@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
@@ -1,42 +1,77 @@
1
1
  import e from "../../helpers/parsePath.mjs";
2
2
  import t from "./Subscribers.mjs";
3
3
  //#region src/createStore/helpers/PathTrie.ts
4
- var n = (e, t, n) => {
5
- let r = "";
6
- for (let i = 0; i < t; i++) r = r ? `${r}.${e[i]}` : e[i], n(r);
4
+ var n = class {
5
+ subscribers = null;
6
+ children = null;
7
7
  }, r = class {
8
8
  direct = /* @__PURE__ */ new Map();
9
9
  descendants = /* @__PURE__ */ new Map();
10
+ root = new n();
10
11
  size = 0;
11
12
  add(r, i) {
12
- let a = this.direct.get(r), o = e(r);
13
- return a || (a = new t(), this.direct.set(r, a), this.size++, n(o, o.length - 1, (e) => {
14
- let t = this.descendants.get(e);
15
- t || (t = /* @__PURE__ */ new Set(), this.descendants.set(e, t)), t.add(r);
16
- })), a.add(i), () => this.remove(r, a, i, o);
13
+ let a = e(r), o = this.direct.get(r);
14
+ if (!o) {
15
+ o = new t(), this.direct.set(r, o);
16
+ let e = this.root;
17
+ for (let t of a) {
18
+ e.children ||= /* @__PURE__ */ new Map();
19
+ let r = e.children.get(t);
20
+ r || (r = new n(), e.children.set(t, r)), e = r;
21
+ }
22
+ e.subscribers = o, this.size++;
23
+ let i = "";
24
+ for (let e = 0; e < a.length - 1; e++) {
25
+ i = i ? `${i}.${a[e]}` : a[e];
26
+ let t = this.descendants.get(i);
27
+ t || (t = /* @__PURE__ */ new Set(), this.descendants.set(i, t)), t.add(r);
28
+ }
29
+ }
30
+ return o.add(i), () => this.remove(r, o, i, a);
17
31
  }
18
- remove(e, t, r, i) {
19
- this.direct.get(e) === t && (t.remove(r), !(t.length > 0) && (this.direct.delete(e), this.size--, n(i, i.length - 1, (t) => {
20
- let n = this.descendants.get(t);
21
- n && (n.delete(e), n.size === 0 && this.descendants.delete(t));
22
- })));
32
+ remove(e, t, n, r) {
33
+ if (this.direct.get(e) !== t || (t.remove(n), t.length > 0)) return;
34
+ this.direct.delete(e), this.size--;
35
+ let i = this.root;
36
+ for (let e of r) {
37
+ if (!i.children) return;
38
+ let t = i.children.get(e);
39
+ if (!t) return;
40
+ i = t;
41
+ }
42
+ i.subscribers === t && (i.subscribers = null);
43
+ let a = "";
44
+ for (let t = 0; t < r.length - 1; t++) {
45
+ a = a ? `${a}.${r[t]}` : r[t];
46
+ let n = this.descendants.get(a);
47
+ n && (n.delete(e), n.size === 0 && this.descendants.delete(a));
48
+ }
49
+ }
50
+ walkAncestors(e, t) {
51
+ let n = this.root;
52
+ for (let r of e) {
53
+ if (!n.children) return;
54
+ let e = n.children.get(r);
55
+ if (!e) return;
56
+ n = e, n.subscribers && t(n.subscribers);
57
+ }
23
58
  }
24
59
  getDescendants(e) {
25
60
  return this.descendants.get(e);
26
61
  }
27
- forEachAffected(t, r, i) {
28
- let a = (e) => {
29
- e && e.forEach(r, i);
62
+ forEachAffected(t, n, r) {
63
+ let i = (e) => {
64
+ e && e.forEach(n, r);
30
65
  };
31
66
  if (typeof t != "string") {
32
- this.direct.forEach(a);
67
+ this.direct.forEach(i);
33
68
  return;
34
69
  }
35
- let o = e(t);
36
- n(o, o.length, (e) => a(this.direct.get(e))), this.descendants.get(t)?.forEach((e) => a(this.direct.get(e)));
70
+ let a = e(t);
71
+ this.walkAncestors(a, i), this.descendants.get(t)?.forEach((e) => i(this.direct.get(e)));
37
72
  }
38
73
  clear() {
39
- this.direct.clear(), this.descendants.clear(), this.size = 0;
74
+ this.direct.clear(), this.descendants.clear(), this.root.children = null, this.root.subscribers = null, this.size = 0;
40
75
  }
41
76
  };
42
77
  //#endregion
@@ -4,7 +4,7 @@ export type ChainReads<TState extends object> = {
4
4
  getState: GetState<TState>;
5
5
  getPath: GetPath<TState>;
6
6
  invalidate: () => void;
7
- setActive: (active: boolean) => void;
7
+ resetCache: () => void;
8
8
  getMergeCount: () => number;
9
9
  };
10
10
  export declare function createChainReads<TState extends object>(getOwnState: () => TState, getOwnSnapshot: () => TState, parent: StoreApi<TState> | undefined): ChainReads<TState>;
@@ -6,31 +6,30 @@ function r(r, i, a) {
6
6
  getState: i,
7
7
  getPath: (e) => n(r(), e),
8
8
  invalidate: () => {},
9
- setActive: () => {},
9
+ resetCache: () => {},
10
10
  getMergeCount: () => 0
11
11
  };
12
- let o = a, s = !0, c = !0, l = !1, u, d = 0, f = /* @__PURE__ */ new Map(), p = () => (d++, e(o.getState(), i())), m = () => s ? ((c || u === void 0) && (u = p(), c = !1), u) : p(), h = (e) => {
12
+ let o = a, s = !0, c = !1, l, u = 0, d = /* @__PURE__ */ new Map(), f = () => (u++, e(o.getState(), i())), p = () => ((s || l === void 0) && (l = f(), s = !1), l), m = (e) => {
13
13
  let i = n(r(), e);
14
14
  if (i === void 0) return o.getPath(e);
15
15
  let a = o.getPath(e);
16
- return a === void 0 || !t(i) || !t(a) ? i : n(m(), e);
16
+ return a === void 0 || !t(i) || !t(a) ? i : n(p(), e);
17
17
  };
18
18
  return {
19
- getState: m,
19
+ getState: p,
20
20
  getPath: (e) => {
21
- if (!s) return h(e);
22
- if (l) f.clear(), l = !1;
23
- else if (f.has(e)) return f.get(e);
24
- let t = h(e);
25
- return f.set(e, t), t;
21
+ if (c) d.clear(), c = !1;
22
+ else if (d.has(e)) return d.get(e);
23
+ let t = m(e);
24
+ return d.set(e, t), t;
26
25
  },
27
26
  invalidate: () => {
28
- c = !0, l = !0;
27
+ s = !0, c = !0;
29
28
  },
30
- setActive: (e) => {
31
- s = e, e || (f.clear(), u = void 0, c = !0, l = !1);
29
+ resetCache: () => {
30
+ d.clear(), l = void 0, s = !0, c = !1;
32
31
  },
33
- getMergeCount: () => d
32
+ getMergeCount: () => u
34
33
  };
35
34
  }
36
35
  //#endregion
@@ -44,12 +44,14 @@ function u(u) {
44
44
  for (let e = 0, t = n.length; e < t; e++) T.add(n[e]);
45
45
  return;
46
46
  }
47
- e.begin();
48
- try {
49
- let e = s(n, t, n.length);
50
- e !== o && b(e, "notify", t);
51
- } finally {
52
- e.end();
47
+ if (n.length !== 0) {
48
+ e.begin();
49
+ try {
50
+ let e = s(n, t, n.length);
51
+ e !== o && b(e, "notify", t);
52
+ } finally {
53
+ e.end();
54
+ }
53
55
  }
54
56
  }, D = (e) => {
55
57
  w++;
@@ -77,19 +79,14 @@ function u(u) {
77
79
  v.end();
78
80
  }
79
81
  }, k = (e, t) => {
80
- let n = "";
81
- for (let r = 0; r < t.length; r++) {
82
- n = n ? `${n}.${t[r]}` : t[r];
83
- let i = _.direct.get(n);
84
- i && E(i, e);
85
- }
86
- }, A = (e, n, r, i) => {
87
- let a = _.getDescendants(e);
88
- if (a) for (let o of a) {
89
- let a = _.direct.get(o);
90
- if (!a) continue;
91
- let s = o.slice(i);
92
- t(n, s) !== t(r, s) && E(a, e);
82
+ _.walkAncestors(t, (t) => E(t, e));
83
+ }, A = (n, r, i, a) => {
84
+ let o = _.getDescendants(n);
85
+ if (o) for (let s of o) {
86
+ let o = _.direct.get(s);
87
+ if (!o) continue;
88
+ let c = e(s).slice(a);
89
+ t(r, c) !== t(i, c) && E(o, n);
93
90
  }
94
91
  }, j = (e, n, r, o) => {
95
92
  let s = e ? t(r, e) : void 0, c = e ? typeof n == "function" ? n(s) : n : void 0;
@@ -108,15 +105,9 @@ function u(u) {
108
105
  if (e === a) return;
109
106
  l = e;
110
107
  }
111
- if (l !== r) {
112
- if (p(l), v.length > 0 && O(e, r, l), !o) {
113
- x();
114
- return;
115
- }
116
- E(g, e), _.size > 0 && _.direct.forEach((n, i) => {
117
- t(r, i) !== t(l, i) && E(n, e);
118
- });
119
- }
108
+ l !== r && (p(l), v.length > 0 && O(e, r, l), x(), o && (E(g, e), _.size > 0 && _.direct.forEach((n, i) => {
109
+ t(r, i) !== t(l, i) && E(n, e);
110
+ })));
120
111
  };
121
112
  return {
122
113
  setState: (i, o, s = !0) => {
@@ -139,11 +130,11 @@ function u(u) {
139
130
  }
140
131
  if (e === n) return;
141
132
  let r = v.length > 0 ? f() : void 0;
142
- if (m(i, n), r !== void 0 && O(i, r, f()), s) {
143
- E(g, i);
133
+ if (m(i, n), r !== void 0 && O(i, r, f()), s && (E(g, i), _.size > 0)) {
144
134
  let t = _.direct.get(i);
145
- t && E(t, i), A(i, e, n, i.length + 1);
146
- } else x();
135
+ t && E(t, i), A(i, e, n, 1);
136
+ }
137
+ x();
147
138
  return;
148
139
  }
149
140
  let b = e(i), w;
@@ -154,7 +145,7 @@ function u(u) {
154
145
  } else w = r(u, i, b, o, typeof o == "function");
155
146
  if (w === n) return;
156
147
  let T = w;
157
- p(T), v.length > 0 && O(i, u, T), s ? (E(g, i), k(i, b), A(i, u, T, 0)) : x();
148
+ p(T), v.length > 0 && O(i, u, T), s && (E(g, i), _.size > 0 && (k(i, b), A(i, u, T, 0))), x();
158
149
  },
159
150
  batch: D
160
151
  };
@@ -24,6 +24,7 @@ var e = Symbol("unchanged"), t = (e) => /^\d+$/.test(e), n = (e) => Array.isArra
24
24
  return n += `return ${i};`, Function("o", "v", "f", n);
25
25
  }, c, l, u = () => {
26
26
  if (l !== void 0) return l;
27
+ if (typeof window > "u") return !1;
27
28
  if (c === void 0) try {
28
29
  s(["x", "y"])({ x: {} }, 1, !1), c = !0;
29
30
  } catch {
@@ -1,10 +1,9 @@
1
1
  import { PathOf, PathOrFn, StoreApi, SyncMode } from '../../types';
2
2
  import { RefObject } from 'react';
3
3
  export declare const defaultMultiEqualityFn: (a: unknown[], b: unknown[]) => boolean;
4
- export declare function makeSingleSnapshot<TState extends object>(store: StoreApi<TState>, pathOrFn: PathOf<TState> | ((state: TState) => PathOf<TState>) | undefined, defaultValue?: unknown): () => unknown;
4
+ export declare function makeSingleSnapshot<TState extends object>(store: StoreApi<TState>, pathOrFn: PathOf<TState> | ((state: TState) => PathOf<TState>) | undefined): () => unknown;
5
5
  export declare function makeMultiSnapshot<TState extends object>(store: StoreApi<TState>, pathsRef: RefObject<ReadonlyArray<PathOrFn<TState>>>, lastRef: RefObject<unknown[] | null>, options?: {
6
6
  equalityFn?: (a: unknown[], b: unknown[]) => boolean;
7
- defaultValue?: unknown;
8
7
  }): () => unknown[];
9
8
  export declare function useResolvedStore<TState extends object>(optionStore: StoreApi<TState> | undefined, hookName: string, storeId?: string): StoreApi<TState>;
10
9
  export declare function useMultiSubscribe<TState extends object>(store: StoreApi<TState>, pathsRef: RefObject<ReadonlyArray<PathOrFn<TState>>>, pathsKey: string, enabled: boolean, mode: SyncMode): (cb: () => void) => () => void;
@@ -7,32 +7,21 @@ var c = (e, t) => {
7
7
  for (let n = 0; n < e.length; n++) if (!Object.is(e[n], t[n])) return !1;
8
8
  return !0;
9
9
  };
10
- function l(t, n, r) {
10
+ function l(t, n) {
11
11
  return () => {
12
- if (typeof n == "string") {
13
- let e = t.getPath(n);
14
- return e === void 0 ? r : e;
15
- }
12
+ if (typeof n == "string") return t.getPath(n);
16
13
  if (typeof n == "function") {
17
- let i = t.getState(), a = e(i, n(i));
18
- return a === void 0 ? r : a;
14
+ let r = t.getState();
15
+ return e(r, n(r));
19
16
  }
20
17
  return t.getState();
21
18
  };
22
19
  }
23
20
  function u(t, n, r, i = {}) {
24
- let { equalityFn: a = c, defaultValue: o } = i;
21
+ let { equalityFn: a = c } = i;
25
22
  return () => {
26
- let i = n.current, s = i.some((e) => typeof e == "function") ? t.getState() : void 0, c = i.map((n, r) => {
27
- let i = typeof n == "function" ? e(s, n(s)) : t.getPath(n);
28
- if (i !== void 0 || o === void 0) return i;
29
- if (Array.isArray(o)) {
30
- let e = o[r];
31
- return e === void 0 ? i : e;
32
- }
33
- return o;
34
- }), l = r.current;
35
- return l !== null && a(l, c) ? l : (r.current = c, c);
23
+ let i = n.current, o = i.some((e) => typeof e == "function") ? t.getState() : void 0, s = i.map((n) => typeof n == "function" ? e(o, n(o)) : t.getPath(n)), c = r.current;
24
+ return c !== null && a(c, s) ? c : (r.current = s, s);
36
25
  };
37
26
  }
38
27
  function d(e, i, o) {
@@ -1,72 +1,27 @@
1
- import { ___NoDefault, MultiPathReturn, PathOf, PathOrFn, PathOrFnSetters, PathOrFnValue, PathOrFnValues, PathSetter, PathSetters, PathValue, PathValues, StoreApi, UseStoreMultiOptions, UseStoreOptions, UseStoreReturn } from '../../types';
1
+ import { MultiPathReturn, PathOf, PathOrFn, PathOrFnSetters, PathOrFnValues, PathSetter, PathSetters, PathValue, PathValues, StoreApi, UseStoreMultiOptions, UseStoreOptions, UseStoreReturn } from '../../types';
2
2
  export { defaultMultiEqualityFn } from './shared';
3
3
  export type { MultiPathReturn, UseStoreOptions, UseStoreMultiOptions, UseStoreReturn };
4
4
  declare function useStore<TState extends object>(arg?: undefined, options?: UseStoreOptions<TState>): [TState, StoreApi<TState>['setState']];
5
- declare function useStore<TState extends object, P extends PathOf<TState>>(path: P, options: Omit<UseStoreOptions<PathValue<TState, P>>, 'defaultValue'> & {
6
- defaultValue: undefined;
7
- transformer?: never;
8
- }): [PathValue<TState, P> | undefined, PathSetter<TState, P>];
9
5
  declare function useStore<TState extends object, P extends PathOf<TState>>(path: P, options?: UseStoreOptions<PathValue<TState, P>> & {
10
- defaultValue?: never;
11
6
  transformer?: never;
12
7
  }): [PathValue<TState, P>, PathSetter<TState, P>];
13
- declare function useStore<TState extends object, P extends PathOf<TState>, D>(path: P, options: UseStoreOptions<PathValue<TState, P>> & {
14
- defaultValue: D;
15
- transformer?: never;
16
- }): [NonNullable<PathValue<TState, P>> | D, PathSetter<TState, P>];
17
8
  declare function useStore<TState extends object, P extends PathOf<TState>, TResult>(path: P, options: UseStoreOptions<PathValue<TState, P>> & {
18
9
  transformer: (value: PathValue<TState, P>) => TResult;
19
10
  }): [TResult, PathSetter<TState, P>];
20
- declare function useStore<TState extends object, P extends PathOf<TState>>(pathFn: (state: TState) => P, options: Omit<UseStoreOptions<PathValue<TState, P>, TState>, 'defaultValue'> & {
21
- defaultValue: undefined;
22
- transformer?: never;
23
- }): [PathValue<TState, P> | undefined, PathSetter<TState, P>];
24
11
  declare function useStore<TState extends object, P extends PathOf<TState>>(pathFn: (state: TState) => P, options?: UseStoreOptions<PathValue<TState, P>, TState> & {
25
- defaultValue?: never;
26
12
  transformer?: never;
27
13
  }): [PathValue<TState, P>, PathSetter<TState, P>];
28
- declare function useStore<TState extends object, P extends PathOf<TState>, D>(pathFn: (state: TState) => P, options: UseStoreOptions<PathValue<TState, P>, TState> & {
29
- defaultValue: D;
30
- transformer?: never;
31
- }): [NonNullable<PathValue<TState, P>> | D, PathSetter<TState, P>];
32
14
  declare function useStore<TState extends object, P extends PathOf<TState>, TResult>(pathFn: (state: TState) => P, options: UseStoreOptions<PathValue<TState, P>, TState> & {
33
15
  transformer: (value: PathValue<TState, P>) => TResult;
34
16
  }): [TResult, PathSetter<TState, P>];
35
- declare function useStore<TState extends object, const Paths extends ReadonlyArray<PathOf<TState>>>(paths: Paths, options?: Omit<UseStoreMultiOptions<TState, Paths>, 'defaultValue' | 'transformer'>): MultiPathReturn<TState, Paths, __NoDefault>;
36
- declare function useStore<TState extends object, const Paths extends ReadonlyArray<PathOf<TState>>>(paths: Paths, options: UseStoreMultiOptions<TState, Paths> & {
37
- defaultValue: undefined;
38
- transformer?: never;
39
- }): MultiPathReturn<TState, Paths, undefined>;
40
- declare function useStore<TState extends object, const Paths extends ReadonlyArray<PathOf<TState>>, const TDefaultValue extends readonly (PathValue<TState, Paths[number]> | undefined)[]>(paths: Paths, options: UseStoreMultiOptions<TState, Paths, TDefaultValue> & {
41
- defaultValue: TDefaultValue;
42
- transformer?: never;
43
- }): MultiPathReturn<TState, Paths, TDefaultValue>;
44
- declare function useStore<TState extends object, const Paths extends ReadonlyArray<PathOf<TState>>, TDefaultValue extends PathValue<TState, Paths[number]>>(paths: Paths, options: UseStoreMultiOptions<TState, Paths, TDefaultValue> & {
45
- defaultValue: TDefaultValue;
46
- transformer?: never;
47
- }): MultiPathReturn<TState, Paths, TDefaultValue>;
17
+ declare function useStore<TState extends object, const Paths extends ReadonlyArray<PathOf<TState>>>(paths: Paths, options?: Omit<UseStoreMultiOptions<TState, Paths>, 'transformer'>): MultiPathReturn<TState, Paths>;
48
18
  declare function useStore<TState extends object, const Paths extends ReadonlyArray<PathOf<TState>>, TResult>(paths: Paths, options: UseStoreMultiOptions<TState, Paths> & {
49
19
  transformer: (values: PathValues<TState, Paths>) => TResult;
50
20
  }): [TResult, ...PathSetters<TState, Paths>];
51
- declare function useStore<TState extends object, const Entries extends ReadonlyArray<PathOrFn<TState>>>(paths: Entries, options?: Omit<UseStoreMultiOptions<TState, any>, 'defaultValue' | 'transformer'> & {
21
+ declare function useStore<TState extends object, const Entries extends ReadonlyArray<PathOrFn<TState>>>(paths: Entries, options?: Omit<UseStoreMultiOptions<TState, any>, 'transformer'> & {
52
22
  transformer?: never;
53
23
  }): [PathOrFnValues<TState, Entries>, ...PathOrFnSetters<TState, Entries>];
54
- declare function useStore<TState extends object, const Entries extends ReadonlyArray<PathOrFn<TState>>>(paths: Entries, options: Omit<UseStoreMultiOptions<TState, any>, 'defaultValue' | 'transformer'> & {
55
- defaultValue: undefined;
56
- transformer?: never;
57
- }): [{
58
- [I in keyof Entries]: PathOrFnValue<TState, Entries[I]> | undefined;
59
- }, ...PathOrFnSetters<TState, Entries>];
60
- declare function useStore<TState extends object, const Entries extends ReadonlyArray<PathOrFn<TState>>, const TDefaultValue extends readonly unknown[]>(paths: Entries, options: Omit<UseStoreMultiOptions<TState, any>, 'defaultValue' | 'transformer'> & {
61
- defaultValue: TDefaultValue;
62
- transformer?: never;
63
- }): [
64
- {
65
- [I in keyof Entries]: I extends keyof TDefaultValue ? TDefaultValue[I] extends undefined ? PathOrFnValue<TState, Entries[I]> | undefined : NonNullable<PathOrFnValue<TState, Entries[I]>> | TDefaultValue[I] : PathOrFnValue<TState, Entries[I]>;
66
- },
67
- ...PathOrFnSetters<TState, Entries>
68
- ];
69
- declare function useStore<TState extends object, const Entries extends ReadonlyArray<PathOrFn<TState>>, TResult>(paths: Entries, options: Omit<UseStoreMultiOptions<TState, any>, 'defaultValue' | 'transformer'> & {
24
+ declare function useStore<TState extends object, const Entries extends ReadonlyArray<PathOrFn<TState>>, TResult>(paths: Entries, options: Omit<UseStoreMultiOptions<TState, any>, 'transformer'> & {
70
25
  transformer: (values: PathOrFnValues<TState, Entries>) => TResult;
71
26
  }): [TResult, ...PathOrFnSetters<TState, Entries>];
72
27
  export type { PathSetters, PathValues };
@@ -4,42 +4,34 @@ import { useCallback as c, useMemo as l, useRef as u, useSyncExternalStore as d
4
4
  //#region src/createStore/hooks/useStore.ts
5
5
  var f = [];
6
6
  function p(e, t, r) {
7
- let i = r.mode ?? "sync", a = r.enabled ?? !0, o = r.defaultValue, f = t === void 0, p = r.equalityFn ?? (f ? s : Object.is), m = r.transformer, h = u(m);
8
- h.current = m;
9
- let g = l(() => n(e, t, o), [
10
- e,
11
- t,
12
- o
13
- ]), _ = u(g()), v = l(() => (n) => !a || i === "mount" ? () => {} : typeof t == "string" ? e.subscribePath(t, n) : e.subscribe(n), [
7
+ let i = r.mode ?? "sync", a = r.enabled ?? !0, o = t === void 0, f = r.equalityFn ?? (o ? s : Object.is), p = r.transformer, m = u(p);
8
+ m.current = p;
9
+ let h = l(() => n(e, t), [e, t]), g = u(h()), _ = l(() => (n) => !a || i === "mount" ? () => {} : typeof t == "string" ? e.subscribePath(t, n) : e.subscribe(n), [
14
10
  a,
15
11
  i,
16
12
  t,
17
13
  e
18
- ]), y = () => {
19
- if (!a) return _.current;
20
- if (i === "mount") return g();
21
- let e = g();
22
- return p(_.current, e) ? _.current : (_.current = e, e);
23
- }, b = d(v, y, y);
24
- return [l(() => h.current ? h.current(b) : b, [b]), c((n) => {
25
- f ? e.setState(void 0, n) : typeof t == "function" ? e.setState(t(e.getState()), n) : e.setState(t, n);
14
+ ]), v = () => {
15
+ if (!a) return g.current;
16
+ if (i === "mount") return h();
17
+ let e = h();
18
+ return f(g.current, e) ? g.current : (g.current = e, e);
19
+ }, y = d(_, v, v);
20
+ return [l(() => m.current ? m.current(y) : y, [y]), c((n) => {
21
+ o ? e.setState(void 0, n) : typeof t == "function" ? e.setState(t(e.getState()), n) : e.setState(t, n);
26
22
  }, [e, t])];
27
23
  }
28
24
  function m(n, o, s) {
29
- let c = s.mode ?? "sync", d = s.enabled ?? !0, f = s.defaultValue, p = s.equalityFn ?? e, m = s.transformer, h = u(m);
30
- h.current = m;
31
- let g = u(o);
32
- g.current = o;
33
- let _ = o.map((e, t) => typeof e == "function" ? `fn_${t}` : e).join("|"), v = u(null), y = l(() => t(n, g, v, {
34
- equalityFn: p,
35
- defaultValue: f
36
- }), [
25
+ let c = s.mode ?? "sync", d = s.enabled ?? !0, f = s.equalityFn ?? e, p = s.transformer, m = u(p);
26
+ m.current = p;
27
+ let h = u(o);
28
+ h.current = o;
29
+ let g = o.map((e, t) => typeof e == "function" ? `fn_${t}` : e).join("|"), _ = u(null), v = l(() => t(n, h, _, { equalityFn: f }), [
37
30
  n,
38
- _,
39
- p,
31
+ g,
40
32
  f
41
- ]), b = r(a(n, g, _, d, c), y, d, v);
42
- return [l(() => h.current ? h.current(b) : b, [b]), ...i(n, g, _)];
33
+ ]), y = r(a(n, h, g, d, c), v, d, _);
34
+ return [l(() => m.current ? m.current(y) : y, [y]), ...i(n, h, g)];
43
35
  }
44
36
  function h(e, t = {}) {
45
37
  let n = o(t.store, "useStore", t.storeId), r = Array.isArray(e), i = p(n, r ? void 0 : e, r ? {
@@ -1,9 +1,6 @@
1
- import { GetterTuple, GetValueFromBaseWithDefaultFn, GetValueFromBaseFn, GetValueFn, PathOf, PathValue, UseStoreGetterOptions } from '../../types';
2
- export type { GetValueFn, GetValueFromBaseFn, GetValueFromBaseWithDefaultFn, GetterTuple, UseStoreGetterOptions };
1
+ import { GetterTuple, GetValueFromBaseFn, GetValueFn, PathOf, PathValue, UseStoreGetterOptions } from '../../types';
2
+ export type { GetValueFn, GetValueFromBaseFn, GetterTuple, UseStoreGetterOptions };
3
3
  declare function useStoreGetter<TState extends object>(options?: UseStoreGetterOptions<TState>): GetValueFn<TState>;
4
4
  declare function useStoreGetter<TState extends object, P extends PathOf<TState>>(basePath: P, options?: UseStoreGetterOptions<TState>): GetValueFromBaseFn<PathValue<TState, P>>;
5
- declare function useStoreGetter<TState extends object, P extends PathOf<TState>, D>(basePath: P, options: UseStoreGetterOptions<TState, D> & {
6
- defaultValue: D;
7
- }): GetValueFromBaseWithDefaultFn<PathValue<TState, P>, D>;
8
5
  declare function useStoreGetter<TState extends object, const Entries extends ReadonlyArray<PathOf<TState> | ((state: TState) => unknown)>>(entries: Entries, options?: UseStoreGetterOptions<TState>): GetterTuple<TState, Entries>;
9
6
  export default useStoreGetter;
@@ -3,34 +3,31 @@ import { useResolvedStore as t } from "./shared.mjs";
3
3
  import { useMemo as n } from "react";
4
4
  //#region src/createStore/hooks/useStoreGetter.ts
5
5
  function r(r, i) {
6
- let a = typeof r == "string" ? r : void 0, o = Array.isArray(r) ? r : void 0, s = typeof r == "object" && !Array.isArray(r) ? r : i, c = t(s?.store, "useStoreGetter", s?.storeId), { defaultValue: l } = s ?? {}, u = o?.map((e) => typeof e == "function" ? e.toString() : e).join("|");
7
- return n(() => o ? o.map((t) => (n, r) => {
8
- let i = typeof t == "function" ? t(c.getState()) : e(c.getState(), t);
9
- if (n !== void 0) {
10
- let t = e(i, n);
11
- return t === void 0 && r !== void 0 ? r : t;
12
- }
13
- return i === void 0 && r !== void 0 ? r : i;
14
- }) : (t, n) => {
15
- let r = c.getState();
6
+ let a = typeof r == "string" ? r : void 0, o = Array.isArray(r) ? r : void 0, s = typeof r == "object" && !Array.isArray(r) ? r : i, c = t(s?.store, "useStoreGetter", s?.storeId), l = o?.map((e) => typeof e == "function" ? e.toString() : e).join("|");
7
+ return n(() => {
8
+ if (o) return o.map((t) => (n, r) => {
9
+ let i = typeof t == "function" ? t(c.getState()) : e(c.getState(), t);
10
+ if (n !== void 0) {
11
+ let t = e(i, n);
12
+ return t === void 0 && r !== void 0 ? r : t;
13
+ }
14
+ return i === void 0 && r !== void 0 ? r : i;
15
+ });
16
16
  if (a !== void 0) {
17
- let i = e(r, a);
17
+ let e = c.withBase(a);
18
+ return (t, n) => t === void 0 ? n === void 0 ? e.getState() : e.getState(n) : n === void 0 ? e.getPath(t) : e.getPath(t, n);
19
+ }
20
+ return (t, n) => {
21
+ let r = c.getState();
18
22
  if (t !== void 0) {
19
- let r = e(i, t);
20
- return r === void 0 && n !== void 0 ? n : r;
23
+ let i = e(r, t);
24
+ return i === void 0 && n !== void 0 ? n : i;
21
25
  }
22
- let o = n === void 0 ? l : n;
23
- return i === void 0 && o !== void 0 ? o : i;
24
- }
25
- if (t !== void 0) {
26
- let i = e(r, t);
27
- return i === void 0 && n !== void 0 ? n : i;
28
- }
29
- return r;
26
+ return r;
27
+ };
30
28
  }, [
31
29
  c,
32
30
  a,
33
- u,
34
31
  l
35
32
  ]);
36
33
  }
@@ -1,11 +1,9 @@
1
1
  import { useResolvedStore as e } from "./shared.mjs";
2
- import { useCallback as t } from "react";
2
+ import { useMemo as t } from "react";
3
3
  //#region src/createStore/hooks/useStoreSetter.ts
4
4
  function n(n, r) {
5
5
  let i = typeof n == "string" ? n : void 0, a = typeof n == "object" ? n : r, o = e(a?.store, "useStoreSetter", a?.storeId);
6
- return t((e, t) => {
7
- i === void 0 ? o.setState(e, t) : e === void 0 ? o.setState(i, t) : o.setState(`${i}.${e}`, t);
8
- }, [o, i]);
6
+ return t(() => i === void 0 ? o.setState : o.withBase(i).setState, [o, i]);
9
7
  }
10
8
  //#endregion
11
9
  export { n as default };
@@ -7,4 +7,4 @@ export type Derived<R> = {
7
7
  export type DerivedOptions<R> = {
8
8
  equalityFn?: (a: R, b: R) => boolean;
9
9
  };
10
- export declare function createDerived<TState extends object, const Paths extends readonly PathOf<TState>[], R>(store: StoreApi<TState>, deps: Paths, compute: (values: PathValues<TState, Paths>) => R, options?: DerivedOptions<R>): Derived<R>;
10
+ export declare function createDerived<TState extends object, const Paths extends readonly PathOf<TState>[], R>(store: StoreApi<TState>, deps: Paths, compute: (values: PathValues<TState, Paths>, changedPath?: string) => R, options?: DerivedOptions<R>): Derived<R>;
@@ -1,19 +1,22 @@
1
1
  import { createObservable as e } from "../helpers/createObservable.mjs";
2
2
  //#region src/derived/createDerived.ts
3
3
  function t(t, n, r, i = {}) {
4
- let a = i.equalityFn ?? Object.is, o = e(() => r(n.map((e) => t.getPath(e)))), s = () => {
5
- if (!o.hasListeners()) {
6
- o.invalidate();
4
+ let a = i.equalityFn ?? Object.is, o, s = e(() => {
5
+ let e = o;
6
+ return o = void 0, r(n.map((e) => t.getPath(e)), e);
7
+ }), c = (e) => {
8
+ if (o = e, !s.hasListeners()) {
9
+ s.invalidate();
7
10
  return;
8
11
  }
9
- let e = o.get();
10
- o.invalidate(), a(e, o.get()) || o.notify();
11
- }, c = n.map((e) => t.subscribePath(e, s));
12
+ let t = s.get();
13
+ s.invalidate(), a(t, s.get()) || s.notify();
14
+ }, l = n.map((e) => t.subscribePath(e, c));
12
15
  return {
13
- get: o.get,
14
- subscribe: (e) => (o.get(), o.subscribe(e)),
16
+ get: s.get,
17
+ subscribe: (e) => (s.get(), s.subscribe(e)),
15
18
  destroy: () => {
16
- c.forEach((e) => e()), o.destroy();
19
+ l.forEach((e) => e()), s.destroy();
17
20
  }
18
21
  };
19
22
  }
@@ -0,0 +1,38 @@
1
+ import { EntityId } from './createEntityAdapter';
2
+ export type EntityChangeListener = () => void;
3
+ export type EntityStoreOptions<T> = {
4
+ selectId?: (entity: T) => EntityId;
5
+ sortComparer?: (a: T, b: T) => number;
6
+ };
7
+ export type EntityStore<T> = {
8
+ selectId: (entity: T) => EntityId;
9
+ getOne: (id: EntityId) => T | undefined;
10
+ getAll: () => T[];
11
+ getIds: () => string[];
12
+ has: (id: EntityId) => boolean;
13
+ size: () => number;
14
+ setOne: (entity: T) => void;
15
+ setMany: (entities: readonly T[]) => void;
16
+ setAll: (entities: readonly T[]) => void;
17
+ addOne: (entity: T) => void;
18
+ addMany: (entities: readonly T[]) => void;
19
+ upsertOne: (entity: T) => void;
20
+ upsertMany: (entities: readonly T[]) => void;
21
+ updateOne: (id: EntityId, changes: Partial<T>) => void;
22
+ updateMany: (updates: readonly {
23
+ id: EntityId;
24
+ changes: Partial<T>;
25
+ }[]) => void;
26
+ removeOne: (id: EntityId) => void;
27
+ removeMany: (ids: readonly EntityId[]) => void;
28
+ removeAll: () => void;
29
+ batch: (fn: () => void) => void;
30
+ subscribeOne: (id: EntityId, listener: EntityChangeListener) => () => void;
31
+ subscribeIds: (listener: EntityChangeListener) => () => void;
32
+ subscribeAll: (listener: EntityChangeListener) => () => void;
33
+ useOne: (id: EntityId) => T | undefined;
34
+ useIds: () => string[];
35
+ useAll: () => T[];
36
+ destroy: () => void;
37
+ };
38
+ export declare function createEntityStore<T>(initialEntities?: readonly T[], options?: EntityStoreOptions<T>): EntityStore<T>;