@voidhash/mimic-react 0.0.1 → 0.0.3
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/.turbo/turbo-build.log +60 -26
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.cjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/defineProperty.mjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.cjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectSpread2.mjs +27 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.cjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPrimitive.mjs +16 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.mjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.cjs +18 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/typeof.mjs +12 -0
- package/dist/zustand/index.cjs +2 -94
- package/dist/zustand/index.d.cts +3 -115
- package/dist/zustand/index.d.mts +3 -115
- package/dist/zustand/index.mjs +2 -95
- package/dist/zustand/middleware.cjs +95 -0
- package/dist/zustand/middleware.d.cts +47 -0
- package/dist/zustand/middleware.d.cts.map +1 -0
- package/dist/zustand/middleware.d.mts +47 -0
- package/dist/zustand/middleware.d.mts.map +1 -0
- package/dist/zustand/middleware.mjs +96 -0
- package/dist/zustand/middleware.mjs.map +1 -0
- package/dist/zustand/types.d.cts +75 -0
- package/dist/zustand/types.d.cts.map +1 -0
- package/dist/zustand/types.d.mts +75 -0
- package/dist/zustand/types.d.mts.map +1 -0
- package/dist/zustand-commander/commander.cjs +187 -0
- package/dist/zustand-commander/commander.d.cts +52 -0
- package/dist/zustand-commander/commander.d.cts.map +1 -0
- package/dist/zustand-commander/commander.d.mts +52 -0
- package/dist/zustand-commander/commander.d.mts.map +1 -0
- package/dist/zustand-commander/commander.mjs +185 -0
- package/dist/zustand-commander/commander.mjs.map +1 -0
- package/dist/zustand-commander/hooks.cjs +145 -0
- package/dist/zustand-commander/hooks.d.cts +78 -0
- package/dist/zustand-commander/hooks.d.cts.map +1 -0
- package/dist/zustand-commander/hooks.d.mts +78 -0
- package/dist/zustand-commander/hooks.d.mts.map +1 -0
- package/dist/zustand-commander/hooks.mjs +144 -0
- package/dist/zustand-commander/hooks.mjs.map +1 -0
- package/dist/zustand-commander/index.cjs +15 -354
- package/dist/zustand-commander/index.d.cts +4 -313
- package/dist/zustand-commander/index.d.mts +4 -313
- package/dist/zustand-commander/index.mjs +4 -344
- package/dist/zustand-commander/types.cjs +28 -0
- package/dist/zustand-commander/types.d.cts +195 -0
- package/dist/zustand-commander/types.d.cts.map +1 -0
- package/dist/zustand-commander/types.d.mts +195 -0
- package/dist/zustand-commander/types.d.mts.map +1 -0
- package/dist/zustand-commander/types.mjs +25 -0
- package/dist/zustand-commander/types.mjs.map +1 -0
- package/package.json +3 -3
- package/tsdown.config.ts +1 -1
- package/dist/objectSpread2-CIP_6jda.cjs +0 -73
- package/dist/objectSpread2-CxTyNSYl.mjs +0 -67
- package/dist/zustand/index.d.cts.map +0 -1
- package/dist/zustand/index.d.mts.map +0 -1
- package/dist/zustand/index.mjs.map +0 -1
- package/dist/zustand-commander/index.d.cts.map +0 -1
- package/dist/zustand-commander/index.d.mts.map +0 -1
- package/dist/zustand-commander/index.mjs.map +0 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { StoreApi, UseBoundStore } from "zustand";
|
|
2
|
+
|
|
3
|
+
//#region src/zustand-commander/types.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Symbol used to identify Command objects at runtime.
|
|
7
|
+
*/
|
|
8
|
+
declare const COMMAND_SYMBOL: unique symbol;
|
|
9
|
+
/**
|
|
10
|
+
* Symbol used to identify UndoableCommand objects at runtime.
|
|
11
|
+
*/
|
|
12
|
+
declare const UNDOABLE_COMMAND_SYMBOL: unique symbol;
|
|
13
|
+
/**
|
|
14
|
+
* Context provided to command functions.
|
|
15
|
+
* Gives access to store state and dispatch capabilities.
|
|
16
|
+
*/
|
|
17
|
+
interface CommandContext<TStore> {
|
|
18
|
+
/**
|
|
19
|
+
* Get the current store state.
|
|
20
|
+
*/
|
|
21
|
+
readonly getState: () => TStore;
|
|
22
|
+
/**
|
|
23
|
+
* Set partial store state (for local/browser state updates).
|
|
24
|
+
*/
|
|
25
|
+
readonly setState: (partial: Partial<TStore>) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Dispatch another command.
|
|
28
|
+
* Returns the result of the dispatched command.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* dispatch(otherCommand)({ param: "value" });
|
|
32
|
+
*/
|
|
33
|
+
readonly dispatch: CommandDispatch<TStore>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The function signature for a command handler.
|
|
37
|
+
*/
|
|
38
|
+
type CommandFn<TStore, TParams, TReturn> = (ctx: CommandContext<TStore>, params: TParams) => TReturn;
|
|
39
|
+
/**
|
|
40
|
+
* The function signature for an undoable command's revert handler.
|
|
41
|
+
* Receives the original params and the result from the forward execution.
|
|
42
|
+
*/
|
|
43
|
+
type RevertFn<TStore, TParams, TReturn> = (ctx: CommandContext<TStore>, params: TParams, result: TReturn) => void;
|
|
44
|
+
/**
|
|
45
|
+
* A command that can be dispatched to modify store state.
|
|
46
|
+
* Regular commands do not support undo/redo.
|
|
47
|
+
*/
|
|
48
|
+
interface Command<TStore, TParams, TReturn> {
|
|
49
|
+
readonly [COMMAND_SYMBOL]: true;
|
|
50
|
+
readonly fn: CommandFn<TStore, TParams, TReturn>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* An undoable command that supports undo/redo.
|
|
54
|
+
* Must provide a revert function that knows how to undo the change.
|
|
55
|
+
*/
|
|
56
|
+
interface UndoableCommand<TStore, TParams, TReturn> extends Command<TStore, TParams, TReturn> {
|
|
57
|
+
readonly [UNDOABLE_COMMAND_SYMBOL]: true;
|
|
58
|
+
readonly revert: RevertFn<TStore, TParams, TReturn>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Any command type (regular or undoable).
|
|
62
|
+
*/
|
|
63
|
+
type AnyCommand = Command<any, any, any>;
|
|
64
|
+
/**
|
|
65
|
+
* Any undoable command type.
|
|
66
|
+
*/
|
|
67
|
+
type AnyUndoableCommand = UndoableCommand<any, any, any>;
|
|
68
|
+
/**
|
|
69
|
+
* Dispatch function that accepts commands and returns a function to call with params.
|
|
70
|
+
* Returns the result of the command execution.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* const result = dispatch(myCommand)({ param: "value" });
|
|
74
|
+
*/
|
|
75
|
+
type CommandDispatch<TStore> = <TParams, TReturn>(command: Command<TStore, TParams, TReturn>) => (params: TParams) => TReturn;
|
|
76
|
+
/**
|
|
77
|
+
* An entry in the undo/redo stack.
|
|
78
|
+
* Contains all information needed to revert or redo a command.
|
|
79
|
+
*/
|
|
80
|
+
interface UndoEntry<TParams = unknown, TReturn = unknown> {
|
|
81
|
+
/** The undoable command that was executed */
|
|
82
|
+
readonly command: AnyUndoableCommand;
|
|
83
|
+
/** The parameters that were passed to the command */
|
|
84
|
+
readonly params: TParams;
|
|
85
|
+
/** The result returned by the command (passed to revert) */
|
|
86
|
+
readonly result: TReturn;
|
|
87
|
+
/** Timestamp when the command was executed */
|
|
88
|
+
readonly timestamp: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* State slice for undo/redo functionality.
|
|
92
|
+
*/
|
|
93
|
+
interface CommanderSlice {
|
|
94
|
+
readonly _commander: {
|
|
95
|
+
/** Stack of commands that can be undone */
|
|
96
|
+
readonly undoStack: ReadonlyArray<UndoEntry>;
|
|
97
|
+
/** Stack of commands that can be redone */
|
|
98
|
+
readonly redoStack: ReadonlyArray<UndoEntry>;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Options for creating a commander.
|
|
103
|
+
*/
|
|
104
|
+
interface CommanderOptions {
|
|
105
|
+
/**
|
|
106
|
+
* Maximum number of undo entries to keep.
|
|
107
|
+
* @default 100
|
|
108
|
+
*/
|
|
109
|
+
readonly maxUndoStackSize?: number;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A commander instance bound to a specific store type.
|
|
113
|
+
* Used to create commands and the middleware.
|
|
114
|
+
*/
|
|
115
|
+
interface Commander<TStore> {
|
|
116
|
+
/**
|
|
117
|
+
* Create a regular command (no undo support).
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* // With params
|
|
121
|
+
* const addItem = commander.action<{ name: string }>(
|
|
122
|
+
* (ctx, params) => {
|
|
123
|
+
* // modify state using params.name
|
|
124
|
+
* }
|
|
125
|
+
* );
|
|
126
|
+
*
|
|
127
|
+
* // Without params
|
|
128
|
+
* const clearAll = commander.action((ctx) => {
|
|
129
|
+
* // modify state
|
|
130
|
+
* });
|
|
131
|
+
*/
|
|
132
|
+
readonly action: {
|
|
133
|
+
<TParams, TReturn = void>(fn: CommandFn<TStore, TParams, TReturn>): Command<TStore, TParams, TReturn>;
|
|
134
|
+
<TReturn = void>(fn: CommandFn<TStore, void, TReturn>): Command<TStore, void, TReturn>;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Create an undoable command with undo/redo support.
|
|
138
|
+
* The revert function is called when undoing the command.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* const moveItem = commander.undoableAction<{ id: string; toIndex: number }, { fromIndex: number }>(
|
|
142
|
+
* (ctx, params) => {
|
|
143
|
+
* const fromIndex = // get current index
|
|
144
|
+
* // perform move
|
|
145
|
+
* return { fromIndex }; // return data needed for revert
|
|
146
|
+
* },
|
|
147
|
+
* (ctx, params, result) => {
|
|
148
|
+
* // revert: move back to original position
|
|
149
|
+
* ctx.dispatch(moveItem)({ id: params.id, toIndex: result.fromIndex });
|
|
150
|
+
* }
|
|
151
|
+
* );
|
|
152
|
+
*/
|
|
153
|
+
readonly undoableAction: {
|
|
154
|
+
<TParams, TReturn>(fn: CommandFn<TStore, TParams, TReturn>, revert: RevertFn<TStore, TParams, TReturn>): UndoableCommand<TStore, TParams, TReturn>;
|
|
155
|
+
<TReturn>(fn: CommandFn<TStore, void, TReturn>, revert: RevertFn<TStore, void, TReturn>): UndoableCommand<TStore, void, TReturn>;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Zustand middleware that adds commander functionality.
|
|
159
|
+
* Adds undo/redo stacks to the store state.
|
|
160
|
+
*/
|
|
161
|
+
readonly middleware: CommanderMiddleware<TStore>;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Type for the commander middleware.
|
|
165
|
+
* Note: TStore is intentionally unused here to match the Commander interface signature.
|
|
166
|
+
* The middleware is generic over T (the inner store type) and adds CommanderSlice.
|
|
167
|
+
*/
|
|
168
|
+
type CommanderMiddleware<_TStore> = <T extends object>(config: (set: StoreApi<T & CommanderSlice>["setState"], get: StoreApi<T & CommanderSlice>["getState"], api: StoreApi<T & CommanderSlice>) => T) => (set: StoreApi<T & CommanderSlice>["setState"], get: StoreApi<T & CommanderSlice>["getState"], api: StoreApi<T & CommanderSlice>) => T & CommanderSlice;
|
|
169
|
+
/**
|
|
170
|
+
* Extract the params type from a command.
|
|
171
|
+
*/
|
|
172
|
+
type CommandParams<T> = T extends Command<any, infer P, any> ? P : never;
|
|
173
|
+
/**
|
|
174
|
+
* Extract the return type from a command.
|
|
175
|
+
*/
|
|
176
|
+
type CommandReturn<T> = T extends Command<any, any, infer R> ? R : undefined;
|
|
177
|
+
/**
|
|
178
|
+
* Extract the store type from a command.
|
|
179
|
+
*/
|
|
180
|
+
type CommandStore<T> = T extends Command<infer S, any, any> ? S : never;
|
|
181
|
+
/**
|
|
182
|
+
* Type guard to check if a value is a Command.
|
|
183
|
+
*/
|
|
184
|
+
declare function isCommand(value: unknown): value is AnyCommand;
|
|
185
|
+
/**
|
|
186
|
+
* Type guard to check if a command is undoable.
|
|
187
|
+
*/
|
|
188
|
+
declare function isUndoableCommand(value: unknown): value is AnyUndoableCommand;
|
|
189
|
+
/**
|
|
190
|
+
* Helper type to extract the state type from a zustand store.
|
|
191
|
+
*/
|
|
192
|
+
type ExtractState<TStore> = TStore extends UseBoundStore<StoreApi<infer S>> ? S : TStore extends StoreApi<infer S> ? S : never;
|
|
193
|
+
//#endregion
|
|
194
|
+
export { AnyCommand, AnyUndoableCommand, COMMAND_SYMBOL, Command, CommandContext, CommandDispatch, CommandFn, CommandParams, CommandReturn, CommandStore, Commander, CommanderMiddleware, CommanderOptions, CommanderSlice, ExtractState, RevertFn, UNDOABLE_COMMAND_SYMBOL, UndoEntry, UndoableCommand, isCommand, isUndoableCommand };
|
|
195
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/zustand-commander/types.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/zustand-commander/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* Symbol used to identify Command objects at runtime.
|
|
4
|
+
*/
|
|
5
|
+
const COMMAND_SYMBOL = Symbol.for("zustand-commander/command");
|
|
6
|
+
/**
|
|
7
|
+
* Symbol used to identify UndoableCommand objects at runtime.
|
|
8
|
+
*/
|
|
9
|
+
const UNDOABLE_COMMAND_SYMBOL = Symbol.for("zustand-commander/undoable-command");
|
|
10
|
+
/**
|
|
11
|
+
* Type guard to check if a value is a Command.
|
|
12
|
+
*/
|
|
13
|
+
function isCommand(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && COMMAND_SYMBOL in value && value[COMMAND_SYMBOL] === true;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Type guard to check if a command is undoable.
|
|
18
|
+
*/
|
|
19
|
+
function isUndoableCommand(value) {
|
|
20
|
+
return isCommand(value) && UNDOABLE_COMMAND_SYMBOL in value && value[UNDOABLE_COMMAND_SYMBOL] === true;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { COMMAND_SYMBOL, UNDOABLE_COMMAND_SYMBOL, isCommand, isUndoableCommand };
|
|
25
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","names":[],"sources":["../../src/zustand-commander/types.ts"],"sourcesContent":["/**\n * @voidhash/mimic-react/zustand-commander\n *\n * Type definitions for the zustand-commander package.\n *\n * @since 0.0.1\n */\n\nimport type { StoreApi, UseBoundStore } from \"zustand\";\n\n// =============================================================================\n// Command Symbol & Type Guard\n// =============================================================================\n\n/**\n * Symbol used to identify Command objects at runtime.\n */\nexport const COMMAND_SYMBOL = Symbol.for(\"zustand-commander/command\");\n\n/**\n * Symbol used to identify UndoableCommand objects at runtime.\n */\nexport const UNDOABLE_COMMAND_SYMBOL = Symbol.for(\n \"zustand-commander/undoable-command\"\n);\n\n// =============================================================================\n// Command Context\n// =============================================================================\n\n/**\n * Context provided to command functions.\n * Gives access to store state and dispatch capabilities.\n */\nexport interface CommandContext<TStore> {\n /**\n * Get the current store state.\n */\n readonly getState: () => TStore;\n\n /**\n * Set partial store state (for local/browser state updates).\n */\n readonly setState: (partial: Partial<TStore>) => void;\n\n /**\n * Dispatch another command.\n * Returns the result of the dispatched command.\n *\n * @example\n * dispatch(otherCommand)({ param: \"value\" });\n */\n readonly dispatch: CommandDispatch<TStore>;\n}\n\n// =============================================================================\n// Command Function Types\n// =============================================================================\n\n/**\n * The function signature for a command handler.\n */\nexport type CommandFn<TStore, TParams, TReturn> = (\n ctx: CommandContext<TStore>,\n params: TParams\n) => TReturn;\n\n/**\n * The function signature for an undoable command's revert handler.\n * Receives the original params and the result from the forward execution.\n */\nexport type RevertFn<TStore, TParams, TReturn> = (\n ctx: CommandContext<TStore>,\n params: TParams,\n result: TReturn\n) => void;\n\n// =============================================================================\n// Command Types\n// =============================================================================\n\n/**\n * A command that can be dispatched to modify store state.\n * Regular commands do not support undo/redo.\n */\nexport interface Command<TStore, TParams, TReturn> {\n readonly [COMMAND_SYMBOL]: true;\n readonly fn: CommandFn<TStore, TParams, TReturn>;\n}\n\n/**\n * An undoable command that supports undo/redo.\n * Must provide a revert function that knows how to undo the change.\n */\nexport interface UndoableCommand<TStore, TParams, TReturn>\n extends Command<TStore, TParams, TReturn> {\n readonly [UNDOABLE_COMMAND_SYMBOL]: true;\n readonly revert: RevertFn<TStore, TParams, TReturn>;\n}\n\n/**\n * Any command type (regular or undoable).\n */\nexport type AnyCommand = Command<any, any, any>;\n\n/**\n * Any undoable command type.\n */\nexport type AnyUndoableCommand = UndoableCommand<any, any, any>;\n\n// =============================================================================\n// Command Dispatch\n// =============================================================================\n\n/**\n * Dispatch function that accepts commands and returns a function to call with params.\n * Returns the result of the command execution.\n *\n * @example\n * const result = dispatch(myCommand)({ param: \"value\" });\n */\nexport type CommandDispatch<TStore> = <TParams, TReturn>(\n command: Command<TStore, TParams, TReturn>\n) => (params: TParams) => TReturn;\n\n// =============================================================================\n// Undo/Redo Stack Types\n// =============================================================================\n\n/**\n * An entry in the undo/redo stack.\n * Contains all information needed to revert or redo a command.\n */\nexport interface UndoEntry<TParams = unknown, TReturn = unknown> {\n /** The undoable command that was executed */\n readonly command: AnyUndoableCommand;\n /** The parameters that were passed to the command */\n readonly params: TParams;\n /** The result returned by the command (passed to revert) */\n readonly result: TReturn;\n /** Timestamp when the command was executed */\n readonly timestamp: number;\n}\n\n/**\n * State slice for undo/redo functionality.\n */\nexport interface CommanderSlice {\n readonly _commander: {\n /** Stack of commands that can be undone */\n readonly undoStack: ReadonlyArray<UndoEntry>;\n /** Stack of commands that can be redone */\n readonly redoStack: ReadonlyArray<UndoEntry>;\n };\n}\n\n// =============================================================================\n// Commander Types\n// =============================================================================\n\n/**\n * Options for creating a commander.\n */\nexport interface CommanderOptions {\n /**\n * Maximum number of undo entries to keep.\n * @default 100\n */\n readonly maxUndoStackSize?: number;\n}\n\n/**\n * A commander instance bound to a specific store type.\n * Used to create commands and the middleware.\n */\nexport interface Commander<TStore> {\n /**\n * Create a regular command (no undo support).\n *\n * @example\n * // With params\n * const addItem = commander.action<{ name: string }>(\n * (ctx, params) => {\n * // modify state using params.name\n * }\n * );\n *\n * // Without params\n * const clearAll = commander.action((ctx) => {\n * // modify state\n * });\n */\n readonly action: {\n // With params (explicit type parameter)\n <TParams, TReturn = void>(\n fn: CommandFn<TStore, TParams, TReturn>\n ): Command<TStore, TParams, TReturn>;\n\n // Without params (void) - inferred when no type param provided\n <TReturn = void>(\n fn: CommandFn<TStore, void, TReturn>\n ): Command<TStore, void, TReturn>;\n };\n\n /**\n * Create an undoable command with undo/redo support.\n * The revert function is called when undoing the command.\n *\n * @example\n * const moveItem = commander.undoableAction<{ id: string; toIndex: number }, { fromIndex: number }>(\n * (ctx, params) => {\n * const fromIndex = // get current index\n * // perform move\n * return { fromIndex }; // return data needed for revert\n * },\n * (ctx, params, result) => {\n * // revert: move back to original position\n * ctx.dispatch(moveItem)({ id: params.id, toIndex: result.fromIndex });\n * }\n * );\n */\n readonly undoableAction: {\n // With params (explicit type parameter)\n <TParams, TReturn>(\n fn: CommandFn<TStore, TParams, TReturn>,\n revert: RevertFn<TStore, TParams, TReturn>\n ): UndoableCommand<TStore, TParams, TReturn>;\n\n // Without params (void)\n <TReturn>(\n fn: CommandFn<TStore, void, TReturn>,\n revert: RevertFn<TStore, void, TReturn>\n ): UndoableCommand<TStore, void, TReturn>;\n };\n\n /**\n * Zustand middleware that adds commander functionality.\n * Adds undo/redo stacks to the store state.\n */\n readonly middleware: CommanderMiddleware<TStore>;\n}\n\n/**\n * Type for the commander middleware.\n * Note: TStore is intentionally unused here to match the Commander interface signature.\n * The middleware is generic over T (the inner store type) and adds CommanderSlice.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type CommanderMiddleware<_TStore> = <T extends object>(\n config: (\n set: StoreApi<T & CommanderSlice>[\"setState\"],\n get: StoreApi<T & CommanderSlice>[\"getState\"],\n api: StoreApi<T & CommanderSlice>\n ) => T\n) => (\n set: StoreApi<T & CommanderSlice>[\"setState\"],\n get: StoreApi<T & CommanderSlice>[\"getState\"],\n api: StoreApi<T & CommanderSlice>\n) => T & CommanderSlice;\n\n// =============================================================================\n// Type Helpers\n// =============================================================================\n\n/**\n * Extract the params type from a command.\n */\nexport type CommandParams<T> = T extends Command<any, infer P, any> ? P : never;\n\n/**\n * Extract the return type from a command.\n */\nexport type CommandReturn<T> = T extends Command<any, any, infer R>\n ? R\n : undefined;\n\n/**\n * Extract the store type from a command.\n */\nexport type CommandStore<T> = T extends Command<infer S, any, any> ? S : never;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is a Command.\n */\nexport function isCommand(value: unknown): value is AnyCommand {\n return (\n typeof value === \"object\" &&\n value !== null &&\n COMMAND_SYMBOL in value &&\n value[COMMAND_SYMBOL] === true\n );\n}\n\n/**\n * Type guard to check if a command is undoable.\n */\nexport function isUndoableCommand(\n value: unknown\n): value is AnyUndoableCommand {\n return (\n isCommand(value) &&\n UNDOABLE_COMMAND_SYMBOL in value &&\n value[UNDOABLE_COMMAND_SYMBOL] === true\n );\n}\n\n// =============================================================================\n// Store Type Helper\n// =============================================================================\n\n/**\n * Helper type to extract the state type from a zustand store.\n */\nexport type ExtractState<TStore> = TStore extends UseBoundStore<\n StoreApi<infer S>\n>\n ? S\n : TStore extends StoreApi<infer S>\n ? S\n : never;\n\n"],"mappings":";;;;AAiBA,MAAa,iBAAiB,OAAO,IAAI,4BAA4B;;;;AAKrE,MAAa,0BAA0B,OAAO,IAC5C,qCACD;;;;AAwQD,SAAgB,UAAU,OAAqC;AAC7D,QACE,OAAO,UAAU,YACjB,UAAU,QACV,kBAAkB,SAClB,MAAM,oBAAoB;;;;;AAO9B,SAAgB,kBACd,OAC6B;AAC7B,QACE,UAAU,MAAM,IAChB,2BAA2B,SAC3B,MAAM,6BAA6B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voidhash/mimic-react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
"typescript": "5.8.3",
|
|
38
38
|
"vite-tsconfig-paths": "^5.1.4",
|
|
39
39
|
"vitest": "^3.2.4",
|
|
40
|
-
"@voidhash/tsconfig": "0.0.
|
|
40
|
+
"@voidhash/tsconfig": "0.0.3"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"effect": "^3.16.0",
|
|
44
44
|
"react": "^18.0.0 || ^19.0.0",
|
|
45
|
-
"@voidhash/mimic": "0.0.
|
|
45
|
+
"@voidhash/mimic": "0.0.3"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsdown",
|
package/tsdown.config.ts
CHANGED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/typeof.js
|
|
3
|
-
function _typeof(o) {
|
|
4
|
-
"@babel/helpers - typeof";
|
|
5
|
-
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o$1) {
|
|
6
|
-
return typeof o$1;
|
|
7
|
-
} : function(o$1) {
|
|
8
|
-
return o$1 && "function" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1;
|
|
9
|
-
}, _typeof(o);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
//#endregion
|
|
13
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/toPrimitive.js
|
|
14
|
-
function toPrimitive(t, r) {
|
|
15
|
-
if ("object" != _typeof(t) || !t) return t;
|
|
16
|
-
var e = t[Symbol.toPrimitive];
|
|
17
|
-
if (void 0 !== e) {
|
|
18
|
-
var i = e.call(t, r || "default");
|
|
19
|
-
if ("object" != _typeof(i)) return i;
|
|
20
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
21
|
-
}
|
|
22
|
-
return ("string" === r ? String : Number)(t);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
//#endregion
|
|
26
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/toPropertyKey.js
|
|
27
|
-
function toPropertyKey(t) {
|
|
28
|
-
var i = toPrimitive(t, "string");
|
|
29
|
-
return "symbol" == _typeof(i) ? i : i + "";
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
//#endregion
|
|
33
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/defineProperty.js
|
|
34
|
-
function _defineProperty(e, r, t) {
|
|
35
|
-
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
36
|
-
value: t,
|
|
37
|
-
enumerable: !0,
|
|
38
|
-
configurable: !0,
|
|
39
|
-
writable: !0
|
|
40
|
-
}) : e[r] = t, e;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
//#endregion
|
|
44
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/objectSpread2.js
|
|
45
|
-
function ownKeys(e, r) {
|
|
46
|
-
var t = Object.keys(e);
|
|
47
|
-
if (Object.getOwnPropertySymbols) {
|
|
48
|
-
var o = Object.getOwnPropertySymbols(e);
|
|
49
|
-
r && (o = o.filter(function(r$1) {
|
|
50
|
-
return Object.getOwnPropertyDescriptor(e, r$1).enumerable;
|
|
51
|
-
})), t.push.apply(t, o);
|
|
52
|
-
}
|
|
53
|
-
return t;
|
|
54
|
-
}
|
|
55
|
-
function _objectSpread2(e) {
|
|
56
|
-
for (var r = 1; r < arguments.length; r++) {
|
|
57
|
-
var t = null != arguments[r] ? arguments[r] : {};
|
|
58
|
-
r % 2 ? ownKeys(Object(t), !0).forEach(function(r$1) {
|
|
59
|
-
_defineProperty(e, r$1, t[r$1]);
|
|
60
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) {
|
|
61
|
-
Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1));
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return e;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
//#endregion
|
|
68
|
-
Object.defineProperty(exports, '_objectSpread2', {
|
|
69
|
-
enumerable: true,
|
|
70
|
-
get: function () {
|
|
71
|
-
return _objectSpread2;
|
|
72
|
-
}
|
|
73
|
-
});
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/typeof.js
|
|
2
|
-
function _typeof(o) {
|
|
3
|
-
"@babel/helpers - typeof";
|
|
4
|
-
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o$1) {
|
|
5
|
-
return typeof o$1;
|
|
6
|
-
} : function(o$1) {
|
|
7
|
-
return o$1 && "function" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1;
|
|
8
|
-
}, _typeof(o);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
//#endregion
|
|
12
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/toPrimitive.js
|
|
13
|
-
function toPrimitive(t, r) {
|
|
14
|
-
if ("object" != _typeof(t) || !t) return t;
|
|
15
|
-
var e = t[Symbol.toPrimitive];
|
|
16
|
-
if (void 0 !== e) {
|
|
17
|
-
var i = e.call(t, r || "default");
|
|
18
|
-
if ("object" != _typeof(i)) return i;
|
|
19
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
20
|
-
}
|
|
21
|
-
return ("string" === r ? String : Number)(t);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/toPropertyKey.js
|
|
26
|
-
function toPropertyKey(t) {
|
|
27
|
-
var i = toPrimitive(t, "string");
|
|
28
|
-
return "symbol" == _typeof(i) ? i : i + "";
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
//#endregion
|
|
32
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/defineProperty.js
|
|
33
|
-
function _defineProperty(e, r, t) {
|
|
34
|
-
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
35
|
-
value: t,
|
|
36
|
-
enumerable: !0,
|
|
37
|
-
configurable: !0,
|
|
38
|
-
writable: !0
|
|
39
|
-
}) : e[r] = t, e;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
//#endregion
|
|
43
|
-
//#region \0@oxc-project+runtime@0.103.0/helpers/objectSpread2.js
|
|
44
|
-
function ownKeys(e, r) {
|
|
45
|
-
var t = Object.keys(e);
|
|
46
|
-
if (Object.getOwnPropertySymbols) {
|
|
47
|
-
var o = Object.getOwnPropertySymbols(e);
|
|
48
|
-
r && (o = o.filter(function(r$1) {
|
|
49
|
-
return Object.getOwnPropertyDescriptor(e, r$1).enumerable;
|
|
50
|
-
})), t.push.apply(t, o);
|
|
51
|
-
}
|
|
52
|
-
return t;
|
|
53
|
-
}
|
|
54
|
-
function _objectSpread2(e) {
|
|
55
|
-
for (var r = 1; r < arguments.length; r++) {
|
|
56
|
-
var t = null != arguments[r] ? arguments[r] : {};
|
|
57
|
-
r % 2 ? ownKeys(Object(t), !0).forEach(function(r$1) {
|
|
58
|
-
_defineProperty(e, r$1, t[r$1]);
|
|
59
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) {
|
|
60
|
-
Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1));
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
return e;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
//#endregion
|
|
67
|
-
export { _objectSpread2 as t };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/zustand/types.ts","../../src/zustand/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAWA;AAAiD,UAAhC,aAAyC,CAAA,kBAAT,QAAA,CAAS,WAAA,CAAA,CAAA;EAW1B;;;;EAO5B,SAAS,MAAA,EAAA,MAAA,GAAA,SAAA;EAFM;;;;EAQH,SAAA,IAAA,EAbC,QAAA,CAAS,KAaV,CAbgB,SAahB,CAAA,GAAA,SAAA;EAAW;AAU3B;;EAEoB,SAAS,MAAA,EApBV,WAoBU,CAAA,MAAA,EAlBzB,QAAA,CAAS,aAkBgB,CAlBF,QAAA,CAAS,KAkBP,CAlBa,SAkBb,CAAA,CAAA,CAAA;EAGsB;;;EAEN,SAAA,GAAA,EAjB7B,WAiB6B,CAAA,MAAA,EAfzC,QAAA,CAAS,aAegC,CAflB,QAAA,CAAS,KAeS,CAfH,SAeG,CAAA,CAAA,CAAA;;;;;;AAM1B,UAbF,WAaE,CAAA,gBAZD,SAAA,CAAU,YAYT,EAAA,kBAXC,QAAA,CAAS,WAWV,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA;EAeF;EACC,SAAU,QAAA,EAxBP,cAAA,CAAe,cAwBR,CAxBuB,OAwBvB,EAxBgC,SAwBhC,CAAA;EACR;EAGU,SAAA,QAAA,EA1BT,SAAA,CAAU,aA0BD,CA1Be,OA0Bf,CAAA;EAAS;;;AAsBvC;EACkB,SAAU,QAAA,EA5CP,SA4CO,SA5CW,QAAA,CAAS,WA4CpB,GA3CtB,aA2CsB,CA3CR,SA2CQ,CAAA,GAAA,SAAA;EACR;EAEL,SAAA,WAAA,EAAA,OAAA;EACA;EACE,SAAA,OAAA,EAAA,OAAA;EAAe;EAAS,SAAA,YAAA,EAAA,MAAA;EAApB;EAAgC,SAAA,iBAAA,EAAA,OAAA;;;;;AAKpC,UAtCA,UAsCA,CAAA,gBArCC,SAAA,CAAU,YAqCW,EAAA,kBApCnB,QAAA,CAAS,WAoCU,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA;;kBAjCrB,YAAY,SAAS;;;;;ACzDZ,KD+Ef,iBC/Ee,CAAA,gBDgFT,SAAA,CAAU,YChFD,EAAA,kBDiFP,QAAA,CAAS,WCjFF,GAAA,SAAA,EAAA,CAAA,EAAA,YAAA,CDmFZ,sBCnFY,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,EAAA,YAAA,CDoFZ,sBCpFY,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,GDqFvB,YCrFuB,CDqFV,CCrFU,GDqFN,UCrFM,CDqFK,OCrFL,EDqFc,SCrFd,CAAA,EDqF0B,GCrF1B,EDqF+B,GCrF/B,EDqFoC,CCrFpC,CAAA;;;;AAAjB,UD0FO,sBAAA,CC1FP;EACE;EACM,SAAA,aAAA,CAAA,EAAA,OAAA;EAAe;EAAS,SAAA,WAAA,CAAA,EAAA,OAAA;;;;KAVrC,eAAA,oBACa,SAAA,CAAU,gCACR,QAAA,CAAS,6EAEd,sDACA,mDAEH,cAAA,CAAe,eAAe,SAAS,oBACzC,aAAa,IAAI,WAAW,SAAS,YAAY,KAAK,KAAK,cACzD,2BACP,aAAa,IAAI,WAAW,SAAS,YAAY,KAAK,KAAK,IAAI,WAAW,SAAS;ADZxF;;;;;;;;;;;;;AAkCA;;;;;;;;;;;;;AA4BA;;;;;;;AA2BA;;;AAIe,cCkEF,KDlEE,ECkE8B,eDlE9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/zustand/types.ts","../../src/zustand/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAWA;AAAiD,UAAhC,aAAyC,CAAA,kBAAT,QAAA,CAAS,WAAA,CAAA,CAAA;EAW1B;;;;EAO5B,SAAS,MAAA,EAAA,MAAA,GAAA,SAAA;EAFM;;;;EAQH,SAAA,IAAA,EAbC,QAAA,CAAS,KAaV,CAbgB,SAahB,CAAA,GAAA,SAAA;EAAW;AAU3B;;EAEoB,SAAS,MAAA,EApBV,WAoBU,CAAA,MAAA,EAlBzB,QAAA,CAAS,aAkBgB,CAlBF,QAAA,CAAS,KAkBP,CAlBa,SAkBb,CAAA,CAAA,CAAA;EAGsB;;;EAEN,SAAA,GAAA,EAjB7B,WAiB6B,CAAA,MAAA,EAfzC,QAAA,CAAS,aAegC,CAflB,QAAA,CAAS,KAeS,CAfH,SAeG,CAAA,CAAA,CAAA;;;;;;AAM1B,UAbF,WAaE,CAAA,gBAZD,SAAA,CAAU,YAYT,EAAA,kBAXC,QAAA,CAAS,WAWV,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA;EAeF;EACC,SAAU,QAAA,EAxBP,cAAA,CAAe,cAwBR,CAxBuB,OAwBvB,EAxBgC,SAwBhC,CAAA;EACR;EAGU,SAAA,QAAA,EA1BT,SAAA,CAAU,aA0BD,CA1Be,OA0Bf,CAAA;EAAS;;;AAsBvC;EACkB,SAAU,QAAA,EA5CP,SA4CO,SA5CW,QAAA,CAAS,WA4CpB,GA3CtB,aA2CsB,CA3CR,SA2CQ,CAAA,GAAA,SAAA;EACR;EAEL,SAAA,WAAA,EAAA,OAAA;EACA;EACE,SAAA,OAAA,EAAA,OAAA;EAAe;EAAS,SAAA,YAAA,EAAA,MAAA;EAApB;EAAgC,SAAA,iBAAA,EAAA,OAAA;;;;;AAKpC,UAtCA,UAsCA,CAAA,gBArCC,SAAA,CAAU,YAqCW,EAAA,kBApCnB,QAAA,CAAS,WAoCU,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA;;kBAjCrB,YAAY,SAAS;;;;;ACzDZ,KD+Ef,iBC/Ee,CAAA,gBDgFT,SAAA,CAAU,YChFD,EAAA,kBDiFP,QAAA,CAAS,WCjFF,GAAA,SAAA,EAAA,CAAA,EAAA,YAAA,CDmFZ,sBCnFY,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,EAAA,YAAA,CDoFZ,sBCpFY,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,GDqFvB,YCrFuB,CDqFV,CCrFU,GDqFN,UCrFM,CDqFK,OCrFL,EDqFc,SCrFd,CAAA,EDqF0B,GCrF1B,EDqF+B,GCrF/B,EDqFoC,CCrFpC,CAAA;;;;AAAjB,UD0FO,sBAAA,CC1FP;EACE;EACM,SAAA,aAAA,CAAA,EAAA,OAAA;EAAe;EAAS,SAAA,WAAA,CAAA,EAAA,OAAA;;;;KAVrC,eAAA,oBACa,SAAA,CAAU,gCACR,QAAA,CAAS,6EAEd,sDACA,mDAEH,cAAA,CAAe,eAAe,SAAS,oBACzC,aAAa,IAAI,WAAW,SAAS,YAAY,KAAK,KAAK,cACzD,2BACP,aAAa,IAAI,WAAW,SAAS,YAAY,KAAK,KAAK,IAAI,WAAW,SAAS;ADZxF;;;;;;;;;;;;;AAkCA;;;;;;;;;;;;;AA4BA;;;;;;;AA2BA;;;AAIe,cCkEF,KDlEE,ECkE8B,eDlE9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["mimicImpl: MimicMiddlewareImpl"],"sources":["../../src/zustand/middleware.ts"],"sourcesContent":["import type { StateCreator, StoreMutatorIdentifier } from \"zustand\";\nimport type { ClientDocument } from \"@voidhash/mimic/client\";\nimport type { Primitive, Presence } from \"@voidhash/mimic\";\nimport type {\n MimicSlice,\n MimicObject,\n MimicMiddlewareOptions,\n} from \"./types.js\";\n\n// =============================================================================\n// Middleware Implementation\n// =============================================================================\n\ntype MimicMiddleware = <\n TSchema extends Primitive.AnyPrimitive,\n TPresence extends Presence.AnyPresence | undefined = undefined,\n T extends object = object,\n Mps extends [StoreMutatorIdentifier, unknown][] = [],\n Mcs extends [StoreMutatorIdentifier, unknown][] = [],\n>(\n document: ClientDocument.ClientDocument<TSchema, TPresence>,\n config: StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T>,\n options?: MimicMiddlewareOptions\n) => StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T & MimicSlice<TSchema, TPresence>>;\n\ntype MimicMiddlewareImpl = <\n TSchema extends Primitive.AnyPrimitive,\n TPresence extends Presence.AnyPresence | undefined = undefined,\n T extends object = object,\n>(\n document: ClientDocument.ClientDocument<TSchema, TPresence>,\n config: StateCreator<T & MimicSlice<TSchema, TPresence>, [], [], T>,\n options?: MimicMiddlewareOptions\n) => StateCreator<T & MimicSlice<TSchema, TPresence>, [], [], T & MimicSlice<TSchema, TPresence>>;\n\n/**\n * Creates a MimicObject from the current document state.\n */\nconst createMimicObject = <\n TSchema extends Primitive.AnyPrimitive,\n TPresence extends Presence.AnyPresence | undefined = undefined\n>(\n document: ClientDocument.ClientDocument<TSchema, TPresence>\n): MimicObject<TSchema, TPresence> => {\n const presence = document.presence\n ? {\n selfId: document.presence.selfId(),\n self: document.presence.self(),\n // Important: clone Maps to ensure zustand selectors re-render\n // when presence changes (the underlying ClientDocument mutates Maps in-place).\n others: new Map(document.presence.others()),\n all: new Map(document.presence.all()),\n }\n : undefined;\n\n return {\n document,\n snapshot: document.root.toSnapshot() as Primitive.InferSnapshot<TSchema>,\n presence: presence as MimicObject<TSchema, TPresence>[\"presence\"],\n isConnected: document.isConnected(),\n isReady: document.isReady(),\n pendingCount: document.getPendingCount(),\n hasPendingChanges: document.hasPendingChanges(),\n };\n};\n\n/**\n * Implementation of the mimic middleware.\n */\nconst mimicImpl: MimicMiddlewareImpl = <\n TSchema extends Primitive.AnyPrimitive,\n TPresence extends Presence.AnyPresence | undefined = undefined,\n _T extends object = object\n>(\n document: ClientDocument.ClientDocument<TSchema, TPresence>,\n config: any,\n options: MimicMiddlewareOptions = {}\n) => {\n const { autoSubscribe = true, autoConnect = true } = options;\n\n return (set: any, get: any, api: any) => {\n // Create initial mimic slice\n const initialMimic = createMimicObject(document);\n\n // Helper to update mimic state\n const updateMimicState = () => {\n const newMimic = createMimicObject(document);\n set(\n (state: any) => ({\n ...state,\n mimic: newMimic,\n }),\n false\n );\n };\n\n // Subscribe to document changes\n if (autoSubscribe) {\n document.subscribe({\n onStateChange: () => {\n updateMimicState();\n },\n onConnectionChange: () => {\n updateMimicState();\n },\n onReady: () => {\n updateMimicState();\n },\n });\n\n // Subscribe to presence changes (if presence schema is enabled)\n document.presence?.subscribe({\n onPresenceChange: () => {\n updateMimicState();\n },\n });\n }\n\n if (autoConnect) {\n document.connect();\n }\n\n // Get user's state - pass through set/get/api directly\n // The user's set calls won't affect mimic state since we update it separately\n const userState = config(set, get, api);\n\n // Combine user state with mimic slice\n return {\n ...userState,\n mimic: initialMimic,\n };\n };\n};\n\n/**\n * Zustand middleware that integrates a ClientDocument.\n * \n * Adds a `mimic` object to the store containing:\n * - `document`: The ClientDocument instance for performing transactions\n * - `snapshot`: Read-only snapshot of the document state (reactive)\n * - `presence`: Reactive presence snapshot (self + others). Undefined if presence is not enabled on the ClientDocument.\n * - `isConnected`: Connection status\n * - `isReady`: Ready status\n * - `pendingCount`: Number of pending transactions\n * - `hasPendingChanges`: Whether there are pending changes\n * \n * @example\n * ```ts\n * import { create } from 'zustand'\n * import { mimic } from '@voidhash/mimic-react/zustand'\n * \n * const useStore = create(\n * mimic(clientDocument, (set, get) => ({\n * // Your additional store state\n * }))\n * )\n * \n * // Read snapshot (reactive)\n * const snapshot = useStore(state => state.mimic.snapshot)\n * \n * // Read presence (reactive, if enabled)\n * const myPresence = useStore(state => state.mimic.presence?.self)\n * const othersPresence = useStore(state => state.mimic.presence?.others)\n * \n * // Write via document\n * store.getState().mimic.document.transaction(root => {\n * root.name.set(\"New Name\")\n * })\n * ```\n */\nexport const mimic = mimicImpl as unknown as MimicMiddleware;\n"],"mappings":";;;;;;AAsCA,MAAM,qBAIJ,aACoC;CACpC,MAAM,WAAW,SAAS,WACtB;EACE,QAAQ,SAAS,SAAS,QAAQ;EAClC,MAAM,SAAS,SAAS,MAAM;EAG9B,QAAQ,IAAI,IAAI,SAAS,SAAS,QAAQ,CAAC;EAC3C,KAAK,IAAI,IAAI,SAAS,SAAS,KAAK,CAAC;EACtC,GACD;AAEJ,QAAO;EACL;EACA,UAAU,SAAS,KAAK,YAAY;EAC1B;EACV,aAAa,SAAS,aAAa;EACnC,SAAS,SAAS,SAAS;EAC3B,cAAc,SAAS,iBAAiB;EACxC,mBAAmB,SAAS,mBAAmB;EAChD;;;;;AAMH,MAAMA,aAKJ,UACA,QACA,UAAkC,EAAE,KACjC;CACH,MAAM,EAAE,gBAAgB,MAAM,cAAc,SAAS;AAErD,SAAQ,KAAU,KAAU,QAAa;EAEvC,MAAM,eAAe,kBAAkB,SAAS;EAGhD,MAAM,yBAAyB;GAC7B,MAAM,WAAW,kBAAkB,SAAS;AAC5C,QACG,4CACI,cACH,OAAO,aAET,MACD;;AAIH,MAAI,eAAe;;AACjB,YAAS,UAAU;IACjB,qBAAqB;AACnB,uBAAkB;;IAEpB,0BAA0B;AACxB,uBAAkB;;IAEpB,eAAe;AACb,uBAAkB;;IAErB,CAAC;AAGF,kCAAS,0EAAU,UAAU,EAC3B,wBAAwB;AACtB,sBAAkB;MAErB,CAAC;;AAGJ,MAAI,YACF,UAAS,SAAS;AAQpB,2CAHkB,OAAO,KAAK,KAAK,IAAI,SAKrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCb,MAAa,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/zustand-commander/types.ts","../../src/zustand-commander/commander.ts","../../src/zustand-commander/hooks.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/zustand-commander/types.ts","../../src/zustand-commander/commander.ts","../../src/zustand-commander/hooks.ts"],"sourcesContent":[],"mappings":";;;;;;;AAoDoC,cAnCvB,cAmCuB,EAAA,OAAA,MAAA;AAUpC;;;AAEU,cA1CG,uBA0CH,EAAA,OAAA,MAAA;;;AAOV;;AACO,UAtCU,cAsCV,CAAA,MAAA,CAAA,CAAA;EACG;;;EAYO,SAAA,QAAO,EAAA,GAAA,GA/CG,MA+CH;EACZ;;;EAC8B,SAAA,QAAA,EAAA,CAAA,OAAA,EA5CX,OA4CW,CA5CH,MA4CG,CAAA,EAAA,GAAA,IAAA;EAA3B;;AAOf;;;;;EAG4B,SAAA,QAAA,EA7CP,eA6CO,CA7CS,MA6CT,CAAA;;;;;AAFX,KAjCL,SAiCK,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,GAAA,CAAA,GAAA,EAhCV,cAgCU,CAhCK,MAgCL,CAAA,EAAA,MAAA,EA/BP,OA+BO,EAAA,GA9BZ,OA8BY;AAQjB;AAKA;AAaA;;AAC2B,KAnDf,QAmDe,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,GAAA,CAAA,GAAA,EAlDpB,cAkDoB,CAlDL,MAkDK,CAAA,EAAA,MAAA,EAjDjB,OAiDiB,EAAA,MAAA,EAhDjB,OAgDiB,EAAA,GAAA,IAAA;;;;;AACM,UAtChB,OAsCgB,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,CAAA;EAUhB,UA/CL,cAAA,CA+Cc,EAAA,IAAA;EAEN,SAAA,EAAA,EAhDL,SAgDK,CAhDK,MAgDL,EAhDa,OAgDb,EAhDsB,OAgDtB,CAAA;;;;AAYpB;;AAGwB,UAxDP,eAwDO,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,SAvDd,OAuDc,CAvDN,MAuDM,EAvDE,OAuDF,EAvDW,OAuDX,CAAA,CAAA;EAEc,UAxD1B,uBAAA,CAwD0B,EAAA,IAAA;EAAd,SAAA,MAAA,EAvDL,QAuDK,CAvDI,MAuDJ,EAvDY,OAuDZ,EAvDqB,OAuDrB,CAAA;;AAWxB;AAYA;;AAoB4B,KA5FhB,UAAA,GAAa,OA4FG,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA;;;;AACL,KAxFX,kBAAA,GAAqB,eAwFV,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA;;;;;;;;AAKhB,KAhFK,eAgFL,CAAA,MAAA,CAAA,GAAA,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,OAAA,EA/EI,OA+EJ,CA/EY,MA+EZ,EA/EoB,OA+EpB,EA/E6B,OA+E7B,CAAA,EAAA,GAAA,CAAA,MAAA,EA9EO,OA8EP,EAAA,GA9EmB,OA8EnB;;;;;AAwBgB,UA5FN,SA4FM,CAAA,UAAA,OAAA,EAAA,UAAA,OAAA,CAAA,CAAA;EAAQ;EAAS,SAAA,OAAA,EA1FpB,kBA0FoB;EAA1B;EACS,SAAA,MAAA,EAzFJ,OAyFI;EAAQ;EAAS,SAAA,MAAA,EAvFrB,OAuFqB;EAAjC;EAIa,SAAA,SAAA,EAAA,MAAA;;;;;AACN,UApFG,cAAA,CAoFH;EACS,SAAA,UAAA,EAAA;IAAc;IAA9B,SAAA,SAAA,EAlFiB,aAkFjB,CAlF+B,SAkF/B,CAAA;IAOoC;IAApB,SAAA,SAAA,EAvFC,aAuFD,CAvFe,SAuFf,CAAA;EAAmB,CAAA;AAS1C;;;;AAGkB,UAxFD,gBAAA,CAwFC;EAAI;;;;EACb,SAAA,gBAAA,CAAA,EAAA,MAAA;;;;;;AAIW,UAjFH,SAiFG,CAAA,MAAA,CAAA,CAAA;EAAb;;;;;;;AAWP;AAKA;AAOA;AASA;AAYA;AAiBA;;;;EAII,SAAA,MAAA,EAAA;IAAe,CAAA,OAAA,EAAA,UAAA,IAAA,CAAA,CAAA,EAAA,EA9HT,SA8HS,CA9HC,MA8HD,EA9HS,OA8HT,EA9HkB,OA8HlB,CAAA,CAAA,EA7HZ,OA6HY,CA7HJ,MA6HI,EA7HI,OA6HJ,EA7Ha,OA6Hb,CAAA;IAAQ,CAAA,UAAA,IAAA,CAAA,CAAA,EAAA,EAzHjB,SAyHiB,CAzHP,MAyHO,EAAA,IAAA,EAzHO,OAyHP,CAAA,CAAA,EAxHpB,OAwHoB,CAxHZ,MAwHY,EAAA,IAAA,EAxHE,OAwHF,CAAA;;;;AC/P3B;;;;;;AAyIA;;;;;AAwCA;;;;EACoB,SAAA,cAAA,EAAA;IAmEJ,CAAA,OAAA,EAAA,OAAgB,CAAA,CAAA,EAAA,EDvFtB,SCuFsB,CDvFZ,MCuFY,EDvFJ,OCuFI,EDvFK,OCuFL,CAAA,EAAA,MAAA,EDtFlB,QCsFkB,CDtFT,MCsFS,EDtFD,OCsFC,EDtFQ,OCsFR,CAAA,CAAA,EDrFzB,eCqFyB,CDrFT,MCqFS,EDrFD,OCqFC,EDrFQ,OCqFR,CAAA;IAAgB,CAAA,OAAA,CAAA,CAAA,EAAA,EDjFtC,SCiFsC,CDjF5B,MCiF4B,EAAA,IAAA,EDjFd,OCiFc,CAAA,EAAA,MAAA,EDhFlC,QCgFkC,CDhFzB,MCgFyB,EAAA,IAAA,EDhFX,OCgFW,CAAA,CAAA,ED/EzC,eC+EyC,CD/EzB,MC+EyB,EAAA,IAAA,ED/EX,OC+EW,CAAA;EAC3B,CAAA;EAAT;;;;uBDzEW,oBAAoB;AElJ3C;;;;;;AAEG,KFyJS,mBEzJT,CAAA,OAAA,CAAA,GAAA,CAAA,UAAA,MAAA,CAAA,CAAA,MAAA,EAAA,CAAA,GAAA,EF2JM,QE3JN,CF2Je,CE3Jf,GF2JmB,cE3JnB,CAAA,CAAA,UAAA,CAAA,EAAA,GAAA,EF4JM,QE5JN,CF4Je,CE5Jf,GF4JmB,cE5JnB,CAAA,CAAA,UAAA,CAAA,EAAA,GAAA,EF6JM,QE7JN,CF6Je,CE7Jf,GF6JmB,cE7JnB,CAAA,EAAA,GF8JI,CE9JJ,EAAA,GAAA,CAAA,GAAA,EFgKI,QEhKJ,CFgKa,CEhKb,GFgKiB,cEhKjB,CAAA,CAAA,UAAA,CAAA,EAAA,GAAA,EFiKI,QEjKJ,CFiKa,CEjKb,GFiKiB,cEjKjB,CAAA,CAAA,UAAA,CAAA,EAAA,GAAA,EFkKI,QElKJ,CFkKa,CElKb,GFkKiB,cElKjB,CAAA,EAAA,GFmKE,CEnKF,GFmKM,cEnKN;;AAuBH;AAiCA;AAA2C,KFoH/B,aEpH+B,CAAA,CAAA,CAAA,GFoHZ,CEpHY,SFoHF,OEpHE,CAAA,GAAA,EAAA,KAAA,EAAA,EAAA,GAAA,CAAA,GAAA,CAAA,GAAA,KAAA;;;;AAExC,KFuHS,aEvHT,CAAA,CAAA,CAAA,GFuH4B,CEvH5B,SFuHsC,OEvHtC,CAAA,GAAA,EAAA,GAAA,EAAA,KAAA,EAAA,CAAA,GAAA,CAAA,GAAA,SAAA;;AA+CH;AAiBA;AAAmD,KF8DvC,YE9DuC,CAAA,CAAA,CAAA,GF8DrB,CE9DqB,SF8DX,OE9DW,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,GAAA,CAAA,GAAA,CAAA,GAAA,KAAA;;;;AAExC,iBFqEK,SAAA,CErEL,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IFqEyC,UErEzC;;;;iBFiFK,iBAAA,2BAEJ;;;;KAeA,uBAAuB,eAAe,cAChD,yBAGE,eAAe;;;;;;AAnQnB;;;;;;AASA;;;;;;AAcA;;;;;;;AASA;;;;;;;AAG6C,iBC/B7B,eD+B6B,CAAA,eAAA,MAAA,CAAA,CAAA,OAAA,CAAA,EC9BlC,gBD8BkC,CAAA,EC7B1C,SD6B0C,CC7BhC,MD6BgC,GC7BvB,cD6BuB,CAAA;;;;AAM7C;AAKY,iBC+FI,WD/Fc,CAAG,eC+FU,cD/FK,CAAA,CAAA,QAAA,ECgGpC,QDhGoC,CCgG3B,MDhG2B,CAAA,CAAA,EAAA,OAAA;AAahD;;;;AACW,iBCyHK,WDzHL,CAAA,eCyHgC,cDzHhC,CAAA,CAAA,QAAA,EC0HC,QD1HD,CC0HU,MD1HV,CAAA,CAAA,EAAA,OAAA;;;;AAWM,iBCkLD,gBDlLU,CAAA,eCkLsB,cDlLtB,CAAA,CAAA,QAAA,ECmLd,QDnLc,CCmLL,MDnLK,CAAA,CAAA,EAAA,IAAA;;;;;;AAvE1B;;;;;;AASA;;;;AAGU,iBEmBM,YFnBN,CAAA,eEmBkC,cFnBlC,CAAA,CAAA,KAAA,EEoBD,aFpBC,CEoBa,QFpBb,CEoBsB,MFpBtB,CAAA,CAAA,CAAA,EEqBP,eFrBO,CEqBS,MFrBT,CAAA;;AAWV;;AAEyB,UE+BR,aAAA,CF/BQ;EAAQ;EAAS,SAAA,OAAA,EAAA,OAAA;EAA3B;EAAS,SAAA,OAAA,EAAA,OAAA;EAOP;EACC,SAAA,SAAA,EAAA,MAAA;EAAQ;EAAS,SAAA,SAAA,EAAA,MAAA;EACvB;EACgB,SAAA,IAAA,EAAA,GAAA,GAAA,OAAA;EAAQ;EAAS,SAAA,IAAA,EAAA,GAAA,GAAA,OAAA;EAA1B;EAFT,SAAA,KAAA,EAAA,GAAA,GAAA,IAAA;;AAQV;AAKA;AAaA;;;;;;;;AAYA;;;;;AAcA;AAGsC,iBECtB,WFDsB,CAAA,eECK,cFDL,CAAA,CAAA,KAAA,EEE7B,aFF6B,CEEf,QFFe,CEEN,MFFM,CAAA,CAAA,CAAA,EEGnC,aFHmC;;;;AAED,UEgDpB,0BAAA,CFhDoB;EAWpB;EAYA,SAAA,UAAS,CAAA,EAAA,OAAA;EAoBN;EAAQ,SAAA,UAAA,CAAA,EAAA,OAAA;;;;;;;;;;;;AAMrB,iBEgBS,mBFhBT,CAAA,eEgB4C,cFhB5C,CAAA,CAAA,KAAA,EEiBE,aFjBF,CEiBgB,QFjBhB,CEiByB,MFjBzB,CAAA,CAAA,EAAA,OAAA,CAAA,EEkBI,0BFlBJ,CAAA,EAAA,IAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["DEFAULT_OPTIONS: Required<CommanderOptions>","_storeApi: StoreApi<TStore & CommanderSlice> | null","ctx: CommandContext<TStore & CommanderSlice>","entry: UndoEntry<TParams, TReturn>","ctx: CommandContext<TStore>","newEntry: UndoEntry","dispatch: CommandDispatch<TStore>","ctx: CommandContext<TStore>"],"sources":["../../src/zustand-commander/types.ts","../../src/zustand-commander/commander.ts","../../src/zustand-commander/hooks.ts"],"sourcesContent":["/**\n * @voidhash/mimic-react/zustand-commander\n *\n * Type definitions for the zustand-commander package.\n *\n * @since 0.0.1\n */\n\nimport type { StoreApi, UseBoundStore } from \"zustand\";\n\n// =============================================================================\n// Command Symbol & Type Guard\n// =============================================================================\n\n/**\n * Symbol used to identify Command objects at runtime.\n */\nexport const COMMAND_SYMBOL = Symbol.for(\"zustand-commander/command\");\n\n/**\n * Symbol used to identify UndoableCommand objects at runtime.\n */\nexport const UNDOABLE_COMMAND_SYMBOL = Symbol.for(\n \"zustand-commander/undoable-command\"\n);\n\n// =============================================================================\n// Command Context\n// =============================================================================\n\n/**\n * Context provided to command functions.\n * Gives access to store state and dispatch capabilities.\n */\nexport interface CommandContext<TStore> {\n /**\n * Get the current store state.\n */\n readonly getState: () => TStore;\n\n /**\n * Set partial store state (for local/browser state updates).\n */\n readonly setState: (partial: Partial<TStore>) => void;\n\n /**\n * Dispatch another command.\n * Returns the result of the dispatched command.\n *\n * @example\n * dispatch(otherCommand)({ param: \"value\" });\n */\n readonly dispatch: CommandDispatch<TStore>;\n}\n\n// =============================================================================\n// Command Function Types\n// =============================================================================\n\n/**\n * The function signature for a command handler.\n */\nexport type CommandFn<TStore, TParams, TReturn> = (\n ctx: CommandContext<TStore>,\n params: TParams\n) => TReturn;\n\n/**\n * The function signature for an undoable command's revert handler.\n * Receives the original params and the result from the forward execution.\n */\nexport type RevertFn<TStore, TParams, TReturn> = (\n ctx: CommandContext<TStore>,\n params: TParams,\n result: TReturn\n) => void;\n\n// =============================================================================\n// Command Types\n// =============================================================================\n\n/**\n * A command that can be dispatched to modify store state.\n * Regular commands do not support undo/redo.\n */\nexport interface Command<TStore, TParams, TReturn> {\n readonly [COMMAND_SYMBOL]: true;\n readonly fn: CommandFn<TStore, TParams, TReturn>;\n}\n\n/**\n * An undoable command that supports undo/redo.\n * Must provide a revert function that knows how to undo the change.\n */\nexport interface UndoableCommand<TStore, TParams, TReturn>\n extends Command<TStore, TParams, TReturn> {\n readonly [UNDOABLE_COMMAND_SYMBOL]: true;\n readonly revert: RevertFn<TStore, TParams, TReturn>;\n}\n\n/**\n * Any command type (regular or undoable).\n */\nexport type AnyCommand = Command<any, any, any>;\n\n/**\n * Any undoable command type.\n */\nexport type AnyUndoableCommand = UndoableCommand<any, any, any>;\n\n// =============================================================================\n// Command Dispatch\n// =============================================================================\n\n/**\n * Dispatch function that accepts commands and returns a function to call with params.\n * Returns the result of the command execution.\n *\n * @example\n * const result = dispatch(myCommand)({ param: \"value\" });\n */\nexport type CommandDispatch<TStore> = <TParams, TReturn>(\n command: Command<TStore, TParams, TReturn>\n) => (params: TParams) => TReturn;\n\n// =============================================================================\n// Undo/Redo Stack Types\n// =============================================================================\n\n/**\n * An entry in the undo/redo stack.\n * Contains all information needed to revert or redo a command.\n */\nexport interface UndoEntry<TParams = unknown, TReturn = unknown> {\n /** The undoable command that was executed */\n readonly command: AnyUndoableCommand;\n /** The parameters that were passed to the command */\n readonly params: TParams;\n /** The result returned by the command (passed to revert) */\n readonly result: TReturn;\n /** Timestamp when the command was executed */\n readonly timestamp: number;\n}\n\n/**\n * State slice for undo/redo functionality.\n */\nexport interface CommanderSlice {\n readonly _commander: {\n /** Stack of commands that can be undone */\n readonly undoStack: ReadonlyArray<UndoEntry>;\n /** Stack of commands that can be redone */\n readonly redoStack: ReadonlyArray<UndoEntry>;\n };\n}\n\n// =============================================================================\n// Commander Types\n// =============================================================================\n\n/**\n * Options for creating a commander.\n */\nexport interface CommanderOptions {\n /**\n * Maximum number of undo entries to keep.\n * @default 100\n */\n readonly maxUndoStackSize?: number;\n}\n\n/**\n * A commander instance bound to a specific store type.\n * Used to create commands and the middleware.\n */\nexport interface Commander<TStore> {\n /**\n * Create a regular command (no undo support).\n *\n * @example\n * // With params\n * const addItem = commander.action<{ name: string }>(\n * (ctx, params) => {\n * // modify state using params.name\n * }\n * );\n *\n * // Without params\n * const clearAll = commander.action((ctx) => {\n * // modify state\n * });\n */\n readonly action: {\n // With params (explicit type parameter)\n <TParams, TReturn = void>(\n fn: CommandFn<TStore, TParams, TReturn>\n ): Command<TStore, TParams, TReturn>;\n\n // Without params (void) - inferred when no type param provided\n <TReturn = void>(\n fn: CommandFn<TStore, void, TReturn>\n ): Command<TStore, void, TReturn>;\n };\n\n /**\n * Create an undoable command with undo/redo support.\n * The revert function is called when undoing the command.\n *\n * @example\n * const moveItem = commander.undoableAction<{ id: string; toIndex: number }, { fromIndex: number }>(\n * (ctx, params) => {\n * const fromIndex = // get current index\n * // perform move\n * return { fromIndex }; // return data needed for revert\n * },\n * (ctx, params, result) => {\n * // revert: move back to original position\n * ctx.dispatch(moveItem)({ id: params.id, toIndex: result.fromIndex });\n * }\n * );\n */\n readonly undoableAction: {\n // With params (explicit type parameter)\n <TParams, TReturn>(\n fn: CommandFn<TStore, TParams, TReturn>,\n revert: RevertFn<TStore, TParams, TReturn>\n ): UndoableCommand<TStore, TParams, TReturn>;\n\n // Without params (void)\n <TReturn>(\n fn: CommandFn<TStore, void, TReturn>,\n revert: RevertFn<TStore, void, TReturn>\n ): UndoableCommand<TStore, void, TReturn>;\n };\n\n /**\n * Zustand middleware that adds commander functionality.\n * Adds undo/redo stacks to the store state.\n */\n readonly middleware: CommanderMiddleware<TStore>;\n}\n\n/**\n * Type for the commander middleware.\n * Note: TStore is intentionally unused here to match the Commander interface signature.\n * The middleware is generic over T (the inner store type) and adds CommanderSlice.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type CommanderMiddleware<_TStore> = <T extends object>(\n config: (\n set: StoreApi<T & CommanderSlice>[\"setState\"],\n get: StoreApi<T & CommanderSlice>[\"getState\"],\n api: StoreApi<T & CommanderSlice>\n ) => T\n) => (\n set: StoreApi<T & CommanderSlice>[\"setState\"],\n get: StoreApi<T & CommanderSlice>[\"getState\"],\n api: StoreApi<T & CommanderSlice>\n) => T & CommanderSlice;\n\n// =============================================================================\n// Type Helpers\n// =============================================================================\n\n/**\n * Extract the params type from a command.\n */\nexport type CommandParams<T> = T extends Command<any, infer P, any> ? P : never;\n\n/**\n * Extract the return type from a command.\n */\nexport type CommandReturn<T> = T extends Command<any, any, infer R>\n ? R\n : undefined;\n\n/**\n * Extract the store type from a command.\n */\nexport type CommandStore<T> = T extends Command<infer S, any, any> ? S : never;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is a Command.\n */\nexport function isCommand(value: unknown): value is AnyCommand {\n return (\n typeof value === \"object\" &&\n value !== null &&\n COMMAND_SYMBOL in value &&\n value[COMMAND_SYMBOL] === true\n );\n}\n\n/**\n * Type guard to check if a command is undoable.\n */\nexport function isUndoableCommand(\n value: unknown\n): value is AnyUndoableCommand {\n return (\n isCommand(value) &&\n UNDOABLE_COMMAND_SYMBOL in value &&\n value[UNDOABLE_COMMAND_SYMBOL] === true\n );\n}\n\n// =============================================================================\n// Store Type Helper\n// =============================================================================\n\n/**\n * Helper type to extract the state type from a zustand store.\n */\nexport type ExtractState<TStore> = TStore extends UseBoundStore<\n StoreApi<infer S>\n>\n ? S\n : TStore extends StoreApi<infer S>\n ? S\n : never;\n\n","/**\n * @voidhash/mimic-react/zustand-commander\n *\n * Commander creation and command definition.\n *\n * @since 0.0.1\n */\n\nimport type { StoreApi } from \"zustand\";\nimport {\n COMMAND_SYMBOL,\n UNDOABLE_COMMAND_SYMBOL,\n isUndoableCommand,\n type Command,\n type Commander,\n type CommanderOptions,\n type CommanderSlice,\n type CommandContext,\n type CommandDispatch,\n type CommandFn,\n type RevertFn,\n type UndoableCommand,\n type UndoEntry,\n} from \"./types.js\";\n\n// =============================================================================\n// Default Options\n// =============================================================================\n\nconst DEFAULT_OPTIONS: Required<CommanderOptions> = {\n maxUndoStackSize: 100,\n};\n\n// =============================================================================\n// Commander Implementation\n// =============================================================================\n\n/**\n * Creates a commander instance bound to a specific store type.\n *\n * @example\n * ```ts\n * // Create commander for your store type\n * const commander = createCommander<StoreState>();\n *\n * // Define commands\n * const addItem = commander.action(\n * Schema.Struct({ name: Schema.String }),\n * (ctx, params) => {\n * const { mimic } = ctx.getState();\n * mimic.document.transaction(root => {\n * // add item\n * });\n * }\n * );\n *\n * // Create store with middleware\n * const useStore = create(\n * commander.middleware(\n * mimic(document, (set, get) => ({\n * // your state\n * }))\n * )\n * );\n * ```\n */\nexport function createCommander<TStore extends object>(\n options: CommanderOptions = {}\n): Commander<TStore & CommanderSlice> {\n const { maxUndoStackSize } = { ...DEFAULT_OPTIONS, ...options };\n\n // Track the store API once middleware is applied\n let _storeApi: StoreApi<TStore & CommanderSlice> | null = null;\n\n /**\n * Creates the dispatch function for use within command handlers.\n */\n const createDispatch = (): CommandDispatch<TStore & CommanderSlice> => {\n return <TParams, TReturn>(\n command: Command<TStore & CommanderSlice, TParams, TReturn>\n ) => {\n return (params: TParams): TReturn => {\n if (!_storeApi) {\n throw new Error(\n \"Commander: Store not initialized. Make sure to use the commander middleware.\"\n );\n }\n\n // Create context for the command\n const ctx: CommandContext<TStore & CommanderSlice> = {\n getState: () => _storeApi!.getState(),\n setState: (partial) => _storeApi!.setState(partial as any),\n dispatch: createDispatch(),\n };\n\n // Execute the command\n const result = command.fn(ctx, params);\n\n // If it's an undoable command, add to undo stack\n if (isUndoableCommand(command)) {\n const entry: UndoEntry<TParams, TReturn> = {\n command,\n params,\n result,\n timestamp: Date.now(),\n };\n\n _storeApi.setState((state: TStore & CommanderSlice) => {\n const { undoStack, redoStack } = state._commander;\n\n // Add to undo stack, respecting max size\n const newUndoStack = [...undoStack, entry].slice(-maxUndoStackSize);\n\n // Clear redo stack when a new command is executed\n return {\n ...state,\n _commander: {\n undoStack: newUndoStack,\n redoStack: [],\n },\n };\n });\n }\n\n return result;\n };\n };\n };\n\n /**\n * Create a regular command (no undo support).\n */\n function action<TParams, TReturn = void>(\n fn: CommandFn<TStore & CommanderSlice, TParams, TReturn>\n ): Command<TStore & CommanderSlice, TParams, TReturn> {\n return {\n [COMMAND_SYMBOL]: true,\n fn,\n };\n }\n\n /**\n * Create an undoable command with undo/redo support.\n */\n function undoableAction<TParams, TReturn>(\n fn: CommandFn<TStore & CommanderSlice, TParams, TReturn>,\n revert: RevertFn<TStore & CommanderSlice, TParams, TReturn>\n ): UndoableCommand<TStore & CommanderSlice, TParams, TReturn> {\n return {\n [COMMAND_SYMBOL]: true,\n [UNDOABLE_COMMAND_SYMBOL]: true,\n fn,\n revert,\n };\n }\n\n /**\n * Zustand middleware that adds commander functionality.\n */\n const middleware = <T extends object>(\n config: (\n set: StoreApi<T & CommanderSlice>[\"setState\"],\n get: StoreApi<T & CommanderSlice>[\"getState\"],\n api: StoreApi<T & CommanderSlice>\n ) => T\n ) => {\n return (\n set: StoreApi<T & CommanderSlice>[\"setState\"],\n get: StoreApi<T & CommanderSlice>[\"getState\"],\n api: StoreApi<T & CommanderSlice>\n ): T & CommanderSlice => {\n // Store the API reference for dispatch\n _storeApi = api as unknown as StoreApi<TStore & CommanderSlice>;\n\n // Get user's state\n const userState = config(set, get, api);\n\n // Add commander slice\n return {\n ...userState,\n _commander: {\n undoStack: [],\n redoStack: [],\n },\n };\n };\n };\n\n return {\n action,\n undoableAction,\n middleware: middleware as Commander<TStore & CommanderSlice>[\"middleware\"],\n };\n}\n\n// =============================================================================\n// Undo/Redo Functions\n// =============================================================================\n\n/**\n * Perform an undo operation on the store.\n * Returns true if an undo was performed, false if undo stack was empty.\n */\nexport function performUndo<TStore extends CommanderSlice>(\n storeApi: StoreApi<TStore>\n): boolean {\n const state = storeApi.getState();\n const { undoStack, redoStack } = state._commander;\n\n // Pop the last entry from undo stack\n const entry = undoStack[undoStack.length - 1];\n if (!entry) {\n return false;\n }\n\n const newUndoStack = undoStack.slice(0, -1);\n\n // Create context for the revert function\n const ctx: CommandContext<TStore> = {\n getState: () => storeApi.getState(),\n setState: (partial) => storeApi.setState(partial as any),\n dispatch: createDispatchForUndo(storeApi),\n };\n\n // Execute the revert function\n entry.command.revert(ctx, entry.params, entry.result);\n\n // Move entry to redo stack\n storeApi.setState((state: TStore) => ({\n ...state,\n _commander: {\n undoStack: newUndoStack,\n redoStack: [...redoStack, entry],\n },\n }));\n\n return true;\n}\n\n/**\n * Perform a redo operation on the store.\n * Returns true if a redo was performed, false if redo stack was empty.\n */\nexport function performRedo<TStore extends CommanderSlice>(\n storeApi: StoreApi<TStore>\n): boolean {\n const state = storeApi.getState();\n const { undoStack, redoStack } = state._commander;\n\n // Pop the last entry from redo stack\n const entry = redoStack[redoStack.length - 1];\n if (!entry) {\n return false;\n }\n\n const newRedoStack = redoStack.slice(0, -1);\n\n // Create context for re-executing the command\n const ctx: CommandContext<TStore> = {\n getState: () => storeApi.getState(),\n setState: (partial) => storeApi.setState(partial as any),\n dispatch: createDispatchForUndo(storeApi),\n };\n\n // Re-execute the command\n const result = entry.command.fn(ctx, entry.params);\n\n // Create new entry with potentially new result\n const newEntry: UndoEntry = {\n command: entry.command,\n params: entry.params,\n result,\n timestamp: Date.now(),\n };\n\n // Move entry back to undo stack\n storeApi.setState((state: TStore) => ({\n ...state,\n _commander: {\n undoStack: [...undoStack, newEntry],\n redoStack: newRedoStack,\n },\n }));\n\n return true;\n}\n\n/**\n * Creates a dispatch function for use during undo/redo operations.\n * This dispatch does NOT add to undo stack (to avoid infinite loops).\n */\nfunction createDispatchForUndo<TStore>(\n storeApi: StoreApi<TStore>\n): CommandDispatch<TStore> {\n return <TParams, TReturn>(command: Command<TStore, TParams, TReturn>) => {\n return (params: TParams): TReturn => {\n const ctx: CommandContext<TStore> = {\n getState: () => storeApi.getState(),\n setState: (partial) => storeApi.setState(partial as any),\n dispatch: createDispatchForUndo(storeApi),\n };\n\n // Execute without adding to undo stack\n return command.fn(ctx, params);\n };\n };\n}\n\n/**\n * Clear the undo and redo stacks.\n */\nexport function clearUndoHistory<TStore extends CommanderSlice>(\n storeApi: StoreApi<TStore>\n): void {\n storeApi.setState((state: TStore) => ({\n ...state,\n _commander: {\n undoStack: [],\n redoStack: [],\n },\n }));\n}\n\n","/**\n * @voidhash/mimic-react/zustand-commander\n *\n * React hooks for zustand-commander.\n *\n * @since 0.0.1\n */\n\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useStore, type StoreApi, type UseBoundStore } from \"zustand\";\nimport { performRedo, performUndo, clearUndoHistory } from \"./commander\";\nimport {\n isUndoableCommand,\n type Command,\n type CommandContext,\n type CommandDispatch,\n type CommanderSlice,\n type ExtractState,\n} from \"./types.js\";\n\n// =============================================================================\n// useCommander Hook\n// =============================================================================\n\n/**\n * Creates a dispatch function for commands.\n * This is for use outside of React components (e.g., in command handlers).\n */\nfunction createDispatchFromApi<TStore extends CommanderSlice>(\n storeApi: StoreApi<TStore>,\n maxUndoStackSize = 100\n): CommandDispatch<TStore> {\n const dispatch: CommandDispatch<TStore> = <TParams, TReturn>(\n command: Command<TStore, TParams, TReturn>\n ) => {\n return (params: TParams): TReturn => {\n // Create context for the command\n const ctx: CommandContext<TStore> = {\n getState: () => storeApi.getState(),\n setState: (partial) => storeApi.setState(partial as Partial<TStore>),\n dispatch,\n };\n\n // Execute the command\n const result = command.fn(ctx, params);\n\n // If it's an undoable command, add to undo stack\n if (isUndoableCommand(command)) {\n storeApi.setState((state: TStore) => {\n const { undoStack } = state._commander;\n\n // Add to undo stack, respecting max size\n const newUndoStack = [\n ...undoStack,\n {\n command,\n params,\n result,\n timestamp: Date.now(),\n },\n ].slice(-maxUndoStackSize);\n\n // Clear redo stack when a new command is executed\n return {\n ...state,\n _commander: {\n undoStack: newUndoStack,\n redoStack: [],\n },\n } as TStore;\n });\n }\n\n return result;\n };\n };\n\n return dispatch;\n}\n\n/**\n * React hook to get a dispatch function for commands.\n * The dispatch function executes commands and manages undo/redo state.\n *\n * @example\n * ```tsx\n * const dispatch = useCommander(useStore);\n *\n * const handleClick = () => {\n * dispatch(addCard)({ columnId: \"col-1\", title: \"New Card\" });\n * };\n * ```\n */\nexport function useCommander<TStore extends CommanderSlice>(\n store: UseBoundStore<StoreApi<TStore>>\n): CommandDispatch<TStore> {\n // Get the store API\n const storeApi = useMemo(() => {\n // UseBoundStore has the StoreApi attached\n return store as unknown as StoreApi<TStore>;\n }, [store]);\n\n // Create a stable dispatch function\n const dispatch = useMemo(\n () => createDispatchFromApi<TStore>(storeApi),\n [storeApi]\n );\n\n return dispatch as CommandDispatch<TStore>;\n}\n\n// =============================================================================\n// useUndoRedo Hook\n// =============================================================================\n\n/**\n * State and actions for undo/redo functionality.\n */\nexport interface UndoRedoState {\n /** Whether there are actions that can be undone */\n readonly canUndo: boolean;\n /** Whether there are actions that can be redone */\n readonly canRedo: boolean;\n /** Number of items in the undo stack */\n readonly undoCount: number;\n /** Number of items in the redo stack */\n readonly redoCount: number;\n /** Undo the last action */\n readonly undo: () => boolean;\n /** Redo the last undone action */\n readonly redo: () => boolean;\n /** Clear the undo/redo history */\n readonly clear: () => void;\n}\n\n/**\n * React hook for undo/redo functionality.\n * Provides state (canUndo, canRedo) and actions (undo, redo, clear).\n *\n * @example\n * ```tsx\n * const { canUndo, canRedo, undo, redo } = useUndoRedo(useStore);\n *\n * return (\n * <>\n * <button onClick={undo} disabled={!canUndo}>Undo</button>\n * <button onClick={redo} disabled={!canRedo}>Redo</button>\n * </>\n * );\n * ```\n */\nexport function useUndoRedo<TStore extends CommanderSlice>(\n store: UseBoundStore<StoreApi<TStore>>\n): UndoRedoState {\n // Get the store API\n const storeApi = useMemo(() => {\n return store as unknown as StoreApi<TStore>;\n }, [store]);\n\n // Subscribe to commander state\n const commanderState = useStore(\n store,\n (state: TStore) => state._commander\n );\n\n const canUndo = commanderState.undoStack.length > 0;\n const canRedo = commanderState.redoStack.length > 0;\n const undoCount = commanderState.undoStack.length;\n const redoCount = commanderState.redoStack.length;\n\n const undo = useCallback(() => {\n return performUndo(storeApi);\n }, [storeApi]);\n\n const redo = useCallback(() => {\n return performRedo(storeApi);\n }, [storeApi]);\n\n const clear = useCallback(() => {\n clearUndoHistory(storeApi);\n }, [storeApi]);\n\n return {\n canUndo,\n canRedo,\n undoCount,\n redoCount,\n undo,\n redo,\n clear,\n };\n}\n\n// =============================================================================\n// Keyboard Shortcut Hook\n// =============================================================================\n\n/**\n * Options for the keyboard shortcut hook.\n */\nexport interface UseUndoRedoKeyboardOptions {\n /** Enable Ctrl/Cmd+Z for undo (default: true) */\n readonly enableUndo?: boolean;\n /** Enable Ctrl/Cmd+Shift+Z or Ctrl+Y for redo (default: true) */\n readonly enableRedo?: boolean;\n}\n\n/**\n * React hook that adds keyboard shortcuts for undo/redo.\n * Listens for Ctrl/Cmd+Z (undo) and Ctrl/Cmd+Shift+Z or Ctrl+Y (redo).\n *\n * @example\n * ```tsx\n * // In your app component\n * useUndoRedoKeyboard(useStore);\n * ```\n */\nexport function useUndoRedoKeyboard<TStore extends CommanderSlice>(\n store: UseBoundStore<StoreApi<TStore>>,\n options: UseUndoRedoKeyboardOptions = {}\n): void {\n const { enableUndo = true, enableRedo = true } = options;\n\n const storeApi = useMemo(() => {\n return store as unknown as StoreApi<TStore>;\n }, [store]);\n\n // Set up keyboard listener\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const isMac = navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0;\n const modKey = isMac ? event.metaKey : event.ctrlKey;\n\n if (!modKey) return;\n\n // Undo: Ctrl/Cmd + Z (without Shift)\n if (enableUndo && event.key === \"z\" && !event.shiftKey) {\n event.preventDefault();\n performUndo(storeApi);\n return;\n }\n\n // Redo: Ctrl/Cmd + Shift + Z or Ctrl + Y\n if (enableRedo) {\n if ((event.key === \"z\" && event.shiftKey) || event.key === \"y\") {\n event.preventDefault();\n performRedo(storeApi);\n }\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [storeApi, enableUndo, enableRedo]);\n}\n"],"mappings":"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"}
|