@voidhash/mimic-react 1.0.0-beta.13 → 1.0.0-beta.14

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 (41) hide show
  1. package/.turbo/turbo-build.log +36 -36
  2. package/dist/zustand/middleware.d.cts +1 -1
  3. package/dist/zustand/middleware.d.mts +1 -1
  4. package/dist/zustand/types.d.cts +1 -1
  5. package/dist/zustand/types.d.mts +1 -1
  6. package/dist/zustand/useDraft.cjs +14 -11
  7. package/dist/zustand/useDraft.d.cts +6 -5
  8. package/dist/zustand/useDraft.d.cts.map +1 -1
  9. package/dist/zustand/useDraft.d.mts +6 -5
  10. package/dist/zustand/useDraft.d.mts.map +1 -1
  11. package/dist/zustand/useDraft.mjs +14 -11
  12. package/dist/zustand/useDraft.mjs.map +1 -1
  13. package/dist/zustand-commander/commander.cjs +59 -22
  14. package/dist/zustand-commander/commander.d.cts +16 -6
  15. package/dist/zustand-commander/commander.d.cts.map +1 -1
  16. package/dist/zustand-commander/commander.d.mts +16 -6
  17. package/dist/zustand-commander/commander.d.mts.map +1 -1
  18. package/dist/zustand-commander/commander.mjs +57 -22
  19. package/dist/zustand-commander/commander.mjs.map +1 -1
  20. package/dist/zustand-commander/hooks.cjs +18 -4
  21. package/dist/zustand-commander/hooks.d.cts +2 -1
  22. package/dist/zustand-commander/hooks.d.cts.map +1 -1
  23. package/dist/zustand-commander/hooks.d.mts +2 -1
  24. package/dist/zustand-commander/hooks.d.mts.map +1 -1
  25. package/dist/zustand-commander/hooks.mjs +18 -4
  26. package/dist/zustand-commander/hooks.mjs.map +1 -1
  27. package/dist/zustand-commander/index.cjs +2 -0
  28. package/dist/zustand-commander/index.d.cts +2 -2
  29. package/dist/zustand-commander/index.d.mts +2 -2
  30. package/dist/zustand-commander/index.mjs +2 -2
  31. package/dist/zustand-commander/types.d.cts +23 -14
  32. package/dist/zustand-commander/types.d.cts.map +1 -1
  33. package/dist/zustand-commander/types.d.mts +23 -14
  34. package/dist/zustand-commander/types.d.mts.map +1 -1
  35. package/dist/zustand-commander/types.mjs.map +1 -1
  36. package/package.json +3 -3
  37. package/src/zustand/useDraft.ts +15 -19
  38. package/src/zustand-commander/commander.ts +107 -21
  39. package/src/zustand-commander/hooks.ts +38 -12
  40. package/src/zustand-commander/index.ts +2 -0
  41. package/src/zustand-commander/types.ts +34 -24
@@ -1,5 +1,5 @@
1
1
 
2
- > @voidhash/mimic-react@1.0.0-beta.13 build /home/runner/work/mimic/mimic/packages/mimic-react
2
+ > @voidhash/mimic-react@1.0.0-beta.14 build /home/runner/work/mimic/mimic/packages/mimic-react
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.18.2 powered by rolldown v1.0.0-beta.55
@@ -8,69 +8,69 @@
8
8
  ℹ target: es2017
9
9
  ℹ tsconfig: tsconfig.json
10
10
  ℹ Build start
11
- ℹ [CJS] dist/zustand-commander/index.cjs 0.78 kB │ gzip: 0.24 kB
11
+ ℹ [CJS] dist/zustand-commander/index.cjs 0.90 kB │ gzip: 0.26 kB
12
12
  ℹ [CJS] dist/zustand/index.cjs 0.20 kB │ gzip: 0.11 kB
13
13
  ℹ [CJS] dist/index.cjs 0.00 kB │ gzip: 0.02 kB
14
- ℹ [CJS] dist/zustand-commander/commander.cjs 5.39 kB │ gzip: 1.54 kB
15
- ℹ [CJS] dist/zustand-commander/hooks.cjs 4.18 kB │ gzip: 1.46 kB
14
+ ℹ [CJS] dist/zustand-commander/commander.cjs 7.57 kB │ gzip: 1.89 kB
15
+ ℹ [CJS] dist/zustand-commander/hooks.cjs 4.85 kB │ gzip: 1.67 kB
16
16
  ℹ [CJS] dist/zustand/middleware.cjs 3.17 kB │ gzip: 1.14 kB
17
- ℹ [CJS] dist/zustand/useDraft.cjs 1.85 kB │ gzip: 0.64 kB
17
+ ℹ [CJS] dist/zustand/useDraft.cjs 2.13 kB │ gzip: 0.74 kB
18
18
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs 0.95 kB │ gzip: 0.43 kB
19
19
  ℹ [CJS] dist/zustand-commander/types.cjs 0.91 kB │ gzip: 0.34 kB
20
20
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs 0.53 kB │ gzip: 0.29 kB
21
21
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs 0.52 kB │ gzip: 0.32 kB
22
22
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs 0.40 kB │ gzip: 0.24 kB
23
23
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs 0.37 kB │ gzip: 0.23 kB
24
- ℹ [CJS] 13 files, total: 19.23 kB
25
- ℹ [CJS] dist/zustand-commander/types.d.cts.map 2.75 kB │ gzip: 1.17 kB
24
+ ℹ [CJS] 13 files, total: 22.47 kB
25
+ ℹ [CJS] dist/zustand-commander/types.d.cts.map 3.96 kB │ gzip: 1.61 kB
26
26
  ℹ [CJS] dist/zustand/types.d.cts.map 1.24 kB │ gzip: 0.59 kB
27
- ℹ [CJS] dist/zustand/useDraft.d.cts.map 0.60 kB │ gzip: 0.30 kB
28
- ℹ [CJS] dist/zustand-commander/hooks.d.cts.map 0.48 kB │ gzip: 0.30 kB
27
+ ℹ [CJS] dist/zustand-commander/hooks.d.cts.map 0.59 kB │ gzip: 0.35 kB
28
+ ℹ [CJS] dist/zustand-commander/commander.d.cts.map 0.54 kB │ gzip: 0.31 kB
29
+ ℹ [CJS] dist/zustand/useDraft.d.cts.map 0.49 kB │ gzip: 0.27 kB
29
30
  ℹ [CJS] dist/zustand/middleware.d.cts.map 0.38 kB │ gzip: 0.23 kB
30
- ℹ [CJS] dist/zustand-commander/commander.d.cts.map 0.30 kB │ gzip: 0.20 kB
31
- ℹ [CJS] dist/zustand-commander/index.d.cts 1.14 kB │ gzip: 0.36 kB
31
+ ℹ [CJS] dist/zustand-commander/index.d.cts 1.21 kB │ gzip: 0.38 kB
32
32
  ℹ [CJS] dist/zustand/index.d.cts 0.34 kB │ gzip: 0.17 kB
33
33
  ℹ [CJS] dist/index.d.cts 0.01 kB │ gzip: 0.03 kB
34
- ℹ [CJS] dist/zustand-commander/types.d.cts 7.04 kB │ gzip: 2.06 kB
34
+ ℹ [CJS] dist/zustand-commander/types.d.cts 8.14 kB │ gzip: 2.30 kB
35
35
  ℹ [CJS] dist/zustand/types.d.cts 3.23 kB │ gzip: 1.04 kB
36
- ℹ [CJS] dist/zustand-commander/hooks.d.cts 2.52 kB │ gzip: 0.89 kB
36
+ ℹ [CJS] dist/zustand-commander/hooks.d.cts 2.63 kB │ gzip: 0.93 kB
37
+ ℹ [CJS] dist/zustand-commander/commander.d.cts 2.28 kB │ gzip: 0.80 kB
37
38
  ℹ [CJS] dist/zustand/middleware.d.cts 2.13 kB │ gzip: 0.85 kB
38
- ℹ [CJS] dist/zustand-commander/commander.d.cts 1.63 kB │ gzip: 0.64 kB
39
- ℹ [CJS] dist/zustand/useDraft.d.cts 1.45 kB │ gzip: 0.61 kB
40
- ℹ [CJS] 15 files, total: 25.23 kB
41
- ✔ Build complete in 3602ms
42
- ℹ [ESM] dist/zustand-commander/index.mjs  0.47 kB │ gzip: 0.20 kB
39
+ ℹ [CJS] dist/zustand/useDraft.d.cts 1.54 kB │ gzip: 0.66 kB
40
+ ℹ [CJS] 15 files, total: 28.71 kB
41
+ ✔ Build complete in 4092ms
42
+ ℹ [ESM] dist/zustand-commander/index.mjs  0.53 kB │ gzip: 0.21 kB
43
43
  ℹ [ESM] dist/zustand/index.mjs  0.11 kB │ gzip: 0.09 kB
44
44
  ℹ [ESM] dist/index.mjs  0.01 kB │ gzip: 0.03 kB
45
- ℹ [ESM] dist/zustand-commander/commander.mjs.map 11.46 kB │ gzip: 3.07 kB
46
- ℹ [ESM] dist/zustand-commander/types.mjs.map 10.16 kB │ gzip: 2.60 kB
47
- ℹ [ESM] dist/zustand-commander/hooks.mjs.map  9.15 kB │ gzip: 2.82 kB
45
+ ℹ [ESM] dist/zustand-commander/commander.mjs.map 15.04 kB │ gzip: 3.77 kB
46
+ ℹ [ESM] dist/zustand-commander/types.mjs.map 11.30 kB │ gzip: 2.83 kB
47
+ ℹ [ESM] dist/zustand-commander/hooks.mjs.map 10.68 kB │ gzip: 3.27 kB
48
48
  ℹ [ESM] dist/zustand/middleware.mjs.map  6.89 kB │ gzip: 2.11 kB
49
- ℹ [ESM] dist/zustand-commander/commander.mjs  5.05 kB │ gzip: 1.54 kB
50
- ℹ [ESM] dist/zustand/useDraft.mjs.map  4.58 kB │ gzip: 1.56 kB
51
- ℹ [ESM] dist/zustand-commander/hooks.mjs  3.95 kB │ gzip: 1.46 kB
49
+ ℹ [ESM] dist/zustand-commander/commander.mjs  6.83 kB │ gzip: 1.88 kB
50
+ ℹ [ESM] dist/zustand/useDraft.mjs.map  4.64 kB │ gzip: 1.59 kB
51
+ ℹ [ESM] dist/zustand-commander/hooks.mjs  4.57 kB │ gzip: 1.66 kB
52
+ ℹ [ESM] dist/zustand-commander/types.d.mts.map  3.96 kB │ gzip: 1.61 kB
52
53
  ℹ [ESM] dist/zustand/middleware.mjs  3.10 kB │ gzip: 1.15 kB
53
- ℹ [ESM] dist/zustand-commander/types.d.mts.map  2.75 kB │ gzip: 1.17 kB
54
- ℹ [ESM] dist/zustand/useDraft.mjs  1.81 kB │ gzip: 0.66 kB
54
+ ℹ [ESM] dist/zustand/useDraft.mjs  2.04 kB │ gzip: 0.76 kB
55
55
  ℹ [ESM] dist/zustand/types.d.mts.map  1.24 kB │ gzip: 0.59 kB
56
56
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs  0.90 kB │ gzip: 0.42 kB
57
57
  ℹ [ESM] dist/zustand-commander/types.mjs  0.84 kB │ gzip: 0.35 kB
58
- ℹ [ESM] dist/zustand/useDraft.d.mts.map  0.60 kB │ gzip: 0.30 kB
59
- ℹ [ESM] dist/zustand-commander/hooks.d.mts.map  0.48 kB │ gzip: 0.30 kB
58
+ ℹ [ESM] dist/zustand-commander/hooks.d.mts.map  0.59 kB │ gzip: 0.35 kB
59
+ ℹ [ESM] dist/zustand-commander/commander.d.mts.map  0.54 kB │ gzip: 0.31 kB
60
+ ℹ [ESM] dist/zustand/useDraft.d.mts.map  0.49 kB │ gzip: 0.27 kB
60
61
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs  0.47 kB │ gzip: 0.30 kB
61
62
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs  0.43 kB │ gzip: 0.24 kB
62
63
  ℹ [ESM] dist/zustand/middleware.d.mts.map  0.38 kB │ gzip: 0.23 kB
63
64
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs  0.35 kB │ gzip: 0.23 kB
64
65
  ℹ [ESM] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs  0.30 kB │ gzip: 0.21 kB
65
- ℹ [ESM] dist/zustand-commander/commander.d.mts.map  0.30 kB │ gzip: 0.20 kB
66
- ℹ [ESM] dist/zustand-commander/index.d.mts  1.14 kB │ gzip: 0.36 kB
66
+ ℹ [ESM] dist/zustand-commander/index.d.mts  1.21 kB │ gzip: 0.38 kB
67
67
  ℹ [ESM] dist/zustand/index.d.mts  0.34 kB │ gzip: 0.17 kB
68
68
  ℹ [ESM] dist/index.d.mts  0.01 kB │ gzip: 0.03 kB
69
- ℹ [ESM] dist/zustand-commander/types.d.mts  7.04 kB │ gzip: 2.06 kB
69
+ ℹ [ESM] dist/zustand-commander/types.d.mts  8.14 kB │ gzip: 2.30 kB
70
70
  ℹ [ESM] dist/zustand/types.d.mts  3.23 kB │ gzip: 1.04 kB
71
- ℹ [ESM] dist/zustand-commander/hooks.d.mts  2.52 kB │ gzip: 0.89 kB
71
+ ℹ [ESM] dist/zustand-commander/hooks.d.mts  2.63 kB │ gzip: 0.93 kB
72
+ ℹ [ESM] dist/zustand-commander/commander.d.mts  2.28 kB │ gzip: 0.80 kB
72
73
  ℹ [ESM] dist/zustand/middleware.d.mts  2.13 kB │ gzip: 0.85 kB
73
- ℹ [ESM] dist/zustand-commander/commander.d.mts  1.63 kB │ gzip: 0.64 kB
74
- ℹ [ESM] dist/zustand/useDraft.d.mts  1.45 kB │ gzip: 0.61 kB
75
- ℹ [ESM] 33 files, total: 85.29 kB
76
- ✔ Build complete in 3628ms
74
+ ℹ [ESM] dist/zustand/useDraft.d.mts  1.54 kB │ gzip: 0.66 kB
75
+ ℹ [ESM] 33 files, total: 97.77 kB
76
+ ✔ Build complete in 4138ms
@@ -1,7 +1,7 @@
1
1
  import { MimicMiddlewareOptions, MimicSlice } from "./types.cjs";
2
2
  import { StateCreator, StoreMutatorIdentifier } from "zustand";
3
- import { ClientDocument } from "@voidhash/mimic/client";
4
3
  import { Presence, Primitive } from "@voidhash/mimic";
4
+ import { ClientDocument } from "@voidhash/mimic/client";
5
5
 
6
6
  //#region src/zustand/middleware.d.ts
7
7
  type MimicMiddleware = <TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined = undefined, T extends object = object, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []>(document: ClientDocument.ClientDocument<TSchema, TPresence>, config: StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T>, options?: MimicMiddlewareOptions) => StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T & MimicSlice<TSchema, TPresence>>;
@@ -1,7 +1,7 @@
1
1
  import { MimicMiddlewareOptions, MimicSlice } from "./types.mjs";
2
2
  import { StateCreator, StoreMutatorIdentifier } from "zustand";
3
- import { ClientDocument } from "@voidhash/mimic/client";
4
3
  import { Presence, Primitive } from "@voidhash/mimic";
4
+ import { ClientDocument } from "@voidhash/mimic/client";
5
5
 
6
6
  //#region src/zustand/middleware.d.ts
7
7
  type MimicMiddleware = <TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined = undefined, T extends object = object, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []>(document: ClientDocument.ClientDocument<TSchema, TPresence>, config: StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T>, options?: MimicMiddlewareOptions) => StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T & MimicSlice<TSchema, TPresence>>;
@@ -1,6 +1,6 @@
1
1
  import { StateCreator, StoreMutatorIdentifier } from "zustand";
2
- import { ClientDocument } from "@voidhash/mimic/client";
3
2
  import { Presence, Primitive } from "@voidhash/mimic";
3
+ import { ClientDocument } from "@voidhash/mimic/client";
4
4
 
5
5
  //#region src/zustand/types.d.ts
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { StateCreator, StoreMutatorIdentifier } from "zustand";
2
- import { ClientDocument } from "@voidhash/mimic/client";
3
2
  import { Presence, Primitive } from "@voidhash/mimic";
3
+ import { ClientDocument } from "@voidhash/mimic/client";
4
4
 
5
5
  //#region src/zustand/types.d.ts
6
6
 
@@ -1,10 +1,13 @@
1
+ const require_commander = require('../zustand-commander/commander.cjs');
1
2
  let react = require("react");
2
3
 
3
4
  //#region src/zustand/useDraft.ts
4
5
  /**
5
6
  * React hook for managing a draft lifecycle with auto-cleanup on unmount.
7
+ * Links the draft to the commander so that `ctx.transaction()` routes through the draft
8
+ * and undo/redo is disabled while the draft is active.
6
9
  *
7
- * @param store - The zustand store containing the mimic slice
10
+ * @param store - The zustand store containing the mimic slice and commander slice
8
11
  * @returns Draft control methods
9
12
  */
10
13
  const useDraft = (store) => {
@@ -22,41 +25,41 @@ const useDraft = (store) => {
22
25
  }, []);
23
26
  const begin = (0, react.useCallback)(() => {
24
27
  if (draftRef.current !== null) throw new Error("A draft is already active. Commit or discard it first.");
25
- draftRef.current = store.getState().mimic.document.createDraft();
28
+ const draft = store.getState().mimic.document.createDraft();
29
+ draftRef.current = draft;
30
+ require_commander.setActiveDraft(store, draft);
26
31
  bumpVersion();
27
32
  }, [store, bumpVersion]);
28
33
  const commit = (0, react.useCallback)(() => {
29
34
  if (draftRef.current === null) return;
35
+ require_commander.clearActiveDraft(store);
30
36
  draftRef.current.commit();
31
37
  draftRef.current = null;
32
38
  bumpVersion();
33
- }, [bumpVersion]);
39
+ }, [store, bumpVersion]);
34
40
  const discard = (0, react.useCallback)(() => {
35
41
  if (draftRef.current === null) return;
42
+ require_commander.clearActiveDraft(store);
36
43
  draftRef.current.discard();
37
44
  draftRef.current = null;
38
45
  bumpVersion();
39
- }, [bumpVersion]);
40
- const update = (0, react.useCallback)((fn) => {
41
- if (draftRef.current === null) throw new Error("No active draft. Call begin() first.");
42
- draftRef.current.update(fn);
43
- }, []);
46
+ }, [store, bumpVersion]);
44
47
  (0, react.useEffect)(() => {
45
48
  return () => {
46
49
  if (draftRef.current !== null) {
47
50
  try {
51
+ require_commander.clearActiveDraft(store);
48
52
  draftRef.current.discard();
49
53
  } catch (_unused) {}
50
54
  draftRef.current = null;
51
55
  }
52
56
  };
53
- }, []);
57
+ }, [store]);
54
58
  return {
55
59
  draft: draftRef.current,
56
60
  begin,
57
61
  commit,
58
- discard,
59
- update
62
+ discard
60
63
  };
61
64
  };
62
65
 
@@ -1,8 +1,9 @@
1
+ import { CommanderSlice } from "../zustand-commander/types.cjs";
1
2
  import { MimicSlice } from "./types.cjs";
2
3
  import { StoreApi } from "zustand";
3
- import { ClientDocument } from "@voidhash/mimic/client";
4
4
  import * as _voidhash_mimic0 from "@voidhash/mimic";
5
5
  import { Primitive } from "@voidhash/mimic";
6
+ import { ClientDocument } from "@voidhash/mimic/client";
6
7
 
7
8
  //#region src/zustand/useDraft.d.ts
8
9
  /**
@@ -17,16 +18,16 @@ interface UseDraftReturn<TSchema extends Primitive.AnyPrimitive> {
17
18
  readonly commit: () => void;
18
19
  /** Discards the active draft. No-op if no draft is active. */
19
20
  readonly discard: () => void;
20
- /** Runs an update on the active draft. Throws if no draft is active. */
21
- readonly update: (fn: (root: Primitive.InferProxy<TSchema>) => void) => void;
22
21
  }
23
22
  /**
24
23
  * React hook for managing a draft lifecycle with auto-cleanup on unmount.
24
+ * Links the draft to the commander so that `ctx.transaction()` routes through the draft
25
+ * and undo/redo is disabled while the draft is active.
25
26
  *
26
- * @param store - The zustand store containing the mimic slice
27
+ * @param store - The zustand store containing the mimic slice and commander slice
27
28
  * @returns Draft control methods
28
29
  */
29
- declare const useDraft: <TSchema extends Primitive.AnyPrimitive, TPresence extends _voidhash_mimic0.Presence.AnyPresence | undefined = undefined>(store: StoreApi<MimicSlice<TSchema, TPresence>>) => UseDraftReturn<TSchema>;
30
+ declare const useDraft: <TSchema extends Primitive.AnyPrimitive, TPresence extends _voidhash_mimic0.Presence.AnyPresence | undefined = undefined>(store: StoreApi<MimicSlice<TSchema, TPresence> & CommanderSlice>) => UseDraftReturn<TSchema>;
30
31
  //#endregion
31
32
  export { UseDraftReturn, useDraft };
32
33
  //# sourceMappingURL=useDraft.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDraft.d.cts","names":[],"sources":["../../src/zustand/useDraft.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAUiB,UAAA,cAAc,CAAA,gBAAiB,SAAA,CAAU,YAA3B,CAAA,CAAA;EAAiB;EAEH,SAAA,KAAA,EAA3B,cAAA,CAAe,WAAY,CAAA,OAAA,CAAA,GAAA,IAAA;EAA3B;EAQkC,SAAA,KAAA,EAAA,GAAA,GAAA,IAAA;EAArB;EAAoB,SAAA,MAAA,EAAA,GAAA,GAAA,IAAA;EAStC;EACK,SAAU,OAAA,EAAA,GAAA,GAAA,IAAA;EACkB;EAEjB,SAAA,MAAA,EAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAbE,SAAA,CAAU,UAaZ,CAbuB,OAavB,CAAA,EAAA,GAAA,IAAA,EAAA,GAAA,IAAA;;;;;;;;cAJhB,2BACK,SAAA,CAAU,gCACkB,gBAAA,CAAA,QAAA,CAAS,WAAA,iCAE9C,SAAS,WAAW,SAAS,gBACnC,eAAe"}
1
+ {"version":3,"file":"useDraft.d.cts","names":[],"sources":["../../src/zustand/useDraft.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAYiB,UAAA,cAAc,CAAA,gBAAiB,SAAA,CAAU,YAA3B,CAAA,CAAA;EAAiB;EAEH,SAAA,KAAA,EAA3B,cAAA,CAAe,WAAY,CAAA,OAAA,CAAA,GAAA,IAAA;EAA3B;EAA0B,SAAA,KAAA,EAAA,GAAA,GAAA,IAAA;EAiB/B;EACK,SAAU,MAAA,EAAA,GAAA,GAAA,IAAA;EACkB;EAEjB,SAAA,OAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;;;;cAJhB,2BACK,SAAA,CAAU,gCACkB,gBAAA,CAAA,QAAA,CAAS,WAAA,iCAE9C,SAAS,WAAW,SAAS,aAAa,oBAChD,eAAe"}
@@ -1,8 +1,9 @@
1
+ import { CommanderSlice } from "../zustand-commander/types.mjs";
1
2
  import { MimicSlice } from "./types.mjs";
2
3
  import { StoreApi } from "zustand";
3
- import { ClientDocument } from "@voidhash/mimic/client";
4
4
  import * as _voidhash_mimic0 from "@voidhash/mimic";
5
5
  import { Primitive } from "@voidhash/mimic";
6
+ import { ClientDocument } from "@voidhash/mimic/client";
6
7
 
7
8
  //#region src/zustand/useDraft.d.ts
8
9
  /**
@@ -17,16 +18,16 @@ interface UseDraftReturn<TSchema extends Primitive.AnyPrimitive> {
17
18
  readonly commit: () => void;
18
19
  /** Discards the active draft. No-op if no draft is active. */
19
20
  readonly discard: () => void;
20
- /** Runs an update on the active draft. Throws if no draft is active. */
21
- readonly update: (fn: (root: Primitive.InferProxy<TSchema>) => void) => void;
22
21
  }
23
22
  /**
24
23
  * React hook for managing a draft lifecycle with auto-cleanup on unmount.
24
+ * Links the draft to the commander so that `ctx.transaction()` routes through the draft
25
+ * and undo/redo is disabled while the draft is active.
25
26
  *
26
- * @param store - The zustand store containing the mimic slice
27
+ * @param store - The zustand store containing the mimic slice and commander slice
27
28
  * @returns Draft control methods
28
29
  */
29
- declare const useDraft: <TSchema extends Primitive.AnyPrimitive, TPresence extends _voidhash_mimic0.Presence.AnyPresence | undefined = undefined>(store: StoreApi<MimicSlice<TSchema, TPresence>>) => UseDraftReturn<TSchema>;
30
+ declare const useDraft: <TSchema extends Primitive.AnyPrimitive, TPresence extends _voidhash_mimic0.Presence.AnyPresence | undefined = undefined>(store: StoreApi<MimicSlice<TSchema, TPresence> & CommanderSlice>) => UseDraftReturn<TSchema>;
30
31
  //#endregion
31
32
  export { UseDraftReturn, useDraft };
32
33
  //# sourceMappingURL=useDraft.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDraft.d.mts","names":[],"sources":["../../src/zustand/useDraft.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAUiB,UAAA,cAAc,CAAA,gBAAiB,SAAA,CAAU,YAA3B,CAAA,CAAA;EAAiB;EAEH,SAAA,KAAA,EAA3B,cAAA,CAAe,WAAY,CAAA,OAAA,CAAA,GAAA,IAAA;EAA3B;EAQkC,SAAA,KAAA,EAAA,GAAA,GAAA,IAAA;EAArB;EAAoB,SAAA,MAAA,EAAA,GAAA,GAAA,IAAA;EAStC;EACK,SAAU,OAAA,EAAA,GAAA,GAAA,IAAA;EACkB;EAEjB,SAAA,MAAA,EAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAbE,SAAA,CAAU,UAaZ,CAbuB,OAavB,CAAA,EAAA,GAAA,IAAA,EAAA,GAAA,IAAA;;;;;;;;cAJhB,2BACK,SAAA,CAAU,gCACkB,gBAAA,CAAA,QAAA,CAAS,WAAA,iCAE9C,SAAS,WAAW,SAAS,gBACnC,eAAe"}
1
+ {"version":3,"file":"useDraft.d.mts","names":[],"sources":["../../src/zustand/useDraft.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAYiB,UAAA,cAAc,CAAA,gBAAiB,SAAA,CAAU,YAA3B,CAAA,CAAA;EAAiB;EAEH,SAAA,KAAA,EAA3B,cAAA,CAAe,WAAY,CAAA,OAAA,CAAA,GAAA,IAAA;EAA3B;EAA0B,SAAA,KAAA,EAAA,GAAA,GAAA,IAAA;EAiB/B;EACK,SAAU,MAAA,EAAA,GAAA,GAAA,IAAA;EACkB;EAEjB,SAAA,OAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;;;;cAJhB,2BACK,SAAA,CAAU,gCACkB,gBAAA,CAAA,QAAA,CAAS,WAAA,iCAE9C,SAAS,WAAW,SAAS,aAAa,oBAChD,eAAe"}
@@ -1,10 +1,13 @@
1
+ import { clearActiveDraft, setActiveDraft } from "../zustand-commander/commander.mjs";
1
2
  import { useCallback, useEffect, useRef, useSyncExternalStore } from "react";
2
3
 
3
4
  //#region src/zustand/useDraft.ts
4
5
  /**
5
6
  * React hook for managing a draft lifecycle with auto-cleanup on unmount.
7
+ * Links the draft to the commander so that `ctx.transaction()` routes through the draft
8
+ * and undo/redo is disabled while the draft is active.
6
9
  *
7
- * @param store - The zustand store containing the mimic slice
10
+ * @param store - The zustand store containing the mimic slice and commander slice
8
11
  * @returns Draft control methods
9
12
  */
10
13
  const useDraft = (store) => {
@@ -22,41 +25,41 @@ const useDraft = (store) => {
22
25
  }, []);
23
26
  const begin = useCallback(() => {
24
27
  if (draftRef.current !== null) throw new Error("A draft is already active. Commit or discard it first.");
25
- draftRef.current = store.getState().mimic.document.createDraft();
28
+ const draft = store.getState().mimic.document.createDraft();
29
+ draftRef.current = draft;
30
+ setActiveDraft(store, draft);
26
31
  bumpVersion();
27
32
  }, [store, bumpVersion]);
28
33
  const commit = useCallback(() => {
29
34
  if (draftRef.current === null) return;
35
+ clearActiveDraft(store);
30
36
  draftRef.current.commit();
31
37
  draftRef.current = null;
32
38
  bumpVersion();
33
- }, [bumpVersion]);
39
+ }, [store, bumpVersion]);
34
40
  const discard = useCallback(() => {
35
41
  if (draftRef.current === null) return;
42
+ clearActiveDraft(store);
36
43
  draftRef.current.discard();
37
44
  draftRef.current = null;
38
45
  bumpVersion();
39
- }, [bumpVersion]);
40
- const update = useCallback((fn) => {
41
- if (draftRef.current === null) throw new Error("No active draft. Call begin() first.");
42
- draftRef.current.update(fn);
43
- }, []);
46
+ }, [store, bumpVersion]);
44
47
  useEffect(() => {
45
48
  return () => {
46
49
  if (draftRef.current !== null) {
47
50
  try {
51
+ clearActiveDraft(store);
48
52
  draftRef.current.discard();
49
53
  } catch (_unused) {}
50
54
  draftRef.current = null;
51
55
  }
52
56
  };
53
- }, []);
57
+ }, [store]);
54
58
  return {
55
59
  draft: draftRef.current,
56
60
  begin,
57
61
  commit,
58
- discard,
59
- update
62
+ discard
60
63
  };
61
64
  };
62
65
 
@@ -1 +1 @@
1
- {"version":3,"file":"useDraft.mjs","names":[],"sources":["../../src/zustand/useDraft.ts"],"sourcesContent":["import { useRef, useCallback, useEffect } from \"react\";\nimport { useSyncExternalStore } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport type { ClientDocument } from \"@voidhash/mimic/client\";\nimport type { Primitive } from \"@voidhash/mimic\";\nimport type { MimicSlice } from \"./types\";\n\n/**\n * Return type of the useDraft hook.\n */\nexport interface UseDraftReturn<TSchema extends Primitive.AnyPrimitive> {\n /** The active draft handle, or null if no draft is active */\n readonly draft: ClientDocument.DraftHandle<TSchema> | null;\n /** Creates a new draft. Throws if a draft is already active. */\n readonly begin: () => void;\n /** Commits the active draft. No-op if no draft is active. */\n readonly commit: () => void;\n /** Discards the active draft. No-op if no draft is active. */\n readonly discard: () => void;\n /** Runs an update on the active draft. Throws if no draft is active. */\n readonly update: (fn: (root: Primitive.InferProxy<TSchema>) => void) => void;\n}\n\n/**\n * React hook for managing a draft lifecycle with auto-cleanup on unmount.\n *\n * @param store - The zustand store containing the mimic slice\n * @returns Draft control methods\n */\nexport const useDraft = <\n TSchema extends Primitive.AnyPrimitive,\n TPresence extends import(\"@voidhash/mimic\").Presence.AnyPresence | undefined = undefined,\n>(\n store: StoreApi<MimicSlice<TSchema, TPresence>>\n): UseDraftReturn<TSchema> => {\n const draftRef = useRef<ClientDocument.DraftHandle<TSchema> | null>(null);\n // Use a counter to force re-renders when draft state changes\n const versionRef = useRef(0);\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n // We piggyback on the zustand store subscription to know when drafts change\n return store.subscribe(onStoreChange);\n },\n [store]\n );\n\n const getSnapshot = useCallback(() => {\n return versionRef.current;\n }, []);\n\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const bumpVersion = useCallback(() => {\n versionRef.current++;\n }, []);\n\n const begin = useCallback(() => {\n if (draftRef.current !== null) {\n throw new Error(\"A draft is already active. Commit or discard it first.\");\n }\n const document = store.getState().mimic.document;\n draftRef.current = document.createDraft();\n bumpVersion();\n }, [store, bumpVersion]);\n\n const commit = useCallback(() => {\n if (draftRef.current === null) return;\n draftRef.current.commit();\n draftRef.current = null;\n bumpVersion();\n }, [bumpVersion]);\n\n const discard = useCallback(() => {\n if (draftRef.current === null) return;\n draftRef.current.discard();\n draftRef.current = null;\n bumpVersion();\n }, [bumpVersion]);\n\n const update = useCallback(\n (fn: (root: Primitive.InferProxy<TSchema>) => void) => {\n if (draftRef.current === null) {\n throw new Error(\"No active draft. Call begin() first.\");\n }\n draftRef.current.update(fn);\n },\n []\n );\n\n // Auto-discard on unmount\n useEffect(() => {\n return () => {\n if (draftRef.current !== null) {\n try {\n draftRef.current.discard();\n } catch {\n // Draft may already be consumed\n }\n draftRef.current = null;\n }\n };\n }, []);\n\n return {\n draft: draftRef.current,\n begin,\n commit,\n discard,\n update,\n };\n};\n"],"mappings":";;;;;;;;;AA6BA,MAAa,YAIX,UAC4B;CAC5B,MAAM,WAAW,OAAmD,KAAK;CAEzE,MAAM,aAAa,OAAO,EAAE;CAE5B,MAAM,YAAY,aACf,kBAA8B;AAE7B,SAAO,MAAM,UAAU,cAAc;IAEvC,CAAC,MAAM,CACR;CAED,MAAM,cAAc,kBAAkB;AACpC,SAAO,WAAW;IACjB,EAAE,CAAC;AAEN,sBAAqB,WAAW,aAAa,YAAY;CAEzD,MAAM,cAAc,kBAAkB;AACpC,aAAW;IACV,EAAE,CAAC;CAEN,MAAM,QAAQ,kBAAkB;AAC9B,MAAI,SAAS,YAAY,KACvB,OAAM,IAAI,MAAM,yDAAyD;AAG3E,WAAS,UADQ,MAAM,UAAU,CAAC,MAAM,SACZ,aAAa;AACzC,eAAa;IACZ,CAAC,OAAO,YAAY,CAAC;CAExB,MAAM,SAAS,kBAAkB;AAC/B,MAAI,SAAS,YAAY,KAAM;AAC/B,WAAS,QAAQ,QAAQ;AACzB,WAAS,UAAU;AACnB,eAAa;IACZ,CAAC,YAAY,CAAC;CAEjB,MAAM,UAAU,kBAAkB;AAChC,MAAI,SAAS,YAAY,KAAM;AAC/B,WAAS,QAAQ,SAAS;AAC1B,WAAS,UAAU;AACnB,eAAa;IACZ,CAAC,YAAY,CAAC;CAEjB,MAAM,SAAS,aACZ,OAAsD;AACrD,MAAI,SAAS,YAAY,KACvB,OAAM,IAAI,MAAM,uCAAuC;AAEzD,WAAS,QAAQ,OAAO,GAAG;IAE7B,EAAE,CACH;AAGD,iBAAgB;AACd,eAAa;AACX,OAAI,SAAS,YAAY,MAAM;AAC7B,QAAI;AACF,cAAS,QAAQ,SAAS;sBACpB;AAGR,aAAS,UAAU;;;IAGtB,EAAE,CAAC;AAEN,QAAO;EACL,OAAO,SAAS;EAChB;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"useDraft.mjs","names":[],"sources":["../../src/zustand/useDraft.ts"],"sourcesContent":["import { useRef, useCallback, useEffect } from \"react\";\nimport { useSyncExternalStore } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport type { ClientDocument } from \"@voidhash/mimic/client\";\nimport type { Primitive } from \"@voidhash/mimic\";\nimport type { MimicSlice } from \"./types\";\nimport type { CommanderSlice } from \"../zustand-commander/types\";\nimport { setActiveDraft, clearActiveDraft } from \"../zustand-commander/commander\";\n\n/**\n * Return type of the useDraft hook.\n */\nexport interface UseDraftReturn<TSchema extends Primitive.AnyPrimitive> {\n /** The active draft handle, or null if no draft is active */\n readonly draft: ClientDocument.DraftHandle<TSchema> | null;\n /** Creates a new draft. Throws if a draft is already active. */\n readonly begin: () => void;\n /** Commits the active draft. No-op if no draft is active. */\n readonly commit: () => void;\n /** Discards the active draft. No-op if no draft is active. */\n readonly discard: () => void;\n}\n\n/**\n * React hook for managing a draft lifecycle with auto-cleanup on unmount.\n * Links the draft to the commander so that `ctx.transaction()` routes through the draft\n * and undo/redo is disabled while the draft is active.\n *\n * @param store - The zustand store containing the mimic slice and commander slice\n * @returns Draft control methods\n */\nexport const useDraft = <\n TSchema extends Primitive.AnyPrimitive,\n TPresence extends import(\"@voidhash/mimic\").Presence.AnyPresence | undefined = undefined,\n>(\n store: StoreApi<MimicSlice<TSchema, TPresence> & CommanderSlice>\n): UseDraftReturn<TSchema> => {\n const draftRef = useRef<ClientDocument.DraftHandle<TSchema> | null>(null);\n // Use a counter to force re-renders when draft state changes\n const versionRef = useRef(0);\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n // We piggyback on the zustand store subscription to know when drafts change\n return store.subscribe(onStoreChange);\n },\n [store]\n );\n\n const getSnapshot = useCallback(() => {\n return versionRef.current;\n }, []);\n\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const bumpVersion = useCallback(() => {\n versionRef.current++;\n }, []);\n\n const begin = useCallback(() => {\n if (draftRef.current !== null) {\n throw new Error(\"A draft is already active. Commit or discard it first.\");\n }\n const document = store.getState().mimic.document;\n const draft = document.createDraft();\n draftRef.current = draft;\n setActiveDraft(store, draft);\n bumpVersion();\n }, [store, bumpVersion]);\n\n const commit = useCallback(() => {\n if (draftRef.current === null) return;\n clearActiveDraft(store);\n draftRef.current.commit();\n draftRef.current = null;\n bumpVersion();\n }, [store, bumpVersion]);\n\n const discard = useCallback(() => {\n if (draftRef.current === null) return;\n clearActiveDraft(store);\n draftRef.current.discard();\n draftRef.current = null;\n bumpVersion();\n }, [store, bumpVersion]);\n\n // Auto-discard on unmount\n useEffect(() => {\n return () => {\n if (draftRef.current !== null) {\n try {\n clearActiveDraft(store);\n draftRef.current.discard();\n } catch {\n // Draft may already be consumed\n }\n draftRef.current = null;\n }\n };\n }, [store]);\n\n return {\n draft: draftRef.current,\n begin,\n commit,\n discard,\n };\n};\n"],"mappings":";;;;;;;;;;;;AA+BA,MAAa,YAIX,UAC4B;CAC5B,MAAM,WAAW,OAAmD,KAAK;CAEzE,MAAM,aAAa,OAAO,EAAE;CAE5B,MAAM,YAAY,aACf,kBAA8B;AAE7B,SAAO,MAAM,UAAU,cAAc;IAEvC,CAAC,MAAM,CACR;CAED,MAAM,cAAc,kBAAkB;AACpC,SAAO,WAAW;IACjB,EAAE,CAAC;AAEN,sBAAqB,WAAW,aAAa,YAAY;CAEzD,MAAM,cAAc,kBAAkB;AACpC,aAAW;IACV,EAAE,CAAC;CAEN,MAAM,QAAQ,kBAAkB;AAC9B,MAAI,SAAS,YAAY,KACvB,OAAM,IAAI,MAAM,yDAAyD;EAG3E,MAAM,QADW,MAAM,UAAU,CAAC,MAAM,SACjB,aAAa;AACpC,WAAS,UAAU;AACnB,iBAAe,OAAO,MAAM;AAC5B,eAAa;IACZ,CAAC,OAAO,YAAY,CAAC;CAExB,MAAM,SAAS,kBAAkB;AAC/B,MAAI,SAAS,YAAY,KAAM;AAC/B,mBAAiB,MAAM;AACvB,WAAS,QAAQ,QAAQ;AACzB,WAAS,UAAU;AACnB,eAAa;IACZ,CAAC,OAAO,YAAY,CAAC;CAExB,MAAM,UAAU,kBAAkB;AAChC,MAAI,SAAS,YAAY,KAAM;AAC/B,mBAAiB,MAAM;AACvB,WAAS,QAAQ,SAAS;AAC1B,WAAS,UAAU;AACnB,eAAa;IACZ,CAAC,OAAO,YAAY,CAAC;AAGxB,iBAAgB;AACd,eAAa;AACX,OAAI,SAAS,YAAY,MAAM;AAC7B,QAAI;AACF,sBAAiB,MAAM;AACvB,cAAS,QAAQ,SAAS;sBACpB;AAGR,aAAS,UAAU;;;IAGtB,CAAC,MAAM,CAAC;AAEX,QAAO;EACL,OAAO,SAAS;EAChB;EACA;EACA;EACD"}
@@ -4,6 +4,21 @@ const require_types = require('./types.cjs');
4
4
  //#region src/zustand-commander/commander.ts
5
5
  const DEFAULT_OPTIONS = { maxUndoStackSize: 100 };
6
6
  /**
7
+ * Build a transaction function that routes to draft or document.
8
+ */
9
+ function buildTransaction(storeApi) {
10
+ return (fn) => {
11
+ const state = storeApi.getState();
12
+ const draft = state._commander.activeDraft;
13
+ if (draft) draft.update(fn);
14
+ else {
15
+ const mimic = state.mimic;
16
+ if (!(mimic === null || mimic === void 0 ? void 0 : mimic.document)) throw new Error("Commander: No active draft and no mimic document found on the store.");
17
+ mimic.document.transaction(fn);
18
+ }
19
+ };
20
+ }
21
+ /**
7
22
  * Creates a commander instance bound to a specific store type.
8
23
  *
9
24
  * @example
@@ -15,8 +30,7 @@ const DEFAULT_OPTIONS = { maxUndoStackSize: 100 };
15
30
  * const addItem = commander.action(
16
31
  * Schema.Struct({ name: Schema.String }),
17
32
  * (ctx, params) => {
18
- * const { mimic } = ctx.getState();
19
- * mimic.document.transaction(root => {
33
+ * ctx.transaction(root => {
20
34
  * // add item
21
35
  * });
22
36
  * }
@@ -45,10 +59,12 @@ function createCommander(options = {}) {
45
59
  const ctx = {
46
60
  getState: () => _storeApi.getState(),
47
61
  setState: (partial) => _storeApi.setState(partial),
48
- dispatch: createDispatch()
62
+ dispatch: createDispatch(),
63
+ transaction: buildTransaction(_storeApi)
49
64
  };
50
65
  const result = command.fn(ctx, params);
51
- if (require_types.isUndoableCommand(command)) {
66
+ const hasDraft = _storeApi.getState()._commander.activeDraft !== null;
67
+ if (require_types.isUndoableCommand(command) && !hasDraft) {
52
68
  const entry = {
53
69
  command,
54
70
  params,
@@ -56,12 +72,12 @@ function createCommander(options = {}) {
56
72
  timestamp: Date.now()
57
73
  };
58
74
  _storeApi.setState((state) => {
59
- const { undoStack, redoStack } = state._commander;
75
+ const { undoStack, redoStack: _redoStack } = state._commander;
60
76
  const newUndoStack = [...undoStack, entry].slice(-maxUndoStackSize);
61
- return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: {
77
+ return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state._commander), {}, {
62
78
  undoStack: newUndoStack,
63
79
  redoStack: []
64
- } });
80
+ }) });
65
81
  });
66
82
  }
67
83
  return result;
@@ -96,7 +112,8 @@ function createCommander(options = {}) {
96
112
  _storeApi = api;
97
113
  return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, config(set, get, api)), {}, { _commander: {
98
114
  undoStack: [],
99
- redoStack: []
115
+ redoStack: [],
116
+ activeDraft: null
100
117
  } });
101
118
  };
102
119
  };
@@ -107,39 +124,56 @@ function createCommander(options = {}) {
107
124
  };
108
125
  }
109
126
  /**
127
+ * Set the active draft on the commander slice.
128
+ * While a draft is active, transactions route through `draft.update()` and undo is disabled.
129
+ */
130
+ function setActiveDraft(storeApi, draft) {
131
+ storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state._commander), {}, { activeDraft: draft }) }));
132
+ }
133
+ /**
134
+ * Clear the active draft from the commander slice.
135
+ */
136
+ function clearActiveDraft(storeApi) {
137
+ storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state._commander), {}, { activeDraft: null }) }));
138
+ }
139
+ /**
110
140
  * Perform an undo operation on the store.
111
- * Returns true if an undo was performed, false if undo stack was empty.
141
+ * Returns true if an undo was performed, false if undo stack was empty or a draft is active.
112
142
  */
113
143
  function performUndo(storeApi) {
114
- const { undoStack, redoStack } = storeApi.getState()._commander;
144
+ const { undoStack, redoStack, activeDraft } = storeApi.getState()._commander;
145
+ if (activeDraft) return false;
115
146
  const entry = undoStack[undoStack.length - 1];
116
147
  if (!entry) return false;
117
148
  const newUndoStack = undoStack.slice(0, -1);
118
149
  const ctx = {
119
150
  getState: () => storeApi.getState(),
120
151
  setState: (partial) => storeApi.setState(partial),
121
- dispatch: createDispatchForUndo(storeApi)
152
+ dispatch: createDispatchForUndo(storeApi),
153
+ transaction: buildTransaction(storeApi)
122
154
  };
123
155
  entry.command.revert(ctx, entry.params, entry.result);
124
- storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: {
156
+ storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state._commander), {}, {
125
157
  undoStack: newUndoStack,
126
158
  redoStack: [...redoStack, entry]
127
- } }));
159
+ }) }));
128
160
  return true;
129
161
  }
130
162
  /**
131
163
  * Perform a redo operation on the store.
132
- * Returns true if a redo was performed, false if redo stack was empty.
164
+ * Returns true if a redo was performed, false if redo stack was empty or a draft is active.
133
165
  */
134
166
  function performRedo(storeApi) {
135
- const { undoStack, redoStack } = storeApi.getState()._commander;
167
+ const { undoStack, redoStack, activeDraft } = storeApi.getState()._commander;
168
+ if (activeDraft) return false;
136
169
  const entry = redoStack[redoStack.length - 1];
137
170
  if (!entry) return false;
138
171
  const newRedoStack = redoStack.slice(0, -1);
139
172
  const ctx = {
140
173
  getState: () => storeApi.getState(),
141
174
  setState: (partial) => storeApi.setState(partial),
142
- dispatch: createDispatchForUndo(storeApi)
175
+ dispatch: createDispatchForUndo(storeApi),
176
+ transaction: buildTransaction(storeApi)
143
177
  };
144
178
  const result = entry.command.fn(ctx, entry.params);
145
179
  const newEntry = {
@@ -148,10 +182,10 @@ function performRedo(storeApi) {
148
182
  result,
149
183
  timestamp: Date.now()
150
184
  };
151
- storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: {
185
+ storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state._commander), {}, {
152
186
  undoStack: [...undoStack, newEntry],
153
187
  redoStack: newRedoStack
154
- } }));
188
+ }) }));
155
189
  return true;
156
190
  }
157
191
  /**
@@ -164,7 +198,8 @@ function createDispatchForUndo(storeApi) {
164
198
  const ctx = {
165
199
  getState: () => storeApi.getState(),
166
200
  setState: (partial) => storeApi.setState(partial),
167
- dispatch: createDispatchForUndo(storeApi)
201
+ dispatch: createDispatchForUndo(storeApi),
202
+ transaction: buildTransaction(storeApi)
168
203
  };
169
204
  return command.fn(ctx, params);
170
205
  };
@@ -174,14 +209,16 @@ function createDispatchForUndo(storeApi) {
174
209
  * Clear the undo and redo stacks.
175
210
  */
176
211
  function clearUndoHistory(storeApi) {
177
- storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: {
212
+ storeApi.setState((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { _commander: require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state._commander), {}, {
178
213
  undoStack: [],
179
214
  redoStack: []
180
- } }));
215
+ }) }));
181
216
  }
182
217
 
183
218
  //#endregion
219
+ exports.clearActiveDraft = clearActiveDraft;
184
220
  exports.clearUndoHistory = clearUndoHistory;
185
221
  exports.createCommander = createCommander;
186
222
  exports.performRedo = performRedo;
187
- exports.performUndo = performUndo;
223
+ exports.performUndo = performUndo;
224
+ exports.setActiveDraft = setActiveDraft;
@@ -1,5 +1,7 @@
1
1
  import { Commander, CommanderOptions, CommanderSlice } from "./types.cjs";
2
2
  import { StoreApi } from "zustand";
3
+ import { Primitive } from "@voidhash/mimic";
4
+ import { ClientDocument } from "@voidhash/mimic/client";
3
5
 
4
6
  //#region src/zustand-commander/commander.d.ts
5
7
 
@@ -15,8 +17,7 @@ import { StoreApi } from "zustand";
15
17
  * const addItem = commander.action(
16
18
  * Schema.Struct({ name: Schema.String }),
17
19
  * (ctx, params) => {
18
- * const { mimic } = ctx.getState();
19
- * mimic.document.transaction(root => {
20
+ * ctx.transaction(root => {
20
21
  * // add item
21
22
  * });
22
23
  * }
@@ -32,15 +33,24 @@ import { StoreApi } from "zustand";
32
33
  * );
33
34
  * ```
34
35
  */
35
- declare function createCommander<TStore extends object>(options?: CommanderOptions): Commander<TStore & CommanderSlice>;
36
+ declare function createCommander<TStore extends object, TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive>(options?: CommanderOptions): Commander<TStore & CommanderSlice, TSchema>;
37
+ /**
38
+ * Set the active draft on the commander slice.
39
+ * While a draft is active, transactions route through `draft.update()` and undo is disabled.
40
+ */
41
+ declare function setActiveDraft<TStore extends CommanderSlice>(storeApi: StoreApi<TStore>, draft: ClientDocument.DraftHandle<any>): void;
42
+ /**
43
+ * Clear the active draft from the commander slice.
44
+ */
45
+ declare function clearActiveDraft<TStore extends CommanderSlice>(storeApi: StoreApi<TStore>): void;
36
46
  /**
37
47
  * Perform an undo operation on the store.
38
- * Returns true if an undo was performed, false if undo stack was empty.
48
+ * Returns true if an undo was performed, false if undo stack was empty or a draft is active.
39
49
  */
40
50
  declare function performUndo<TStore extends CommanderSlice>(storeApi: StoreApi<TStore>): boolean;
41
51
  /**
42
52
  * Perform a redo operation on the store.
43
- * Returns true if a redo was performed, false if redo stack was empty.
53
+ * Returns true if a redo was performed, false if redo stack was empty or a draft is active.
44
54
  */
45
55
  declare function performRedo<TStore extends CommanderSlice>(storeApi: StoreApi<TStore>): boolean;
46
56
  /**
@@ -48,5 +58,5 @@ declare function performRedo<TStore extends CommanderSlice>(storeApi: StoreApi<T
48
58
  */
49
59
  declare function clearUndoHistory<TStore extends CommanderSlice>(storeApi: StoreApi<TStore>): void;
50
60
  //#endregion
51
- export { clearUndoHistory, createCommander, performRedo, performUndo };
61
+ export { clearActiveDraft, clearUndoHistory, createCommander, performRedo, performUndo, setActiveDraft };
52
62
  //# sourceMappingURL=commander.d.cts.map