@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.
- package/CHANGELOG.md +12 -0
- package/README.md +197 -1
- package/dist/StoreProvider.mjs +44 -38
- package/dist/async/createAsync.mjs +8 -1
- package/dist/createStore/createStore.d.ts +11 -47
- package/dist/createStore/createStore.mjs +57 -39
- package/dist/createStore/helpers/PathTrie.d.ts +2 -0
- package/dist/createStore/helpers/PathTrie.mjs +55 -20
- package/dist/createStore/helpers/createChainReads.d.ts +1 -1
- package/dist/createStore/helpers/createChainReads.mjs +12 -13
- package/dist/createStore/helpers/createSetState.mjs +24 -33
- package/dist/createStore/helpers/writeByPath.mjs +1 -0
- package/dist/createStore/hooks/shared.d.ts +1 -2
- package/dist/createStore/hooks/shared.mjs +7 -18
- package/dist/createStore/hooks/useStore.d.ts +4 -49
- package/dist/createStore/hooks/useStore.mjs +19 -27
- package/dist/createStore/hooks/useStoreGetter.d.ts +2 -5
- package/dist/createStore/hooks/useStoreGetter.mjs +19 -22
- package/dist/createStore/hooks/useStoreSetter.mjs +2 -4
- package/dist/derived/createDerived.d.ts +1 -1
- package/dist/derived/createDerived.mjs +12 -9
- package/dist/entities/createEntityStore.d.ts +38 -0
- package/dist/entities/createEntityStore.mjs +102 -0
- package/dist/entities/index.d.ts +2 -0
- package/dist/entities/index.mjs +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +11 -9
- package/dist/middleware/historyMiddleware.d.ts +3 -3
- package/dist/middleware/historyMiddleware.mjs +22 -17
- package/dist/middleware/index.d.ts +1 -1
- package/dist/middleware/isDisabled.d.ts +2 -0
- package/dist/middleware/isDisabled.mjs +4 -0
- package/dist/middleware/loggerMiddleware.d.ts +2 -2
- package/dist/middleware/loggerMiddleware.mjs +14 -15
- package/dist/middleware/persistMiddleware.d.ts +7 -5
- package/dist/middleware/persistMiddleware.mjs +58 -26
- package/dist/middleware/reduxDevToolsMiddleware.d.ts +2 -2
- package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -21
- package/dist/next/index.d.ts +26 -0
- package/dist/next/index.mjs +18 -0
- package/dist/rsc/index.d.ts +29 -0
- package/dist/rsc/index.mjs +18 -0
- package/dist/types/StoreTypes.d.ts +33 -21
- package/logo.svg +57 -0
- package/package.json +22 -10
|
@@ -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 };
|
package/dist/entities/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/entities/index.mjs
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -14,3 +14,4 @@ export * from './createStore/hooks/useStoreById';
|
|
|
14
14
|
export * from './types';
|
|
15
15
|
export { createStore, StoreProvider, useStoreById, useStoreSetter };
|
|
16
16
|
export { setCodegenEnabled } from './createStore/helpers/writeByPath';
|
|
17
|
+
export { createServerSnapshot, isServerSnapshot } from './rsc';
|
package/dist/index.mjs
CHANGED
|
@@ -10,12 +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 {
|
|
14
|
-
import {
|
|
15
|
-
import g from "./
|
|
16
|
-
import _ from "./
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
|
|
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 "
|
|
3
|
+
import { isDisabled as n } from "./isDisabled.mjs";
|
|
4
|
+
import r from "../helpers/isPathAffected.mjs";
|
|
4
5
|
//#region src/middleware/historyMiddleware.ts
|
|
5
|
-
var
|
|
6
|
+
var i = (t, n, r = 12) => {
|
|
6
7
|
if (!Object.is(t, n)) {
|
|
7
|
-
if (
|
|
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 =
|
|
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
|
|
22
|
-
let a =
|
|
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:
|
|
33
|
-
if (u || s && !s(
|
|
34
|
-
let d = l < c.length - 1 ? c.slice(0, l + 1) : c, f = d[d.length - 1].state, p = e.getState(), h =
|
|
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 =
|
|
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
|
|
73
|
-
function
|
|
74
|
-
return
|
|
73
|
+
var o = /* @__PURE__ */ new WeakMap();
|
|
74
|
+
function s(e) {
|
|
75
|
+
return o.get(e);
|
|
75
76
|
}
|
|
76
|
-
var
|
|
77
|
-
let
|
|
78
|
-
return
|
|
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 {
|
|
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';
|
|
@@ -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
|
|
3
|
+
var t = (e) => {
|
|
3
4
|
console.log("[store]", e.path ?? "(root)", e.next);
|
|
4
|
-
},
|
|
5
|
+
}, n = (e) => {
|
|
5
6
|
console.error("[store]", `${e.phase} error at`, e.path ?? "(root)", e.error);
|
|
6
|
-
},
|
|
7
|
-
let { filter:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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 {
|
|
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
|
|
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?:
|
|
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) =>
|
|
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,36 +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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
};
|
|
33
|
+
n.setItem(o, JSON.stringify(r));
|
|
34
|
+
}, y = (e) => !c || c.some((t) => n(e, t));
|
|
14
35
|
return (e) => {
|
|
15
|
-
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
hydrate: r,
|
|
44
|
+
onChange: (t) => {
|
|
45
|
+
r(), y(t.path) && v(e);
|
|
21
46
|
}
|
|
22
|
-
|
|
23
|
-
} };
|
|
47
|
+
};
|
|
24
48
|
};
|
|
25
49
|
};
|
|
26
|
-
function
|
|
27
|
-
let
|
|
28
|
-
if (
|
|
29
|
-
let t = JSON.parse(
|
|
30
|
-
|
|
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);
|
|
31
63
|
} catch {
|
|
32
|
-
n
|
|
64
|
+
n?.removeItem(t);
|
|
33
65
|
}
|
|
34
66
|
}
|
|
35
67
|
//#endregion
|
|
36
|
-
export {
|
|
68
|
+
export { i as persistMiddleware };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { StoreChange, StoreMiddleware } from '../types';
|
|
2
|
-
export type ReduxDevToolsOptions<TState extends object> = {
|
|
1
|
+
import { MiddlewareOptions, StoreChange, StoreMiddleware } from '../types';
|
|
2
|
+
export type ReduxDevToolsOptions<TState extends object> = MiddlewareOptions<TState> & {
|
|
3
3
|
name?: string;
|
|
4
4
|
action?: (change: StoreChange<TState>) => string;
|
|
5
5
|
};
|
|
@@ -1,26 +1,31 @@
|
|
|
1
|
+
import { isDisabled as e } from "./isDisabled.mjs";
|
|
1
2
|
//#region src/middleware/reduxDevToolsMiddleware.ts
|
|
2
|
-
var
|
|
3
|
+
var t = () => {
|
|
3
4
|
if (!(typeof window > "u")) return window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
4
|
-
},
|
|
5
|
-
let r =
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
let
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
}, n = (n = {}) => {
|
|
6
|
+
let { enabled: r } = n;
|
|
7
|
+
return (i) => {
|
|
8
|
+
if (e(r, i.getState())) return;
|
|
9
|
+
let a = t();
|
|
10
|
+
if (!a) return;
|
|
11
|
+
let { name: o = "nexus", action: s } = n, c = a.connect({ name: o });
|
|
12
|
+
c.init(i.getState());
|
|
13
|
+
let l = !1;
|
|
14
|
+
return c.subscribe((e) => {
|
|
15
|
+
if (e.type !== "DISPATCH" || e.state === void 0) return;
|
|
16
|
+
let t = e.payload?.type;
|
|
17
|
+
if (!(t !== "JUMP_TO_STATE" && t !== "JUMP_TO_ACTION" && t !== "ROLLBACK")) {
|
|
18
|
+
l = !0;
|
|
19
|
+
try {
|
|
20
|
+
i.setState(void 0, JSON.parse(e.state));
|
|
21
|
+
} finally {
|
|
22
|
+
l = !1;
|
|
23
|
+
}
|
|
19
24
|
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
25
|
+
}), { onChange: (e) => {
|
|
26
|
+
l || c.send({ type: s ? s(e) : e.path ?? "SET_STATE" }, i.getState());
|
|
27
|
+
} };
|
|
28
|
+
};
|
|
24
29
|
};
|
|
25
30
|
//#endregion
|
|
26
|
-
export {
|
|
31
|
+
export { n as reduxDevToolsMiddleware };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PathOf, PathValue, StoreApi } from '../types';
|
|
2
|
+
export type ServerActionResult<TState extends object, P extends PathOf<TState>> = (value: PathValue<TState, P> | ((prev: PathValue<TState, P>) => PathValue<TState, P>)) => Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Binds a Nexus store path to a Next.js Server Action, giving you
|
|
5
|
+
* optimistic updates + automatic revalidation.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* 'use client';
|
|
9
|
+
* import { useStore } from '@plitzi/nexus';
|
|
10
|
+
* import { bindServerAction } from '@plitzi/nexus/next';
|
|
11
|
+
*
|
|
12
|
+
* function Likes({ store, updateLikes }: { store: StoreApi<State>; updateLikes: ServerAction }) {
|
|
13
|
+
* const [likes, setLikes] = useStore('likes');
|
|
14
|
+
* const syncLikes = bindServerAction(store, 'likes', updateLikes, { revalidatePath: '/dashboard' });
|
|
15
|
+
*
|
|
16
|
+
* return <button onClick={() => syncLikes(n => n + 1)}>{likes}</button>;
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* ⚠️ This file imports from `next/cache` dynamically. It only works within
|
|
21
|
+
* Next.js App Router — not a peer dependency, just a compatibility layer.
|
|
22
|
+
*/
|
|
23
|
+
export declare function bindServerAction<TState extends object, P extends PathOf<TState>>(store: StoreApi<TState>, path: P, action: (value: PathValue<TState, P>) => Promise<PathValue<TState, P>>, options?: {
|
|
24
|
+
revalidatePath?: string;
|
|
25
|
+
revalidateTag?: string;
|
|
26
|
+
}): ServerActionResult<TState, P>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/next/index.ts
|
|
2
|
+
function e(e, t, n, r) {
|
|
3
|
+
let i = r?.revalidatePath || r?.revalidateTag;
|
|
4
|
+
return async (a) => {
|
|
5
|
+
let o = e.getPath(t), s = typeof a == "function" ? a(o) : a;
|
|
6
|
+
e.setState(t, s);
|
|
7
|
+
try {
|
|
8
|
+
if (await n(s), i) {
|
|
9
|
+
let e = await import("next/cache");
|
|
10
|
+
r.revalidatePath && e.revalidatePath(r.revalidatePath), r.revalidateTag && e.revalidateTag(r.revalidateTag);
|
|
11
|
+
}
|
|
12
|
+
} catch (n) {
|
|
13
|
+
throw e.setState(t, o), n;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { e as bindServerAction };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const SSR_FLAG: unique symbol;
|
|
2
|
+
type WithSsrFlag<T> = T & {
|
|
3
|
+
readonly [SSR_FLAG]: true;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Wraps server-fetched data so Nexus knows it came from SSR.
|
|
7
|
+
*
|
|
8
|
+
* Usage in a Server Component (App Router):
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { createServerSnapshot } from '@plitzi/nexus/rsc';
|
|
12
|
+
* import { StoreProvider } from '@plitzi/nexus';
|
|
13
|
+
*
|
|
14
|
+
* export default async function Page() {
|
|
15
|
+
* const data = await fetch('https://api.example.com/user');
|
|
16
|
+
* return (
|
|
17
|
+
* <StoreProvider value={createServerSnapshot(data)}>
|
|
18
|
+
* <ClientComponent />
|
|
19
|
+
* </StoreProvider>
|
|
20
|
+
* );
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function createServerSnapshot<T extends object>(data: T): WithSsrFlag<T>;
|
|
25
|
+
/** @internal */
|
|
26
|
+
export declare function isServerSnapshot<T>(value: T): value is WithSsrFlag<T>;
|
|
27
|
+
/** @internal Strip the SSR flag from a snapshot (returns a plain object). */
|
|
28
|
+
export declare function stripServerFlag<T extends object>(value: T): T;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/rsc/index.ts
|
|
2
|
+
var e = Symbol("@plitzi/nexus/ssr-snapshot");
|
|
3
|
+
function t(t) {
|
|
4
|
+
return e in t ? t : Object.defineProperty(t, e, {
|
|
5
|
+
value: !0,
|
|
6
|
+
enumerable: !1,
|
|
7
|
+
writable: !1,
|
|
8
|
+
configurable: !1
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function n(t) {
|
|
12
|
+
return typeof t == "object" && !!t && e in t;
|
|
13
|
+
}
|
|
14
|
+
function r(e) {
|
|
15
|
+
return n(e) ? { ...e } : e;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { t as createServerSnapshot, n as isServerSnapshot, r as stripServerFlag };
|