@voidhash/mimic-react 0.0.1-alpha.7 → 0.0.1-alpha.8
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 +27 -11
- package/dist/objectSpread2-CIP_6jda.cjs +73 -0
- package/dist/objectSpread2-CxTyNSYl.mjs +67 -0
- package/dist/zustand/index.cjs +95 -0
- package/dist/zustand/index.d.cts +115 -0
- package/dist/zustand/index.d.cts.map +1 -0
- package/dist/zustand/index.d.mts +115 -0
- package/dist/zustand/index.d.mts.map +1 -0
- package/dist/zustand/index.mjs +96 -0
- package/dist/zustand/index.mjs.map +1 -0
- package/dist/zustand-commander/index.cjs +364 -0
- package/dist/zustand-commander/index.d.cts +325 -0
- package/dist/zustand-commander/index.d.cts.map +1 -0
- package/dist/zustand-commander/index.d.mts +325 -0
- package/dist/zustand-commander/index.d.mts.map +1 -0
- package/dist/zustand-commander/index.mjs +355 -0
- package/dist/zustand-commander/index.mjs.map +1 -0
- package/package.json +18 -5
- package/tsdown.config.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
|
|
2
|
-
> @voidhash/mimic-react@0.0.1-alpha.
|
|
2
|
+
> @voidhash/mimic-react@0.0.1-alpha.8 build /home/runner/work/mimic/mimic/packages/mimic-react
|
|
3
3
|
> tsdown
|
|
4
4
|
|
|
5
5
|
[34mℹ[39m tsdown [2mv0.18.2[22m powered by rolldown [2mv1.0.0-beta.55[22m
|
|
6
6
|
[34mℹ[39m config file: [4m/home/runner/work/mimic/mimic/packages/mimic-react/tsdown.config.ts[24m
|
|
7
|
-
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
7
|
+
[34mℹ[39m entry: [34msrc/index.ts, src/zustand/index.ts, src/zustand-commander/index.ts[39m
|
|
8
8
|
[34mℹ[39m target: [34mes2017[39m
|
|
9
9
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
10
|
[34mℹ[39m Build start
|
|
11
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[
|
|
12
|
-
[34mℹ[39m [33m[CJS][39m
|
|
13
|
-
[34mℹ[39m [
|
|
14
|
-
[34mℹ[39m [
|
|
15
|
-
[34mℹ[39m [
|
|
16
|
-
[
|
|
17
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[
|
|
18
|
-
[34mℹ[39m [33m[CJS][39m
|
|
19
|
-
[
|
|
11
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mzustand-commander/index.cjs[22m [2m10.57 kB[22m [2m│ gzip: 2.75 kB[22m
|
|
12
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mzustand/index.cjs[22m [2m 3.02 kB[22m [2m│ gzip: 1.09 kB[22m
|
|
13
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m 0.00 kB[22m [2m│ gzip: 0.02 kB[22m
|
|
14
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mobjectSpread2-CIP_6jda.cjs [2m 2.23 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
15
|
+
[34mℹ[39m [33m[CJS][39m 4 files, total: 15.81 kB
|
|
16
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mzustand-commander/index.d.cts.map [2m 5.67 kB[22m [2m│ gzip: 2.28 kB[22m
|
|
17
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mzustand/index.d.cts.map [2m 1.86 kB[22m [2m│ gzip: 0.82 kB[22m
|
|
18
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mzustand-commander/index.d.cts[22m[39m [2m11.59 kB[22m [2m│ gzip: 3.11 kB[22m
|
|
19
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mzustand/index.d.cts[22m[39m [2m 5.01 kB[22m [2m│ gzip: 1.46 kB[22m
|
|
20
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
21
|
+
[34mℹ[39m [33m[CJS][39m 5 files, total: 24.14 kB
|
|
22
|
+
[32m✔[39m Build complete in [32m5884ms[39m
|
|
23
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mzustand-commander/index.mjs[22m [2m 9.95 kB[22m [2m│ gzip: 2.71 kB[22m
|
|
24
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mzustand/index.mjs[22m [2m 2.96 kB[22m [2m│ gzip: 1.11 kB[22m
|
|
25
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
26
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mzustand-commander/index.mjs.map [2m34.69 kB[22m [2m│ gzip: 7.63 kB[22m
|
|
27
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mzustand/index.mjs.map [2m 6.71 kB[22m [2m│ gzip: 2.09 kB[22m
|
|
28
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mzustand-commander/index.d.mts.map [2m 5.67 kB[22m [2m│ gzip: 2.28 kB[22m
|
|
29
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mobjectSpread2-CxTyNSYl.mjs [2m 2.13 kB[22m [2m│ gzip: 0.77 kB[22m
|
|
30
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mzustand/index.d.mts.map [2m 1.86 kB[22m [2m│ gzip: 0.82 kB[22m
|
|
31
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mzustand-commander/index.d.mts[22m[39m [2m11.59 kB[22m [2m│ gzip: 3.11 kB[22m
|
|
32
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mzustand/index.d.mts[22m[39m [2m 5.01 kB[22m [2m│ gzip: 1.46 kB[22m
|
|
33
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
34
|
+
[34mℹ[39m [34m[ESM][39m 11 files, total: 80.59 kB
|
|
35
|
+
[32m✔[39m Build complete in [32m5895ms[39m
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
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 };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const require_objectSpread2 = require('../objectSpread2-CIP_6jda.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/zustand/middleware.ts
|
|
4
|
+
/**
|
|
5
|
+
* Creates a MimicObject from the current document state.
|
|
6
|
+
*/
|
|
7
|
+
const createMimicObject = (document) => {
|
|
8
|
+
const presence = document.presence ? {
|
|
9
|
+
selfId: document.presence.selfId(),
|
|
10
|
+
self: document.presence.self(),
|
|
11
|
+
others: new Map(document.presence.others()),
|
|
12
|
+
all: new Map(document.presence.all())
|
|
13
|
+
} : void 0;
|
|
14
|
+
return {
|
|
15
|
+
document,
|
|
16
|
+
snapshot: document.root.toSnapshot(),
|
|
17
|
+
presence,
|
|
18
|
+
isConnected: document.isConnected(),
|
|
19
|
+
isReady: document.isReady(),
|
|
20
|
+
pendingCount: document.getPendingCount(),
|
|
21
|
+
hasPendingChanges: document.hasPendingChanges()
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Implementation of the mimic middleware.
|
|
26
|
+
*/
|
|
27
|
+
const mimicImpl = (document, config, options = {}) => {
|
|
28
|
+
const { autoSubscribe = true, autoConnect = true } = options;
|
|
29
|
+
return (set, get, api) => {
|
|
30
|
+
const initialMimic = createMimicObject(document);
|
|
31
|
+
const updateMimicState = () => {
|
|
32
|
+
const newMimic = createMimicObject(document);
|
|
33
|
+
set((state) => require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { mimic: newMimic }), false);
|
|
34
|
+
};
|
|
35
|
+
if (autoSubscribe) {
|
|
36
|
+
var _document$presence;
|
|
37
|
+
document.subscribe({
|
|
38
|
+
onStateChange: () => {
|
|
39
|
+
updateMimicState();
|
|
40
|
+
},
|
|
41
|
+
onConnectionChange: () => {
|
|
42
|
+
updateMimicState();
|
|
43
|
+
},
|
|
44
|
+
onReady: () => {
|
|
45
|
+
updateMimicState();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
(_document$presence = document.presence) === null || _document$presence === void 0 || _document$presence.subscribe({ onPresenceChange: () => {
|
|
49
|
+
updateMimicState();
|
|
50
|
+
} });
|
|
51
|
+
}
|
|
52
|
+
if (autoConnect) document.connect();
|
|
53
|
+
return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, config(set, get, api)), {}, { mimic: initialMimic });
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Zustand middleware that integrates a ClientDocument.
|
|
58
|
+
*
|
|
59
|
+
* Adds a `mimic` object to the store containing:
|
|
60
|
+
* - `document`: The ClientDocument instance for performing transactions
|
|
61
|
+
* - `snapshot`: Read-only snapshot of the document state (reactive)
|
|
62
|
+
* - `presence`: Reactive presence snapshot (self + others). Undefined if presence is not enabled on the ClientDocument.
|
|
63
|
+
* - `isConnected`: Connection status
|
|
64
|
+
* - `isReady`: Ready status
|
|
65
|
+
* - `pendingCount`: Number of pending transactions
|
|
66
|
+
* - `hasPendingChanges`: Whether there are pending changes
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { create } from 'zustand'
|
|
71
|
+
* import { mimic } from '@voidhash/mimic-react/zustand'
|
|
72
|
+
*
|
|
73
|
+
* const useStore = create(
|
|
74
|
+
* mimic(clientDocument, (set, get) => ({
|
|
75
|
+
* // Your additional store state
|
|
76
|
+
* }))
|
|
77
|
+
* )
|
|
78
|
+
*
|
|
79
|
+
* // Read snapshot (reactive)
|
|
80
|
+
* const snapshot = useStore(state => state.mimic.snapshot)
|
|
81
|
+
*
|
|
82
|
+
* // Read presence (reactive, if enabled)
|
|
83
|
+
* const myPresence = useStore(state => state.mimic.presence?.self)
|
|
84
|
+
* const othersPresence = useStore(state => state.mimic.presence?.others)
|
|
85
|
+
*
|
|
86
|
+
* // Write via document
|
|
87
|
+
* store.getState().mimic.document.transaction(root => {
|
|
88
|
+
* root.name.set("New Name")
|
|
89
|
+
* })
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
const mimic = mimicImpl;
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
exports.mimic = mimic;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { StateCreator, StoreMutatorIdentifier } from "zustand";
|
|
2
|
+
import { ClientDocument } from "@voidhash/mimic/client";
|
|
3
|
+
import { Presence, Primitive } from "@voidhash/mimic";
|
|
4
|
+
|
|
5
|
+
//#region src/zustand/types.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Presence data exposed on the zustand store (reactive snapshot).
|
|
9
|
+
*/
|
|
10
|
+
interface MimicPresence<TPresence extends Presence.AnyPresence> {
|
|
11
|
+
/**
|
|
12
|
+
* This client's connection ID (set after receiving presence snapshot).
|
|
13
|
+
* Undefined before the snapshot is received.
|
|
14
|
+
*/
|
|
15
|
+
readonly selfId: string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* This client's current presence data.
|
|
18
|
+
* Undefined if not set.
|
|
19
|
+
*/
|
|
20
|
+
readonly self: Presence.Infer<TPresence> | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Other clients' presence entries (connectionId -> entry).
|
|
23
|
+
*/
|
|
24
|
+
readonly others: ReadonlyMap<string, Presence.PresenceEntry<Presence.Infer<TPresence>>>;
|
|
25
|
+
/**
|
|
26
|
+
* All presence entries including self (connectionId -> entry).
|
|
27
|
+
*/
|
|
28
|
+
readonly all: ReadonlyMap<string, Presence.PresenceEntry<Presence.Infer<TPresence>>>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The mimic object containing the document and client state.
|
|
32
|
+
* This is added to the zustand store by the middleware.
|
|
33
|
+
*/
|
|
34
|
+
interface MimicObject<TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined = undefined> {
|
|
35
|
+
/** The ClientDocument instance for performing transactions */
|
|
36
|
+
readonly document: ClientDocument.ClientDocument<TSchema, TPresence>;
|
|
37
|
+
/** Read-only snapshot of the document state */
|
|
38
|
+
readonly snapshot: Primitive.InferSnapshot<TSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Reactive presence snapshot (self + others).
|
|
41
|
+
* Undefined when the ClientDocument was created without a presence schema.
|
|
42
|
+
*/
|
|
43
|
+
readonly presence: TPresence extends Presence.AnyPresence ? MimicPresence<TPresence> : undefined;
|
|
44
|
+
/** Whether the client is connected to the server */
|
|
45
|
+
readonly isConnected: boolean;
|
|
46
|
+
/** Whether the client is fully initialized and ready */
|
|
47
|
+
readonly isReady: boolean;
|
|
48
|
+
/** Number of pending transactions */
|
|
49
|
+
readonly pendingCount: number;
|
|
50
|
+
/** Whether there are pending changes */
|
|
51
|
+
readonly hasPendingChanges: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The state slice added by the mimic middleware.
|
|
55
|
+
*/
|
|
56
|
+
interface MimicSlice<TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined = undefined> {
|
|
57
|
+
/** The mimic object containing document and state */
|
|
58
|
+
readonly mimic: MimicObject<TSchema, TPresence>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Type for state creator with mimic slice merged.
|
|
62
|
+
*/
|
|
63
|
+
type MimicStateCreator<TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined, T, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []> = StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T>;
|
|
64
|
+
/**
|
|
65
|
+
* Options for the mimic middleware.
|
|
66
|
+
*/
|
|
67
|
+
interface MimicMiddlewareOptions {
|
|
68
|
+
/** If true, automatically subscribe when store is created (default: true) */
|
|
69
|
+
readonly autoSubscribe?: boolean;
|
|
70
|
+
/** If true, automatically attempt to connect the document to the remote server */
|
|
71
|
+
readonly autoConnect?: boolean;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/zustand/middleware.d.ts
|
|
75
|
+
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>>;
|
|
76
|
+
/**
|
|
77
|
+
* Zustand middleware that integrates a ClientDocument.
|
|
78
|
+
*
|
|
79
|
+
* Adds a `mimic` object to the store containing:
|
|
80
|
+
* - `document`: The ClientDocument instance for performing transactions
|
|
81
|
+
* - `snapshot`: Read-only snapshot of the document state (reactive)
|
|
82
|
+
* - `presence`: Reactive presence snapshot (self + others). Undefined if presence is not enabled on the ClientDocument.
|
|
83
|
+
* - `isConnected`: Connection status
|
|
84
|
+
* - `isReady`: Ready status
|
|
85
|
+
* - `pendingCount`: Number of pending transactions
|
|
86
|
+
* - `hasPendingChanges`: Whether there are pending changes
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* import { create } from 'zustand'
|
|
91
|
+
* import { mimic } from '@voidhash/mimic-react/zustand'
|
|
92
|
+
*
|
|
93
|
+
* const useStore = create(
|
|
94
|
+
* mimic(clientDocument, (set, get) => ({
|
|
95
|
+
* // Your additional store state
|
|
96
|
+
* }))
|
|
97
|
+
* )
|
|
98
|
+
*
|
|
99
|
+
* // Read snapshot (reactive)
|
|
100
|
+
* const snapshot = useStore(state => state.mimic.snapshot)
|
|
101
|
+
*
|
|
102
|
+
* // Read presence (reactive, if enabled)
|
|
103
|
+
* const myPresence = useStore(state => state.mimic.presence?.self)
|
|
104
|
+
* const othersPresence = useStore(state => state.mimic.presence?.others)
|
|
105
|
+
*
|
|
106
|
+
* // Write via document
|
|
107
|
+
* store.getState().mimic.document.transaction(root => {
|
|
108
|
+
* root.name.set("New Name")
|
|
109
|
+
* })
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
declare const mimic: MimicMiddleware;
|
|
113
|
+
//#endregion
|
|
114
|
+
export { type MimicMiddlewareOptions, type MimicObject, type MimicSlice, type MimicStateCreator, mimic };
|
|
115
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { StateCreator, StoreMutatorIdentifier } from "zustand";
|
|
2
|
+
import { ClientDocument } from "@voidhash/mimic/client";
|
|
3
|
+
import { Presence, Primitive } from "@voidhash/mimic";
|
|
4
|
+
|
|
5
|
+
//#region src/zustand/types.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Presence data exposed on the zustand store (reactive snapshot).
|
|
9
|
+
*/
|
|
10
|
+
interface MimicPresence<TPresence extends Presence.AnyPresence> {
|
|
11
|
+
/**
|
|
12
|
+
* This client's connection ID (set after receiving presence snapshot).
|
|
13
|
+
* Undefined before the snapshot is received.
|
|
14
|
+
*/
|
|
15
|
+
readonly selfId: string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* This client's current presence data.
|
|
18
|
+
* Undefined if not set.
|
|
19
|
+
*/
|
|
20
|
+
readonly self: Presence.Infer<TPresence> | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Other clients' presence entries (connectionId -> entry).
|
|
23
|
+
*/
|
|
24
|
+
readonly others: ReadonlyMap<string, Presence.PresenceEntry<Presence.Infer<TPresence>>>;
|
|
25
|
+
/**
|
|
26
|
+
* All presence entries including self (connectionId -> entry).
|
|
27
|
+
*/
|
|
28
|
+
readonly all: ReadonlyMap<string, Presence.PresenceEntry<Presence.Infer<TPresence>>>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The mimic object containing the document and client state.
|
|
32
|
+
* This is added to the zustand store by the middleware.
|
|
33
|
+
*/
|
|
34
|
+
interface MimicObject<TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined = undefined> {
|
|
35
|
+
/** The ClientDocument instance for performing transactions */
|
|
36
|
+
readonly document: ClientDocument.ClientDocument<TSchema, TPresence>;
|
|
37
|
+
/** Read-only snapshot of the document state */
|
|
38
|
+
readonly snapshot: Primitive.InferSnapshot<TSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Reactive presence snapshot (self + others).
|
|
41
|
+
* Undefined when the ClientDocument was created without a presence schema.
|
|
42
|
+
*/
|
|
43
|
+
readonly presence: TPresence extends Presence.AnyPresence ? MimicPresence<TPresence> : undefined;
|
|
44
|
+
/** Whether the client is connected to the server */
|
|
45
|
+
readonly isConnected: boolean;
|
|
46
|
+
/** Whether the client is fully initialized and ready */
|
|
47
|
+
readonly isReady: boolean;
|
|
48
|
+
/** Number of pending transactions */
|
|
49
|
+
readonly pendingCount: number;
|
|
50
|
+
/** Whether there are pending changes */
|
|
51
|
+
readonly hasPendingChanges: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The state slice added by the mimic middleware.
|
|
55
|
+
*/
|
|
56
|
+
interface MimicSlice<TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined = undefined> {
|
|
57
|
+
/** The mimic object containing document and state */
|
|
58
|
+
readonly mimic: MimicObject<TSchema, TPresence>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Type for state creator with mimic slice merged.
|
|
62
|
+
*/
|
|
63
|
+
type MimicStateCreator<TSchema extends Primitive.AnyPrimitive, TPresence extends Presence.AnyPresence | undefined, T, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []> = StateCreator<T & MimicSlice<TSchema, TPresence>, Mps, Mcs, T>;
|
|
64
|
+
/**
|
|
65
|
+
* Options for the mimic middleware.
|
|
66
|
+
*/
|
|
67
|
+
interface MimicMiddlewareOptions {
|
|
68
|
+
/** If true, automatically subscribe when store is created (default: true) */
|
|
69
|
+
readonly autoSubscribe?: boolean;
|
|
70
|
+
/** If true, automatically attempt to connect the document to the remote server */
|
|
71
|
+
readonly autoConnect?: boolean;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/zustand/middleware.d.ts
|
|
75
|
+
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>>;
|
|
76
|
+
/**
|
|
77
|
+
* Zustand middleware that integrates a ClientDocument.
|
|
78
|
+
*
|
|
79
|
+
* Adds a `mimic` object to the store containing:
|
|
80
|
+
* - `document`: The ClientDocument instance for performing transactions
|
|
81
|
+
* - `snapshot`: Read-only snapshot of the document state (reactive)
|
|
82
|
+
* - `presence`: Reactive presence snapshot (self + others). Undefined if presence is not enabled on the ClientDocument.
|
|
83
|
+
* - `isConnected`: Connection status
|
|
84
|
+
* - `isReady`: Ready status
|
|
85
|
+
* - `pendingCount`: Number of pending transactions
|
|
86
|
+
* - `hasPendingChanges`: Whether there are pending changes
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* import { create } from 'zustand'
|
|
91
|
+
* import { mimic } from '@voidhash/mimic-react/zustand'
|
|
92
|
+
*
|
|
93
|
+
* const useStore = create(
|
|
94
|
+
* mimic(clientDocument, (set, get) => ({
|
|
95
|
+
* // Your additional store state
|
|
96
|
+
* }))
|
|
97
|
+
* )
|
|
98
|
+
*
|
|
99
|
+
* // Read snapshot (reactive)
|
|
100
|
+
* const snapshot = useStore(state => state.mimic.snapshot)
|
|
101
|
+
*
|
|
102
|
+
* // Read presence (reactive, if enabled)
|
|
103
|
+
* const myPresence = useStore(state => state.mimic.presence?.self)
|
|
104
|
+
* const othersPresence = useStore(state => state.mimic.presence?.others)
|
|
105
|
+
*
|
|
106
|
+
* // Write via document
|
|
107
|
+
* store.getState().mimic.document.transaction(root => {
|
|
108
|
+
* root.name.set("New Name")
|
|
109
|
+
* })
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
declare const mimic: MimicMiddleware;
|
|
113
|
+
//#endregion
|
|
114
|
+
export { type MimicMiddlewareOptions, type MimicObject, type MimicSlice, type MimicStateCreator, mimic };
|
|
115
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { t as _objectSpread2 } from "../objectSpread2-CxTyNSYl.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/zustand/middleware.ts
|
|
4
|
+
/**
|
|
5
|
+
* Creates a MimicObject from the current document state.
|
|
6
|
+
*/
|
|
7
|
+
const createMimicObject = (document) => {
|
|
8
|
+
const presence = document.presence ? {
|
|
9
|
+
selfId: document.presence.selfId(),
|
|
10
|
+
self: document.presence.self(),
|
|
11
|
+
others: new Map(document.presence.others()),
|
|
12
|
+
all: new Map(document.presence.all())
|
|
13
|
+
} : void 0;
|
|
14
|
+
return {
|
|
15
|
+
document,
|
|
16
|
+
snapshot: document.root.toSnapshot(),
|
|
17
|
+
presence,
|
|
18
|
+
isConnected: document.isConnected(),
|
|
19
|
+
isReady: document.isReady(),
|
|
20
|
+
pendingCount: document.getPendingCount(),
|
|
21
|
+
hasPendingChanges: document.hasPendingChanges()
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Implementation of the mimic middleware.
|
|
26
|
+
*/
|
|
27
|
+
const mimicImpl = (document, config, options = {}) => {
|
|
28
|
+
const { autoSubscribe = true, autoConnect = true } = options;
|
|
29
|
+
return (set, get, api) => {
|
|
30
|
+
const initialMimic = createMimicObject(document);
|
|
31
|
+
const updateMimicState = () => {
|
|
32
|
+
const newMimic = createMimicObject(document);
|
|
33
|
+
set((state) => _objectSpread2(_objectSpread2({}, state), {}, { mimic: newMimic }), false);
|
|
34
|
+
};
|
|
35
|
+
if (autoSubscribe) {
|
|
36
|
+
var _document$presence;
|
|
37
|
+
document.subscribe({
|
|
38
|
+
onStateChange: () => {
|
|
39
|
+
updateMimicState();
|
|
40
|
+
},
|
|
41
|
+
onConnectionChange: () => {
|
|
42
|
+
updateMimicState();
|
|
43
|
+
},
|
|
44
|
+
onReady: () => {
|
|
45
|
+
updateMimicState();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
(_document$presence = document.presence) === null || _document$presence === void 0 || _document$presence.subscribe({ onPresenceChange: () => {
|
|
49
|
+
updateMimicState();
|
|
50
|
+
} });
|
|
51
|
+
}
|
|
52
|
+
if (autoConnect) document.connect();
|
|
53
|
+
return _objectSpread2(_objectSpread2({}, config(set, get, api)), {}, { mimic: initialMimic });
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Zustand middleware that integrates a ClientDocument.
|
|
58
|
+
*
|
|
59
|
+
* Adds a `mimic` object to the store containing:
|
|
60
|
+
* - `document`: The ClientDocument instance for performing transactions
|
|
61
|
+
* - `snapshot`: Read-only snapshot of the document state (reactive)
|
|
62
|
+
* - `presence`: Reactive presence snapshot (self + others). Undefined if presence is not enabled on the ClientDocument.
|
|
63
|
+
* - `isConnected`: Connection status
|
|
64
|
+
* - `isReady`: Ready status
|
|
65
|
+
* - `pendingCount`: Number of pending transactions
|
|
66
|
+
* - `hasPendingChanges`: Whether there are pending changes
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { create } from 'zustand'
|
|
71
|
+
* import { mimic } from '@voidhash/mimic-react/zustand'
|
|
72
|
+
*
|
|
73
|
+
* const useStore = create(
|
|
74
|
+
* mimic(clientDocument, (set, get) => ({
|
|
75
|
+
* // Your additional store state
|
|
76
|
+
* }))
|
|
77
|
+
* )
|
|
78
|
+
*
|
|
79
|
+
* // Read snapshot (reactive)
|
|
80
|
+
* const snapshot = useStore(state => state.mimic.snapshot)
|
|
81
|
+
*
|
|
82
|
+
* // Read presence (reactive, if enabled)
|
|
83
|
+
* const myPresence = useStore(state => state.mimic.presence?.self)
|
|
84
|
+
* const othersPresence = useStore(state => state.mimic.presence?.others)
|
|
85
|
+
*
|
|
86
|
+
* // Write via document
|
|
87
|
+
* store.getState().mimic.document.transaction(root => {
|
|
88
|
+
* root.name.set("New Name")
|
|
89
|
+
* })
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
const mimic = mimicImpl;
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
export { mimic };
|
|
96
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|