@homeostate/core 0.1.2 → 0.2.0
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 +15 -0
- package/README.md +22 -1
- package/dist/apply.d.ts +1 -0
- package/dist/apply.d.ts.map +1 -1
- package/dist/apply.js +3 -1
- package/dist/apply.js.map +1 -1
- package/dist/change.d.ts +8 -2
- package/dist/change.d.ts.map +1 -1
- package/dist/diff.js +17 -12
- package/dist/diff.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/sync-engine.d.ts +1 -1
- package/dist/sync-engine.js +1 -1
- package/dist/testing.d.ts +3 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/package.json +6 -1
- package/src/apply.ts +5 -1
- package/src/change.ts +8 -2
- package/src/diff.ts +23 -14
- package/src/index.ts +1 -3
- package/src/sync-engine.ts +1 -1
- package/src/testing.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @homeostate/core
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a643bbe: Stop exporting `applyStringChanges`. It was only used inside core; `applyChanges` still applies string changes wherever they appear in the state.
|
|
8
|
+
- 0bbf653: Move `createMemoryBackend` and `MemoryBackend` to the `@homeostate/core/testing` entry, so the root entry only exports what production code uses. Mark the package side-effect free.
|
|
9
|
+
- fb76f77: Preserve complete Unicode code points when diffing and applying string edits. Deleting or
|
|
10
|
+
replacing supplementary characters such as emoji no longer corrupts text, deletes adjacent
|
|
11
|
+
characters, or throws in the supplied CRDT backends.
|
|
12
|
+
|
|
13
|
+
String `Change` offsets remain UTF-16 code units. A string deletion can now carry a numeric
|
|
14
|
+
UTF-16 deletion length in its third tuple entry; `undefined` still means one unit. Custom
|
|
15
|
+
backends consuming `getChanges` must honor this length in one operation rather than delete
|
|
16
|
+
one code unit per step. Array and object deletion semantics are unchanged.
|
|
17
|
+
|
|
3
18
|
## 0.1.2
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -27,9 +27,30 @@ const engine = createSyncEngine(createYjsBackend(doc, "shared"), adapter, {
|
|
|
27
27
|
engine.connect();
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
`createMemoryBackend()` is a plain-JSON backend without
|
|
30
|
+
`createMemoryBackend()` from `@homeostate/core/testing` is a plain-JSON backend without
|
|
31
|
+
replication, meant for tests.
|
|
31
32
|
`getChanges` is exported so a backend can turn a `write(next)` into fine-grained operations.
|
|
32
33
|
|
|
34
|
+
## Applying string changes
|
|
35
|
+
|
|
36
|
+
String changes from `getChanges` use UTF-16 offsets into the progressively edited string,
|
|
37
|
+
matching JavaScript string indexing. The diff compares whole Unicode code points so an edit
|
|
38
|
+
does not split a valid surrogate pair. It does not treat a multi-code-point grapheme, such as
|
|
39
|
+
a joined emoji or a letter with combining marks, as one indivisible character.
|
|
40
|
+
|
|
41
|
+
For a string `DELETE`, the third tuple entry is the number of UTF-16 units to remove;
|
|
42
|
+
`undefined` means one unit. Custom backends must honor this length in one operation:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
getChanges("😀a😃b", "😀ab");
|
|
46
|
+
// [[ChangeType.DELETE, 3, 2]] — remove the whole 😃 surrogate pair
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Inserts carry complete strings. Array and object deletes still carry `undefined` and remove
|
|
50
|
+
one element or property. Core's `applyChanges` and the supplied CRDT backends handle string
|
|
51
|
+
deletion lengths; an external backend using a different text-index unit must translate both
|
|
52
|
+
offsets and lengths before applying them.
|
|
53
|
+
|
|
33
54
|
## Connecting
|
|
34
55
|
|
|
35
56
|
`connect()` reconciles the store and the backend per key, over the view the `filter` allows:
|
package/dist/apply.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface ApplyOps {
|
|
|
17
17
|
/**
|
|
18
18
|
* Revises `value` by the character-level edit script `changes`, which is what `getChanges`
|
|
19
19
|
* returns for two strings. Each index addresses the string as revised by the steps before it.
|
|
20
|
+
* Offsets and deletion lengths are UTF-16 units; an omitted length means one unit.
|
|
20
21
|
*/
|
|
21
22
|
export declare const applyStringChanges: (value: string, changes: Change[]) => string;
|
|
22
23
|
/**
|
package/dist/apply.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAItD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,gFAAgF;IAChF,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChE,wCAAwC;IACxC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,6FAA6F;IAC7F,MAAM,CACJ,MAAM,EAAE,OAAO,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,EAAE,GAClB,IAAI,CAAC;CACT;AAED
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAItD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,gFAAgF;IAChF,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChE,wCAAwC;IACxC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,6FAA6F;IAC7F,MAAM,CACJ,MAAM,EAAE,OAAO,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,EAAE,GAClB,IAAI,CAAC;CACT;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,KAAG,MAW3D,CAAC;AAEZ;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,EACd,SAAS,MAAM,EAAE,EACjB,KAAK,QAAQ,KACZ,IA6BF,CAAC"}
|
package/dist/apply.js
CHANGED
|
@@ -2,13 +2,15 @@ import { ChangeType } from "./change.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Revises `value` by the character-level edit script `changes`, which is what `getChanges`
|
|
4
4
|
* returns for two strings. Each index addresses the string as revised by the steps before it.
|
|
5
|
+
* Offsets and deletion lengths are UTF-16 units; an omitted length means one unit.
|
|
5
6
|
*/
|
|
6
7
|
export const applyStringChanges = (value, changes) => changes.reduce((revised, [type, index, inserted]) => {
|
|
7
8
|
const at = index;
|
|
8
9
|
if (type === ChangeType.INSERT)
|
|
9
10
|
return revised.slice(0, at) + inserted + revised.slice(at);
|
|
10
11
|
if (type === ChangeType.DELETE)
|
|
11
|
-
return revised.slice(0, at) +
|
|
12
|
+
return (revised.slice(0, at) +
|
|
13
|
+
revised.slice(at + (typeof inserted === "number" ? inserted : 1)));
|
|
12
14
|
return revised;
|
|
13
15
|
}, value);
|
|
14
16
|
/**
|
package/dist/apply.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAyBtD
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAyBtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,OAAiB,EAAU,EAAE,CAC7E,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE;IAClD,MAAM,EAAE,GAAG,KAAe,CAAC;IAC3B,IAAI,IAAI,KAAK,UAAU,CAAC,MAAM;QAC5B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAI,QAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzE,IAAI,IAAI,KAAK,UAAU,CAAC,MAAM;QAC5B,OAAO,CACL,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAClE,CAAC;IACJ,OAAO,OAAO,CAAC;AACjB,CAAC,EAAE,KAAK,CAAC,CAAC;AAEZ;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAAc,EACd,OAAiB,EACjB,GAAa,EACP,EAAE;IACR,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnE,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAI,MAAgB,CAAC,GAAa,CAAC,CAAC;gBAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAC3B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,kBAAkB,CAAC,KAAK,EAAE,KAAiB,CAAC,CAAC,CAAC;qBAChE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAClD,YAAY,CAAC,KAAK,EAAE,KAAiB,EAAE,GAAG,CAAC,CAAC;gBAC9C,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,MAAM;gBACpB,IAAI,KAAK;oBAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAa,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;;oBAC9C,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAa,CAAC,CAAC;gBACvC,MAAM;YAER,KAAK,UAAU,CAAC,MAAM;gBACpB,IAAI,KAAK;oBAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAa,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;;oBACnD,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjC,MAAM;YAER,KAAK,UAAU,CAAC,MAAM;gBACpB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5B,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
|
package/dist/change.d.ts
CHANGED
|
@@ -16,8 +16,14 @@ export declare enum ChangeType {
|
|
|
16
16
|
*
|
|
17
17
|
* Steps apply in order. A numeric key addresses the array or string as revised by the
|
|
18
18
|
* steps before it, so appliers never sort or clamp. `value` is the inserted or replacing
|
|
19
|
-
* value (a string insert may carry several characters), `
|
|
20
|
-
*
|
|
19
|
+
* value (a string insert may carry several characters), and the nested `Change[]` for a
|
|
20
|
+
* pending entry. Object and array deletes carry `undefined`.
|
|
21
|
+
*
|
|
22
|
+
* String offsets and deletion lengths use UTF-16 code units. A string delete carries its
|
|
23
|
+
* length in `value`, or `undefined` for the default length of 1. Generated string edits
|
|
24
|
+
* preserve code point boundaries: deleting a supplementary character is one step with
|
|
25
|
+
* length 2, never two steps that split its surrogate pair. These are not grapheme edits;
|
|
26
|
+
* combining marks and joined emoji may span multiple code points.
|
|
21
27
|
*/
|
|
22
28
|
export type Change = [ChangeType, string | number, unknown];
|
|
23
29
|
//# sourceMappingURL=change.d.ts.map
|
package/dist/change.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../src/change.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,UAAU;IACpB,4BAA4B;IAC5B,MAAM,WAAW;IACjB,4BAA4B;IAC5B,MAAM,WAAW;IACjB,2BAA2B;IAC3B,MAAM,WAAW;IACjB,uEAAuE;IACvE,OAAO,YAAY;CACpB;AAED
|
|
1
|
+
{"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../src/change.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,UAAU;IACpB,4BAA4B;IAC5B,MAAM,WAAW;IACjB,4BAA4B;IAC5B,MAAM,WAAW;IACjB,2BAA2B;IAC3B,MAAM,WAAW;IACjB,uEAAuE;IACvE,OAAO,YAAY;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC"}
|
package/dist/diff.js
CHANGED
|
@@ -33,34 +33,39 @@ const sharesCharacter = (a, b) => {
|
|
|
33
33
|
return true;
|
|
34
34
|
return false;
|
|
35
35
|
};
|
|
36
|
+
const deleteCharacter = (index, character) => [
|
|
37
|
+
ChangeType.DELETE,
|
|
38
|
+
index,
|
|
39
|
+
character.length === 1 ? undefined : character.length,
|
|
40
|
+
];
|
|
36
41
|
const getStringChanges = (a, b) => {
|
|
37
42
|
if (a === b)
|
|
38
43
|
return [];
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
// Compare whole code points, but keep Change offsets in JavaScript's UTF-16 units.
|
|
45
|
+
// Comparing code units can retain half a surrogate pair and corrupt a CRDT text.
|
|
46
|
+
const from = Array.from(a);
|
|
47
|
+
const to = Array.from(b);
|
|
48
|
+
if (!sharesCharacter(from, to)) {
|
|
49
|
+
const deletes = from.map((character) => deleteCharacter(0, character));
|
|
45
50
|
return b.length === 0 ? deletes : [...deletes, [ChangeType.INSERT, 0, b]];
|
|
46
51
|
}
|
|
47
52
|
const changes = [];
|
|
48
53
|
let index = 0;
|
|
49
|
-
for (const { step, b: position } of editScript(
|
|
54
|
+
for (const { step, a: source, b: position } of editScript(from, to, (x, y) => x === y)) {
|
|
50
55
|
if (step === "eq")
|
|
51
|
-
index
|
|
56
|
+
index += from[source].length;
|
|
52
57
|
else if (step === "del")
|
|
53
|
-
changes.push(
|
|
58
|
+
changes.push(deleteCharacter(index, from[source]));
|
|
54
59
|
else {
|
|
55
60
|
const last = changes.length > 0 ? changes[changes.length - 1] : undefined;
|
|
56
61
|
if (last !== undefined &&
|
|
57
62
|
last[0] === ChangeType.INSERT &&
|
|
58
63
|
last[1] + last[2].length === index) {
|
|
59
|
-
last[2] = last[2] +
|
|
64
|
+
last[2] = last[2] + to[position];
|
|
60
65
|
}
|
|
61
66
|
else
|
|
62
|
-
changes.push([ChangeType.INSERT, index,
|
|
63
|
-
index
|
|
67
|
+
changes.push([ChangeType.INSERT, index, to[position]]);
|
|
68
|
+
index += to[position].length;
|
|
64
69
|
}
|
|
65
70
|
}
|
|
66
71
|
return changes;
|
package/dist/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAItD,MAAM,OAAO,GAAG,CAAC,KAAc,EAA2B,EAAE,CAC1D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvB,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAEhF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CACvD,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEvD,MAAM,UAAU,GAAG,CAAC,CAAW,EAAE,CAAW,EAAW,EAAE,CACvD,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEpE,MAAM,aAAa,GAAG,CAAC,CAAU,EAAE,CAAU,EAAmB,EAAE,CAChE,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE/E,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,CAAU,EAAW,EAAE;IACpD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;QAC1B,OAAO,CACL,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACvE,CAAC;IACJ,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;YACrC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAW,EAAE,CAAW,EAAY,EAAE;IAC/D,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
export { createSyncEngine } from "./sync-engine.js";
|
|
2
|
-
export { createMemoryBackend } from "./memory-backend.js";
|
|
3
|
-
export type { MemoryBackend } from "./memory-backend.js";
|
|
4
2
|
export { getChanges } from "./diff.js";
|
|
5
|
-
export { applyChanges
|
|
3
|
+
export { applyChanges } from "./apply.js";
|
|
6
4
|
export type { ApplyOps } from "./apply.js";
|
|
7
5
|
export type { Diffable } from "./diff.js";
|
|
8
6
|
export { ChangeType } from "./change.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export { createSyncEngine } from "./sync-engine.js";
|
|
2
|
-
export { createMemoryBackend } from "./memory-backend.js";
|
|
3
2
|
export { getChanges } from "./diff.js";
|
|
4
|
-
export { applyChanges
|
|
3
|
+
export { applyChanges } from "./apply.js";
|
|
5
4
|
export { ChangeType } from "./change.js";
|
|
6
5
|
export { defaultSyncFilter } from "./types.js";
|
|
7
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/sync-engine.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { CrdtBackend, StoreAdapter, SyncEngine, SyncEngineConfig } from "./
|
|
|
15
15
|
* @example
|
|
16
16
|
* ```typescript
|
|
17
17
|
* const backend = createYjsBackend(new Y.Doc(), 'shared');
|
|
18
|
-
* const adapter =
|
|
18
|
+
* const adapter = createZustandAdapter(store);
|
|
19
19
|
* const engine = createSyncEngine(backend, adapter);
|
|
20
20
|
* engine.connect();
|
|
21
21
|
* ```
|
package/dist/sync-engine.js
CHANGED
|
@@ -16,7 +16,7 @@ import { patchState } from "./patching.js";
|
|
|
16
16
|
* @example
|
|
17
17
|
* ```typescript
|
|
18
18
|
* const backend = createYjsBackend(new Y.Doc(), 'shared');
|
|
19
|
-
* const adapter =
|
|
19
|
+
* const adapter = createZustandAdapter(store);
|
|
20
20
|
* const engine = createSyncEngine(backend, adapter);
|
|
21
21
|
* engine.connect();
|
|
22
22
|
* ```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homeostate/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "State-manager and CRDT-backend agnostic sync engine between a store adapter and a CrdtBackend",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -25,8 +25,13 @@
|
|
|
25
25
|
".": {
|
|
26
26
|
"types": "./dist/index.d.ts",
|
|
27
27
|
"default": "./dist/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./testing": {
|
|
30
|
+
"types": "./dist/testing.d.ts",
|
|
31
|
+
"default": "./dist/testing.js"
|
|
28
32
|
}
|
|
29
33
|
},
|
|
34
|
+
"sideEffects": false,
|
|
30
35
|
"files": [
|
|
31
36
|
"dist",
|
|
32
37
|
"src",
|
package/src/apply.ts
CHANGED
|
@@ -26,6 +26,7 @@ export interface ApplyOps {
|
|
|
26
26
|
/**
|
|
27
27
|
* Revises `value` by the character-level edit script `changes`, which is what `getChanges`
|
|
28
28
|
* returns for two strings. Each index addresses the string as revised by the steps before it.
|
|
29
|
+
* Offsets and deletion lengths are UTF-16 units; an omitted length means one unit.
|
|
29
30
|
*/
|
|
30
31
|
export const applyStringChanges = (value: string, changes: Change[]): string =>
|
|
31
32
|
changes.reduce((revised, [type, index, inserted]) => {
|
|
@@ -33,7 +34,10 @@ export const applyStringChanges = (value: string, changes: Change[]): string =>
|
|
|
33
34
|
if (type === ChangeType.INSERT)
|
|
34
35
|
return revised.slice(0, at) + (inserted as string) + revised.slice(at);
|
|
35
36
|
if (type === ChangeType.DELETE)
|
|
36
|
-
return
|
|
37
|
+
return (
|
|
38
|
+
revised.slice(0, at) +
|
|
39
|
+
revised.slice(at + (typeof inserted === "number" ? inserted : 1))
|
|
40
|
+
);
|
|
37
41
|
return revised;
|
|
38
42
|
}, value);
|
|
39
43
|
|
package/src/change.ts
CHANGED
|
@@ -17,7 +17,13 @@ export enum ChangeType {
|
|
|
17
17
|
*
|
|
18
18
|
* Steps apply in order. A numeric key addresses the array or string as revised by the
|
|
19
19
|
* steps before it, so appliers never sort or clamp. `value` is the inserted or replacing
|
|
20
|
-
* value (a string insert may carry several characters), `
|
|
21
|
-
*
|
|
20
|
+
* value (a string insert may carry several characters), and the nested `Change[]` for a
|
|
21
|
+
* pending entry. Object and array deletes carry `undefined`.
|
|
22
|
+
*
|
|
23
|
+
* String offsets and deletion lengths use UTF-16 code units. A string delete carries its
|
|
24
|
+
* length in `value`, or `undefined` for the default length of 1. Generated string edits
|
|
25
|
+
* preserve code point boundaries: deleting a supplementary character is one step with
|
|
26
|
+
* length 2, never two steps that split its surrogate pair. These are not grapheme edits;
|
|
27
|
+
* combining marks and joined emoji may span multiple code points.
|
|
22
28
|
*/
|
|
23
29
|
export type Change = [ChangeType, string | number, unknown];
|
package/src/diff.ts
CHANGED
|
@@ -42,30 +42,39 @@ export const getChanges = (a: Diffable, b: Diffable): Change[] => {
|
|
|
42
42
|
return [];
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
-
const sharesCharacter = (a: string, b: string): boolean => {
|
|
45
|
+
const sharesCharacter = (a: string[], b: string[]): boolean => {
|
|
46
46
|
const characters = new Set(a);
|
|
47
47
|
for (const character of b) if (characters.has(character)) return true;
|
|
48
48
|
return false;
|
|
49
49
|
};
|
|
50
50
|
|
|
51
|
+
const deleteCharacter = (index: number, character: string): Change => [
|
|
52
|
+
ChangeType.DELETE,
|
|
53
|
+
index,
|
|
54
|
+
character.length === 1 ? undefined : character.length,
|
|
55
|
+
];
|
|
56
|
+
|
|
51
57
|
const getStringChanges = (a: string, b: string): Change[] => {
|
|
52
58
|
if (a === b) return [];
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
// Compare whole code points, but keep Change offsets in JavaScript's UTF-16 units.
|
|
60
|
+
// Comparing code units can retain half a surrogate pair and corrupt a CRDT text.
|
|
61
|
+
const from = Array.from(a);
|
|
62
|
+
const to = Array.from(b);
|
|
63
|
+
if (!sharesCharacter(from, to)) {
|
|
64
|
+
const deletes = from.map((character) => deleteCharacter(0, character));
|
|
59
65
|
return b.length === 0 ? deletes : [...deletes, [ChangeType.INSERT, 0, b]];
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
const changes: Change[] = [];
|
|
63
69
|
let index = 0;
|
|
64
70
|
|
|
65
|
-
for (const { step, b: position } of editScript(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
for (const { step, a: source, b: position } of editScript(
|
|
72
|
+
from,
|
|
73
|
+
to,
|
|
74
|
+
(x, y) => x === y,
|
|
75
|
+
)) {
|
|
76
|
+
if (step === "eq") index += from[source].length;
|
|
77
|
+
else if (step === "del") changes.push(deleteCharacter(index, from[source]));
|
|
69
78
|
else {
|
|
70
79
|
const last = changes.length > 0 ? changes[changes.length - 1] : undefined;
|
|
71
80
|
if (
|
|
@@ -73,9 +82,9 @@ const getStringChanges = (a: string, b: string): Change[] => {
|
|
|
73
82
|
last[0] === ChangeType.INSERT &&
|
|
74
83
|
(last[1] as number) + (last[2] as string).length === index
|
|
75
84
|
) {
|
|
76
|
-
last[2] = (last[2] as string) +
|
|
77
|
-
} else changes.push([ChangeType.INSERT, index,
|
|
78
|
-
index
|
|
85
|
+
last[2] = (last[2] as string) + to[position];
|
|
86
|
+
} else changes.push([ChangeType.INSERT, index, to[position]]);
|
|
87
|
+
index += to[position].length;
|
|
79
88
|
}
|
|
80
89
|
}
|
|
81
90
|
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
export { createSyncEngine } from "./sync-engine.js";
|
|
2
|
-
export { createMemoryBackend } from "./memory-backend.js";
|
|
3
|
-
export type { MemoryBackend } from "./memory-backend.js";
|
|
4
2
|
export { getChanges } from "./diff.js";
|
|
5
|
-
export { applyChanges
|
|
3
|
+
export { applyChanges } from "./apply.js";
|
|
6
4
|
export type { ApplyOps } from "./apply.js";
|
|
7
5
|
export type { Diffable } from "./diff.js";
|
|
8
6
|
export { ChangeType } from "./change.js";
|
package/src/sync-engine.ts
CHANGED
|
@@ -26,7 +26,7 @@ type Plain = Record<string, unknown>;
|
|
|
26
26
|
* @example
|
|
27
27
|
* ```typescript
|
|
28
28
|
* const backend = createYjsBackend(new Y.Doc(), 'shared');
|
|
29
|
-
* const adapter =
|
|
29
|
+
* const adapter = createZustandAdapter(store);
|
|
30
30
|
* const engine = createSyncEngine(backend, adapter);
|
|
31
31
|
* engine.connect();
|
|
32
32
|
* ```
|
package/src/testing.ts
ADDED