@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.
Files changed (45) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +197 -1
  3. package/dist/StoreProvider.mjs +44 -38
  4. package/dist/async/createAsync.mjs +8 -1
  5. package/dist/createStore/createStore.d.ts +11 -47
  6. package/dist/createStore/createStore.mjs +57 -39
  7. package/dist/createStore/helpers/PathTrie.d.ts +2 -0
  8. package/dist/createStore/helpers/PathTrie.mjs +55 -20
  9. package/dist/createStore/helpers/createChainReads.d.ts +1 -1
  10. package/dist/createStore/helpers/createChainReads.mjs +12 -13
  11. package/dist/createStore/helpers/createSetState.mjs +24 -33
  12. package/dist/createStore/helpers/writeByPath.mjs +1 -0
  13. package/dist/createStore/hooks/shared.d.ts +1 -2
  14. package/dist/createStore/hooks/shared.mjs +7 -18
  15. package/dist/createStore/hooks/useStore.d.ts +4 -49
  16. package/dist/createStore/hooks/useStore.mjs +19 -27
  17. package/dist/createStore/hooks/useStoreGetter.d.ts +2 -5
  18. package/dist/createStore/hooks/useStoreGetter.mjs +19 -22
  19. package/dist/createStore/hooks/useStoreSetter.mjs +2 -4
  20. package/dist/derived/createDerived.d.ts +1 -1
  21. package/dist/derived/createDerived.mjs +12 -9
  22. package/dist/entities/createEntityStore.d.ts +38 -0
  23. package/dist/entities/createEntityStore.mjs +102 -0
  24. package/dist/entities/index.d.ts +2 -0
  25. package/dist/entities/index.mjs +2 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.mjs +11 -9
  28. package/dist/middleware/historyMiddleware.d.ts +3 -3
  29. package/dist/middleware/historyMiddleware.mjs +22 -17
  30. package/dist/middleware/index.d.ts +1 -1
  31. package/dist/middleware/isDisabled.d.ts +2 -0
  32. package/dist/middleware/isDisabled.mjs +4 -0
  33. package/dist/middleware/loggerMiddleware.d.ts +2 -2
  34. package/dist/middleware/loggerMiddleware.mjs +14 -15
  35. package/dist/middleware/persistMiddleware.d.ts +7 -5
  36. package/dist/middleware/persistMiddleware.mjs +58 -26
  37. package/dist/middleware/reduxDevToolsMiddleware.d.ts +2 -2
  38. package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -21
  39. package/dist/next/index.d.ts +26 -0
  40. package/dist/next/index.mjs +18 -0
  41. package/dist/rsc/index.d.ts +29 -0
  42. package/dist/rsc/index.mjs +18 -0
  43. package/dist/types/StoreTypes.d.ts +33 -21
  44. package/logo.svg +57 -0
  45. 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], Seen | T>}`;
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 __NoDefault = {
11
- __noDefault: true;
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>>, TDefaultValue = __NoDefault> = [PathValues<TState, Paths, TDefaultValue>, ...PathSetters<TState, Paths>];
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>>, TDefaultValue extends readonly (PathValue<TState, Paths[number]> | undefined)[] | PathValue<TState, Paths[number]> | undefined = undefined> = Omit<StoreHookReactiveOptions<never, TState>, 'equalityFn'> & {
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, D = __NoDefault> = StoreHookBaseOptions<TState> & {
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.31.1",
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"