@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.
- package/CHANGELOG.md +31 -0
- package/LICENSE +74 -0
- package/README.md +563 -0
- package/dist/StoreContext.d.ts +10 -0
- package/dist/StoreContext.mjs +11 -0
- package/dist/StoreProvider.d.ts +24 -0
- package/dist/StoreProvider.mjs +51 -0
- package/dist/async/createAsync.d.ts +19 -0
- package/dist/async/createAsync.mjs +29 -0
- package/dist/async/hooks/useAsync.d.ts +2 -0
- package/dist/async/hooks/useAsync.mjs +7 -0
- package/dist/async/hooks/useAsyncValue.d.ts +2 -0
- package/dist/async/hooks/useAsyncValue.mjs +13 -0
- package/dist/async/index.d.ts +4 -0
- package/dist/async/index.mjs +4 -0
- package/dist/createStore/createStore.d.ts +90 -0
- package/dist/createStore/createStore.mjs +104 -0
- package/dist/createStore/helpers/PathTrie.d.ts +13 -0
- package/dist/createStore/helpers/PathTrie.mjs +43 -0
- package/dist/createStore/helpers/Subscribers.d.ts +15 -0
- package/dist/createStore/helpers/Subscribers.mjs +59 -0
- package/dist/createStore/helpers/createChainReads.d.ts +10 -0
- package/dist/createStore/helpers/createChainReads.mjs +37 -0
- package/dist/createStore/helpers/createSetState.d.ts +22 -0
- package/dist/createStore/helpers/createSetState.mjs +163 -0
- package/dist/createStore/helpers/deepMerge.d.ts +2 -0
- package/dist/createStore/helpers/deepMerge.mjs +9 -0
- package/dist/createStore/helpers/forwardParentChanges.d.ts +7 -0
- package/dist/createStore/helpers/forwardParentChanges.mjs +23 -0
- package/dist/createStore/helpers/scopeCollisions.d.ts +4 -0
- package/dist/createStore/helpers/scopeCollisions.mjs +14 -0
- package/dist/createStore/helpers/writeByPath.d.ts +11 -0
- package/dist/createStore/helpers/writeByPath.mjs +51 -0
- package/dist/createStore/hooks/shared.d.ts +12 -0
- package/dist/createStore/hooks/shared.mjs +85 -0
- package/dist/createStore/hooks/useStore.d.ts +73 -0
- package/dist/createStore/hooks/useStore.mjs +57 -0
- package/dist/createStore/hooks/useStoreById.d.ts +3 -0
- package/dist/createStore/hooks/useStoreById.mjs +7 -0
- package/dist/createStore/hooks/useStoreGetter.d.ts +9 -0
- package/dist/createStore/hooks/useStoreGetter.mjs +38 -0
- package/dist/createStore/hooks/useStoreSetter.d.ts +5 -0
- package/dist/createStore/hooks/useStoreSetter.mjs +11 -0
- package/dist/createStore/hooks/useStoreSync.d.ts +7 -0
- package/dist/createStore/hooks/useStoreSync.mjs +55 -0
- package/dist/createStore/index.d.ts +3 -0
- package/dist/createStore/index.mjs +5 -0
- package/dist/derived/createDerived.d.ts +10 -0
- package/dist/derived/createDerived.mjs +21 -0
- package/dist/derived/hooks/useDerived.d.ts +2 -0
- package/dist/derived/hooks/useDerived.mjs +7 -0
- package/dist/derived/index.d.ts +3 -0
- package/dist/derived/index.mjs +3 -0
- package/dist/entities/createEntityAdapter.d.ts +32 -0
- package/dist/entities/createEntityAdapter.mjs +73 -0
- package/dist/entities/index.d.ts +2 -0
- package/dist/entities/index.mjs +2 -0
- package/dist/helpers/createObservable.d.ts +9 -0
- package/dist/helpers/createObservable.mjs +18 -0
- package/dist/helpers/getByPath.d.ts +4 -0
- package/dist/helpers/getByPath.mjs +40 -0
- package/dist/helpers/isPathAffected.d.ts +3 -0
- package/dist/helpers/isPathAffected.mjs +4 -0
- package/dist/helpers/parsePath.d.ts +2 -0
- package/dist/helpers/parsePath.mjs +7 -0
- package/dist/helpers/setByPath.d.ts +3 -0
- package/dist/helpers/setByPath.mjs +19 -0
- package/dist/helpers/shallowEqual.d.ts +2 -0
- package/dist/helpers/shallowEqual.mjs +11 -0
- package/dist/helpers/useIsomorphicLayoutEffect.d.ts +3 -0
- package/dist/helpers/useIsomorphicLayoutEffect.mjs +5 -0
- package/dist/history/hooks/useStoreHistory.d.ts +8 -0
- package/dist/history/hooks/useStoreHistory.mjs +24 -0
- package/dist/history/index.d.ts +4 -0
- package/dist/history/index.mjs +3 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.mjs +21 -0
- package/dist/middleware/cascade.d.ts +2 -0
- package/dist/middleware/cascade.mjs +4 -0
- package/dist/middleware/historyMiddleware.d.ts +28 -0
- package/dist/middleware/historyMiddleware.mjs +81 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.mjs +6 -0
- package/dist/middleware/loggerMiddleware.d.ts +7 -0
- package/dist/middleware/loggerMiddleware.mjs +20 -0
- package/dist/middleware/persistMiddleware.d.ts +16 -0
- package/dist/middleware/persistMiddleware.mjs +36 -0
- package/dist/middleware/reduxDevToolsMiddleware.d.ts +6 -0
- package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -0
- package/dist/types/StoreTypes.d.ts +143 -0
- package/dist/types/StoreTypes.mjs +4 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.mjs +2 -0
- 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,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,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,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,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,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,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,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';
|
package/dist/index.d.ts
ADDED
|
@@ -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,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 };
|