@plitzi/nexus 0.31.1

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 (94) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/LICENSE +74 -0
  3. package/README.md +563 -0
  4. package/dist/StoreContext.d.ts +10 -0
  5. package/dist/StoreContext.mjs +11 -0
  6. package/dist/StoreProvider.d.ts +24 -0
  7. package/dist/StoreProvider.mjs +51 -0
  8. package/dist/async/createAsync.d.ts +19 -0
  9. package/dist/async/createAsync.mjs +29 -0
  10. package/dist/async/hooks/useAsync.d.ts +2 -0
  11. package/dist/async/hooks/useAsync.mjs +7 -0
  12. package/dist/async/hooks/useAsyncValue.d.ts +2 -0
  13. package/dist/async/hooks/useAsyncValue.mjs +13 -0
  14. package/dist/async/index.d.ts +4 -0
  15. package/dist/async/index.mjs +4 -0
  16. package/dist/createStore/createStore.d.ts +90 -0
  17. package/dist/createStore/createStore.mjs +104 -0
  18. package/dist/createStore/helpers/PathTrie.d.ts +13 -0
  19. package/dist/createStore/helpers/PathTrie.mjs +43 -0
  20. package/dist/createStore/helpers/Subscribers.d.ts +15 -0
  21. package/dist/createStore/helpers/Subscribers.mjs +59 -0
  22. package/dist/createStore/helpers/createChainReads.d.ts +10 -0
  23. package/dist/createStore/helpers/createChainReads.mjs +37 -0
  24. package/dist/createStore/helpers/createSetState.d.ts +22 -0
  25. package/dist/createStore/helpers/createSetState.mjs +163 -0
  26. package/dist/createStore/helpers/deepMerge.d.ts +2 -0
  27. package/dist/createStore/helpers/deepMerge.mjs +9 -0
  28. package/dist/createStore/helpers/forwardParentChanges.d.ts +7 -0
  29. package/dist/createStore/helpers/forwardParentChanges.mjs +23 -0
  30. package/dist/createStore/helpers/scopeCollisions.d.ts +4 -0
  31. package/dist/createStore/helpers/scopeCollisions.mjs +14 -0
  32. package/dist/createStore/helpers/writeByPath.d.ts +11 -0
  33. package/dist/createStore/helpers/writeByPath.mjs +51 -0
  34. package/dist/createStore/hooks/shared.d.ts +12 -0
  35. package/dist/createStore/hooks/shared.mjs +85 -0
  36. package/dist/createStore/hooks/useStore.d.ts +73 -0
  37. package/dist/createStore/hooks/useStore.mjs +57 -0
  38. package/dist/createStore/hooks/useStoreById.d.ts +3 -0
  39. package/dist/createStore/hooks/useStoreById.mjs +7 -0
  40. package/dist/createStore/hooks/useStoreGetter.d.ts +9 -0
  41. package/dist/createStore/hooks/useStoreGetter.mjs +38 -0
  42. package/dist/createStore/hooks/useStoreSetter.d.ts +5 -0
  43. package/dist/createStore/hooks/useStoreSetter.mjs +11 -0
  44. package/dist/createStore/hooks/useStoreSync.d.ts +7 -0
  45. package/dist/createStore/hooks/useStoreSync.mjs +55 -0
  46. package/dist/createStore/index.d.ts +3 -0
  47. package/dist/createStore/index.mjs +5 -0
  48. package/dist/derived/createDerived.d.ts +10 -0
  49. package/dist/derived/createDerived.mjs +21 -0
  50. package/dist/derived/hooks/useDerived.d.ts +2 -0
  51. package/dist/derived/hooks/useDerived.mjs +7 -0
  52. package/dist/derived/index.d.ts +3 -0
  53. package/dist/derived/index.mjs +3 -0
  54. package/dist/entities/createEntityAdapter.d.ts +32 -0
  55. package/dist/entities/createEntityAdapter.mjs +73 -0
  56. package/dist/entities/index.d.ts +2 -0
  57. package/dist/entities/index.mjs +2 -0
  58. package/dist/helpers/createObservable.d.ts +9 -0
  59. package/dist/helpers/createObservable.mjs +18 -0
  60. package/dist/helpers/getByPath.d.ts +4 -0
  61. package/dist/helpers/getByPath.mjs +40 -0
  62. package/dist/helpers/isPathAffected.d.ts +3 -0
  63. package/dist/helpers/isPathAffected.mjs +4 -0
  64. package/dist/helpers/parsePath.d.ts +2 -0
  65. package/dist/helpers/parsePath.mjs +7 -0
  66. package/dist/helpers/setByPath.d.ts +3 -0
  67. package/dist/helpers/setByPath.mjs +19 -0
  68. package/dist/helpers/shallowEqual.d.ts +2 -0
  69. package/dist/helpers/shallowEqual.mjs +11 -0
  70. package/dist/helpers/useIsomorphicLayoutEffect.d.ts +3 -0
  71. package/dist/helpers/useIsomorphicLayoutEffect.mjs +5 -0
  72. package/dist/history/hooks/useStoreHistory.d.ts +8 -0
  73. package/dist/history/hooks/useStoreHistory.mjs +24 -0
  74. package/dist/history/index.d.ts +4 -0
  75. package/dist/history/index.mjs +3 -0
  76. package/dist/index.d.ts +16 -0
  77. package/dist/index.mjs +21 -0
  78. package/dist/middleware/cascade.d.ts +2 -0
  79. package/dist/middleware/cascade.mjs +4 -0
  80. package/dist/middleware/historyMiddleware.d.ts +28 -0
  81. package/dist/middleware/historyMiddleware.mjs +81 -0
  82. package/dist/middleware/index.d.ts +8 -0
  83. package/dist/middleware/index.mjs +6 -0
  84. package/dist/middleware/loggerMiddleware.d.ts +7 -0
  85. package/dist/middleware/loggerMiddleware.mjs +20 -0
  86. package/dist/middleware/persistMiddleware.d.ts +16 -0
  87. package/dist/middleware/persistMiddleware.mjs +36 -0
  88. package/dist/middleware/reduxDevToolsMiddleware.d.ts +6 -0
  89. package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -0
  90. package/dist/types/StoreTypes.d.ts +143 -0
  91. package/dist/types/StoreTypes.mjs +4 -0
  92. package/dist/types/index.d.ts +1 -0
  93. package/dist/types/index.mjs +2 -0
  94. package/package.json +257 -0
@@ -0,0 +1,55 @@
1
+ import { useResolvedStore as e } from "./shared.mjs";
2
+ import t from "../../helpers/shallowEqual.mjs";
3
+ import n from "../../helpers/useIsomorphicLayoutEffect.mjs";
4
+ import { useRef as r } from "react";
5
+ //#region src/createStore/hooks/useStoreSync.ts
6
+ function i(e, t, i, a) {
7
+ let { mode: o = "sync", enabled: s = !0, syncStrategy: c = "afterRender" } = a, l = t.map((e, t) => typeof e == "function" ? `fn_${t}` : e).join("|"), u = r(!1), d = !u.current;
8
+ u.current = !0;
9
+ let f = r(void 0), p = s && (d || o === "sync" && i.some((e, t) => !Object.is(f.current?.[t], e))), m = () => {
10
+ f.current = i, e.batch(() => {
11
+ t.forEach((t, n) => {
12
+ let r = typeof t == "function" ? t(e.getState()) : t;
13
+ e.setState(r, i[n]);
14
+ });
15
+ });
16
+ };
17
+ c === "render" ? p && m() : (p && d && m(), n(() => {
18
+ p && !d && m();
19
+ }, [
20
+ p,
21
+ i,
22
+ l
23
+ ]));
24
+ }
25
+ function a(e, i, a, o) {
26
+ let s = i === void 0, c = typeof i == "function", l = s ? t : Object.is, { mode: u = "sync", enabled: d = !0, equalityFn: f = l, syncStrategy: p = "afterRender" } = o, m = r(void 0), h = r(!1), g = !h.current;
27
+ h.current = !0;
28
+ let _ = m.current, v = d && (g || u === "sync" && (_ === void 0 || !f(_, a))), y = (t = !0) => {
29
+ if (m.current = a, s) e.setState(void 0, (e) => ({
30
+ ...e,
31
+ ...a
32
+ }), t);
33
+ else if (c) {
34
+ let n = i(e.getState());
35
+ e.setState(n, a, t);
36
+ } else e.setState(i, a, t);
37
+ };
38
+ p === "render" ? v && y() : (v && g && y(!1), n(() => {
39
+ v && !g && y();
40
+ }, [
41
+ v,
42
+ a,
43
+ i
44
+ ]));
45
+ }
46
+ function o(t, n, r = {}) {
47
+ let o = r, s = e(o.store, "useStoreSync", o.storeId);
48
+ if (Array.isArray(t)) {
49
+ i(s, t, n, r);
50
+ return;
51
+ }
52
+ a(s, t, n, r);
53
+ }
54
+ //#endregion
55
+ export { o as default };
@@ -0,0 +1,3 @@
1
+ import { default as createStore } from './createStore';
2
+ export * from './createStore';
3
+ export default createStore;
@@ -0,0 +1,5 @@
1
+ import e, { createStoreHook as t } from "./createStore.mjs";
2
+ //#region src/createStore/index.ts
3
+ var n = e;
4
+ //#endregion
5
+ export { t as createStoreHook, n as default };
@@ -0,0 +1,10 @@
1
+ import { PathOf, PathValues, StoreApi } from '../types';
2
+ export type Derived<R> = {
3
+ get: () => R;
4
+ subscribe: (listener: () => void) => () => void;
5
+ destroy: () => void;
6
+ };
7
+ export type DerivedOptions<R> = {
8
+ equalityFn?: (a: R, b: R) => boolean;
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>;
@@ -0,0 +1,21 @@
1
+ import { createObservable as e } from "../helpers/createObservable.mjs";
2
+ //#region src/derived/createDerived.ts
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();
7
+ return;
8
+ }
9
+ let e = o.get();
10
+ o.invalidate(), a(e, o.get()) || o.notify();
11
+ }, c = n.map((e) => t.subscribePath(e, s));
12
+ return {
13
+ get: o.get,
14
+ subscribe: (e) => (o.get(), o.subscribe(e)),
15
+ destroy: () => {
16
+ c.forEach((e) => e()), o.destroy();
17
+ }
18
+ };
19
+ }
20
+ //#endregion
21
+ export { t as createDerived };
@@ -0,0 +1,2 @@
1
+ import { Derived } from '../createDerived';
2
+ export declare function useDerived<R>(derived: Derived<R>): R;
@@ -0,0 +1,7 @@
1
+ import { useSyncExternalStore as e } from "react";
2
+ //#region src/derived/hooks/useDerived.ts
3
+ function t(t) {
4
+ return e(t.subscribe, t.get, t.get);
5
+ }
6
+ //#endregion
7
+ export { t as useDerived };
@@ -0,0 +1,3 @@
1
+ export { createDerived } from './createDerived';
2
+ export { useDerived } from './hooks/useDerived';
3
+ export type { Derived, DerivedOptions } from './createDerived';
@@ -0,0 +1,3 @@
1
+ import { createDerived as e } from "./createDerived.mjs";
2
+ import { useDerived as t } from "./hooks/useDerived.mjs";
3
+ export { e as createDerived, t as useDerived };
@@ -0,0 +1,32 @@
1
+ export type EntityId = string | number;
2
+ export type EntityMap<T> = Record<string, T>;
3
+ export type EntityUpdate<T> = {
4
+ id: EntityId;
5
+ changes: Partial<T>;
6
+ };
7
+ export type EntityUpdater<T> = (map: EntityMap<T>) => EntityMap<T>;
8
+ export type EntityAdapter<T> = {
9
+ getInitialState: () => EntityMap<T>;
10
+ selectId: (entity: T) => EntityId;
11
+ addOne: (entity: T) => EntityUpdater<T>;
12
+ addMany: (entities: readonly T[]) => EntityUpdater<T>;
13
+ setOne: (entity: T) => EntityUpdater<T>;
14
+ setMany: (entities: readonly T[]) => EntityUpdater<T>;
15
+ setAll: (entities: readonly T[]) => EntityUpdater<T>;
16
+ updateOne: (update: EntityUpdate<T>) => EntityUpdater<T>;
17
+ updateMany: (updates: readonly EntityUpdate<T>[]) => EntityUpdater<T>;
18
+ upsertOne: (entity: T) => EntityUpdater<T>;
19
+ upsertMany: (entities: readonly T[]) => EntityUpdater<T>;
20
+ removeOne: (id: EntityId) => EntityUpdater<T>;
21
+ removeMany: (ids: readonly EntityId[]) => EntityUpdater<T>;
22
+ removeAll: () => EntityUpdater<T>;
23
+ selectIds: (map: EntityMap<T>) => string[];
24
+ selectAll: (map: EntityMap<T>) => T[];
25
+ selectById: (map: EntityMap<T>, id: EntityId) => T | undefined;
26
+ selectTotal: (map: EntityMap<T>) => number;
27
+ };
28
+ export type EntityAdapterOptions<T> = {
29
+ selectId?: (entity: T) => EntityId;
30
+ sortComparer?: (a: T, b: T) => number;
31
+ };
32
+ export declare function createEntityAdapter<T>(options?: EntityAdapterOptions<T>): EntityAdapter<T>;
@@ -0,0 +1,73 @@
1
+ //#region src/entities/createEntityAdapter.ts
2
+ function e(e = {}) {
3
+ let t = e.selectId ?? ((e) => e.id), n = e.sortComparer, r = (e) => String(t(e)), i = (e, t) => (n) => {
4
+ if (e.length === 0) return n;
5
+ let i = { ...n }, a = !1;
6
+ for (let n of e) {
7
+ let e = r(n);
8
+ t && e in i || (i[e] = n, a = !0);
9
+ }
10
+ return a ? i : n;
11
+ }, a = (e) => (t) => {
12
+ let n = t;
13
+ for (let { id: r, changes: i } of e) {
14
+ let e = String(r), a = n[e];
15
+ a && (n === t && (n = { ...t }), n[e] = {
16
+ ...a,
17
+ ...i
18
+ });
19
+ }
20
+ return n;
21
+ }, o = (e) => {
22
+ let t = Object.values(e);
23
+ return n ? t.sort(n) : t;
24
+ };
25
+ return {
26
+ getInitialState: () => ({}),
27
+ selectId: t,
28
+ addOne: (e) => i([e], !0),
29
+ addMany: (e) => i(e, !0),
30
+ setOne: (e) => i([e], !1),
31
+ setMany: (e) => i(e, !1),
32
+ setAll: (e) => () => i(e, !1)({}),
33
+ updateOne: (e) => a([e]),
34
+ updateMany: (e) => a(e),
35
+ upsertOne: (e) => (t) => {
36
+ let n = r(e), i = t[n];
37
+ return {
38
+ ...t,
39
+ [n]: i ? {
40
+ ...i,
41
+ ...e
42
+ } : e
43
+ };
44
+ },
45
+ upsertMany: (e) => (t) => {
46
+ if (e.length === 0) return t;
47
+ let n = { ...t };
48
+ for (let t of e) {
49
+ let e = r(t);
50
+ n[e] = n[e] ? {
51
+ ...n[e],
52
+ ...t
53
+ } : t;
54
+ }
55
+ return n;
56
+ },
57
+ removeOne: (e) => (t) => {
58
+ let n = String(e);
59
+ return n in t ? Object.fromEntries(Object.entries(t).filter(([e]) => e !== n)) : t;
60
+ },
61
+ removeMany: (e) => (t) => {
62
+ let n = new Set(e.map(String));
63
+ return Object.keys(t).some((e) => n.has(e)) ? Object.fromEntries(Object.entries(t).filter(([e]) => !n.has(e))) : t;
64
+ },
65
+ removeAll: () => () => ({}),
66
+ selectIds: (e) => n ? o(e).map(r) : Object.keys(e),
67
+ selectAll: o,
68
+ selectById: (e, t) => e[String(t)],
69
+ selectTotal: (e) => Object.keys(e).length
70
+ };
71
+ }
72
+ //#endregion
73
+ export { e as createEntityAdapter };
@@ -0,0 +1,2 @@
1
+ export { createEntityAdapter } from './createEntityAdapter';
2
+ export type { EntityAdapter, EntityAdapterOptions, EntityId, EntityMap, EntityUpdate, EntityUpdater } from './createEntityAdapter';
@@ -0,0 +1,2 @@
1
+ import { createEntityAdapter as e } from "./createEntityAdapter.mjs";
2
+ export { e as createEntityAdapter };
@@ -0,0 +1,9 @@
1
+ export type Observable<T> = {
2
+ get: () => T;
3
+ invalidate: () => void;
4
+ notify: () => void;
5
+ subscribe: (listener: () => void) => () => void;
6
+ hasListeners: () => boolean;
7
+ destroy: () => void;
8
+ };
9
+ export declare function createObservable<T>(compute: () => T): Observable<T>;
@@ -0,0 +1,18 @@
1
+ //#region src/helpers/createObservable.ts
2
+ function e(e) {
3
+ let t = /* @__PURE__ */ new Set(), n, r = !0;
4
+ return {
5
+ get: () => (r &&= (n = e(), !1), n),
6
+ invalidate: () => {
7
+ r = !0;
8
+ },
9
+ notify: () => {
10
+ t.forEach((e) => e());
11
+ },
12
+ subscribe: (e) => (t.add(e), () => t.delete(e)),
13
+ hasListeners: () => t.size > 0,
14
+ destroy: () => t.clear()
15
+ };
16
+ }
17
+ //#endregion
18
+ export { e as createObservable };
@@ -0,0 +1,4 @@
1
+ import { PathOf, PathValue } from '../types';
2
+ declare function getByPath<TState, P extends '' | undefined | []>(obj: TState, path: P): TState | undefined;
3
+ declare function getByPath<TState, P extends PathOf<TState> | PathOf<TState>[]>(obj: TState, path: P): PathValue<TState, P> | undefined;
4
+ export default getByPath;
@@ -0,0 +1,40 @@
1
+ import e from "./parsePath.mjs";
2
+ //#region src/helpers/getByPath.ts
3
+ var t = /* @__PURE__ */ new Map(), n = 512, r = (e) => {
4
+ if (e.length === 1) {
5
+ let t = e[0];
6
+ return (e) => typeof e == "object" && e && t in e ? e[t] : void 0;
7
+ }
8
+ return (t) => {
9
+ let n = t;
10
+ for (let t = 0; t < e.length; t++) {
11
+ if (typeof n != "object" || !n) return;
12
+ n = n[e[t]];
13
+ }
14
+ return n;
15
+ };
16
+ }, i = (i) => {
17
+ let a = t.get(i);
18
+ if (!a) {
19
+ if (a = r(e(i)), t.size >= n) {
20
+ let e = t.keys().next().value;
21
+ t.delete(e);
22
+ }
23
+ t.set(i, a);
24
+ }
25
+ return a;
26
+ };
27
+ function a(e, t) {
28
+ let n = Array.isArray(t);
29
+ if (typeof t != "string" && !n || n && !t.length || typeof t == "string" && !t) return e;
30
+ if (typeof t == "string" && t.indexOf(".") === -1) return typeof e == "object" && e && t in e ? e[t] : void 0;
31
+ if (typeof t == "string") return i(t)(e);
32
+ let r = e;
33
+ for (let e of t) {
34
+ if (typeof r != "object" || !r || !(e in r)) return;
35
+ r = r[e];
36
+ }
37
+ return r;
38
+ }
39
+ //#endregion
40
+ export { a as default };
@@ -0,0 +1,3 @@
1
+ import { Path } from '../types';
2
+ declare const isPathAffected: (changed: Path | undefined, candidate: Path) => boolean;
3
+ export default isPathAffected;
@@ -0,0 +1,4 @@
1
+ //#region src/helpers/isPathAffected.ts
2
+ var e = (e, t) => typeof e != "string" || e === t || e.length > t.length && e.startsWith(t) && e[t.length] === "." || t.length > e.length && t.startsWith(e) && t[e.length] === ".";
3
+ //#endregion
4
+ export { e as default };
@@ -0,0 +1,2 @@
1
+ declare const parsePath: (path: string) => string[];
2
+ export default parsePath;
@@ -0,0 +1,7 @@
1
+ //#region src/helpers/parsePath.ts
2
+ var e = /* @__PURE__ */ new Map(), t = 512, n = (n) => {
3
+ let r = e.get(n);
4
+ return r === void 0 && (r = n.split("."), e.size >= t && e.delete(e.keys().next().value), e.set(n, r)), r;
5
+ };
6
+ //#endregion
7
+ export { n as default };
@@ -0,0 +1,3 @@
1
+ type AnyObject = Record<string | number, any>;
2
+ declare const setByPath: <T extends AnyObject>(obj: T, path: string | (string | number)[], value: any) => T;
3
+ export default setByPath;
@@ -0,0 +1,19 @@
1
+ import e from "./parsePath.mjs";
2
+ //#region src/helpers/setByPath.ts
3
+ var t = (e) => typeof e == "number" ? e : e !== "" && !isNaN(Number(e)) ? Number(e) : e, n = (e) => Array.isArray(e) ? e.slice() : { ...e }, r = (e, i, a, o) => {
4
+ let s = t(i[a]), c = n(e);
5
+ return c[s] = a === i.length - 1 ? o : r(e[s] ?? {}, i, a + 1, o), c;
6
+ }, i = (i, a, o) => {
7
+ if (typeof a == "string") {
8
+ if (!a) return o;
9
+ let s = e(a);
10
+ if (s.length === 1) {
11
+ let e = n(i);
12
+ return e[t(s[0])] = o, e;
13
+ }
14
+ return r(i, s, 0, o);
15
+ }
16
+ return !Array.isArray(a) || !a.length ? o : r(i, a, 0, o);
17
+ };
18
+ //#endregion
19
+ export { i as default };
@@ -0,0 +1,2 @@
1
+ declare const shallowEqual: (a: unknown, b: unknown) => boolean;
2
+ export default shallowEqual;
@@ -0,0 +1,11 @@
1
+ //#region src/helpers/shallowEqual.ts
2
+ var e = (e, t) => {
3
+ if (Object.is(e, t)) return !0;
4
+ if (typeof e != "object" || !e || typeof t != "object" || !t) return !1;
5
+ let n = Object.keys(e), r = Object.keys(t);
6
+ if (n.length !== r.length) return !1;
7
+ for (let r of n) if (!Object.is(e[r], t[r])) return !1;
8
+ return !0;
9
+ };
10
+ //#endregion
11
+ export { e as default };
@@ -0,0 +1,3 @@
1
+ import { useLayoutEffect } from 'react';
2
+ declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
3
+ export default useIsomorphicLayoutEffect;
@@ -0,0 +1,5 @@
1
+ import { useEffect as e, useLayoutEffect as t } from "react";
2
+ //#region src/helpers/useIsomorphicLayoutEffect.ts
3
+ var n = typeof window < "u" ? t : e;
4
+ //#endregion
5
+ export { n as default };
@@ -0,0 +1,8 @@
1
+ import { HistorySnapshot } from '../../middleware/historyMiddleware';
2
+ export type UseStoreHistoryReturn<TState> = HistorySnapshot<TState> & {
3
+ undo: () => void;
4
+ redo: () => void;
5
+ travelTo: (index: number) => void;
6
+ clear: () => void;
7
+ };
8
+ export declare function useStoreHistory<TState extends object>(): UseStoreHistoryReturn<TState>;
@@ -0,0 +1,24 @@
1
+ import { useResolvedStore as e } from "../../createStore/hooks/shared.mjs";
2
+ import { getStoreHistory as t } from "../../middleware/historyMiddleware.mjs";
3
+ import { useEffect as n, useSyncExternalStore as r } from "react";
4
+ //#region src/history/hooks/useStoreHistory.ts
5
+ var i = {
6
+ entries: [],
7
+ index: -1,
8
+ canUndo: !1,
9
+ canRedo: !1
10
+ }, a = () => {}, o = () => a, s = () => i;
11
+ function c() {
12
+ let i = e(void 0, "useStoreHistory"), c = t(i);
13
+ n(() => {}, [c, i]);
14
+ let l = c?.getSnapshot ?? s;
15
+ return {
16
+ ...r(c?.subscribe ?? o, l, l),
17
+ undo: c?.undo ?? a,
18
+ redo: c?.redo ?? a,
19
+ travelTo: c?.travelTo ?? a,
20
+ clear: c?.clear ?? a
21
+ };
22
+ }
23
+ //#endregion
24
+ export { c as useStoreHistory };
@@ -0,0 +1,4 @@
1
+ export { getStoreHistory } from '../middleware/historyMiddleware';
2
+ export { useStoreHistory } from './hooks/useStoreHistory';
3
+ export type { HistoryEntry, HistorySnapshot, StoreHistory, StoreHistoryOptions } from '../middleware/historyMiddleware';
4
+ export type { UseStoreHistoryReturn } from './hooks/useStoreHistory';
@@ -0,0 +1,3 @@
1
+ import { getStoreHistory as e } from "../middleware/historyMiddleware.mjs";
2
+ import { useStoreHistory as t } from "./hooks/useStoreHistory.mjs";
3
+ export { e as getStoreHistory, t as useStoreHistory };
@@ -0,0 +1,16 @@
1
+ import { default as createStore } from './createStore';
2
+ import { default as useStoreById } from './createStore/hooks/useStoreById';
3
+ import { default as useStoreSetter } from './createStore/hooks/useStoreSetter';
4
+ import { default as StoreProvider } from './StoreProvider';
5
+ export * from './async';
6
+ export * from './createStore';
7
+ export * from './derived';
8
+ export * from './entities';
9
+ export * from './history';
10
+ export * from './middleware';
11
+ export * from './StoreProvider';
12
+ export * from './createStore/hooks/useStoreSetter';
13
+ export * from './createStore/hooks/useStoreById';
14
+ export * from './types';
15
+ export { createStore, StoreProvider, useStoreById, useStoreSetter };
16
+ export { setCodegenEnabled } from './createStore/helpers/writeByPath';
package/dist/index.mjs ADDED
@@ -0,0 +1,21 @@
1
+ import { createAsync as e } from "./async/createAsync.mjs";
2
+ import { useAsync as t } from "./async/hooks/useAsync.mjs";
3
+ import { useAsyncValue as n } from "./async/hooks/useAsyncValue.mjs";
4
+ import { setCodegenEnabled as r } from "./createStore/helpers/writeByPath.mjs";
5
+ import { CANCEL as i } from "./types/StoreTypes.mjs";
6
+ import { StoreContext as a, StoreRegistryContext as o } from "./StoreContext.mjs";
7
+ import s from "./createStore/hooks/useStoreSetter.mjs";
8
+ import { createStoreHook as c } from "./createStore/createStore.mjs";
9
+ import l from "./createStore/index.mjs";
10
+ import { createDerived as u } from "./derived/createDerived.mjs";
11
+ import { useDerived as d } from "./derived/hooks/useDerived.mjs";
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 _ from "./StoreProvider.mjs";
17
+ import { loggerMiddleware as v } from "./middleware/loggerMiddleware.mjs";
18
+ import { persistMiddleware as y } from "./middleware/persistMiddleware.mjs";
19
+ import { reduxDevToolsMiddleware as b } from "./middleware/reduxDevToolsMiddleware.mjs";
20
+ import { cascade as x } from "./middleware/cascade.mjs";
21
+ export { i as CANCEL, a as StoreContext, _ as StoreProvider, o as StoreRegistryContext, x as cascade, e as createAsync, u as createDerived, f as createEntityAdapter, l as createStore, c as createStoreHook, p as getStoreHistory, m as historyMiddleware, v as loggerMiddleware, y as persistMiddleware, b as reduxDevToolsMiddleware, r as setCodegenEnabled, t as useAsync, n as useAsyncValue, d as useDerived, g as useStoreById, h as useStoreHistory, s as useStoreSetter };
@@ -0,0 +1,2 @@
1
+ import { StoreMiddleware } from '../types';
2
+ export declare const cascade: <T extends object>(middleware: StoreMiddleware<T>) => StoreMiddleware<T>;
@@ -0,0 +1,4 @@
1
+ //#region src/middleware/cascade.ts
2
+ var e = (e) => Object.assign(e, { cascade: !0 });
3
+ //#endregion
4
+ export { e as cascade };
@@ -0,0 +1,28 @@
1
+ import { Path, StoreApi, StoreMiddleware } from '../types';
2
+ export type HistoryEntry<TState> = {
3
+ path?: Path;
4
+ value?: unknown;
5
+ state: TState;
6
+ timestamp: number;
7
+ };
8
+ export type HistorySnapshot<TState> = {
9
+ entries: ReadonlyArray<HistoryEntry<TState>>;
10
+ index: number;
11
+ canUndo: boolean;
12
+ canRedo: boolean;
13
+ };
14
+ export type StoreHistory<TState> = {
15
+ getSnapshot: () => HistorySnapshot<TState>;
16
+ subscribe: (listener: () => void) => () => void;
17
+ undo: () => void;
18
+ redo: () => void;
19
+ travelTo: (index: number) => void;
20
+ clear: () => void;
21
+ };
22
+ export type StoreHistoryOptions = {
23
+ limit?: number;
24
+ path?: Path;
25
+ shouldRecord?: (changedPath: Path | undefined) => boolean;
26
+ };
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>;
@@ -0,0 +1,81 @@
1
+ import { isPlainObject as e } from "../createStore/helpers/deepMerge.mjs";
2
+ import t from "../helpers/getByPath.mjs";
3
+ import n from "../helpers/isPathAffected.mjs";
4
+ //#region src/middleware/historyMiddleware.ts
5
+ var r = (t, n, i = 12) => {
6
+ if (!Object.is(t, n)) {
7
+ if (i <= 0 || !e(t) || !e(n)) return {
8
+ path: "",
9
+ value: n
10
+ };
11
+ for (let e of new Set([...Object.keys(t), ...Object.keys(n)])) {
12
+ if (Object.is(t[e], n[e])) continue;
13
+ let a = r(t[e], n[e], i - 1);
14
+ if (a) return {
15
+ path: a.path ? `${e}.${a.path}` : e,
16
+ value: a.value
17
+ };
18
+ }
19
+ }
20
+ };
21
+ function i(e, i = {}) {
22
+ let a = i.limit ?? 100, o = i.path, s = i.shouldRecord, c = [{
23
+ state: e.getState(),
24
+ timestamp: Date.now()
25
+ }], l = 0, u = !1, d = () => ({
26
+ entries: c,
27
+ index: l,
28
+ canUndo: l > 0,
29
+ canRedo: l < c.length - 1
30
+ }), f = d(), p = /* @__PURE__ */ new Set(), m = () => {
31
+ 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;
35
+ if (_) try {
36
+ let e = r(t(f, _), t(p, _));
37
+ e && (h = e.path ? `${_}.${e.path}` : _, g = e.value);
38
+ } catch {}
39
+ let v = [...d, {
40
+ path: h,
41
+ value: g,
42
+ state: p,
43
+ timestamp: Date.now()
44
+ }];
45
+ c = v.length > a ? v.slice(v.length - a) : v, l = c.length - 1, m();
46
+ }, g = (n) => {
47
+ if (n < 0 || n >= c.length || n === l) return;
48
+ let r = c[n].state;
49
+ if (u = !0, o) {
50
+ let n = t(r, o);
51
+ e.setState(o, () => n);
52
+ } else e.setState(void 0, () => r);
53
+ u = !1, l = n, m();
54
+ };
55
+ return {
56
+ handle: {
57
+ getSnapshot: () => f,
58
+ subscribe: (e) => (p.add(e), () => p.delete(e)),
59
+ undo: () => g(l - 1),
60
+ redo: () => g(l + 1),
61
+ travelTo: g,
62
+ clear: () => {
63
+ c = [{
64
+ state: e.getState(),
65
+ timestamp: Date.now()
66
+ }], l = 0, m();
67
+ }
68
+ },
69
+ record: h
70
+ };
71
+ }
72
+ var a = /* @__PURE__ */ new WeakMap();
73
+ function o(e) {
74
+ return a.get(e);
75
+ }
76
+ var s = (e) => (t) => {
77
+ let { handle: n, record: r } = i(t, e);
78
+ return a.set(t, n), { onChange: r };
79
+ };
80
+ //#endregion
81
+ export { o as getStoreHistory, s as historyMiddleware };
@@ -0,0 +1,8 @@
1
+ export { loggerMiddleware } from './loggerMiddleware';
2
+ export { persistMiddleware } from './persistMiddleware';
3
+ export { historyMiddleware } from './historyMiddleware';
4
+ export { reduxDevToolsMiddleware } from './reduxDevToolsMiddleware';
5
+ export { cascade } from './cascade';
6
+ export type { LoggerOptions } from './loggerMiddleware';
7
+ export type { PersistOptions, PersistStorage } from './persistMiddleware';
8
+ export type { ReduxDevToolsOptions } from './reduxDevToolsMiddleware';
@@ -0,0 +1,6 @@
1
+ import { historyMiddleware as e } from "./historyMiddleware.mjs";
2
+ import { loggerMiddleware as t } from "./loggerMiddleware.mjs";
3
+ import { persistMiddleware as n } from "./persistMiddleware.mjs";
4
+ import { reduxDevToolsMiddleware as r } from "./reduxDevToolsMiddleware.mjs";
5
+ import { cascade as i } from "./cascade.mjs";
6
+ export { i as cascade, e as historyMiddleware, t as loggerMiddleware, n as persistMiddleware, r as reduxDevToolsMiddleware };
@@ -0,0 +1,7 @@
1
+ import { StoreChange, StoreError, StoreMiddleware } from '../types';
2
+ export type LoggerOptions<TState extends object> = {
3
+ filter?: (change: StoreChange<TState>) => boolean;
4
+ sink?: (change: StoreChange<TState>) => void;
5
+ errorSink?: (failure: StoreError<TState>) => void;
6
+ };
7
+ export declare const loggerMiddleware: <TState extends object>(options?: LoggerOptions<TState> | ((change: StoreChange<TState>) => void)) => StoreMiddleware<TState>;
@@ -0,0 +1,20 @@
1
+ //#region src/middleware/loggerMiddleware.ts
2
+ var e = (e) => {
3
+ console.log("[store]", e.path ?? "(root)", e.next);
4
+ }, t = (e) => {
5
+ 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
+ });
18
+ };
19
+ //#endregion
20
+ export { n as loggerMiddleware };