@plitzi/nexus 0.31.2 → 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 (36) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/async/createAsync.mjs +8 -1
  3. package/dist/createStore/createStore.d.ts +4 -45
  4. package/dist/createStore/createStore.mjs +29 -16
  5. package/dist/createStore/helpers/PathTrie.d.ts +2 -0
  6. package/dist/createStore/helpers/PathTrie.mjs +55 -20
  7. package/dist/createStore/helpers/createChainReads.d.ts +1 -1
  8. package/dist/createStore/helpers/createChainReads.mjs +12 -13
  9. package/dist/createStore/helpers/createSetState.mjs +24 -33
  10. package/dist/createStore/hooks/shared.d.ts +1 -2
  11. package/dist/createStore/hooks/shared.mjs +7 -18
  12. package/dist/createStore/hooks/useStore.d.ts +4 -49
  13. package/dist/createStore/hooks/useStore.mjs +19 -27
  14. package/dist/createStore/hooks/useStoreGetter.d.ts +2 -5
  15. package/dist/createStore/hooks/useStoreGetter.mjs +19 -22
  16. package/dist/createStore/hooks/useStoreSetter.mjs +2 -4
  17. package/dist/derived/createDerived.d.ts +1 -1
  18. package/dist/derived/createDerived.mjs +12 -9
  19. package/dist/entities/createEntityStore.d.ts +38 -0
  20. package/dist/entities/createEntityStore.mjs +102 -0
  21. package/dist/entities/index.d.ts +2 -0
  22. package/dist/entities/index.mjs +2 -1
  23. package/dist/index.mjs +11 -10
  24. package/dist/middleware/historyMiddleware.d.ts +3 -3
  25. package/dist/middleware/historyMiddleware.mjs +22 -17
  26. package/dist/middleware/index.d.ts +1 -1
  27. package/dist/middleware/isDisabled.d.ts +2 -0
  28. package/dist/middleware/isDisabled.mjs +4 -0
  29. package/dist/middleware/loggerMiddleware.d.ts +2 -2
  30. package/dist/middleware/loggerMiddleware.mjs +14 -15
  31. package/dist/middleware/persistMiddleware.d.ts +7 -5
  32. package/dist/middleware/persistMiddleware.mjs +56 -28
  33. package/dist/middleware/reduxDevToolsMiddleware.d.ts +2 -2
  34. package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -21
  35. package/dist/types/StoreTypes.d.ts +31 -21
  36. package/package.json +9 -1
@@ -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>;
@@ -0,0 +1,102 @@
1
+ import e from "../createStore/helpers/Subscribers.mjs";
2
+ import { useCallback as t, useSyncExternalStore as n } from "react";
3
+ //#region src/entities/createEntityStore.ts
4
+ function r(r = [], i = {}) {
5
+ let a = i.selectId ?? ((e) => e.id), o = i.sortComparer, s = (e) => String(a(e)), c = /* @__PURE__ */ new Map();
6
+ for (let e of r) c.set(s(e), e);
7
+ let l = /* @__PURE__ */ new Map(), u = new e(), d = new e(), f, p, m = 0, h = /* @__PURE__ */ new Set(), g = !1, _ = !1, v = (e) => {
8
+ e && e.length > 0 && e.forEach((e) => e());
9
+ }, y = (e, t) => {
10
+ if (t && (f = void 0), p = void 0, m > 0) {
11
+ h.add(e), g ||= t, _ = !0;
12
+ return;
13
+ }
14
+ v(l.get(e)), t && v(u), v(d);
15
+ }, b = () => {
16
+ let e = [...h], t = g, n = _;
17
+ h.clear(), g = !1, _ = !1;
18
+ for (let t of e) v(l.get(t));
19
+ t && v(u), n && v(d);
20
+ }, x = (e) => {
21
+ m++;
22
+ try {
23
+ e();
24
+ } finally {
25
+ m--, m === 0 && _ && b();
26
+ }
27
+ }, S = (e, t, n) => {
28
+ let r = s(e), i = c.get(r), a = i === void 0;
29
+ if (t && !a) return;
30
+ let o = n && !a ? {
31
+ ...i,
32
+ ...e
33
+ } : e;
34
+ o !== i && (c.set(r, o), y(r, a));
35
+ }, C = (e) => {
36
+ S(e, !1, !1);
37
+ }, w = (e) => {
38
+ S(e, !0, !1);
39
+ }, T = (e) => {
40
+ S(e, !1, !0);
41
+ }, E = (e, t) => {
42
+ let n = String(e), r = c.get(n);
43
+ r !== void 0 && (c.set(n, {
44
+ ...r,
45
+ ...t
46
+ }), y(n, !1));
47
+ }, D = (e) => {
48
+ let t = String(e);
49
+ c.has(t) && (c.delete(t), y(t, !0));
50
+ }, O = (e) => c.get(String(e)), k = () => f ??= [...c.keys()], A = () => {
51
+ if (p === void 0) {
52
+ let e = [...c.values()];
53
+ p = o ? e.sort(o) : e;
54
+ }
55
+ return p;
56
+ }, j = (t, n) => {
57
+ let r = String(t), i = l.get(r);
58
+ i || (i = new e(), l.set(r, i));
59
+ let a = i, o = a.add(n);
60
+ return () => {
61
+ o(), a.length === 0 && l.get(r) === a && l.delete(r);
62
+ };
63
+ }, M = (e) => u.add(e), N = (e) => d.add(e);
64
+ return {
65
+ selectId: a,
66
+ getOne: O,
67
+ getIds: k,
68
+ getAll: A,
69
+ has: (e) => c.has(String(e)),
70
+ size: () => c.size,
71
+ setOne: C,
72
+ setMany: (e) => x(() => e.forEach(C)),
73
+ setAll: (e) => x(() => {
74
+ for (let e of [...c.keys()]) D(e);
75
+ e.forEach(C);
76
+ }),
77
+ addOne: w,
78
+ addMany: (e) => x(() => e.forEach(w)),
79
+ upsertOne: T,
80
+ upsertMany: (e) => x(() => e.forEach(T)),
81
+ updateOne: E,
82
+ updateMany: (e) => x(() => e.forEach(({ id: e, changes: t }) => E(e, t))),
83
+ removeOne: D,
84
+ removeMany: (e) => x(() => e.forEach(D)),
85
+ removeAll: () => x(() => [...c.keys()].forEach(D)),
86
+ batch: x,
87
+ subscribeOne: j,
88
+ subscribeIds: M,
89
+ subscribeAll: N,
90
+ useOne: (e) => {
91
+ let r = String(e), i = t((e) => j(r, e), [r]), a = t(() => c.get(r), [r]);
92
+ return n(i, a, a);
93
+ },
94
+ useIds: () => n(M, k, k),
95
+ useAll: () => n(N, A, A),
96
+ destroy: () => {
97
+ c.clear(), l.clear(), u.clear(), d.clear(), f = void 0, p = void 0;
98
+ }
99
+ };
100
+ }
101
+ //#endregion
102
+ export { r as createEntityStore };
@@ -1,2 +1,4 @@
1
1
  export { createEntityAdapter } from './createEntityAdapter';
2
+ export { createEntityStore } from './createEntityStore';
2
3
  export type { EntityAdapter, EntityAdapterOptions, EntityId, EntityMap, EntityUpdate, EntityUpdater } from './createEntityAdapter';
4
+ export type { EntityStore, EntityStoreOptions, EntityChangeListener } from './createEntityStore';
@@ -1,2 +1,3 @@
1
1
  import { createEntityAdapter as e } from "./createEntityAdapter.mjs";
2
- export { e as createEntityAdapter };
2
+ import { createEntityStore as t } from "./createEntityStore.mjs";
3
+ export { e as createEntityAdapter, t as createEntityStore };
package/dist/index.mjs CHANGED
@@ -10,13 +10,14 @@ import l from "./createStore/index.mjs";
10
10
  import { createDerived as u } from "./derived/createDerived.mjs";
11
11
  import { useDerived as d } from "./derived/hooks/useDerived.mjs";
12
12
  import { createEntityAdapter as f } from "./entities/createEntityAdapter.mjs";
13
- import { getStoreHistory as p, historyMiddleware as m } from "./middleware/historyMiddleware.mjs";
14
- import { useStoreHistory as h } from "./history/hooks/useStoreHistory.mjs";
15
- import g from "./createStore/hooks/useStoreById.mjs";
16
- import { createServerSnapshot as _, isServerSnapshot as v } from "./rsc/index.mjs";
17
- import y from "./StoreProvider.mjs";
18
- import { loggerMiddleware as b } from "./middleware/loggerMiddleware.mjs";
19
- import { persistMiddleware as x } from "./middleware/persistMiddleware.mjs";
20
- import { reduxDevToolsMiddleware as S } from "./middleware/reduxDevToolsMiddleware.mjs";
21
- import { cascade as C } from "./middleware/cascade.mjs";
22
- export { i as CANCEL, a as StoreContext, y as StoreProvider, o as StoreRegistryContext, C as cascade, e as createAsync, u as createDerived, f as createEntityAdapter, _ as createServerSnapshot, l as createStore, c as createStoreHook, p as getStoreHistory, m as historyMiddleware, v as isServerSnapshot, b as loggerMiddleware, x as persistMiddleware, S as reduxDevToolsMiddleware, r as setCodegenEnabled, t as useAsync, n as useAsyncValue, d as useDerived, g as useStoreById, h as useStoreHistory, s as useStoreSetter };
13
+ import { createEntityStore as p } from "./entities/createEntityStore.mjs";
14
+ import { getStoreHistory as m, historyMiddleware as h } from "./middleware/historyMiddleware.mjs";
15
+ import { useStoreHistory as g } from "./history/hooks/useStoreHistory.mjs";
16
+ import _ from "./createStore/hooks/useStoreById.mjs";
17
+ import { createServerSnapshot as v, isServerSnapshot as y } from "./rsc/index.mjs";
18
+ import b from "./StoreProvider.mjs";
19
+ import { loggerMiddleware as x } from "./middleware/loggerMiddleware.mjs";
20
+ import { persistMiddleware as S } from "./middleware/persistMiddleware.mjs";
21
+ import { reduxDevToolsMiddleware as C } from "./middleware/reduxDevToolsMiddleware.mjs";
22
+ import { cascade as w } from "./middleware/cascade.mjs";
23
+ export { i as CANCEL, a as StoreContext, b as StoreProvider, o as StoreRegistryContext, w as cascade, e as createAsync, u as createDerived, f as createEntityAdapter, p as createEntityStore, v as createServerSnapshot, l as createStore, c as createStoreHook, m as getStoreHistory, h as historyMiddleware, y as isServerSnapshot, x as loggerMiddleware, S as persistMiddleware, C as reduxDevToolsMiddleware, r as setCodegenEnabled, t as useAsync, n as useAsyncValue, d as useDerived, _ as useStoreById, g as useStoreHistory, s as useStoreSetter };
@@ -1,4 +1,4 @@
1
- import { Path, StoreApi, StoreMiddleware } from '../types';
1
+ import { MiddlewareOptions, Path, StoreApi, StoreMiddleware } from '../types';
2
2
  export type HistoryEntry<TState> = {
3
3
  path?: Path;
4
4
  value?: unknown;
@@ -19,10 +19,10 @@ export type StoreHistory<TState> = {
19
19
  travelTo: (index: number) => void;
20
20
  clear: () => void;
21
21
  };
22
- export type StoreHistoryOptions = {
22
+ export type StoreHistoryOptions<TState extends object = object> = MiddlewareOptions<TState> & {
23
23
  limit?: number;
24
24
  path?: Path;
25
25
  shouldRecord?: (changedPath: Path | undefined) => boolean;
26
26
  };
27
27
  export declare function getStoreHistory<TState extends object>(store: StoreApi<TState>): StoreHistory<TState> | undefined;
28
- export declare const historyMiddleware: <TState extends object>(options?: StoreHistoryOptions) => StoreMiddleware<TState>;
28
+ export declare const historyMiddleware: <TState extends object>(options?: StoreHistoryOptions<TState>) => StoreMiddleware<TState>;
@@ -1,16 +1,17 @@
1
1
  import { isPlainObject as e } from "../createStore/helpers/deepMerge.mjs";
2
2
  import t from "../helpers/getByPath.mjs";
3
- import n from "../helpers/isPathAffected.mjs";
3
+ import { isDisabled as n } from "./isDisabled.mjs";
4
+ import r from "../helpers/isPathAffected.mjs";
4
5
  //#region src/middleware/historyMiddleware.ts
5
- var r = (t, n, i = 12) => {
6
+ var i = (t, n, r = 12) => {
6
7
  if (!Object.is(t, n)) {
7
- if (i <= 0 || !e(t) || !e(n)) return {
8
+ if (r <= 0 || !e(t) || !e(n)) return {
8
9
  path: "",
9
10
  value: n
10
11
  };
11
12
  for (let e of new Set([...Object.keys(t), ...Object.keys(n)])) {
12
13
  if (Object.is(t[e], n[e])) continue;
13
- let a = r(t[e], n[e], i - 1);
14
+ let a = i(t[e], n[e], r - 1);
14
15
  if (a) return {
15
16
  path: a.path ? `${e}.${a.path}` : e,
16
17
  value: a.value
@@ -18,8 +19,8 @@ var r = (t, n, i = 12) => {
18
19
  }
19
20
  }
20
21
  };
21
- function i(e, i = {}) {
22
- let a = i.limit ?? 100, o = i.path, s = i.shouldRecord, c = [{
22
+ function a(e, n = {}) {
23
+ let a = n.limit ?? 100, o = n.path, s = n.shouldRecord, c = [{
23
24
  state: e.getState(),
24
25
  timestamp: Date.now()
25
26
  }], l = 0, u = !1, d = () => ({
@@ -29,11 +30,11 @@ function i(e, i = {}) {
29
30
  canRedo: l < c.length - 1
30
31
  }), f = d(), p = /* @__PURE__ */ new Set(), m = () => {
31
32
  f = d(), p.forEach((e) => e());
32
- }, h = ({ path: i }) => {
33
- if (u || s && !s(i) || o && i !== void 0 && !n(i, o)) return;
34
- let d = l < c.length - 1 ? c.slice(0, l + 1) : c, f = d[d.length - 1].state, p = e.getState(), h = i ?? o, g, _ = i ?? o;
33
+ }, h = ({ path: n }) => {
34
+ if (u || s && !s(n) || o && n !== void 0 && !r(n, o)) return;
35
+ let d = l < c.length - 1 ? c.slice(0, l + 1) : c, f = d[d.length - 1].state, p = e.getState(), h = n ?? o, g, _ = n ?? o;
35
36
  if (_) try {
36
- let e = r(t(f, _), t(p, _));
37
+ let e = i(t(f, _), t(p, _));
37
38
  e && (h = e.path ? `${_}.${e.path}` : _, g = e.value);
38
39
  } catch {}
39
40
  let v = [...d, {
@@ -69,13 +70,17 @@ function i(e, i = {}) {
69
70
  record: h
70
71
  };
71
72
  }
72
- var a = /* @__PURE__ */ new WeakMap();
73
- function o(e) {
74
- return a.get(e);
73
+ var o = /* @__PURE__ */ new WeakMap();
74
+ function s(e) {
75
+ return o.get(e);
75
76
  }
76
- var s = (e) => (t) => {
77
- let { handle: n, record: r } = i(t, e);
78
- return a.set(t, n), { onChange: r };
77
+ var c = (e) => {
78
+ let t = e?.enabled;
79
+ return (r) => {
80
+ if (n(t, r.getState())) return;
81
+ let { handle: i, record: s } = a(r, e);
82
+ return o.set(r, i), { onChange: s };
83
+ };
79
84
  };
80
85
  //#endregion
81
- export { o as getStoreHistory, s as historyMiddleware };
86
+ export { s as getStoreHistory, c as historyMiddleware };
@@ -4,5 +4,5 @@ export { historyMiddleware } from './historyMiddleware';
4
4
  export { reduxDevToolsMiddleware } from './reduxDevToolsMiddleware';
5
5
  export { cascade } from './cascade';
6
6
  export type { LoggerOptions } from './loggerMiddleware';
7
- export type { PersistOptions, PersistStorage } from './persistMiddleware';
7
+ export type { PersistOptions, PersistStorage, PersistTarget, PersistTargetOption } from './persistMiddleware';
8
8
  export type { ReduxDevToolsOptions } from './reduxDevToolsMiddleware';
@@ -0,0 +1,2 @@
1
+ import { MiddlewareOptions } from '../types';
2
+ export declare const isDisabled: <T extends object>(enabled: MiddlewareOptions<T>["enabled"], state: T) => boolean;
@@ -0,0 +1,4 @@
1
+ //#region src/middleware/isDisabled.ts
2
+ var e = (e, t) => typeof e == "function" ? !e(t) : e === !1;
3
+ //#endregion
4
+ export { e as isDisabled };
@@ -1,5 +1,5 @@
1
- import { StoreChange, StoreError, StoreMiddleware } from '../types';
2
- export type LoggerOptions<TState extends object> = {
1
+ import { MiddlewareOptions, StoreChange, StoreError, StoreMiddleware } from '../types';
2
+ export type LoggerOptions<TState extends object> = MiddlewareOptions<TState> & {
3
3
  filter?: (change: StoreChange<TState>) => boolean;
4
4
  sink?: (change: StoreChange<TState>) => void;
5
5
  errorSink?: (failure: StoreError<TState>) => void;
@@ -1,20 +1,19 @@
1
+ import { isDisabled as e } from "./isDisabled.mjs";
1
2
  //#region src/middleware/loggerMiddleware.ts
2
- var e = (e) => {
3
+ var t = (e) => {
3
4
  console.log("[store]", e.path ?? "(root)", e.next);
4
- }, t = (e) => {
5
+ }, n = (e) => {
5
6
  console.error("[store]", `${e.phase} error at`, e.path ?? "(root)", e.error);
6
- }, n = (n = {}) => {
7
- let { filter: r, sink: i = e, errorSink: a = t } = typeof n == "function" ? {
8
- filter: void 0,
9
- sink: n,
10
- errorSink: t
11
- } : n;
12
- return () => ({
13
- onChange: (e) => {
14
- (!r || r(e)) && i(e);
15
- },
16
- onError: a
17
- });
7
+ }, r = (r = {}) => {
8
+ let { filter: i, sink: a = t, errorSink: o = n, enabled: s } = typeof r == "function" ? { sink: r } : r;
9
+ return (t) => {
10
+ if (!e(s, t.getState())) return {
11
+ onChange: (e) => {
12
+ (!i || i(e)) && a(e);
13
+ },
14
+ onError: o
15
+ };
16
+ };
18
17
  };
19
18
  //#endregion
20
- export { n as loggerMiddleware };
19
+ export { r as loggerMiddleware };
@@ -1,16 +1,18 @@
1
- import { StoreMiddleware } from '../types';
1
+ import { MiddlewareOptions, PathOf, StoreMiddleware } from '../types';
2
2
  export type PersistStorage = {
3
3
  getItem: (key: string) => string | null;
4
4
  setItem: (key: string, value: string) => void;
5
5
  removeItem: (key: string) => void;
6
6
  };
7
- export type PersistOptions<TState extends object> = {
7
+ export type PersistTarget = PersistStorage | 'local' | 'session';
8
+ export type PersistTargetOption<TState extends object> = PersistTarget | ((state: TState) => PersistTarget | false);
9
+ export type PersistOptions<TState extends object> = MiddlewareOptions<TState> & {
8
10
  key: string;
9
- storage?: PersistStorage;
11
+ storage?: PersistTargetOption<TState>;
12
+ paths?: ReadonlyArray<PathOf<TState>>;
10
13
  partialize?: (state: TState) => Partial<TState>;
11
14
  version?: number;
12
- migrate?: (persisted: unknown, version: number) => Partial<TState>;
15
+ migrate?: (persisted: unknown, version: number) => unknown;
13
16
  merge?: (persisted: Partial<TState>, current: TState) => Partial<TState>;
14
- debounce?: number;
15
17
  };
16
18
  export declare const persistMiddleware: <TState extends object>(options: PersistOptions<TState>) => StoreMiddleware<TState>;
@@ -1,40 +1,68 @@
1
+ import e from "../helpers/getByPath.mjs";
2
+ import { isDisabled as t } from "./isDisabled.mjs";
3
+ import n from "../helpers/isPathAffected.mjs";
1
4
  //#region src/middleware/persistMiddleware.ts
2
- var e = {
3
- getItem: () => null,
4
- setItem: () => {},
5
- removeItem: () => {}
6
- }, t = () => typeof localStorage < "u" ? localStorage : e, n = (e) => {
7
- let { key: n, storage: i = t(), partialize: a, version: o = 0, migrate: s, merge: c, debounce: l = 0 } = e, u = (e) => {
8
- let t = e.getState(), r = {
9
- version: o,
10
- state: a ? a(t) : t
5
+ var r = (e = "local") => {
6
+ if (typeof e != "string") return e;
7
+ try {
8
+ return e === "session" ? globalThis.sessionStorage : globalThis.localStorage;
9
+ } catch {
10
+ return;
11
+ }
12
+ }, i = (i) => {
13
+ let { key: o, storage: s, paths: c, partialize: l, version: u = 0, migrate: d, merge: f, enabled: p } = i, m = typeof s == "function" ? s : void 0, h = typeof s == "function" ? void 0 : r(s);
14
+ if (!m && !h) return () => void 0;
15
+ let g = (e) => {
16
+ if (!m) return h;
17
+ let t = m(e);
18
+ return t ? r(t) : void 0;
19
+ }, _ = (t) => {
20
+ if (c) {
21
+ let n = {};
22
+ for (let r of c) n[r] = e(t, r);
23
+ return n;
24
+ }
25
+ return l ? l(t) : t;
26
+ }, v = (e) => {
27
+ let t = e.getState(), n = g(t);
28
+ if (!n) return;
29
+ let r = {
30
+ version: u,
31
+ state: _(t)
11
32
  };
12
- i.setItem(n, JSON.stringify(r));
13
- };
33
+ n.setItem(o, JSON.stringify(r));
34
+ }, y = (e) => !c || c.some((t) => n(e, t));
14
35
  return (e) => {
15
- let t;
36
+ if (t(p, e.getState())) return;
37
+ let n = !1, r = () => {
38
+ if (n) return;
39
+ let t = g(e.getState());
40
+ t && (n = !0, a(e, o, t, u, c, d, f));
41
+ };
16
42
  return {
17
- hydrate: (e) => {
18
- r(e, n, i, o, s, c);
19
- },
20
- onChange: () => {
21
- if (l <= 0) {
22
- u(e);
23
- return;
24
- }
25
- clearTimeout(t), t = setTimeout(() => u(e), l);
43
+ hydrate: r,
44
+ onChange: (t) => {
45
+ r(), y(t.path) && v(e);
26
46
  }
27
47
  };
28
48
  };
29
49
  };
30
- function r(e, t, n, r, i, a) {
31
- let o = n.getItem(t);
32
- if (o) try {
33
- let t = JSON.parse(o), n = t.version !== r && i ? i(t.state, t.version) : t.state;
34
- e.setState(void 0, a ? a(n, e.getState()) : n);
50
+ function a(e, t, n, r, i, a, o) {
51
+ let s = n?.getItem(t);
52
+ if (s) try {
53
+ let t = JSON.parse(s), n = t.version !== r && a ? a(t.state, t.version) : t.state;
54
+ if (i) {
55
+ let t = n;
56
+ e.batch(() => {
57
+ for (let n of i) n in t && e.setState(n, t[n]);
58
+ });
59
+ return;
60
+ }
61
+ let c = n;
62
+ e.setState(void 0, o ? o(c, e.getState()) : c);
35
63
  } catch {
36
- n.removeItem(t);
64
+ n?.removeItem(t);
37
65
  }
38
66
  }
39
67
  //#endregion
40
- export { n as persistMiddleware };
68
+ export { i as persistMiddleware };