@plitzi/nexus 0.31.1 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +197 -1
  3. package/dist/StoreProvider.mjs +44 -38
  4. package/dist/async/createAsync.mjs +8 -1
  5. package/dist/createStore/createStore.d.ts +11 -47
  6. package/dist/createStore/createStore.mjs +57 -39
  7. package/dist/createStore/helpers/PathTrie.d.ts +2 -0
  8. package/dist/createStore/helpers/PathTrie.mjs +55 -20
  9. package/dist/createStore/helpers/createChainReads.d.ts +1 -1
  10. package/dist/createStore/helpers/createChainReads.mjs +12 -13
  11. package/dist/createStore/helpers/createSetState.mjs +24 -33
  12. package/dist/createStore/helpers/writeByPath.mjs +1 -0
  13. package/dist/createStore/hooks/shared.d.ts +1 -2
  14. package/dist/createStore/hooks/shared.mjs +7 -18
  15. package/dist/createStore/hooks/useStore.d.ts +4 -49
  16. package/dist/createStore/hooks/useStore.mjs +19 -27
  17. package/dist/createStore/hooks/useStoreGetter.d.ts +2 -5
  18. package/dist/createStore/hooks/useStoreGetter.mjs +19 -22
  19. package/dist/createStore/hooks/useStoreSetter.mjs +2 -4
  20. package/dist/derived/createDerived.d.ts +1 -1
  21. package/dist/derived/createDerived.mjs +12 -9
  22. package/dist/entities/createEntityStore.d.ts +38 -0
  23. package/dist/entities/createEntityStore.mjs +102 -0
  24. package/dist/entities/index.d.ts +2 -0
  25. package/dist/entities/index.mjs +2 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.mjs +11 -9
  28. package/dist/middleware/historyMiddleware.d.ts +3 -3
  29. package/dist/middleware/historyMiddleware.mjs +22 -17
  30. package/dist/middleware/index.d.ts +1 -1
  31. package/dist/middleware/isDisabled.d.ts +2 -0
  32. package/dist/middleware/isDisabled.mjs +4 -0
  33. package/dist/middleware/loggerMiddleware.d.ts +2 -2
  34. package/dist/middleware/loggerMiddleware.mjs +14 -15
  35. package/dist/middleware/persistMiddleware.d.ts +7 -5
  36. package/dist/middleware/persistMiddleware.mjs +58 -26
  37. package/dist/middleware/reduxDevToolsMiddleware.d.ts +2 -2
  38. package/dist/middleware/reduxDevToolsMiddleware.mjs +26 -21
  39. package/dist/next/index.d.ts +26 -0
  40. package/dist/next/index.mjs +18 -0
  41. package/dist/rsc/index.d.ts +29 -0
  42. package/dist/rsc/index.mjs +18 -0
  43. package/dist/types/StoreTypes.d.ts +33 -21
  44. package/logo.svg +57 -0
  45. package/package.json +22 -10
@@ -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.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 { 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 };
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,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
- 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
- r(e, n, i, o, s, c);
16
- let t;
17
- return { onChange: () => {
18
- if (l <= 0) {
19
- u(e);
20
- return;
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
- clearTimeout(t), t = setTimeout(() => u(e), l);
23
- } };
47
+ };
24
48
  };
25
49
  };
26
- function r(e, t, n, r, i, a) {
27
- let o = n.getItem(t);
28
- if (o) try {
29
- let t = JSON.parse(o), n = t.version !== r && i ? i(t.state, t.version) : t.state;
30
- 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);
31
63
  } catch {
32
- n.removeItem(t);
64
+ n?.removeItem(t);
33
65
  }
34
66
  }
35
67
  //#endregion
36
- export { n as persistMiddleware };
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 e = () => {
3
+ var t = () => {
3
4
  if (!(typeof window > "u")) return window.__REDUX_DEVTOOLS_EXTENSION__;
4
- }, t = (t = {}) => (n) => {
5
- let r = e();
6
- if (!r) return;
7
- let { name: i = "nexus", action: a } = t, o = r.connect({ name: i });
8
- o.init(n.getState());
9
- let s = !1;
10
- return o.subscribe((e) => {
11
- if (e.type !== "DISPATCH" || e.state === void 0) return;
12
- let t = e.payload?.type;
13
- if (!(t !== "JUMP_TO_STATE" && t !== "JUMP_TO_ACTION" && t !== "ROLLBACK")) {
14
- s = !0;
15
- try {
16
- n.setState(void 0, JSON.parse(e.state));
17
- } finally {
18
- s = !1;
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
- }), { onChange: (e) => {
22
- s || o.send({ type: a ? a(e) : e.path ?? "SET_STATE" }, n.getState());
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 { t as reduxDevToolsMiddleware };
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 };