@plitzi/nexus 0.31.1 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +197 -1
- package/dist/StoreProvider.mjs +44 -38
- package/dist/async/createAsync.mjs +8 -1
- package/dist/createStore/createStore.d.ts +11 -47
- package/dist/createStore/createStore.mjs +57 -39
- package/dist/createStore/helpers/PathTrie.d.ts +2 -0
- package/dist/createStore/helpers/PathTrie.mjs +55 -20
- package/dist/createStore/helpers/createChainReads.d.ts +1 -1
- package/dist/createStore/helpers/createChainReads.mjs +12 -13
- package/dist/createStore/helpers/createSetState.mjs +24 -33
- package/dist/createStore/helpers/writeByPath.mjs +1 -0
- package/dist/createStore/hooks/shared.d.ts +1 -2
- package/dist/createStore/hooks/shared.mjs +7 -18
- package/dist/createStore/hooks/useStore.d.ts +4 -49
- package/dist/createStore/hooks/useStore.mjs +19 -27
- package/dist/createStore/hooks/useStoreGetter.d.ts +2 -5
- package/dist/createStore/hooks/useStoreGetter.mjs +19 -22
- package/dist/createStore/hooks/useStoreSetter.mjs +2 -4
- package/dist/derived/createDerived.d.ts +1 -1
- package/dist/derived/createDerived.mjs +12 -9
- package/dist/entities/createEntityStore.d.ts +38 -0
- package/dist/entities/createEntityStore.mjs +102 -0
- package/dist/entities/index.d.ts +2 -0
- package/dist/entities/index.mjs +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +11 -9
- package/dist/middleware/historyMiddleware.d.ts +3 -3
- package/dist/middleware/historyMiddleware.mjs +22 -17
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/isDisabled.d.ts +2 -0
- package/dist/middleware/isDisabled.mjs +4 -0
- package/dist/middleware/loggerMiddleware.d.ts +2 -2
- package/dist/middleware/loggerMiddleware.mjs +14 -15
- package/dist/middleware/persistMiddleware.d.ts +7 -5
- package/dist/middleware/persistMiddleware.mjs +58 -26
- package/dist/middleware/reduxDevToolsMiddleware.d.ts +2 -2
- package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -21
- package/dist/next/index.d.ts +26 -0
- package/dist/next/index.mjs +18 -0
- package/dist/rsc/index.d.ts +29 -0
- package/dist/rsc/index.mjs +18 -0
- package/dist/types/StoreTypes.d.ts +33 -21
- package/logo.svg +57 -0
- package/package.json +22 -10
|
@@ -2,17 +2,13 @@ import { default as PathTrie } from '../createStore/helpers/PathTrie';
|
|
|
2
2
|
import { default as Subscribers } from '../createStore/helpers/Subscribers';
|
|
3
3
|
export type Path = string;
|
|
4
4
|
export type Primitive = string | number | boolean | null | undefined | symbol | bigint;
|
|
5
|
-
export type PathOf<T, Seen = never> = T extends Primitive ? never : T extends Seen ? never : {
|
|
6
|
-
[K in keyof T & string]-?: T[K] extends Primitive ? K : T[K] extends Array<infer U> ? K | `${K}.${number}` | `${K}.${number}.${PathOf<U, Seen | T>}` : K | `${K}.${PathOf<T[K]
|
|
5
|
+
export type PathOf<T, Seen = never> = T extends Primitive ? never : T extends Seen ? never : [string] extends [keyof T & string] ? string : {
|
|
6
|
+
[K in keyof T & string]-?: T[K] extends Primitive ? K : NonNullable<T[K]> extends Array<infer U> ? K | `${K}.${number}` | `${K}.${number}.${PathOf<U, Seen | T>}` : K | `${K}.${PathOf<NonNullable<T[K]>, Seen | T>}`;
|
|
7
7
|
}[keyof T & string];
|
|
8
8
|
export type PathValue<T, P> = T extends undefined ? undefined : P extends `${infer K}.${infer Rest}` ? K extends keyof NonNullable<T> ? NonNullable<T>[K] extends Array<infer U> ? Rest extends `${number}.${infer R}` ? PathValue<U, R> : Rest extends `${number}` ? U : never : PathValue<NonNullable<T>[K], Rest> : never : P extends keyof NonNullable<T> ? NonNullable<T>[P] : never;
|
|
9
9
|
export type PathSetter<TState extends object, P extends PathOf<TState>> = (value: PathValue<TState, P> | ((prev: PathValue<TState, P>) => PathValue<TState, P>)) => void;
|
|
10
|
-
export type
|
|
11
|
-
|
|
12
|
-
};
|
|
13
|
-
type NumericIndex<I> = I extends `${infer N extends number}` ? N : I extends number ? I : never;
|
|
14
|
-
export type PathValues<TState extends object, Paths extends ReadonlyArray<PathOf<TState>>, DefaultValue = __NoDefault> = {
|
|
15
|
-
[I in keyof Paths]: Paths[I] extends PathOf<TState> ? [DefaultValue] extends [__NoDefault] ? PathValue<TState, Paths[I]> : DefaultValue extends readonly any[] ? NumericIndex<I> extends infer NI ? NI extends keyof DefaultValue ? DefaultValue[NI] extends undefined ? PathValue<TState, Paths[I]> | undefined : NonNullable<PathValue<TState, Paths[I]>> | DefaultValue[NI] : PathValue<TState, Paths[I]> : never : NonNullable<PathValue<TState, Paths[I]>> | DefaultValue : never;
|
|
10
|
+
export type PathValues<TState extends object, Paths extends ReadonlyArray<PathOf<TState>>> = {
|
|
11
|
+
[I in keyof Paths]: Paths[I] extends PathOf<TState> ? PathValue<TState, Paths[I]> : never;
|
|
16
12
|
};
|
|
17
13
|
export type PathSetters<TState extends object, Paths extends ReadonlyArray<PathOf<TState>>> = {
|
|
18
14
|
[I in keyof Paths]: Paths[I] extends PathOf<TState> ? PathSetter<TState, Paths[I]> : never;
|
|
@@ -51,19 +47,40 @@ export type StoreMiddlewareHandlers<T> = {
|
|
|
51
47
|
beforeChange?: WriteInterceptor<T>;
|
|
52
48
|
onChange?: ChangeListener<T>;
|
|
53
49
|
onError?: StoreErrorHandler<T>;
|
|
50
|
+
hydrate?: (api: StoreApi<T>) => void;
|
|
54
51
|
};
|
|
55
52
|
export type StoreMiddleware<T extends object> = (api: StoreApi<T>) => StoreMiddlewareHandlers<T> | void;
|
|
53
|
+
export type MiddlewareOptions<T extends object> = {
|
|
54
|
+
enabled?: boolean | ((state: T) => boolean);
|
|
55
|
+
};
|
|
56
56
|
export type Listener = (changedPath?: Path) => void;
|
|
57
57
|
export type SetState<T> = {
|
|
58
58
|
(path: undefined, value: T | ((prev: T) => T), canPropagate?: boolean): void;
|
|
59
59
|
<P extends PathOf<T>>(path: P, value: PathValue<T, P> | ((prev: PathValue<T, P>) => PathValue<T, P>), canPropagate?: boolean): void;
|
|
60
60
|
};
|
|
61
61
|
export type GetState<T> = () => T;
|
|
62
|
+
export type BoundStore<TBase> = {
|
|
63
|
+
getState: {
|
|
64
|
+
(): TBase | undefined;
|
|
65
|
+
<D>(defaultValue: D): NonNullable<TBase> | D;
|
|
66
|
+
};
|
|
67
|
+
getPath: TBase extends object ? {
|
|
68
|
+
<SubP extends PathOf<TBase>>(subPath: SubP): PathValue<TBase, SubP> | undefined;
|
|
69
|
+
<SubP extends PathOf<TBase>, D>(subPath: SubP, defaultValue: D): NonNullable<PathValue<TBase, SubP>> | D;
|
|
70
|
+
} : {
|
|
71
|
+
(): TBase | undefined;
|
|
72
|
+
<D>(defaultValue: D): NonNullable<TBase> | D;
|
|
73
|
+
};
|
|
74
|
+
setState: SetFromBaseFn<TBase>;
|
|
75
|
+
subscribe: (listener: Listener) => () => void;
|
|
76
|
+
subscribePath: TBase extends object ? <SubP extends PathOf<TBase>>(subPath: SubP, listener: Listener) => () => void : (listener: Listener) => () => void;
|
|
77
|
+
};
|
|
62
78
|
export type StoreApi<T> = {
|
|
63
79
|
id?: string;
|
|
64
80
|
getState: GetState<T>;
|
|
65
81
|
getPath: <P extends PathOf<T>>(path: P) => PathValue<T, P> | undefined;
|
|
66
82
|
setState: SetState<T>;
|
|
83
|
+
withBase: <P extends PathOf<T>>(basePath: P) => BoundStore<NonNullable<PathValue<T, P>>>;
|
|
67
84
|
batch: <R>(fn: () => R) => R;
|
|
68
85
|
subscribe: (listener: Listener) => () => void;
|
|
69
86
|
subscribePath: <P extends PathOf<T>>(path: P, listener: Listener) => () => void;
|
|
@@ -71,6 +88,7 @@ export type StoreApi<T> = {
|
|
|
71
88
|
destroy?: () => void;
|
|
72
89
|
reconnect?: () => void;
|
|
73
90
|
subscribeInvalidate?: (listener: () => void) => () => void;
|
|
91
|
+
hydrate?: () => void;
|
|
74
92
|
};
|
|
75
93
|
export type StoreApiInternal<T> = StoreApi<T> & {
|
|
76
94
|
listeners: Subscribers<Listener>;
|
|
@@ -78,6 +96,7 @@ export type StoreApiInternal<T> = StoreApi<T> & {
|
|
|
78
96
|
changeListeners: Subscribers<ChangeListener<T>>;
|
|
79
97
|
interceptors: WriteInterceptor<T>[];
|
|
80
98
|
errorHandlers: StoreErrorHandler<T>[];
|
|
99
|
+
invalidateListeners: Subscribers<() => void>;
|
|
81
100
|
getMergeCount?: () => number;
|
|
82
101
|
};
|
|
83
102
|
export type PathOrFn<TState extends object> = PathOf<TState> | ((state: TState) => PathOf<TState>);
|
|
@@ -89,15 +108,16 @@ export type PathOrFnSetter<TState extends object, Entry> = Entry extends PathOf<
|
|
|
89
108
|
export type PathOrFnSetters<TState extends object, Entries extends ReadonlyArray<PathOrFn<TState>>> = {
|
|
90
109
|
[I in keyof Entries]: PathOrFnSetter<TState, Entries[I]>;
|
|
91
110
|
};
|
|
92
|
-
export type MultiPathReturn<TState extends object, Paths extends ReadonlyArray<PathOf<TState
|
|
111
|
+
export type MultiPathReturn<TState extends object, Paths extends ReadonlyArray<PathOf<TState>>> = [
|
|
112
|
+
PathValues<TState, Paths>,
|
|
113
|
+
...PathSetters<TState, Paths>
|
|
114
|
+
];
|
|
93
115
|
export type UseStoreReturn<TState extends object, TArg> = TArg extends PathOf<TState> ? [PathValue<TState, TArg>, PathSetter<TState, TArg>] : TArg extends (state: TState) => unknown ? [unknown, (value: unknown) => void] : [TState, StoreApi<TState>['setState']];
|
|
94
116
|
export type UseStoreOptions<T, TState extends object = object> = StoreHookReactiveOptions<T, TState> & {
|
|
95
|
-
defaultValue?: NonNullable<T>;
|
|
96
117
|
transformer?: (value: T) => unknown;
|
|
97
118
|
};
|
|
98
|
-
export type UseStoreMultiOptions<TState extends object, Paths extends ReadonlyArray<PathOf<TState
|
|
119
|
+
export type UseStoreMultiOptions<TState extends object, Paths extends ReadonlyArray<PathOf<TState>>> = Omit<StoreHookReactiveOptions<never, TState>, 'equalityFn'> & {
|
|
99
120
|
equalityFn?: (a: PathValues<TState, Paths>, b: PathValues<TState, Paths>) => boolean;
|
|
100
|
-
defaultValue?: TDefaultValue;
|
|
101
121
|
transformer?: (values: PathValues<TState, Paths>) => unknown;
|
|
102
122
|
};
|
|
103
123
|
export type UseStoreSyncOptions<T, TState extends object = object> = StoreHookReactiveOptions<T, TState> & {
|
|
@@ -118,19 +138,11 @@ export type GetValueFromBaseFn<TBase> = TBase extends object ? {
|
|
|
118
138
|
<SubP extends PathOf<TBase>, D>(path: SubP, defaultValue: D): NonNullable<PathValue<TBase, SubP>> | D;
|
|
119
139
|
<D>(path: undefined, defaultValue: D): NonNullable<TBase> | D;
|
|
120
140
|
} : () => TBase;
|
|
121
|
-
export type GetValueFromBaseWithDefaultFn<TBase, D> = TBase extends object ? {
|
|
122
|
-
(): NonNullable<TBase> | D;
|
|
123
|
-
<SubP extends PathOf<NonNullable<TBase>>>(path: SubP): PathValue<NonNullable<TBase>, SubP>;
|
|
124
|
-
<SubP extends PathOf<NonNullable<TBase>>, D2>(path: SubP, defaultValue: D2): NonNullable<PathValue<NonNullable<TBase>, SubP>> | D2;
|
|
125
|
-
<D2>(path: undefined, defaultValue: D2): NonNullable<TBase> | D2;
|
|
126
|
-
} : () => NonNullable<TBase> | D;
|
|
127
141
|
type EntryGetter<TState extends object, Entry> = Entry extends PathOf<TState> ? GetValueFromBaseFn<PathValue<TState, Entry>> : Entry extends (state: TState) => infer R ? R extends object ? GetValueFromBaseFn<R> : () => R : never;
|
|
128
142
|
export type GetterTuple<TState extends object, Entries extends ReadonlyArray<PathOf<TState> | ((state: TState) => unknown)>> = {
|
|
129
143
|
[K in keyof Entries]: EntryGetter<TState, Entries[K]>;
|
|
130
144
|
};
|
|
131
|
-
export type UseStoreGetterOptions<TState extends object = object
|
|
132
|
-
defaultValue?: D;
|
|
133
|
-
};
|
|
145
|
+
export type UseStoreGetterOptions<TState extends object = object> = StoreHookBaseOptions<TState>;
|
|
134
146
|
export type SetStateFn<TState extends object> = {
|
|
135
147
|
(path: undefined, value: TState | ((prev: TState) => TState)): void;
|
|
136
148
|
<P extends PathOf<TState>>(path: P, value: PathValue<TState, P> | ((prev: PathValue<TState, P>) => PathValue<TState, P>)): void;
|
package/logo.svg
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="180" viewBox="0 0 640 180" fill="none" role="img" aria-label="@plitzi/nexus">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0" y1="0" x2="640" y2="180" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#0c0c12" />
|
|
5
|
+
<stop offset="1" stop-color="#16161f" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="mark" x1="0" y1="0" x2="1" y2="1">
|
|
8
|
+
<stop stop-color="#a78bfa" />
|
|
9
|
+
<stop offset="1" stop-color="#7c3aed" />
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<linearGradient id="word" x1="150" y1="0" x2="560" y2="0" gradientUnits="userSpaceOnUse">
|
|
12
|
+
<stop stop-color="#ede9fe" />
|
|
13
|
+
<stop offset="1" stop-color="#a78bfa" />
|
|
14
|
+
</linearGradient>
|
|
15
|
+
</defs>
|
|
16
|
+
|
|
17
|
+
<rect width="640" height="180" rx="20" fill="url(#bg)" />
|
|
18
|
+
<rect x="0.5" y="0.5" width="639" height="179" rx="19.5" fill="none" stroke="#2a2a38" />
|
|
19
|
+
|
|
20
|
+
<circle cx="96" cy="90" r="130" fill="#7c3aed" opacity="0.10" />
|
|
21
|
+
|
|
22
|
+
<!-- nexus mark -->
|
|
23
|
+
<g transform="translate(90 90)">
|
|
24
|
+
<rect x="-36" y="-36" width="72" height="72" rx="18" fill="url(#mark)" />
|
|
25
|
+
<g transform="scale(2.0)" stroke="#fff" stroke-linecap="round" stroke-linejoin="round">
|
|
26
|
+
<path d="M0 -8.5 7.4 -4.25 7.4 4.25 0 8.5 -7.4 4.25 -7.4 -4.25 Z" stroke-width="1.3" stroke-opacity="0.45" />
|
|
27
|
+
<g stroke-width="1.5">
|
|
28
|
+
<path d="M0 0 0 -8.5" />
|
|
29
|
+
<path d="M0 0 7.4 -4.25" />
|
|
30
|
+
<path d="M0 0 7.4 4.25" />
|
|
31
|
+
<path d="M0 0 0 8.5" />
|
|
32
|
+
<path d="M0 0 -7.4 4.25" />
|
|
33
|
+
<path d="M0 0 -7.4 -4.25" />
|
|
34
|
+
</g>
|
|
35
|
+
</g>
|
|
36
|
+
<g transform="scale(2.0)" fill="#fff">
|
|
37
|
+
<circle cx="0" cy="-8.5" r="1.7" />
|
|
38
|
+
<circle cx="7.4" cy="-4.25" r="1.7" />
|
|
39
|
+
<circle cx="7.4" cy="4.25" r="1.7" />
|
|
40
|
+
<circle cx="0" cy="8.5" r="1.7" />
|
|
41
|
+
<circle cx="-7.4" cy="4.25" r="1.7" />
|
|
42
|
+
<circle cx="-7.4" cy="-4.25" r="1.7" />
|
|
43
|
+
<circle cx="0" cy="0" r="2.6" />
|
|
44
|
+
</g>
|
|
45
|
+
</g>
|
|
46
|
+
|
|
47
|
+
<!-- wordmark -->
|
|
48
|
+
<text x="158" y="86" font-family="'Inter', system-ui, sans-serif" font-size="46" font-weight="800" letter-spacing="-1" fill="url(#word)">
|
|
49
|
+
@plitzi/nexus
|
|
50
|
+
</text>
|
|
51
|
+
<text x="160" y="120" font-family="'Inter', system-ui, sans-serif" font-size="20" font-weight="500" fill="#a1a1aa">
|
|
52
|
+
A tiny, type-safe React store
|
|
53
|
+
</text>
|
|
54
|
+
<text x="160" y="146" font-family="'JetBrains Mono', ui-monospace, monospace" font-size="15" fill="#8b5cf6">
|
|
55
|
+
path subscriptions · scoped stores · time-travel
|
|
56
|
+
</text>
|
|
57
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plitzi/nexus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"files": [
|
|
6
|
-
"dist"
|
|
6
|
+
"dist",
|
|
7
|
+
"logo.svg"
|
|
7
8
|
],
|
|
8
9
|
"main": "dist/index.js",
|
|
9
10
|
"module": "dist/index.js",
|
|
@@ -86,14 +87,6 @@
|
|
|
86
87
|
"types": "./dist/createStore/helpers/createChainReads.d.ts",
|
|
87
88
|
"import": "./dist/createStore/helpers/createChainReads.mjs"
|
|
88
89
|
},
|
|
89
|
-
"./createStore/helpers/createGetPath": {
|
|
90
|
-
"types": "./dist/createStore/helpers/createGetPath.d.ts",
|
|
91
|
-
"import": "./dist/createStore/helpers/createGetPath.mjs"
|
|
92
|
-
},
|
|
93
|
-
"./createStore/helpers/createGetState": {
|
|
94
|
-
"types": "./dist/createStore/helpers/createGetState.d.ts",
|
|
95
|
-
"import": "./dist/createStore/helpers/createGetState.mjs"
|
|
96
|
-
},
|
|
97
90
|
"./createStore/helpers/createSetState": {
|
|
98
91
|
"types": "./dist/createStore/helpers/createSetState.d.ts",
|
|
99
92
|
"import": "./dist/createStore/helpers/createSetState.mjs"
|
|
@@ -166,6 +159,10 @@
|
|
|
166
159
|
"types": "./dist/entities/createEntityAdapter.d.ts",
|
|
167
160
|
"import": "./dist/entities/createEntityAdapter.mjs"
|
|
168
161
|
},
|
|
162
|
+
"./entities/createEntityStore": {
|
|
163
|
+
"types": "./dist/entities/createEntityStore.d.ts",
|
|
164
|
+
"import": "./dist/entities/createEntityStore.mjs"
|
|
165
|
+
},
|
|
169
166
|
"./entities/index": {
|
|
170
167
|
"types": "./dist/entities/index.d.ts",
|
|
171
168
|
"import": "./dist/entities/index.mjs"
|
|
@@ -230,6 +227,10 @@
|
|
|
230
227
|
"types": "./dist/middleware/index.d.ts",
|
|
231
228
|
"import": "./dist/middleware/index.mjs"
|
|
232
229
|
},
|
|
230
|
+
"./middleware/isDisabled": {
|
|
231
|
+
"types": "./dist/middleware/isDisabled.d.ts",
|
|
232
|
+
"import": "./dist/middleware/isDisabled.mjs"
|
|
233
|
+
},
|
|
233
234
|
"./middleware/loggerMiddleware": {
|
|
234
235
|
"types": "./dist/middleware/loggerMiddleware.d.ts",
|
|
235
236
|
"import": "./dist/middleware/loggerMiddleware.mjs"
|
|
@@ -242,6 +243,17 @@
|
|
|
242
243
|
"types": "./dist/middleware/reduxDevToolsMiddleware.d.ts",
|
|
243
244
|
"import": "./dist/middleware/reduxDevToolsMiddleware.mjs"
|
|
244
245
|
},
|
|
246
|
+
"./next": {
|
|
247
|
+
"types": "./dist/next/index.d.ts",
|
|
248
|
+
"import": "./dist/next/index.mjs"
|
|
249
|
+
},
|
|
250
|
+
"./next/index": {
|
|
251
|
+
"types": "./dist/next/index.d.ts",
|
|
252
|
+
"import": "./dist/next/index.mjs"
|
|
253
|
+
},
|
|
254
|
+
"./rsc/index": {
|
|
255
|
+
"import": "./dist/rsc/index.mjs"
|
|
256
|
+
},
|
|
245
257
|
"./types": {
|
|
246
258
|
"types": "./dist/types/index.d.ts",
|
|
247
259
|
"import": "./dist/types/index.mjs"
|