loro-crdt 0.13.1 â 0.14.1
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/CHANGELOG.md +48 -0
- package/dist/loro.d.ts +193 -26
- package/dist/loro.js +0 -28
- package/dist/loro.js.map +1 -1
- package/dist/loro.mjs +0 -29
- package/dist/loro.mjs.map +1 -1
- package/dist/src/index.js +106 -0
- package/dist/tests/basic.test.js +415 -0
- package/dist/tests/checkout.test.js +76 -0
- package/dist/tests/event.test.js +345 -0
- package/dist/tests/issue.test.js +59 -0
- package/dist/tests/misc.test.js +245 -0
- package/dist/tests/richtext.test.js +197 -0
- package/dist/tests/type.test.js +22 -0
- package/dist/tests/version.test.js +185 -0
- package/dist/vite.config.js +14 -0
- package/package.json +3 -3
- package/src/index.ts +202 -65
- package/tsconfig.json +2 -2
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const src_1 = require("../src");
|
|
5
|
+
(0, vitest_1.describe)("richtext", () => {
|
|
6
|
+
(0, vitest_1.it)("mark", () => {
|
|
7
|
+
const doc = new src_1.Loro();
|
|
8
|
+
doc.configTextStyle({
|
|
9
|
+
bold: { expand: "after" },
|
|
10
|
+
link: { expand: "before" },
|
|
11
|
+
});
|
|
12
|
+
const text = doc.getText("text");
|
|
13
|
+
text.insert(0, "Hello World!");
|
|
14
|
+
text.mark({ start: 0, end: 5 }, "bold", true);
|
|
15
|
+
(0, vitest_1.expect)(text.toDelta()).toStrictEqual([
|
|
16
|
+
{
|
|
17
|
+
insert: "Hello",
|
|
18
|
+
attributes: {
|
|
19
|
+
bold: true,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
insert: " World!",
|
|
24
|
+
},
|
|
25
|
+
]);
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)("insert after emoji", () => {
|
|
28
|
+
const doc = new src_1.Loro();
|
|
29
|
+
const text = doc.getText("text");
|
|
30
|
+
text.insert(0, "ðĻâðĐâðĶ");
|
|
31
|
+
text.insert(8, "a");
|
|
32
|
+
(0, vitest_1.expect)(text.toString()).toBe("ðĻâðĐâðĶa");
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)("emit event correctly", async () => {
|
|
35
|
+
const doc = new src_1.Loro();
|
|
36
|
+
const text = doc.getText("text");
|
|
37
|
+
let triggered = false;
|
|
38
|
+
text.subscribe(doc, (e) => {
|
|
39
|
+
for (const event of e.events) {
|
|
40
|
+
if (event.diff.type == "text") {
|
|
41
|
+
(0, vitest_1.expect)(event.diff.diff).toStrictEqual([
|
|
42
|
+
{
|
|
43
|
+
insert: "Hello",
|
|
44
|
+
attributes: {
|
|
45
|
+
bold: true,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
insert: " World!",
|
|
50
|
+
},
|
|
51
|
+
]);
|
|
52
|
+
triggered = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
text.insert(0, "Hello World!");
|
|
57
|
+
text.mark({ start: 0, end: 5 }, "bold", true);
|
|
58
|
+
doc.commit();
|
|
59
|
+
await new Promise((r) => setTimeout(r, 1));
|
|
60
|
+
(0, vitest_1.expect)(triggered).toBeTruthy();
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)("emit event from merging doc correctly", async () => {
|
|
63
|
+
const doc = new src_1.Loro();
|
|
64
|
+
const text = doc.getText("text");
|
|
65
|
+
let called = false;
|
|
66
|
+
text.subscribe(doc, (event) => {
|
|
67
|
+
if (event.events[0].diff.type == "text") {
|
|
68
|
+
called = true;
|
|
69
|
+
(0, vitest_1.expect)(event.events[0].diff.diff).toStrictEqual([
|
|
70
|
+
{
|
|
71
|
+
insert: "Hello",
|
|
72
|
+
attributes: {
|
|
73
|
+
bold: true,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
insert: " World!",
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
const docB = new src_1.Loro();
|
|
83
|
+
const textB = docB.getText("text");
|
|
84
|
+
textB.insert(0, "Hello World!");
|
|
85
|
+
textB.mark({ start: 0, end: 5 }, "bold", true);
|
|
86
|
+
doc.import(docB.exportFrom());
|
|
87
|
+
await new Promise((r) => setTimeout(r, 1));
|
|
88
|
+
(0, vitest_1.expect)(called).toBeTruthy();
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)("Delete emoji", async () => {
|
|
91
|
+
const doc = new src_1.Loro();
|
|
92
|
+
const text = doc.getText("text");
|
|
93
|
+
text.insert(0, "012345ðĻâðĐâðĶ6789");
|
|
94
|
+
doc.commit();
|
|
95
|
+
text.mark({ start: 0, end: 18 }, "bold", true);
|
|
96
|
+
doc.commit();
|
|
97
|
+
(0, vitest_1.expect)(text.toDelta()).toStrictEqual([
|
|
98
|
+
{
|
|
99
|
+
insert: "012345ðĻâðĐâðĶ6789",
|
|
100
|
+
attributes: { bold: true },
|
|
101
|
+
},
|
|
102
|
+
]);
|
|
103
|
+
text.delete(6, 8);
|
|
104
|
+
doc.commit();
|
|
105
|
+
(0, vitest_1.expect)(text.toDelta()).toStrictEqual([
|
|
106
|
+
{
|
|
107
|
+
insert: "0123456789",
|
|
108
|
+
attributes: { bold: true },
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)("apply delta", async () => {
|
|
113
|
+
const doc1 = new src_1.Loro();
|
|
114
|
+
doc1.configTextStyle({
|
|
115
|
+
link: { expand: "none" },
|
|
116
|
+
bold: { expand: "after" },
|
|
117
|
+
});
|
|
118
|
+
const text1 = doc1.getText("text");
|
|
119
|
+
const doc2 = new src_1.Loro();
|
|
120
|
+
doc2.configTextStyle({
|
|
121
|
+
link: { expand: "none" },
|
|
122
|
+
bold: { expand: "after" },
|
|
123
|
+
});
|
|
124
|
+
const text2 = doc2.getText("text");
|
|
125
|
+
text1.subscribe(doc1, (event) => {
|
|
126
|
+
for (const containerDiff of event.events) {
|
|
127
|
+
const e = containerDiff.diff;
|
|
128
|
+
text2.applyDelta(e.diff);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
text1.insert(0, "foo");
|
|
132
|
+
text1.mark({ start: 0, end: 3 }, "link", true);
|
|
133
|
+
doc1.commit();
|
|
134
|
+
await new Promise((r) => setTimeout(r, 1));
|
|
135
|
+
(0, vitest_1.expect)(text2.toDelta()).toStrictEqual(text1.toDelta());
|
|
136
|
+
text1.insert(3, "baz");
|
|
137
|
+
doc1.commit();
|
|
138
|
+
await new Promise((r) => setTimeout(r, 1));
|
|
139
|
+
(0, vitest_1.expect)(text2.toDelta()).toStrictEqual([
|
|
140
|
+
{ insert: "foo", attributes: { link: true } },
|
|
141
|
+
{ insert: "baz" },
|
|
142
|
+
]);
|
|
143
|
+
(0, vitest_1.expect)(text2.toDelta()).toStrictEqual(text1.toDelta());
|
|
144
|
+
text1.mark({ start: 2, end: 5 }, "bold", true);
|
|
145
|
+
doc1.commit();
|
|
146
|
+
await new Promise((r) => setTimeout(r, 1));
|
|
147
|
+
(0, vitest_1.expect)(text2.toDelta()).toStrictEqual(text1.toDelta());
|
|
148
|
+
});
|
|
149
|
+
(0, vitest_1.it)("custom richtext type", async () => {
|
|
150
|
+
const doc = new src_1.Loro();
|
|
151
|
+
doc.configTextStyle({
|
|
152
|
+
myStyle: {
|
|
153
|
+
expand: "none",
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const text = doc.getText("text");
|
|
157
|
+
text.insert(0, "foo");
|
|
158
|
+
text.mark({ start: 0, end: 3 }, "myStyle", 123);
|
|
159
|
+
(0, vitest_1.expect)(text.toDelta()).toStrictEqual([
|
|
160
|
+
{ insert: "foo", attributes: { myStyle: 123 } },
|
|
161
|
+
]);
|
|
162
|
+
(0, vitest_1.expect)(() => {
|
|
163
|
+
text.mark({ start: 0, end: 3 }, "unknownStyle", 2);
|
|
164
|
+
}).toThrowError();
|
|
165
|
+
(0, vitest_1.expect)(() => {
|
|
166
|
+
// default style config should be overwritten
|
|
167
|
+
text.mark({ start: 0, end: 3 }, "bold", 2);
|
|
168
|
+
}).toThrowError();
|
|
169
|
+
});
|
|
170
|
+
(0, vitest_1.it)("allow overlapped styles", () => {
|
|
171
|
+
const doc = new src_1.Loro();
|
|
172
|
+
doc.configTextStyle({
|
|
173
|
+
comment: { expand: "none" },
|
|
174
|
+
});
|
|
175
|
+
const text = doc.getText("text");
|
|
176
|
+
text.insert(0, "The fox jumped.");
|
|
177
|
+
text.mark({ start: 0, end: 7 }, "comment:alice", "Hi");
|
|
178
|
+
text.mark({ start: 4, end: 14 }, "comment:bob", "Jump");
|
|
179
|
+
(0, vitest_1.expect)(text.toDelta()).toStrictEqual([
|
|
180
|
+
{
|
|
181
|
+
insert: "The ",
|
|
182
|
+
attributes: { "comment:alice": "Hi" },
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
insert: "fox",
|
|
186
|
+
attributes: { "comment:alice": "Hi", "comment:bob": "Jump" },
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
insert: " jumped",
|
|
190
|
+
attributes: { "comment:bob": "Jump" },
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
insert: ".",
|
|
194
|
+
},
|
|
195
|
+
]);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const src_1 = require("../src");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
(0, vitest_1.test)("Container should not match Value", () => {
|
|
6
|
+
const list = new src_1.LoroList();
|
|
7
|
+
(0, vitest_1.expectTypeOf)(list).not.toMatchTypeOf();
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.test)("A non-numeric string is not a valid peer id", () => {
|
|
10
|
+
(0, vitest_1.expectTypeOf)("123").toMatchTypeOf();
|
|
11
|
+
(0, vitest_1.expectTypeOf)("a123").not.toMatchTypeOf();
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.test)("Expect container type", () => {
|
|
14
|
+
const list = new src_1.LoroList();
|
|
15
|
+
(0, vitest_1.expectTypeOf)(list.kind()).toMatchTypeOf();
|
|
16
|
+
const map = new src_1.LoroMap();
|
|
17
|
+
(0, vitest_1.expectTypeOf)(map.kind()).toMatchTypeOf();
|
|
18
|
+
const text = new src_1.LoroText();
|
|
19
|
+
(0, vitest_1.expectTypeOf)(text.kind()).toMatchTypeOf();
|
|
20
|
+
const tree = new src_1.LoroTree();
|
|
21
|
+
(0, vitest_1.expectTypeOf)(tree.kind()).toMatchTypeOf();
|
|
22
|
+
});
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const src_1 = require("../src");
|
|
5
|
+
(0, vitest_1.describe)("Frontiers", () => {
|
|
6
|
+
(0, vitest_1.it)("two clients", () => {
|
|
7
|
+
const doc = new src_1.Loro();
|
|
8
|
+
doc.setPeerId(0);
|
|
9
|
+
const text = doc.getText("text");
|
|
10
|
+
text.insert(0, "0");
|
|
11
|
+
doc.commit();
|
|
12
|
+
const v0 = doc.frontiers();
|
|
13
|
+
const docB = new src_1.Loro();
|
|
14
|
+
docB.setPeerId(1);
|
|
15
|
+
docB.import(doc.exportFrom());
|
|
16
|
+
(0, vitest_1.expect)(docB.cmpWithFrontiers(v0)).toBe(0);
|
|
17
|
+
text.insert(1, "0");
|
|
18
|
+
doc.commit();
|
|
19
|
+
(0, vitest_1.expect)(docB.cmpWithFrontiers(doc.frontiers())).toBe(-1);
|
|
20
|
+
const textB = docB.getText("text");
|
|
21
|
+
textB.insert(0, "0");
|
|
22
|
+
docB.commit();
|
|
23
|
+
(0, vitest_1.expect)(docB.cmpWithFrontiers(doc.frontiers())).toBe(-1);
|
|
24
|
+
docB.import(doc.exportFrom());
|
|
25
|
+
(0, vitest_1.expect)(docB.cmpWithFrontiers(doc.frontiers())).toBe(1);
|
|
26
|
+
doc.import(docB.exportFrom());
|
|
27
|
+
(0, vitest_1.expect)(docB.cmpWithFrontiers(doc.frontiers())).toBe(0);
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)("cmp frontiers", () => {
|
|
30
|
+
const doc1 = new src_1.Loro();
|
|
31
|
+
doc1.setPeerId(1);
|
|
32
|
+
const doc2 = new src_1.Loro();
|
|
33
|
+
doc2.setPeerId(2n);
|
|
34
|
+
doc1.getText("text").insert(0, "01234");
|
|
35
|
+
doc2.import(doc1.exportFrom());
|
|
36
|
+
doc2.getText("text").insert(0, "56789");
|
|
37
|
+
doc1.import(doc2.exportFrom());
|
|
38
|
+
doc1.getText("text").insert(0, "01234");
|
|
39
|
+
doc1.commit();
|
|
40
|
+
(0, vitest_1.expect)(() => {
|
|
41
|
+
doc1.cmpFrontiers([{ peer: "1", counter: 1 }], [
|
|
42
|
+
{
|
|
43
|
+
peer: "2",
|
|
44
|
+
counter: 10,
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
47
|
+
}).toThrow();
|
|
48
|
+
(0, vitest_1.expect)(doc1.cmpFrontiers([], [{ peer: "1", counter: 1 }])).toBe(-1);
|
|
49
|
+
(0, vitest_1.expect)(doc1.cmpFrontiers([], [])).toBe(0);
|
|
50
|
+
(0, vitest_1.expect)(doc1.cmpFrontiers([{ peer: "1", counter: 4 }], [
|
|
51
|
+
{
|
|
52
|
+
peer: "2",
|
|
53
|
+
counter: 3,
|
|
54
|
+
},
|
|
55
|
+
])).toBe(-1);
|
|
56
|
+
(0, vitest_1.expect)(doc1.cmpFrontiers([{ peer: "1", counter: 5 }], [
|
|
57
|
+
{
|
|
58
|
+
peer: "2",
|
|
59
|
+
counter: 3,
|
|
60
|
+
},
|
|
61
|
+
])).toBe(1);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)("peer id repr should be consistent", () => {
|
|
65
|
+
const doc = new src_1.Loro();
|
|
66
|
+
const id = doc.peerIdStr;
|
|
67
|
+
doc.getText("text").insert(0, "hello");
|
|
68
|
+
doc.commit();
|
|
69
|
+
const f = doc.frontiers();
|
|
70
|
+
(0, vitest_1.expect)(f[0].peer).toBe(id);
|
|
71
|
+
const child = new src_1.LoroMap();
|
|
72
|
+
const map = doc.getList("list").insertContainer(0, child);
|
|
73
|
+
const mapId = map.id;
|
|
74
|
+
const peerIdInContainerId = mapId.split(":")[1].split("@")[1];
|
|
75
|
+
(0, vitest_1.expect)(peerIdInContainerId).toBe(id);
|
|
76
|
+
doc.commit();
|
|
77
|
+
(0, vitest_1.expect)(doc.version().get(id)).toBe(6);
|
|
78
|
+
(0, vitest_1.expect)(doc.version().toJSON().get(id)).toBe(6);
|
|
79
|
+
const m = doc.getMap(mapId);
|
|
80
|
+
m.set("0", 1);
|
|
81
|
+
(0, vitest_1.expect)(map.get("0")).toBe(1);
|
|
82
|
+
});
|
|
83
|
+
(0, vitest_1.describe)("Version", () => {
|
|
84
|
+
const a = new src_1.Loro();
|
|
85
|
+
a.setPeerId(0n);
|
|
86
|
+
const b = new src_1.Loro();
|
|
87
|
+
b.setPeerId(1n);
|
|
88
|
+
a.getText("text").insert(0, "ha");
|
|
89
|
+
b.getText("text").insert(0, "yo");
|
|
90
|
+
a.import(b.exportFrom());
|
|
91
|
+
a.getText("text").insert(0, "k");
|
|
92
|
+
a.commit();
|
|
93
|
+
(0, vitest_1.it)("version vector to frontiers", () => {
|
|
94
|
+
{
|
|
95
|
+
const vv = new Map();
|
|
96
|
+
vv.set("0", 3);
|
|
97
|
+
vv.set("1", 2);
|
|
98
|
+
(0, vitest_1.expect)(a.version().toJSON()).toStrictEqual(vv);
|
|
99
|
+
(0, vitest_1.expect)(a.version().toJSON()).toStrictEqual(vv);
|
|
100
|
+
(0, vitest_1.expect)(a.vvToFrontiers(new src_1.VersionVector(vv))).toStrictEqual(a.frontiers());
|
|
101
|
+
const v = a.version();
|
|
102
|
+
const temp = a.vvToFrontiers(v);
|
|
103
|
+
(0, vitest_1.expect)(temp).toStrictEqual(a.frontiers());
|
|
104
|
+
(0, vitest_1.expect)(a.frontiers()).toStrictEqual([
|
|
105
|
+
{ peer: "0", counter: 2 },
|
|
106
|
+
]);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.it)("get changes", () => {
|
|
110
|
+
const changes = a.getAllChanges();
|
|
111
|
+
(0, vitest_1.expect)(typeof changes.get("0")?.[0].peer == "string").toBeTruthy();
|
|
112
|
+
(0, vitest_1.expect)(changes.size).toBe(2);
|
|
113
|
+
(0, vitest_1.expect)(changes.get("0")?.length).toBe(2);
|
|
114
|
+
(0, vitest_1.expect)(changes.get("0")?.[0].length).toBe(2);
|
|
115
|
+
(0, vitest_1.expect)(changes.get("0")?.[1].lamport).toBe(2);
|
|
116
|
+
(0, vitest_1.expect)(changes.get("0")?.[1].deps).toStrictEqual([
|
|
117
|
+
{ peer: "0", counter: 1 },
|
|
118
|
+
{ peer: "1", counter: 1 },
|
|
119
|
+
]);
|
|
120
|
+
(0, vitest_1.expect)(changes.get("1")?.length).toBe(1);
|
|
121
|
+
});
|
|
122
|
+
(0, vitest_1.it)("get ops inside changes", () => {
|
|
123
|
+
const change = a.getOpsInChange({ peer: "0", counter: 2 });
|
|
124
|
+
(0, vitest_1.expect)(change.length).toBe(1);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
(0, vitest_1.it)("get import blob metadata", () => {
|
|
128
|
+
const doc0 = new src_1.Loro();
|
|
129
|
+
doc0.setPeerId(0n);
|
|
130
|
+
const text = doc0.getText("text");
|
|
131
|
+
text.insert(0, "0");
|
|
132
|
+
doc0.commit();
|
|
133
|
+
{
|
|
134
|
+
const bytes = doc0.exportFrom();
|
|
135
|
+
const meta = (0, src_1.decodeImportBlobMeta)(bytes);
|
|
136
|
+
(0, vitest_1.expect)(meta.changeNum).toBe(1);
|
|
137
|
+
(0, vitest_1.expect)(meta.partialStartVersionVector.get("0")).toBeFalsy();
|
|
138
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("0")).toBe(1);
|
|
139
|
+
(0, vitest_1.expect)(meta.startTimestamp).toBe(0);
|
|
140
|
+
(0, vitest_1.expect)(meta.endTimestamp).toBe(0);
|
|
141
|
+
(0, vitest_1.expect)(meta.isSnapshot).toBeFalsy();
|
|
142
|
+
(0, vitest_1.expect)(meta.startFrontiers.length).toBe(0);
|
|
143
|
+
}
|
|
144
|
+
const doc1 = new src_1.Loro();
|
|
145
|
+
doc1.setPeerId(1);
|
|
146
|
+
doc1.getText("text").insert(0, "123");
|
|
147
|
+
doc1.import(doc0.exportFrom());
|
|
148
|
+
{
|
|
149
|
+
const bytes = doc1.exportFrom();
|
|
150
|
+
const meta = (0, src_1.decodeImportBlobMeta)(bytes);
|
|
151
|
+
(0, vitest_1.expect)(meta.changeNum).toBe(2);
|
|
152
|
+
(0, vitest_1.expect)(meta.partialStartVersionVector.get("0")).toBeFalsy();
|
|
153
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("0")).toBe(1);
|
|
154
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("1")).toBe(3);
|
|
155
|
+
(0, vitest_1.expect)(meta.startTimestamp).toBe(0);
|
|
156
|
+
(0, vitest_1.expect)(meta.endTimestamp).toBe(0);
|
|
157
|
+
(0, vitest_1.expect)(meta.isSnapshot).toBeFalsy();
|
|
158
|
+
(0, vitest_1.expect)(meta.startFrontiers.length).toBe(0);
|
|
159
|
+
}
|
|
160
|
+
{
|
|
161
|
+
const bytes = doc1.exportSnapshot();
|
|
162
|
+
const meta = (0, src_1.decodeImportBlobMeta)(bytes);
|
|
163
|
+
(0, vitest_1.expect)(meta.changeNum).toBe(2);
|
|
164
|
+
(0, vitest_1.expect)(meta.partialStartVersionVector.get("0")).toBeFalsy();
|
|
165
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("0")).toBe(1);
|
|
166
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("1")).toBe(3);
|
|
167
|
+
(0, vitest_1.expect)(meta.startTimestamp).toBe(0);
|
|
168
|
+
(0, vitest_1.expect)(meta.endTimestamp).toBe(0);
|
|
169
|
+
(0, vitest_1.expect)(meta.isSnapshot).toBeTruthy();
|
|
170
|
+
(0, vitest_1.expect)(meta.startFrontiers.length).toBe(0);
|
|
171
|
+
}
|
|
172
|
+
{
|
|
173
|
+
const bytes = doc1.exportFrom(doc0.oplogVersion());
|
|
174
|
+
const meta = (0, src_1.decodeImportBlobMeta)(bytes);
|
|
175
|
+
(0, vitest_1.expect)(meta.changeNum).toBe(1);
|
|
176
|
+
(0, vitest_1.expect)(meta.partialStartVersionVector.get("0")).toBeUndefined();
|
|
177
|
+
(0, vitest_1.expect)(meta.partialStartVersionVector.get("1")).toBeFalsy();
|
|
178
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("0")).toBeUndefined();
|
|
179
|
+
(0, vitest_1.expect)(meta.partialEndVersionVector.get("1")).toBe(3);
|
|
180
|
+
(0, vitest_1.expect)(meta.startTimestamp).toBe(0);
|
|
181
|
+
(0, vitest_1.expect)(meta.endTimestamp).toBe(0);
|
|
182
|
+
(0, vitest_1.expect)(meta.isSnapshot).toBeFalsy();
|
|
183
|
+
(0, vitest_1.expect)(meta.startFrontiers).toStrictEqual([{ peer: "0", counter: 0 }]);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/// <reference types="vitest" />
|
|
7
|
+
const vite_plugin_wasm_1 = __importDefault(require("vite-plugin-wasm"));
|
|
8
|
+
const vite_1 = require("vite");
|
|
9
|
+
exports.default = (0, vite_1.defineConfig)({
|
|
10
|
+
plugins: [(0, vite_plugin_wasm_1.default)()],
|
|
11
|
+
// test: {
|
|
12
|
+
// reporters:['hanging-process']
|
|
13
|
+
// },
|
|
14
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loro-crdt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "Loro CRDTs is a high-performance CRDT framework that makes your app state synchronized, collaborative and maintainable effortlessly.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"crdt",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"homepage": "https://loro.dev",
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"loro-wasm": "0.
|
|
20
|
+
"loro-wasm": "0.14.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@rollup/plugin-node-resolve": "^15.0.1",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "rollup -c",
|
|
39
39
|
"watch": "rollup -c -w",
|
|
40
|
-
"test": "vitest run --
|
|
40
|
+
"test": "vitest run && npx tsc --noEmit",
|
|
41
41
|
"prepublish": "pnpm run build"
|
|
42
42
|
}
|
|
43
43
|
}
|