mindoodb 0.0.85 → 0.0.86
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/README-server.md +1 -0
- package/README.md +6 -4
- package/dist/cloudflare/DurableObjectSql.d.ts +56 -0
- package/dist/cloudflare/DurableObjectSql.d.ts.map +1 -0
- package/dist/cloudflare/DurableObjectSql.js +180 -0
- package/dist/cloudflare/DurableObjectSql.js.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts +86 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.js +614 -0
- package/dist/cloudflare/MindooDatabaseObject.js.map +1 -0
- package/dist/cloudflare/MindooServerObject.d.ts +63 -0
- package/dist/cloudflare/MindooServerObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooServerObject.js +521 -0
- package/dist/cloudflare/MindooServerObject.js.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts +7 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js +14 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js.map +1 -0
- package/dist/cloudflare/host.d.ts +49 -0
- package/dist/cloudflare/host.d.ts.map +1 -0
- package/dist/cloudflare/host.js +104 -0
- package/dist/cloudflare/host.js.map +1 -0
- package/dist/cloudflare/http.d.ts +91 -0
- package/dist/cloudflare/http.d.ts.map +1 -0
- package/dist/cloudflare/http.js +266 -0
- package/dist/cloudflare/http.js.map +1 -0
- package/dist/cloudflare/index.d.ts +12 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +20 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/storeRpc.d.ts +22 -0
- package/dist/cloudflare/storeRpc.d.ts.map +1 -0
- package/dist/cloudflare/storeRpc.js +85 -0
- package/dist/cloudflare/storeRpc.js.map +1 -0
- package/dist/cloudflare/types.d.ts +101 -0
- package/dist/cloudflare/types.d.ts.map +1 -0
- package/dist/cloudflare/types.js +10 -0
- package/dist/cloudflare/types.js.map +1 -0
- package/dist/cloudflare/worker.d.ts +25 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +170 -0
- package/dist/cloudflare/worker.js.map +1 -0
- package/dist/core/BaseMindooDB.d.ts +28 -1
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +180 -86
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +14 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +46 -0
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +10 -0
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +79 -8
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/ChangeDocDraft.d.ts +133 -0
- package/dist/core/ChangeDocDraft.d.ts.map +1 -0
- package/dist/core/ChangeDocDraft.js +492 -0
- package/dist/core/ChangeDocDraft.js.map +1 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +8 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +19 -0
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.js +3 -23
- package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.d.ts.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js +3 -23
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +21 -30
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +37 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js +99 -40
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -1
- package/dist/core/expressions/evaluateExpression.d.ts +8 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
- package/dist/core/expressions/evaluateExpression.js +29 -4
- package/dist/core/expressions/evaluateExpression.js.map +1 -1
- package/dist/core/expressions/metadata.js +4 -4
- package/dist/core/expressions/metadata.js.map +1 -1
- package/dist/core/types.d.ts +61 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +3 -24
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/utils/base64.d.ts +17 -0
- package/dist/core/utils/base64.d.ts.map +1 -0
- package/dist/core/utils/base64.js +54 -0
- package/dist/core/utils/base64.js.map +1 -0
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +14 -3
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/node/server/FsServerDataStore.d.ts +23 -0
- package/dist/node/server/FsServerDataStore.d.ts.map +1 -0
- package/dist/node/server/FsServerDataStore.js +59 -0
- package/dist/node/server/FsServerDataStore.js.map +1 -0
- package/dist/node/server/IrohServerEndpoint.d.ts +1 -1
- package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.d.ts +5 -5
- package/dist/node/server/IrohServerRpc.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.js +1 -1
- package/dist/node/server/IrohServerRpc.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts +29 -150
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +160 -1573
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +4 -27
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -1
- package/dist/node/server/PurgedDocRegistry.js +6 -83
- package/dist/node/server/PurgedDocRegistry.js.map +1 -1
- package/dist/node/server/StoreFactory.d.ts +1 -1
- package/dist/node/server/StoreFactory.d.ts.map +1 -1
- package/dist/node/server/TenantManager.d.ts +16 -284
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +35 -1168
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/add-to-network.js +1 -1
- package/dist/node/server/add-to-network.js.map +1 -1
- package/dist/node/server/config.d.ts +11 -15
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +30 -245
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/expressAdapter.d.ts +23 -0
- package/dist/node/server/expressAdapter.d.ts.map +1 -0
- package/dist/node/server/expressAdapter.js +108 -0
- package/dist/node/server/expressAdapter.js.map +1 -0
- package/dist/node/server/nativeIrohStreamIO.d.ts +1 -1
- package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts +16 -0
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts.map +1 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js +39 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js.map +1 -0
- package/dist/node/server/peer/IrohPeerLink.d.ts +1 -1
- package/dist/node/server/peer/IrohPeerLink.d.ts.map +1 -1
- package/dist/node/server/peer/routes.d.ts +10 -44
- package/dist/node/server/peer/routes.d.ts.map +1 -1
- package/dist/node/server/peer/routes.js +33 -275
- package/dist/node/server/peer/routes.js.map +1 -1
- package/dist/node/server/resolveServerPassword.js +1 -1
- package/dist/node/server/resolveServerPassword.js.map +1 -1
- package/dist/node/server/server.js +1 -1
- package/dist/node/server/server.js.map +1 -1
- package/dist/node/server/serverinit.js +1 -1
- package/dist/node/server/serverinit.js.map +1 -1
- package/dist/server/CapabilityMatcher.d.ts +60 -0
- package/dist/server/CapabilityMatcher.d.ts.map +1 -0
- package/dist/server/CapabilityMatcher.js +138 -0
- package/dist/server/CapabilityMatcher.js.map +1 -0
- package/dist/server/DeviceDiscoveryService.d.ts +36 -0
- package/dist/server/DeviceDiscoveryService.d.ts.map +1 -0
- package/dist/server/DeviceDiscoveryService.js +165 -0
- package/dist/server/DeviceDiscoveryService.js.map +1 -0
- package/dist/server/PurgedDocRegistry.d.ts +35 -0
- package/dist/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/server/PurgedDocRegistry.js +90 -0
- package/dist/server/PurgedDocRegistry.js.map +1 -0
- package/dist/server/ServerDataStore.d.ts +67 -0
- package/dist/server/ServerDataStore.d.ts.map +1 -0
- package/dist/server/ServerDataStore.js +88 -0
- package/dist/server/ServerDataStore.js.map +1 -0
- package/dist/server/SyncEventBus.d.ts +39 -0
- package/dist/server/SyncEventBus.d.ts.map +1 -0
- package/dist/server/SyncEventBus.js +41 -0
- package/dist/server/SyncEventBus.js.map +1 -0
- package/dist/server/SystemAdminAuth.d.ts +82 -0
- package/dist/server/SystemAdminAuth.d.ts.map +1 -0
- package/dist/server/SystemAdminAuth.js +228 -0
- package/dist/server/SystemAdminAuth.js.map +1 -0
- package/dist/server/TenantManager.d.ts +330 -0
- package/dist/server/TenantManager.d.ts.map +1 -0
- package/dist/server/TenantManager.js +1186 -0
- package/dist/server/TenantManager.js.map +1 -0
- package/dist/server/http/MindooDBServerCore.d.ts +313 -0
- package/dist/server/http/MindooDBServerCore.d.ts.map +1 -0
- package/dist/server/http/MindooDBServerCore.js +1403 -0
- package/dist/server/http/MindooDBServerCore.js.map +1 -0
- package/dist/server/http/types.d.ts +89 -0
- package/dist/server/http/types.d.ts.map +1 -0
- package/dist/server/http/types.js +29 -0
- package/dist/server/http/types.js.map +1 -0
- package/dist/server/index.d.ts +32 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +76 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/peer/ClusterAuditLog.d.ts +71 -0
- package/dist/server/peer/ClusterAuditLog.d.ts.map +1 -0
- package/dist/server/peer/ClusterAuditLog.js +81 -0
- package/dist/server/peer/ClusterAuditLog.js.map +1 -0
- package/dist/server/peer/ClusterJobRunner.d.ts +43 -0
- package/dist/server/peer/ClusterJobRunner.d.ts.map +1 -0
- package/dist/server/peer/ClusterJobRunner.js +119 -0
- package/dist/server/peer/ClusterJobRunner.js.map +1 -0
- package/dist/server/peer/ClusterManager.d.ts +149 -0
- package/dist/server/peer/ClusterManager.d.ts.map +1 -0
- package/dist/server/peer/ClusterManager.js +292 -0
- package/dist/server/peer/ClusterManager.js.map +1 -0
- package/dist/server/peer/PeerAuthService.d.ts +69 -0
- package/dist/server/peer/PeerAuthService.d.ts.map +1 -0
- package/dist/server/peer/PeerAuthService.js +208 -0
- package/dist/server/peer/PeerAuthService.js.map +1 -0
- package/dist/server/peer/PeerReplicator.d.ts +303 -0
- package/dist/server/peer/PeerReplicator.d.ts.map +1 -0
- package/dist/server/peer/PeerReplicator.js +1071 -0
- package/dist/server/peer/PeerReplicator.js.map +1 -0
- package/dist/server/peer/clusterHttp.d.ts +113 -0
- package/dist/server/peer/clusterHttp.d.ts.map +1 -0
- package/dist/server/peer/clusterHttp.js +290 -0
- package/dist/server/peer/clusterHttp.js.map +1 -0
- package/dist/server/peer/types.d.ts +244 -0
- package/dist/server/peer/types.d.ts.map +1 -0
- package/dist/server/peer/types.js +189 -0
- package/dist/server/peer/types.js.map +1 -0
- package/dist/server/rateLimits.d.ts +119 -0
- package/dist/server/rateLimits.d.ts.map +1 -0
- package/dist/server/rateLimits.js +159 -0
- package/dist/server/rateLimits.js.map +1 -0
- package/dist/server/serverConfig.d.ts +37 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +251 -0
- package/dist/server/serverConfig.js.map +1 -0
- package/dist/server/timestampProxy.d.ts +129 -0
- package/dist/server/timestampProxy.d.ts.map +1 -0
- package/dist/server/timestampProxy.js +361 -0
- package/dist/server/timestampProxy.js.map +1 -0
- package/dist/server/types.d.ts +267 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +56 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/validation.d.ts +43 -0
- package/dist/server/validation.d.ts.map +1 -0
- package/dist/server/validation.js +104 -0
- package/dist/server/validation.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The writable view `getData()` returns inside a `changeDoc()` callback.
|
|
3
|
+
*
|
|
4
|
+
* `Automerge.change()` needs a synchronous callback, while `changeDoc()`
|
|
5
|
+
* callbacks may be async. So the callback edits a shadow copy of the payload,
|
|
6
|
+
* and every edit is also written to an ordered log that `BaseMindooDB` replays
|
|
7
|
+
* inside `Automerge.change()` once the callback is done:
|
|
8
|
+
*
|
|
9
|
+
* - `a.b.c = v` and `delete a.b.c` at any depth become `set` / `delete`.
|
|
10
|
+
* - `push`, `pop`, `shift`, `unshift`, `splice` (and `list[list.length] = v`,
|
|
11
|
+
* shrinking `length`) become list `splice` operations, so concurrent inserts
|
|
12
|
+
* from other devices interleave instead of overwriting each other.
|
|
13
|
+
* - `updateText(path, value)` is replayed as a text splice of the changed
|
|
14
|
+
* middle part, so it merges with concurrent typing like `textSplice`. A plain
|
|
15
|
+
* assignment of a string keeps replacing the whole value: apps write ids and
|
|
16
|
+
* status values as plain strings, and two concurrent replacements must not
|
|
17
|
+
* be merged into a mix of both.
|
|
18
|
+
*
|
|
19
|
+
* The shadow copy is built lazily: a container is copied (shallowly) the first
|
|
20
|
+
* time the callback reaches it, so a callback pays for what it touches, not for
|
|
21
|
+
* the size of the document.
|
|
22
|
+
*
|
|
23
|
+
* Paths are computed when an edit happens, from the edited node up to the
|
|
24
|
+
* root, so an element proxy kept across a `splice` still edits that element.
|
|
25
|
+
*/
|
|
26
|
+
import type { MindooFieldType } from "./types";
|
|
27
|
+
export type DraftPath = Array<string | number>;
|
|
28
|
+
export type DraftOp = {
|
|
29
|
+
kind: "set";
|
|
30
|
+
path: DraftPath;
|
|
31
|
+
value: unknown;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "text";
|
|
34
|
+
path: DraftPath;
|
|
35
|
+
value: string;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "counter";
|
|
38
|
+
path: DraftPath;
|
|
39
|
+
delta: number;
|
|
40
|
+
} | {
|
|
41
|
+
kind: "delete";
|
|
42
|
+
path: DraftPath;
|
|
43
|
+
} | {
|
|
44
|
+
kind: "splice";
|
|
45
|
+
path: DraftPath;
|
|
46
|
+
index: number;
|
|
47
|
+
deleteCount: number;
|
|
48
|
+
items: unknown[];
|
|
49
|
+
};
|
|
50
|
+
export interface ChangeDocDraftHooks {
|
|
51
|
+
/** The kind of a CRDT scalar that reads as a plain value, or null for anything else. */
|
|
52
|
+
scalarKind(value: unknown): "counter" | "atomic" | null;
|
|
53
|
+
/** The plain read value of a CRDT scalar. */
|
|
54
|
+
readScalar(value: unknown): unknown;
|
|
55
|
+
/** A CRDT counter holding `value`, for the shadow copy. */
|
|
56
|
+
makeCounter(value: number): unknown;
|
|
57
|
+
/** Whether the text at `path` of the base document carries marks or blocks. */
|
|
58
|
+
isRichTextInBase(path: DraftPath): boolean;
|
|
59
|
+
/** Throws once the callback has completed. */
|
|
60
|
+
assertActive(operation: string): void;
|
|
61
|
+
}
|
|
62
|
+
export declare class ChangeDocDraft {
|
|
63
|
+
private readonly base;
|
|
64
|
+
private readonly hooks;
|
|
65
|
+
readonly ops: DraftOp[];
|
|
66
|
+
private root;
|
|
67
|
+
private readonly shadowNodes;
|
|
68
|
+
private readonly parents;
|
|
69
|
+
private readonly proxies;
|
|
70
|
+
private readonly proxyNodes;
|
|
71
|
+
/** Where a node copied from the base document sits in the base document. */
|
|
72
|
+
private readonly basePaths;
|
|
73
|
+
/** Keys of a node that this callback assigned, deleted or replaced the text of. */
|
|
74
|
+
private readonly writtenKeys;
|
|
75
|
+
/** Lists whose elements this callback moved (splice, sort, ...). */
|
|
76
|
+
private readonly reorderedLists;
|
|
77
|
+
constructor(base: object, hooks: ChangeDocDraftHooks);
|
|
78
|
+
/** The root proxy; the same object for every `getData()` call of one callback. */
|
|
79
|
+
getRoot<T>(): T;
|
|
80
|
+
/** Sets the text at `path` to `value`, stored as a splice of the changed part. */
|
|
81
|
+
updateText(path: DraftPath, value: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Adds `delta` to the counter at `path`. Logged in call order with the other
|
|
84
|
+
* edits; reads in the rest of the callback see the new value.
|
|
85
|
+
*/
|
|
86
|
+
incrementCounter(path: DraftPath, delta: number): void;
|
|
87
|
+
/**
|
|
88
|
+
* The type of the value at `path` as this callback sees it, including its
|
|
89
|
+
* own edits so far; undefined when nothing is there.
|
|
90
|
+
*/
|
|
91
|
+
getFieldType(path: DraftPath): MindooFieldType | undefined;
|
|
92
|
+
private markWritten;
|
|
93
|
+
private isTypedValue;
|
|
94
|
+
private isContainer;
|
|
95
|
+
/** Copies one level of a base node; CRDT scalars stay as they are so their type is known. */
|
|
96
|
+
private shallowCopy;
|
|
97
|
+
private readValue;
|
|
98
|
+
/** The shadow node held at `node[key]`, copying it from the base on first access. */
|
|
99
|
+
private childNode;
|
|
100
|
+
private proxyFor;
|
|
101
|
+
private get;
|
|
102
|
+
private pathOf;
|
|
103
|
+
/**
|
|
104
|
+
* A plain deep copy of a value the callback assigns; proxies of this draft
|
|
105
|
+
* are unwrapped. CRDT scalars copied out of the document become the plain
|
|
106
|
+
* values a read returns (like assigning what `getData()` gave you); CRDT
|
|
107
|
+
* objects the caller created on purpose are kept for hydration.
|
|
108
|
+
*/
|
|
109
|
+
private cloneIn;
|
|
110
|
+
/** Places a cloned value into the shadow tree, making its containers shadow nodes. */
|
|
111
|
+
private adopt;
|
|
112
|
+
private set;
|
|
113
|
+
private setListProperty;
|
|
114
|
+
private deleteProperty;
|
|
115
|
+
private splice;
|
|
116
|
+
private listMethod;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The type of a non-string value: a plain one, a CRDT scalar, or a `MindooValue`
|
|
120
|
+
* tag that this callback assigned and that is not hydrated yet.
|
|
121
|
+
*/
|
|
122
|
+
export declare function fieldTypeOf(value: unknown, hooks: Pick<ChangeDocDraftHooks, "scalarKind">): MindooFieldType;
|
|
123
|
+
/**
|
|
124
|
+
* The single splice that turns `before` into `after`: the common start and
|
|
125
|
+
* end stay, the middle is replaced. Indices are UTF-16 code units, as in
|
|
126
|
+
* `Automerge.splice`; a surrogate pair is never cut in half.
|
|
127
|
+
*/
|
|
128
|
+
export declare function diffTextSplice(before: string, after: string): {
|
|
129
|
+
index: number;
|
|
130
|
+
deleteCount: number;
|
|
131
|
+
insert: string;
|
|
132
|
+
} | null;
|
|
133
|
+
//# sourceMappingURL=ChangeDocDraft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeDocDraft.d.ts","sourceRoot":"","sources":["../../src/core/ChangeDocDraft.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The writable view `getData()` returns inside a `changeDoc()` callback.
|
|
4
|
+
*
|
|
5
|
+
* `Automerge.change()` needs a synchronous callback, while `changeDoc()`
|
|
6
|
+
* callbacks may be async. So the callback edits a shadow copy of the payload,
|
|
7
|
+
* and every edit is also written to an ordered log that `BaseMindooDB` replays
|
|
8
|
+
* inside `Automerge.change()` once the callback is done:
|
|
9
|
+
*
|
|
10
|
+
* - `a.b.c = v` and `delete a.b.c` at any depth become `set` / `delete`.
|
|
11
|
+
* - `push`, `pop`, `shift`, `unshift`, `splice` (and `list[list.length] = v`,
|
|
12
|
+
* shrinking `length`) become list `splice` operations, so concurrent inserts
|
|
13
|
+
* from other devices interleave instead of overwriting each other.
|
|
14
|
+
* - `updateText(path, value)` is replayed as a text splice of the changed
|
|
15
|
+
* middle part, so it merges with concurrent typing like `textSplice`. A plain
|
|
16
|
+
* assignment of a string keeps replacing the whole value: apps write ids and
|
|
17
|
+
* status values as plain strings, and two concurrent replacements must not
|
|
18
|
+
* be merged into a mix of both.
|
|
19
|
+
*
|
|
20
|
+
* The shadow copy is built lazily: a container is copied (shallowly) the first
|
|
21
|
+
* time the callback reaches it, so a callback pays for what it touches, not for
|
|
22
|
+
* the size of the document.
|
|
23
|
+
*
|
|
24
|
+
* Paths are computed when an edit happens, from the edited node up to the
|
|
25
|
+
* root, so an element proxy kept across a `splice` still edits that element.
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.ChangeDocDraft = void 0;
|
|
29
|
+
exports.fieldTypeOf = fieldTypeOf;
|
|
30
|
+
exports.diffTextSplice = diffTextSplice;
|
|
31
|
+
const MAX_DEPTH = 100;
|
|
32
|
+
const LIST_METHODS = new Set(["push", "pop", "shift", "unshift", "splice", "sort", "reverse", "fill", "copyWithin"]);
|
|
33
|
+
class ChangeDocDraft {
|
|
34
|
+
constructor(base, hooks) {
|
|
35
|
+
this.base = base;
|
|
36
|
+
this.hooks = hooks;
|
|
37
|
+
this.ops = [];
|
|
38
|
+
this.root = null;
|
|
39
|
+
this.shadowNodes = new WeakSet();
|
|
40
|
+
this.parents = new WeakMap();
|
|
41
|
+
this.proxies = new WeakMap();
|
|
42
|
+
this.proxyNodes = new WeakMap();
|
|
43
|
+
/** Where a node copied from the base document sits in the base document. */
|
|
44
|
+
this.basePaths = new WeakMap();
|
|
45
|
+
/** Keys of a node that this callback assigned, deleted or replaced the text of. */
|
|
46
|
+
this.writtenKeys = new WeakMap();
|
|
47
|
+
/** Lists whose elements this callback moved (splice, sort, ...). */
|
|
48
|
+
this.reorderedLists = new WeakSet();
|
|
49
|
+
}
|
|
50
|
+
/** The root proxy; the same object for every `getData()` call of one callback. */
|
|
51
|
+
getRoot() {
|
|
52
|
+
if (!this.root) {
|
|
53
|
+
this.root = this.shallowCopy(this.base);
|
|
54
|
+
this.basePaths.set(this.root, []);
|
|
55
|
+
}
|
|
56
|
+
return this.proxyFor(this.root);
|
|
57
|
+
}
|
|
58
|
+
/** Sets the text at `path` to `value`, stored as a splice of the changed part. */
|
|
59
|
+
updateText(path, value) {
|
|
60
|
+
this.hooks.assertActive("updateText");
|
|
61
|
+
if (typeof value !== "string")
|
|
62
|
+
throw new Error("updateText: value must be a string");
|
|
63
|
+
if (path.length === 0)
|
|
64
|
+
throw new Error("updateText: path must not be empty");
|
|
65
|
+
this.getRoot();
|
|
66
|
+
let node = this.root;
|
|
67
|
+
for (const segment of path.slice(0, -1)) {
|
|
68
|
+
if (!this.isContainer(node[segment])) {
|
|
69
|
+
throw new Error(`updateText: no object or list at '${path.map(String).join(".")}'`);
|
|
70
|
+
}
|
|
71
|
+
node = this.childNode(node, segment);
|
|
72
|
+
}
|
|
73
|
+
const key = path[path.length - 1];
|
|
74
|
+
const current = node[key];
|
|
75
|
+
if (current !== undefined && current !== null && typeof current !== "string") {
|
|
76
|
+
throw new Error(`updateText: the value at '${path.map(String).join(".")}' is not text`);
|
|
77
|
+
}
|
|
78
|
+
if (Array.isArray(node) && !(typeof key === "number" && key < node.length)) {
|
|
79
|
+
throw new Error("updateText: list text must target an existing element");
|
|
80
|
+
}
|
|
81
|
+
this.ops.push({ kind: "text", path: [...path], value });
|
|
82
|
+
node[key] = value;
|
|
83
|
+
this.markWritten(node, key);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Adds `delta` to the counter at `path`. Logged in call order with the other
|
|
87
|
+
* edits; reads in the rest of the callback see the new value.
|
|
88
|
+
*/
|
|
89
|
+
incrementCounter(path, delta) {
|
|
90
|
+
this.hooks.assertActive("incrementCounter");
|
|
91
|
+
this.ops.push({ kind: "counter", path: [...path], delta });
|
|
92
|
+
this.getRoot();
|
|
93
|
+
let node = this.root;
|
|
94
|
+
for (const segment of path.slice(0, -1)) {
|
|
95
|
+
if (!this.isContainer(node[segment]))
|
|
96
|
+
return;
|
|
97
|
+
node = this.childNode(node, segment);
|
|
98
|
+
}
|
|
99
|
+
const key = path[path.length - 1];
|
|
100
|
+
const current = node[key];
|
|
101
|
+
if (this.hooks.scalarKind(current) === "counter") {
|
|
102
|
+
node[key] = this.hooks.makeCounter(this.hooks.readScalar(current) + delta);
|
|
103
|
+
}
|
|
104
|
+
else if (this.isTypedValue(current, "counter")) {
|
|
105
|
+
node[key] = { ...current, value: current.value + delta };
|
|
106
|
+
}
|
|
107
|
+
else if (current === undefined || current === null) {
|
|
108
|
+
node[key] = this.hooks.makeCounter(delta);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The type of the value at `path` as this callback sees it, including its
|
|
113
|
+
* own edits so far; undefined when nothing is there.
|
|
114
|
+
*/
|
|
115
|
+
getFieldType(path) {
|
|
116
|
+
this.getRoot();
|
|
117
|
+
if (path.length === 0)
|
|
118
|
+
return "map";
|
|
119
|
+
let node = this.root;
|
|
120
|
+
for (const segment of path.slice(0, -1)) {
|
|
121
|
+
if (!this.isContainer(node[segment]) || this.isTypedValue(node[segment]))
|
|
122
|
+
return undefined;
|
|
123
|
+
node = this.childNode(node, segment);
|
|
124
|
+
}
|
|
125
|
+
const key = path[path.length - 1];
|
|
126
|
+
if (!Object.prototype.hasOwnProperty.call(node, key))
|
|
127
|
+
return undefined;
|
|
128
|
+
const value = node[key];
|
|
129
|
+
if (typeof value === "string") {
|
|
130
|
+
const basePath = this.basePaths.get(node);
|
|
131
|
+
const unchanged = basePath !== undefined &&
|
|
132
|
+
!this.writtenKeys.get(node)?.has(key) &&
|
|
133
|
+
!(Array.isArray(node) && this.reorderedLists.has(node));
|
|
134
|
+
return unchanged && this.hooks.isRichTextInBase([...basePath, key]) ? "richText" : "text";
|
|
135
|
+
}
|
|
136
|
+
return fieldTypeOf(value, this.hooks);
|
|
137
|
+
}
|
|
138
|
+
markWritten(node, key) {
|
|
139
|
+
let keys = this.writtenKeys.get(node);
|
|
140
|
+
if (!keys)
|
|
141
|
+
this.writtenKeys.set(node, (keys = new Set()));
|
|
142
|
+
keys.add(key);
|
|
143
|
+
}
|
|
144
|
+
isTypedValue(value, kind) {
|
|
145
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
146
|
+
return false;
|
|
147
|
+
const tag = value.$mindoo;
|
|
148
|
+
return typeof tag === "string" && (kind === undefined || tag === kind);
|
|
149
|
+
}
|
|
150
|
+
// ---- reading -------------------------------------------------------------
|
|
151
|
+
isContainer(value) {
|
|
152
|
+
return (value !== null &&
|
|
153
|
+
typeof value === "object" &&
|
|
154
|
+
!(value instanceof Date) &&
|
|
155
|
+
!(value instanceof Uint8Array) &&
|
|
156
|
+
this.hooks.scalarKind(value) === null);
|
|
157
|
+
}
|
|
158
|
+
/** Copies one level of a base node; CRDT scalars stay as they are so their type is known. */
|
|
159
|
+
shallowCopy(base) {
|
|
160
|
+
const copy = Array.isArray(base)
|
|
161
|
+
? Array.from(base)
|
|
162
|
+
: Object.fromEntries(Object.keys(base).map((key) => [key, base[key]]));
|
|
163
|
+
this.shadowNodes.add(copy);
|
|
164
|
+
return copy;
|
|
165
|
+
}
|
|
166
|
+
readValue(value) {
|
|
167
|
+
return this.hooks.scalarKind(value) !== null ? this.hooks.readScalar(value) : value;
|
|
168
|
+
}
|
|
169
|
+
/** The shadow node held at `node[key]`, copying it from the base on first access. */
|
|
170
|
+
childNode(node, key) {
|
|
171
|
+
const value = node[key];
|
|
172
|
+
if (this.shadowNodes.has(value))
|
|
173
|
+
return value;
|
|
174
|
+
const copy = this.shallowCopy(value);
|
|
175
|
+
node[key] = copy;
|
|
176
|
+
this.parents.set(copy, { parent: node, key });
|
|
177
|
+
// Map keys stay put; list indices only while the list keeps its order.
|
|
178
|
+
const parentBase = this.basePaths.get(node);
|
|
179
|
+
if (parentBase && !(Array.isArray(node) && this.reorderedLists.has(node))) {
|
|
180
|
+
this.basePaths.set(copy, [...parentBase, key]);
|
|
181
|
+
}
|
|
182
|
+
return copy;
|
|
183
|
+
}
|
|
184
|
+
proxyFor(node) {
|
|
185
|
+
const cached = this.proxies.get(node);
|
|
186
|
+
if (cached)
|
|
187
|
+
return cached;
|
|
188
|
+
const proxy = new Proxy(node, {
|
|
189
|
+
get: (target, prop, receiver) => this.get(target, prop, receiver),
|
|
190
|
+
set: (target, prop, value) => {
|
|
191
|
+
this.set(target, prop, value);
|
|
192
|
+
return true;
|
|
193
|
+
},
|
|
194
|
+
deleteProperty: (target, prop) => {
|
|
195
|
+
this.deleteProperty(target, prop);
|
|
196
|
+
return true;
|
|
197
|
+
},
|
|
198
|
+
defineProperty: (target, prop, descriptor) => {
|
|
199
|
+
if (!("value" in descriptor)) {
|
|
200
|
+
throw new Error("changeDoc: only plain values can be assigned to document fields");
|
|
201
|
+
}
|
|
202
|
+
this.set(target, prop, descriptor.value);
|
|
203
|
+
return true;
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
this.proxies.set(node, proxy);
|
|
207
|
+
this.proxyNodes.set(proxy, node);
|
|
208
|
+
return proxy;
|
|
209
|
+
}
|
|
210
|
+
get(node, prop, receiver) {
|
|
211
|
+
if (typeof prop === "symbol")
|
|
212
|
+
return Reflect.get(node, prop, receiver);
|
|
213
|
+
if (Array.isArray(node) && LIST_METHODS.has(prop)) {
|
|
214
|
+
return (...args) => this.listMethod(node, prop, args);
|
|
215
|
+
}
|
|
216
|
+
if (!Object.prototype.hasOwnProperty.call(node, prop)) {
|
|
217
|
+
return Reflect.get(node, prop, receiver);
|
|
218
|
+
}
|
|
219
|
+
const key = Array.isArray(node) ? Number(prop) : prop;
|
|
220
|
+
const value = node[prop];
|
|
221
|
+
if (this.isContainer(value))
|
|
222
|
+
return this.proxyFor(this.childNode(node, key));
|
|
223
|
+
return this.readValue(value);
|
|
224
|
+
}
|
|
225
|
+
// ---- writing -------------------------------------------------------------
|
|
226
|
+
pathOf(node) {
|
|
227
|
+
const path = [];
|
|
228
|
+
let current = node;
|
|
229
|
+
while (current !== this.root) {
|
|
230
|
+
const link = this.parents.get(current);
|
|
231
|
+
if (!link) {
|
|
232
|
+
throw new Error("changeDoc: this object is no longer part of the document");
|
|
233
|
+
}
|
|
234
|
+
if (Array.isArray(link.parent)) {
|
|
235
|
+
const index = link.parent.indexOf(current);
|
|
236
|
+
if (index < 0)
|
|
237
|
+
throw new Error("changeDoc: this list element is no longer part of the document");
|
|
238
|
+
path.unshift(index);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
if (link.parent[link.key] !== current) {
|
|
242
|
+
throw new Error("changeDoc: this object is no longer part of the document");
|
|
243
|
+
}
|
|
244
|
+
path.unshift(link.key);
|
|
245
|
+
}
|
|
246
|
+
current = link.parent;
|
|
247
|
+
}
|
|
248
|
+
return path;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* A plain deep copy of a value the callback assigns; proxies of this draft
|
|
252
|
+
* are unwrapped. CRDT scalars copied out of the document become the plain
|
|
253
|
+
* values a read returns (like assigning what `getData()` gave you); CRDT
|
|
254
|
+
* objects the caller created on purpose are kept for hydration.
|
|
255
|
+
*/
|
|
256
|
+
cloneIn(value, depth = 0, fromDraft = false) {
|
|
257
|
+
if (depth > MAX_DEPTH)
|
|
258
|
+
throw new Error("Document value is nested too deeply");
|
|
259
|
+
if (value === null || typeof value !== "object")
|
|
260
|
+
return value;
|
|
261
|
+
const node = this.proxyNodes.get(value);
|
|
262
|
+
if (node)
|
|
263
|
+
value = node;
|
|
264
|
+
if (node || this.shadowNodes.has(value))
|
|
265
|
+
fromDraft = true;
|
|
266
|
+
if (value instanceof Date)
|
|
267
|
+
return new Date(value.getTime());
|
|
268
|
+
if (value instanceof Uint8Array)
|
|
269
|
+
return value.slice();
|
|
270
|
+
if (this.hooks.scalarKind(value) !== null)
|
|
271
|
+
return fromDraft ? this.hooks.readScalar(value) : value;
|
|
272
|
+
if (Array.isArray(value))
|
|
273
|
+
return Array.from(value, (entry) => this.cloneIn(entry, depth + 1, fromDraft));
|
|
274
|
+
const result = {};
|
|
275
|
+
for (const key of Object.keys(value)) {
|
|
276
|
+
const entry = value[key];
|
|
277
|
+
if (entry !== undefined)
|
|
278
|
+
result[key] = this.cloneIn(entry, depth + 1, fromDraft);
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
/** Places a cloned value into the shadow tree, making its containers shadow nodes. */
|
|
283
|
+
adopt(parent, key, value) {
|
|
284
|
+
if (!this.isContainer(value))
|
|
285
|
+
return value;
|
|
286
|
+
const node = value;
|
|
287
|
+
this.shadowNodes.add(node);
|
|
288
|
+
this.parents.set(node, { parent, key });
|
|
289
|
+
const entries = Array.isArray(node)
|
|
290
|
+
? node.map((entry, index) => [index, entry])
|
|
291
|
+
: Object.entries(node);
|
|
292
|
+
for (const [childKey, child] of entries)
|
|
293
|
+
this.adopt(node, childKey, child);
|
|
294
|
+
return node;
|
|
295
|
+
}
|
|
296
|
+
set(node, prop, value) {
|
|
297
|
+
this.hooks.assertActive("set property");
|
|
298
|
+
if (typeof prop === "symbol")
|
|
299
|
+
return;
|
|
300
|
+
if (Array.isArray(node)) {
|
|
301
|
+
this.setListProperty(node, prop, value);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const path = [...this.pathOf(node), prop];
|
|
305
|
+
const clone = this.cloneIn(value);
|
|
306
|
+
this.ops.push({ kind: "set", path, value: clone });
|
|
307
|
+
node[prop] = this.adopt(node, prop, this.cloneIn(clone));
|
|
308
|
+
this.markWritten(node, prop);
|
|
309
|
+
}
|
|
310
|
+
setListProperty(list, prop, value) {
|
|
311
|
+
if (prop === "length") {
|
|
312
|
+
const length = Number(value);
|
|
313
|
+
if (!Number.isInteger(length) || length > list.length || length < 0) {
|
|
314
|
+
throw new Error("changeDoc: a list can only be shortened through its length");
|
|
315
|
+
}
|
|
316
|
+
if (length < list.length)
|
|
317
|
+
this.splice(list, length, list.length - length, []);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
const index = Number(prop);
|
|
321
|
+
if (!Number.isInteger(index) || index < 0 || String(index) !== prop) {
|
|
322
|
+
throw new Error(`changeDoc: lists cannot hold the named property '${prop}'`);
|
|
323
|
+
}
|
|
324
|
+
if (index === list.length) {
|
|
325
|
+
this.splice(list, index, 0, [value]);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (index > list.length) {
|
|
329
|
+
throw new Error(`changeDoc: cannot assign list index ${index} past the end (length ${list.length})`);
|
|
330
|
+
}
|
|
331
|
+
const path = [...this.pathOf(list), index];
|
|
332
|
+
const clone = this.cloneIn(value);
|
|
333
|
+
this.ops.push({ kind: "set", path, value: clone });
|
|
334
|
+
list[index] = this.adopt(list, index, this.cloneIn(clone));
|
|
335
|
+
this.markWritten(list, index);
|
|
336
|
+
}
|
|
337
|
+
deleteProperty(node, prop) {
|
|
338
|
+
this.hooks.assertActive("delete property");
|
|
339
|
+
if (typeof prop === "symbol")
|
|
340
|
+
return;
|
|
341
|
+
if (Array.isArray(node)) {
|
|
342
|
+
throw new Error("changeDoc: use splice() to remove list elements");
|
|
343
|
+
}
|
|
344
|
+
if (!Object.prototype.hasOwnProperty.call(node, prop))
|
|
345
|
+
return;
|
|
346
|
+
const path = [...this.pathOf(node), prop];
|
|
347
|
+
this.ops.push({ kind: "delete", path });
|
|
348
|
+
delete node[prop];
|
|
349
|
+
this.markWritten(node, prop);
|
|
350
|
+
}
|
|
351
|
+
splice(list, index, deleteCount, items) {
|
|
352
|
+
this.hooks.assertActive("splice list");
|
|
353
|
+
const clones = items.map((item) => this.cloneIn(item));
|
|
354
|
+
const path = this.pathOf(list);
|
|
355
|
+
if (deleteCount > 0 || clones.length > 0) {
|
|
356
|
+
this.ops.push({ kind: "splice", path, index, deleteCount, items: clones });
|
|
357
|
+
}
|
|
358
|
+
const placed = clones.map((clone) => this.cloneIn(clone));
|
|
359
|
+
const removed = list.splice(index, deleteCount, ...placed);
|
|
360
|
+
placed.forEach((item, offset) => this.adopt(list, index + offset, item));
|
|
361
|
+
this.reorderedLists.add(list);
|
|
362
|
+
return removed.map((entry) => this.cloneIn(entry, 0, true));
|
|
363
|
+
}
|
|
364
|
+
listMethod(list, method, args) {
|
|
365
|
+
const relative = (value, fallback) => {
|
|
366
|
+
if (value === undefined)
|
|
367
|
+
return fallback;
|
|
368
|
+
const n = Math.trunc(Number(value)) || 0;
|
|
369
|
+
return n < 0 ? Math.max(list.length + n, 0) : Math.min(n, list.length);
|
|
370
|
+
};
|
|
371
|
+
switch (method) {
|
|
372
|
+
case "push":
|
|
373
|
+
this.splice(list, list.length, 0, args);
|
|
374
|
+
return list.length;
|
|
375
|
+
case "unshift":
|
|
376
|
+
this.splice(list, 0, 0, args);
|
|
377
|
+
return list.length;
|
|
378
|
+
case "pop":
|
|
379
|
+
return list.length === 0 ? undefined : this.splice(list, list.length - 1, 1, [])[0];
|
|
380
|
+
case "shift":
|
|
381
|
+
return list.length === 0 ? undefined : this.splice(list, 0, 1, [])[0];
|
|
382
|
+
case "splice": {
|
|
383
|
+
const start = relative(args[0], 0);
|
|
384
|
+
const deleteCount = args.length < 2
|
|
385
|
+
? list.length - start
|
|
386
|
+
: Math.max(0, Math.min(Math.trunc(Number(args[1])) || 0, list.length - start));
|
|
387
|
+
return this.splice(list, start, args.length === 0 ? 0 : deleteCount, args.slice(2));
|
|
388
|
+
}
|
|
389
|
+
default: {
|
|
390
|
+
// sort, reverse, fill, copyWithin: reorder or overwrite in place, then
|
|
391
|
+
// record every slot that now holds something else.
|
|
392
|
+
this.hooks.assertActive(method);
|
|
393
|
+
list.forEach((entry, index) => {
|
|
394
|
+
if (this.isContainer(entry))
|
|
395
|
+
this.childNode(list, index);
|
|
396
|
+
});
|
|
397
|
+
const before = list.slice();
|
|
398
|
+
if (method === "fill") {
|
|
399
|
+
const value = this.cloneIn(args[0]);
|
|
400
|
+
const start = relative(args[1], 0);
|
|
401
|
+
const end = relative(args[2], list.length);
|
|
402
|
+
for (let index = start; index < end; index++)
|
|
403
|
+
list[index] = this.cloneIn(value);
|
|
404
|
+
}
|
|
405
|
+
else if (method === "sort") {
|
|
406
|
+
const compare = args[0];
|
|
407
|
+
const read = (entry) => (this.isContainer(entry) ? this.proxyFor(entry) : this.readValue(entry));
|
|
408
|
+
list.sort(compare ? (a, b) => compare(read(a), read(b)) : undefined);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
Array.prototype[method].apply(list, args);
|
|
412
|
+
}
|
|
413
|
+
this.reorderedLists.add(list);
|
|
414
|
+
const path = this.pathOf(list);
|
|
415
|
+
const seen = new Set();
|
|
416
|
+
list.forEach((entry, index) => {
|
|
417
|
+
// copyWithin can leave one node in two slots; each slot gets its own.
|
|
418
|
+
if (this.isContainer(entry) && seen.has(entry))
|
|
419
|
+
entry = list[index] = this.cloneIn(entry);
|
|
420
|
+
seen.add(entry);
|
|
421
|
+
if (entry === before[index])
|
|
422
|
+
return;
|
|
423
|
+
this.ops.push({ kind: "set", path: [...path, index], value: this.cloneIn(entry) });
|
|
424
|
+
this.adopt(list, index, entry);
|
|
425
|
+
});
|
|
426
|
+
return this.proxyFor(list);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
exports.ChangeDocDraft = ChangeDocDraft;
|
|
432
|
+
/**
|
|
433
|
+
* The type of a non-string value: a plain one, a CRDT scalar, or a `MindooValue`
|
|
434
|
+
* tag that this callback assigned and that is not hydrated yet.
|
|
435
|
+
*/
|
|
436
|
+
function fieldTypeOf(value, hooks) {
|
|
437
|
+
if (value === null || value === undefined)
|
|
438
|
+
return "null";
|
|
439
|
+
if (typeof value === "string")
|
|
440
|
+
return "text";
|
|
441
|
+
if (typeof value === "number" || typeof value === "bigint")
|
|
442
|
+
return "number";
|
|
443
|
+
if (typeof value === "boolean")
|
|
444
|
+
return "boolean";
|
|
445
|
+
if (value instanceof Date)
|
|
446
|
+
return "timestamp";
|
|
447
|
+
if (value instanceof Uint8Array)
|
|
448
|
+
return "bytes";
|
|
449
|
+
const kind = hooks.scalarKind(value);
|
|
450
|
+
if (kind)
|
|
451
|
+
return kind;
|
|
452
|
+
if (Array.isArray(value))
|
|
453
|
+
return "list";
|
|
454
|
+
const tag = value.$mindoo;
|
|
455
|
+
if (tag === "atomic" || tag === "counter" || tag === "timestamp")
|
|
456
|
+
return tag;
|
|
457
|
+
return "map";
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* The single splice that turns `before` into `after`: the common start and
|
|
461
|
+
* end stay, the middle is replaced. Indices are UTF-16 code units, as in
|
|
462
|
+
* `Automerge.splice`; a surrogate pair is never cut in half.
|
|
463
|
+
*/
|
|
464
|
+
function diffTextSplice(before, after) {
|
|
465
|
+
if (before === after)
|
|
466
|
+
return null;
|
|
467
|
+
const max = Math.min(before.length, after.length);
|
|
468
|
+
let start = 0;
|
|
469
|
+
while (start < max && before.charCodeAt(start) === after.charCodeAt(start))
|
|
470
|
+
start++;
|
|
471
|
+
if (start > 0 && isHighSurrogate(before.charCodeAt(start - 1)))
|
|
472
|
+
start--;
|
|
473
|
+
let end = 0;
|
|
474
|
+
while (end < max - start &&
|
|
475
|
+
before.charCodeAt(before.length - 1 - end) === after.charCodeAt(after.length - 1 - end)) {
|
|
476
|
+
end++;
|
|
477
|
+
}
|
|
478
|
+
if (end > 0 && isLowSurrogate(before.charCodeAt(before.length - end)))
|
|
479
|
+
end--;
|
|
480
|
+
return {
|
|
481
|
+
index: start,
|
|
482
|
+
deleteCount: before.length - start - end,
|
|
483
|
+
insert: after.slice(start, after.length - end),
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
function isHighSurrogate(code) {
|
|
487
|
+
return code >= 0xd800 && code <= 0xdbff;
|
|
488
|
+
}
|
|
489
|
+
function isLowSurrogate(code) {
|
|
490
|
+
return code >= 0xdc00 && code <= 0xdfff;
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=ChangeDocDraft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeDocDraft.js","sourceRoot":"","sources":["../../src/core/ChangeDocDraft.ts"],"names":[],"mappings":"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"}
|