lib0 0.2.115-4 → 0.2.115-6
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/coverage/tmp/{coverage-32703-1763495370274-0.json → coverage-5242-1765032816888-0.json} +1 -1
- package/delta/binding.d.ts +11 -9
- package/delta/binding.d.ts.map +1 -1
- package/delta/binding.js +5 -2
- package/delta/binding.test.d.ts.map +1 -1
- package/delta/delta-pitch.test.d.ts +5 -0
- package/delta/delta-pitch.test.d.ts.map +1 -0
- package/delta/{d2.d.ts → delta.d.ts} +129 -38
- package/delta/delta.d.ts.map +1 -0
- package/delta/{d2.js → delta.js} +379 -66
- package/delta/{d2.test.d.ts → delta.test.d.ts} +8 -1
- package/delta/delta.test.d.ts.map +1 -0
- package/delta/t3.test.d.ts +1 -1
- package/delta/t3.test.d.ts.map +1 -1
- package/dist/array.cjs +17 -60
- package/dist/array.cjs.map +1 -1
- package/dist/binding.cjs +114 -28
- package/dist/binding.cjs.map +1 -1
- package/dist/{broadcastchannel-d0c108a2.cjs → broadcastchannel-42bbe6e0.cjs} +2 -2
- package/dist/{broadcastchannel-d0c108a2.cjs.map → broadcastchannel-42bbe6e0.cjs.map} +1 -1
- package/dist/broadcastchannel.cjs +6 -6
- package/dist/{buffer-7f6fa8fa.cjs → buffer-54360f21.cjs} +2 -2
- package/dist/{buffer-7f6fa8fa.cjs.map → buffer-54360f21.cjs.map} +1 -1
- package/dist/buffer.cjs +5 -5
- package/dist/cache.cjs +3 -3
- package/dist/component.cjs +12 -8
- package/dist/component.cjs.map +1 -1
- package/dist/delta/binding.d.ts +11 -9
- package/dist/delta/binding.d.ts.map +1 -1
- package/dist/delta/binding.test.d.ts.map +1 -1
- package/dist/delta/delta-pitch.test.d.ts +5 -0
- package/dist/delta/delta-pitch.test.d.ts.map +1 -0
- package/dist/delta/{d2.d.ts → delta.d.ts} +129 -38
- package/dist/delta/delta.d.ts.map +1 -0
- package/dist/delta/{d2.test.d.ts → delta.test.d.ts} +8 -1
- package/dist/delta/delta.test.d.ts.map +1 -0
- package/dist/delta/t3.test.d.ts +1 -1
- package/dist/delta/t3.test.d.ts.map +1 -1
- package/dist/{d2.cjs → delta.cjs} +389 -71
- package/dist/delta.cjs.map +1 -0
- package/dist/{diff-1832cb43.cjs → diff-fab14ea6.cjs} +2 -2
- package/dist/{diff-1832cb43.cjs.map → diff-fab14ea6.cjs.map} +1 -1
- package/dist/diff.cjs +4 -4
- package/dist/{dom-f5047a64.cjs → dom-4c4b4c68.cjs} +1 -1
- package/dist/{dom-f5047a64.cjs.map → dom-4c4b4c68.cjs.map} +1 -1
- package/dist/dom.cjs +12 -5
- package/dist/dom.cjs.map +1 -1
- package/dist/{environment-90227ead.cjs → environment-ae4f6f15.cjs} +2 -2
- package/dist/{environment-90227ead.cjs.map → environment-ae4f6f15.cjs.map} +1 -1
- package/dist/environment.cjs +4 -4
- package/dist/equality.cjs +34 -0
- package/dist/equality.cjs.map +1 -0
- package/dist/fingerprint.cjs +44 -0
- package/dist/fingerprint.cjs.map +1 -0
- package/dist/{function-e7d18feb.cjs → function-618aa640.cjs} +8 -7
- package/dist/function-618aa640.cjs.map +1 -0
- package/dist/function.cjs +3 -3
- package/dist/function.d.ts.map +1 -1
- package/dist/index.cjs +9 -9
- package/dist/indexeddbV2.cjs +2 -2
- package/dist/jwt.cjs +5 -5
- package/dist/list.cjs +18 -5
- package/dist/list.cjs.map +1 -1
- package/dist/list.d.ts +9 -2
- package/dist/list.d.ts.map +1 -1
- package/dist/list.test.d.ts.map +1 -1
- package/dist/logging.cjs +11 -5
- package/dist/logging.cjs.map +1 -1
- package/dist/logging.common.cjs +4 -4
- package/dist/logging.node.cjs +4 -4
- package/dist/map.cjs +7 -314
- package/dist/map.cjs.map +1 -1
- package/dist/{object-18980796.cjs → object-dec41ef9.cjs} +3 -3
- package/dist/object-dec41ef9.cjs.map +1 -0
- package/dist/object.cjs +2 -2
- package/dist/object.d.ts.map +1 -1
- package/dist/performance.node.cjs +3 -3
- package/dist/pledge.cjs +2 -2
- package/dist/{prng-99204216.cjs → prng-96eef52a.cjs} +2 -2
- package/dist/{prng-99204216.cjs.map → prng-96eef52a.cjs.map} +1 -1
- package/dist/prng.cjs +6 -6
- package/dist/rabin-gf2-polynomial.cjs +5 -5
- package/dist/rabin-uncached.cjs +5 -5
- package/dist/rabin.cjs +5 -5
- package/dist/schema.cjs +202 -22
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.ts +86 -29
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.test.d.ts +4 -0
- package/dist/schema.test.d.ts.map +1 -1
- package/dist/testing.cjs +9 -9
- package/dist/testing.cjs.map +1 -1
- package/dist/{traits.d.ts → trait/equality.d.ts} +1 -1
- package/dist/trait/equality.d.ts.map +1 -0
- package/dist/trait/fingerprint.d.ts +13 -0
- package/dist/trait/fingerprint.d.ts.map +1 -0
- package/dist/trait/traits.d.ts +3 -0
- package/dist/trait/traits.d.ts.map +1 -0
- package/dist/trait/traits.test.d.ts +5 -0
- package/dist/trait/traits.test.d.ts.map +1 -0
- package/dist/traits.cjs +23 -26
- package/dist/traits.cjs.map +1 -1
- package/dist/url.cjs +2 -2
- package/function.d.ts.map +1 -1
- package/function.js +6 -5
- package/list.d.ts +9 -2
- package/list.d.ts.map +1 -1
- package/list.js +17 -3
- package/list.test.d.ts.map +1 -1
- package/object.d.ts.map +1 -1
- package/object.js +2 -2
- package/package.json +8 -10
- package/schema.d.ts +86 -29
- package/schema.d.ts.map +1 -1
- package/schema.js +191 -20
- package/schema.test.d.ts +4 -0
- package/schema.test.d.ts.map +1 -1
- package/test.html +2 -4
- package/test.js +7 -13
- package/testing.js +3 -3
- package/{traits.d.ts → trait/equality.d.ts} +1 -1
- package/trait/equality.d.ts.map +1 -0
- package/trait/fingerprint.d.ts +13 -0
- package/trait/fingerprint.d.ts.map +1 -0
- package/trait/fingerprint.js +21 -0
- package/trait/traits.d.ts +3 -0
- package/trait/traits.d.ts.map +1 -0
- package/trait/traits.js +2 -0
- package/trait/traits.test.d.ts +5 -0
- package/{traits.test.d.ts.map → trait/traits.test.d.ts.map} +1 -1
- package/delta/abstract-array.d.ts +0 -166
- package/delta/abstract-array.d.ts.map +0 -1
- package/delta/abstract-array.js +0 -421
- package/delta/abstract.d.ts +0 -69
- package/delta/abstract.d.ts.map +0 -1
- package/delta/abstract.js +0 -102
- package/delta/array.d.ts +0 -23
- package/delta/array.d.ts.map +0 -1
- package/delta/array.js +0 -45
- package/delta/array.test.d.ts +0 -2
- package/delta/array.test.d.ts.map +0 -1
- package/delta/d2.d.ts.map +0 -1
- package/delta/d2.test.d.ts.map +0 -1
- package/delta/index.d.ts +0 -14
- package/delta/index.d.ts.map +0 -1
- package/delta/index.js +0 -79
- package/delta/map.d.ts +0 -226
- package/delta/map.d.ts.map +0 -1
- package/delta/map.js +0 -304
- package/delta/node.d.ts +0 -117
- package/delta/node.d.ts.map +0 -1
- package/delta/node.js +0 -183
- package/delta/node.test.d.ts +0 -4
- package/delta/node.test.d.ts.map +0 -1
- package/delta/ops.d.ts +0 -464
- package/delta/ops.d.ts.map +0 -1
- package/delta/ops.js +0 -544
- package/delta/t2.d.ts +0 -184
- package/delta/t2.d.ts.map +0 -1
- package/delta/t2.js +0 -890
- package/delta/text.d.ts +0 -43
- package/delta/text.d.ts.map +0 -1
- package/delta/text.js +0 -54
- package/delta/text.test.d.ts +0 -6
- package/delta/text.test.d.ts.map +0 -1
- package/delta/transformer.d.ts +0 -164
- package/delta/transformer.d.ts.map +0 -1
- package/delta/transformer.js +0 -888
- package/delta/transformer.test.d.ts +0 -13
- package/delta/transformer.test.d.ts.map +0 -1
- package/delta/value.d.ts +0 -84
- package/delta/value.d.ts.map +0 -1
- package/delta/value.js +0 -168
- package/dist/abstract-array.cjs +0 -433
- package/dist/abstract-array.cjs.map +0 -1
- package/dist/abstract.cjs +0 -122
- package/dist/abstract.cjs.map +0 -1
- package/dist/array2.cjs +0 -26
- package/dist/array2.cjs.map +0 -1
- package/dist/d2.cjs.map +0 -1
- package/dist/delta/abstract-array.d.ts +0 -166
- package/dist/delta/abstract-array.d.ts.map +0 -1
- package/dist/delta/abstract.d.ts +0 -69
- package/dist/delta/abstract.d.ts.map +0 -1
- package/dist/delta/array.d.ts +0 -23
- package/dist/delta/array.d.ts.map +0 -1
- package/dist/delta/array.test.d.ts +0 -2
- package/dist/delta/array.test.d.ts.map +0 -1
- package/dist/delta/d2.d.ts.map +0 -1
- package/dist/delta/d2.test.d.ts.map +0 -1
- package/dist/delta/index.d.ts +0 -14
- package/dist/delta/index.d.ts.map +0 -1
- package/dist/delta/map.d.ts +0 -226
- package/dist/delta/map.d.ts.map +0 -1
- package/dist/delta/node.d.ts +0 -117
- package/dist/delta/node.d.ts.map +0 -1
- package/dist/delta/node.test.d.ts +0 -4
- package/dist/delta/node.test.d.ts.map +0 -1
- package/dist/delta/ops.d.ts +0 -464
- package/dist/delta/ops.d.ts.map +0 -1
- package/dist/delta/t2.d.ts +0 -184
- package/dist/delta/t2.d.ts.map +0 -1
- package/dist/delta/text.d.ts +0 -43
- package/dist/delta/text.d.ts.map +0 -1
- package/dist/delta/text.test.d.ts +0 -6
- package/dist/delta/text.test.d.ts.map +0 -1
- package/dist/delta/transformer.d.ts +0 -164
- package/dist/delta/transformer.d.ts.map +0 -1
- package/dist/delta/transformer.test.d.ts +0 -13
- package/dist/delta/transformer.test.d.ts.map +0 -1
- package/dist/delta/value.d.ts +0 -84
- package/dist/delta/value.d.ts.map +0 -1
- package/dist/function-e7d18feb.cjs.map +0 -1
- package/dist/index2.cjs +0 -71
- package/dist/index2.cjs.map +0 -1
- package/dist/map2.cjs +0 -15
- package/dist/map2.cjs.map +0 -1
- package/dist/node.cjs +0 -206
- package/dist/node.cjs.map +0 -1
- package/dist/object-18980796.cjs.map +0 -1
- package/dist/ops.cjs +0 -575
- package/dist/ops.cjs.map +0 -1
- package/dist/t2.cjs +0 -932
- package/dist/t2.cjs.map +0 -1
- package/dist/text.cjs +0 -79
- package/dist/text.cjs.map +0 -1
- package/dist/traits.d.ts.map +0 -1
- package/dist/traits.test.d.ts +0 -4
- package/dist/traits.test.d.ts.map +0 -1
- package/dist/transformer.cjs +0 -930
- package/dist/transformer.cjs.map +0 -1
- package/dist/value.cjs +0 -187
- package/dist/value.cjs.map +0 -1
- package/traits.d.ts.map +0 -1
- package/traits.test.d.ts +0 -4
- /package/{traits.js → trait/equality.js} +0 -0
|
@@ -3,19 +3,21 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var list = require('./list.cjs');
|
|
6
|
-
var object = require('./object-
|
|
7
|
-
var
|
|
6
|
+
var object = require('./object-dec41ef9.cjs');
|
|
7
|
+
var equality = require('./equality.cjs');
|
|
8
|
+
var fingerprint = require('./fingerprint.cjs');
|
|
8
9
|
var array$1 = require('./array-78849c95.cjs');
|
|
9
|
-
var _function = require('./function-
|
|
10
|
+
var _function = require('./function-618aa640.cjs');
|
|
10
11
|
var schema = require('./schema.cjs');
|
|
11
12
|
var error = require('./error-0c1f634f.cjs');
|
|
12
13
|
var math = require('./math-96d5e8c4.cjs');
|
|
13
14
|
var rabin = require('./rabin.cjs');
|
|
14
15
|
var encoding = require('./encoding-1a745c43.cjs');
|
|
15
|
-
var buffer = require('./buffer-
|
|
16
|
+
var buffer = require('./buffer-54360f21.cjs');
|
|
16
17
|
var patience = require('./patience.cjs');
|
|
18
|
+
var prng = require('./prng-96eef52a.cjs');
|
|
17
19
|
require('./set-5b47859e.cjs');
|
|
18
|
-
require('./environment-
|
|
20
|
+
require('./environment-ae4f6f15.cjs');
|
|
19
21
|
require('./map-24d263c0.cjs');
|
|
20
22
|
require('./string-fddc5f8b.cjs');
|
|
21
23
|
require('./conditions-f5c0c102.cjs');
|
|
@@ -116,10 +118,6 @@ const _cloneAttrs = attrs => attrs == null ? attrs : { ...attrs };
|
|
|
116
118
|
*/
|
|
117
119
|
const _markMaybeDeltaAsDone = maybeDelta => $deltaAny.check(maybeDelta) ? /** @type {MaybeDelta} */ (maybeDelta.done()) : maybeDelta;
|
|
118
120
|
|
|
119
|
-
/**
|
|
120
|
-
* @typedef {unknown & DeltaAny} Q
|
|
121
|
-
*/
|
|
122
|
-
|
|
123
121
|
class TextOp extends list.ListNode {
|
|
124
122
|
/**
|
|
125
123
|
* @param {string} insert
|
|
@@ -198,7 +196,7 @@ class TextOp extends list.ListNode {
|
|
|
198
196
|
/**
|
|
199
197
|
* @param {TextOp} other
|
|
200
198
|
*/
|
|
201
|
-
[
|
|
199
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
202
200
|
return _function.equalityDeep(this.insert, other.insert) && _function.equalityDeep(this.format, other.format) && _function.equalityDeep(this.attribution, other.attribution)
|
|
203
201
|
}
|
|
204
202
|
|
|
@@ -211,7 +209,7 @@ class TextOp extends list.ListNode {
|
|
|
211
209
|
}
|
|
212
210
|
|
|
213
211
|
/**
|
|
214
|
-
* @template {
|
|
212
|
+
* @template {fingerprintTrait.Fingerprintable} ArrayContent
|
|
215
213
|
*/
|
|
216
214
|
class InsertOp extends list.ListNode {
|
|
217
215
|
/**
|
|
@@ -286,13 +284,7 @@ class InsertOp extends list.ListNode {
|
|
|
286
284
|
encoding.writeVarUint(encoder, 1); // insertOp type: 1
|
|
287
285
|
encoding.writeVarUint(encoder, this.insert.length);
|
|
288
286
|
this.insert.forEach(ins => {
|
|
289
|
-
|
|
290
|
-
encoding.writeUint8(encoder, 0);
|
|
291
|
-
encoding.writeVarString(encoder, ins.fingerprint);
|
|
292
|
-
} else {
|
|
293
|
-
encoding.writeUint8(encoder, 1);
|
|
294
|
-
encoding.writeAny(encoder, ins);
|
|
295
|
-
}
|
|
287
|
+
encoding.writeVarString(encoder, fingerprint.fingerprint(ins));
|
|
296
288
|
});
|
|
297
289
|
encoding.writeAny(encoder, this.format);
|
|
298
290
|
})))
|
|
@@ -321,7 +313,7 @@ class InsertOp extends list.ListNode {
|
|
|
321
313
|
/**
|
|
322
314
|
* @param {InsertOp<ArrayContent>} other
|
|
323
315
|
*/
|
|
324
|
-
[
|
|
316
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
325
317
|
return _function.equalityDeep(this.insert, other.insert) && _function.equalityDeep(this.format, other.format) && _function.equalityDeep(this.attribution, other.attribution)
|
|
326
318
|
}
|
|
327
319
|
|
|
@@ -334,7 +326,7 @@ class InsertOp extends list.ListNode {
|
|
|
334
326
|
}
|
|
335
327
|
|
|
336
328
|
/**
|
|
337
|
-
* @template {
|
|
329
|
+
* @template {fingerprintTrait.Fingerprintable} [Children=never]
|
|
338
330
|
* @template {string} [Text=never]
|
|
339
331
|
*/
|
|
340
332
|
class DeleteOp extends list.ListNode {
|
|
@@ -395,7 +387,7 @@ class DeleteOp extends list.ListNode {
|
|
|
395
387
|
/**
|
|
396
388
|
* @param {DeleteOp} other
|
|
397
389
|
*/
|
|
398
|
-
[
|
|
390
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
399
391
|
return this.delete === other.delete
|
|
400
392
|
}
|
|
401
393
|
|
|
@@ -476,7 +468,7 @@ class RetainOp extends list.ListNode {
|
|
|
476
468
|
/**
|
|
477
469
|
* @param {RetainOp} other
|
|
478
470
|
*/
|
|
479
|
-
[
|
|
471
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
480
472
|
return this.retain === other.retain && _function.equalityDeep(this.format, other.format) && _function.equalityDeep(this.attribution, other.attribution)
|
|
481
473
|
}
|
|
482
474
|
|
|
@@ -576,8 +568,8 @@ class ModifyOp extends list.ListNode {
|
|
|
576
568
|
/**
|
|
577
569
|
* @param {ModifyOp<any>} other
|
|
578
570
|
*/
|
|
579
|
-
[
|
|
580
|
-
return this.value[
|
|
571
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
572
|
+
return this.value[equality.EqualityTraitSymbol](other.value) && _function.equalityDeep(this.format, other.format) && _function.equalityDeep(this.attribution, other.attribution)
|
|
581
573
|
}
|
|
582
574
|
|
|
583
575
|
/**
|
|
@@ -589,7 +581,7 @@ class ModifyOp extends list.ListNode {
|
|
|
589
581
|
}
|
|
590
582
|
|
|
591
583
|
/**
|
|
592
|
-
* @template {
|
|
584
|
+
* @template {fingerprintTrait.Fingerprintable} V
|
|
593
585
|
* @template {string|number} [K=any]
|
|
594
586
|
*/
|
|
595
587
|
class AttrInsertOp {
|
|
@@ -674,7 +666,7 @@ class AttrInsertOp {
|
|
|
674
666
|
/**
|
|
675
667
|
* @param {AttrInsertOp<V>} other
|
|
676
668
|
*/
|
|
677
|
-
[
|
|
669
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
678
670
|
return this.key === other.key && _function.equalityDeep(this.value, other.value) && _function.equalityDeep(this.attribution, other.attribution)
|
|
679
671
|
}
|
|
680
672
|
|
|
@@ -739,7 +731,7 @@ class AttrDeleteOp {
|
|
|
739
731
|
/**
|
|
740
732
|
* @param {AttrDeleteOp<V>} other
|
|
741
733
|
*/
|
|
742
|
-
[
|
|
734
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
743
735
|
return this.key === other.key && _function.equalityDeep(this.attribution, other.attribution)
|
|
744
736
|
}
|
|
745
737
|
|
|
@@ -813,8 +805,8 @@ class AttrModifyOp {
|
|
|
813
805
|
/**
|
|
814
806
|
* @param {AttrModifyOp<Modifier>} other
|
|
815
807
|
*/
|
|
816
|
-
[
|
|
817
|
-
return this.key === other.key && this.value[
|
|
808
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
809
|
+
return this.key === other.key && this.value[equality.EqualityTraitSymbol](other.value)
|
|
818
810
|
}
|
|
819
811
|
|
|
820
812
|
/**
|
|
@@ -836,7 +828,7 @@ const $deleteOp = schema.$custom(o => o != null && (o.constructor === DeleteOp |
|
|
|
836
828
|
const $insertOp = schema.$custom(o => o != null && (o.constructor === AttrInsertOp || o.constructor === InsertOp));
|
|
837
829
|
|
|
838
830
|
/**
|
|
839
|
-
* @template {
|
|
831
|
+
* @template {fingerprintTrait.Fingerprintable} Content
|
|
840
832
|
* @param {s.Schema<Content>} $content
|
|
841
833
|
* @return {s.Schema<AttrInsertOp<Content> | InsertOp<Content>>}
|
|
842
834
|
*/
|
|
@@ -917,8 +909,8 @@ const $anyOp = schema.$union($insertOp, $deleteOp, $textOp, $modifyOp);
|
|
|
917
909
|
/**
|
|
918
910
|
* @template {string} [NodeName=any]
|
|
919
911
|
* @template {{[k:string|number]:any}} [Attrs={}]
|
|
920
|
-
* @template {
|
|
921
|
-
* @template {string
|
|
912
|
+
* @template {fingerprintTrait.Fingerprintable} [Children=never]
|
|
913
|
+
* @template {string} [Text=never]
|
|
922
914
|
* @template {s.Schema<Delta<any,any,any,any,any>>|null} [Schema=any]
|
|
923
915
|
*/
|
|
924
916
|
class Delta {
|
|
@@ -969,6 +961,7 @@ class Delta {
|
|
|
969
961
|
*/
|
|
970
962
|
get fingerprint () {
|
|
971
963
|
return this._fingerprint || (this._fingerprint = buffer.toBase64(encoding.encode(encoder => {
|
|
964
|
+
encoding.writeUint32(encoder, 0xf2ae5680); // "magic number" that ensures that different types of content don't yield the same fingerprint
|
|
972
965
|
encoding.writeAny(encoder, this.name);
|
|
973
966
|
/**
|
|
974
967
|
* @type {Array<number|string>}
|
|
@@ -998,6 +991,10 @@ class Delta {
|
|
|
998
991
|
})))
|
|
999
992
|
}
|
|
1000
993
|
|
|
994
|
+
[fingerprint.FingerprintTraitSymbol] () {
|
|
995
|
+
return this.fingerprint
|
|
996
|
+
}
|
|
997
|
+
|
|
1001
998
|
isEmpty () {
|
|
1002
999
|
return object.isEmpty(this.attrs) && list.isEmpty(this.children)
|
|
1003
1000
|
}
|
|
@@ -1034,23 +1031,30 @@ class Delta {
|
|
|
1034
1031
|
* @return {boolean}
|
|
1035
1032
|
*/
|
|
1036
1033
|
equals (other) {
|
|
1037
|
-
return this[
|
|
1034
|
+
return this[equality.EqualityTraitSymbol](other)
|
|
1038
1035
|
}
|
|
1039
1036
|
|
|
1040
1037
|
/**
|
|
1041
1038
|
* @param {any} other
|
|
1042
1039
|
* @return {boolean}
|
|
1043
1040
|
*/
|
|
1044
|
-
[
|
|
1041
|
+
[equality.EqualityTraitSymbol] (other) {
|
|
1045
1042
|
// @todo it is only necessary to compare finrerprints OR do a deep equality check (remove
|
|
1046
1043
|
// childCnt as well)
|
|
1047
1044
|
return this.name === other.name && _function.equalityDeep(this.attrs, other.attrs) && _function.equalityDeep(this.children, other.children) && this.childCnt === other.childCnt
|
|
1048
1045
|
}
|
|
1049
1046
|
|
|
1047
|
+
/**
|
|
1048
|
+
* @return {DeltaBuilder<NodeName,Attrs,Children,Text,Schema>}
|
|
1049
|
+
*/
|
|
1050
|
+
clone () {
|
|
1051
|
+
return this.slice(0, this.childCnt)
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1050
1054
|
/**
|
|
1051
1055
|
* @param {number} start
|
|
1052
1056
|
* @param {number} end
|
|
1053
|
-
* @return {
|
|
1057
|
+
* @return {DeltaBuilder<NodeName,Attrs,Children,Text,Schema>}
|
|
1054
1058
|
*/
|
|
1055
1059
|
slice (start = 0, end = this.childCnt) {
|
|
1056
1060
|
const cpy = /** @type {DeltaAny} */ (new DeltaBuilder(/** @type {any} */ (this.name), this.$schema));
|
|
@@ -1117,7 +1121,7 @@ class Delta {
|
|
|
1117
1121
|
/**
|
|
1118
1122
|
* @template {DeltaAny} D
|
|
1119
1123
|
* @param {D} d
|
|
1120
|
-
* @return {D extends
|
|
1124
|
+
* @return {D extends DeltaBuilder<infer NodeName,infer Attrs,infer Children,infer Text,infer Schema> ? DeltaBuilder<NodeName,Attrs,Children,Text,Schema> : never}
|
|
1121
1125
|
*/
|
|
1122
1126
|
const clone = d => /** @type {any} */ (d.slice(0, d.childCnt));
|
|
1123
1127
|
|
|
@@ -1171,8 +1175,8 @@ const modDeltaCheck = d => {
|
|
|
1171
1175
|
/**
|
|
1172
1176
|
* @template {string} [NodeName=any]
|
|
1173
1177
|
* @template {{[key:string|number]:any}} [Attrs={}]
|
|
1174
|
-
* @template {
|
|
1175
|
-
* @template {string
|
|
1178
|
+
* @template {fingerprintTrait.Fingerprintable} [Children=never]
|
|
1179
|
+
* @template {string} [Text=never]
|
|
1176
1180
|
* @template {s.Schema<Delta<any,any,any,any,any>>|null} [Schema=any]
|
|
1177
1181
|
* @extends {Delta<NodeName,Attrs,Children,Text,Schema>}
|
|
1178
1182
|
*/
|
|
@@ -1436,7 +1440,7 @@ class DeltaBuilder extends Delta {
|
|
|
1436
1440
|
modDeltaCheck(this);
|
|
1437
1441
|
this.$schema?.expect(other);
|
|
1438
1442
|
// apply attrs
|
|
1439
|
-
for (
|
|
1443
|
+
for (const op of other.attrs) {
|
|
1440
1444
|
const c = /** @type {AttrInsertOp<any,any>|AttrDeleteOp<any>|AttrModifyOp<any,any>} */ (this.attrs[op.key]);
|
|
1441
1445
|
if ($modifyOp.check(op)) {
|
|
1442
1446
|
if ($deltaAny.check(c?.value)) {
|
|
@@ -1446,12 +1450,14 @@ class DeltaBuilder extends Delta {
|
|
|
1446
1450
|
// @ts-ignore
|
|
1447
1451
|
this.attrs[op.key] = op.clone();
|
|
1448
1452
|
}
|
|
1449
|
-
} else {
|
|
1450
|
-
op = /** @type {any} */ (op.clone());
|
|
1453
|
+
} else if ($insertOp.check(op)) {
|
|
1451
1454
|
// @ts-ignore
|
|
1452
1455
|
op.prevValue = c?.value;
|
|
1453
1456
|
// @ts-ignore
|
|
1454
|
-
this.attrs[op.key] = op;
|
|
1457
|
+
this.attrs[op.key] = op.clone();
|
|
1458
|
+
} else if ($deleteOp.check(op)) {
|
|
1459
|
+
op.prevValue = c?.value;
|
|
1460
|
+
delete this.attrs[op.key];
|
|
1455
1461
|
}
|
|
1456
1462
|
}
|
|
1457
1463
|
// apply children
|
|
@@ -1483,26 +1489,50 @@ class DeltaBuilder extends Delta {
|
|
|
1483
1489
|
if (offset === 0) {
|
|
1484
1490
|
list.insertBetween(this.children, opsI == null ? this.children.end : opsI.prev, opsI, scheduleForMerge(op.clone()));
|
|
1485
1491
|
} else {
|
|
1492
|
+
// @todo inmplement "splitHelper" and "insertHelper" - I'm splitting all the time and
|
|
1493
|
+
// forget to update opsI
|
|
1486
1494
|
if (opsI == null) error.unexpectedCase();
|
|
1487
1495
|
const cpy = scheduleForMerge(opsI.clone(offset));
|
|
1488
1496
|
opsI._splice(offset, opsI.length - offset);
|
|
1489
1497
|
list.insertBetween(this.children, opsI, opsI.next || null, cpy);
|
|
1490
1498
|
list.insertBetween(this.children, opsI, cpy || null, scheduleForMerge(op.clone()));
|
|
1499
|
+
opsI = cpy;
|
|
1491
1500
|
offset = 0;
|
|
1492
1501
|
}
|
|
1493
1502
|
this.childCnt += op.insert.length;
|
|
1494
1503
|
} else if ($retainOp.check(op)) {
|
|
1495
|
-
let
|
|
1496
|
-
|
|
1497
|
-
|
|
1504
|
+
let retainLen = op.length;
|
|
1505
|
+
|
|
1506
|
+
if (offset > 0 && opsI != null && op.format != null && !$deleteOp.check(opsI) && !object.every(op.format, (v, k) => _function.equalityDeep(v, /** @type {InsertOp<any>|RetainOp|ModifyOp} */ (opsI).format?.[k] || null))) {
|
|
1507
|
+
// need to split current op
|
|
1508
|
+
const cpy = scheduleForMerge(opsI.clone(offset));
|
|
1509
|
+
opsI._splice(offset, opsI.length - offset);
|
|
1510
|
+
list.insertBetween(this.children, opsI, opsI.next || null, cpy);
|
|
1511
|
+
opsI = cpy;
|
|
1512
|
+
offset = 0;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
while (opsI != null && opsI.length - offset <= retainLen) {
|
|
1516
|
+
op.format != null && updateOpFormat(opsI, op.format);
|
|
1517
|
+
retainLen -= opsI.length - offset;
|
|
1498
1518
|
opsI = opsI?.next || null;
|
|
1499
1519
|
offset = 0;
|
|
1500
1520
|
}
|
|
1521
|
+
|
|
1501
1522
|
if (opsI != null) {
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1523
|
+
if (op.format != null && retainLen > 0) {
|
|
1524
|
+
// split current op and apply format
|
|
1525
|
+
const cpy = scheduleForMerge(opsI.clone(retainLen));
|
|
1526
|
+
opsI._splice(retainLen, opsI.length - retainLen);
|
|
1527
|
+
list.insertBetween(this.children, opsI, opsI.next || null, cpy);
|
|
1528
|
+
updateOpFormat(opsI, op.format);
|
|
1529
|
+
opsI = cpy;
|
|
1530
|
+
} else {
|
|
1531
|
+
offset += retainLen;
|
|
1532
|
+
}
|
|
1533
|
+
} else if (retainLen > 0) {
|
|
1534
|
+
list.pushEnd(this.children, scheduleForMerge(new RetainOp(retainLen, op.format, op.attribution)));
|
|
1535
|
+
this.childCnt += retainLen;
|
|
1506
1536
|
}
|
|
1507
1537
|
} else if ($deleteOp.check(op)) {
|
|
1508
1538
|
let remainingLen = op.delete;
|
|
@@ -1533,6 +1563,7 @@ class DeltaBuilder extends Delta {
|
|
|
1533
1563
|
offset = 0;
|
|
1534
1564
|
scheduleForMerge(opsI.next);
|
|
1535
1565
|
list.remove(this.children, opsI);
|
|
1566
|
+
opsI = opsI.next;
|
|
1536
1567
|
} else if (offset === 0) {
|
|
1537
1568
|
// case 2
|
|
1538
1569
|
offset = 0;
|
|
@@ -1743,17 +1774,159 @@ class DeltaBuilder extends Delta {
|
|
|
1743
1774
|
console.info('method rebaseOnInverse unimplemented');
|
|
1744
1775
|
return this
|
|
1745
1776
|
}
|
|
1777
|
+
|
|
1778
|
+
/**
|
|
1779
|
+
* Append child ops from one op to the other.
|
|
1780
|
+
*
|
|
1781
|
+
* delta.create().insert('a').append(delta.create().insert('b')) // => insert "ab"
|
|
1782
|
+
*
|
|
1783
|
+
* @template {DeltaAny} OtherDelta
|
|
1784
|
+
* @param {OtherDelta} other
|
|
1785
|
+
* @return {CastToDelta<OtherDelta> extends Delta<any,any,infer OtherChildren,infer OtherText,any> ? DeltaBuilder<NodeName,Attrs,Children|OtherChildren,Text|OtherText,Schema> : never}
|
|
1786
|
+
*/
|
|
1787
|
+
append (other) {
|
|
1788
|
+
const children = this.children;
|
|
1789
|
+
const prevLast = children.end;
|
|
1790
|
+
// @todo Investigate. Above is a typescript issue. It is necessary to cast OtherDelta to a Delta first before
|
|
1791
|
+
// inferring type, otherwise Children will contain Text.
|
|
1792
|
+
for (const child of other.children) {
|
|
1793
|
+
list.pushEnd(children, child.clone());
|
|
1794
|
+
}
|
|
1795
|
+
this.childCnt += other.childCnt;
|
|
1796
|
+
prevLast?.next && tryMergeWithPrev(children, prevLast.next);
|
|
1797
|
+
// @ts-ignore
|
|
1798
|
+
return this
|
|
1799
|
+
}
|
|
1746
1800
|
}
|
|
1747
1801
|
|
|
1802
|
+
/**
|
|
1803
|
+
* @param {ChildrenOpAny} op
|
|
1804
|
+
* @param {{[k:string]:any}} formatUpdate
|
|
1805
|
+
*/
|
|
1806
|
+
const updateOpFormat = (op, formatUpdate) => {
|
|
1807
|
+
if (!$deleteOp.check(op)) {
|
|
1808
|
+
// apply formatting attributes
|
|
1809
|
+
for (const k in formatUpdate) {
|
|
1810
|
+
const v = formatUpdate[k];
|
|
1811
|
+
if (v != null || $retainOp.check(op)) {
|
|
1812
|
+
// never modify formats
|
|
1813
|
+
/** @type {any} */ (op).format = object.assign({}, op.format, { [k]: v });
|
|
1814
|
+
} else if (op.format != null) {
|
|
1815
|
+
const { [k]: _, ...rest } = op.format
|
|
1816
|
+
;/** @type {any} */ (op).format = rest;
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
};
|
|
1821
|
+
|
|
1822
|
+
/**
|
|
1823
|
+
* @template {DeltaAny} D
|
|
1824
|
+
* @typedef {D extends DeltaBuilder<infer N,infer Attrs,infer Children,infer Text,infer Schema> ? Delta<N,Attrs,Children,Text,Schema> : D} CastToDelta
|
|
1825
|
+
*/
|
|
1826
|
+
|
|
1748
1827
|
/**
|
|
1749
1828
|
* @template {string} NodeName
|
|
1750
1829
|
* @template {{ [key: string|number]: any }} [Attrs={}]
|
|
1751
|
-
* @template {
|
|
1830
|
+
* @template {fingerprintTrait.Fingerprintable|never} [Children=never]
|
|
1752
1831
|
* @template {string|never} [Text=never]
|
|
1753
1832
|
* @typedef {Delta<NodeName,Attrs,Children|Delta<NodeName,Attrs,Children,Text>|RecursiveDelta<NodeName,Attrs,Children,Text>,Text>} RecursiveDelta
|
|
1754
1833
|
*/
|
|
1755
1834
|
|
|
1756
1835
|
/**
|
|
1836
|
+
* @template {string} Name
|
|
1837
|
+
* @template {{[k:string|number]:any}} Attrs
|
|
1838
|
+
* @template {fingerprintTrait.Fingerprintable} Children
|
|
1839
|
+
* @template {boolean} HasText
|
|
1840
|
+
* @template {{ [k:string]:any }} Formats
|
|
1841
|
+
* @template {boolean} Recursive
|
|
1842
|
+
* @extends {s.Schema<Delta<
|
|
1843
|
+
* Name,
|
|
1844
|
+
* Attrs,
|
|
1845
|
+
* Children|(Recursive extends true ? RecursiveDelta<Name,Attrs,Children,HasText extends true ? string : never> : never),
|
|
1846
|
+
* HasText extends true ? string : never,
|
|
1847
|
+
* any>>}
|
|
1848
|
+
*/
|
|
1849
|
+
class $Delta extends schema.Schema {
|
|
1850
|
+
/**
|
|
1851
|
+
* @param {s.Schema<Name>} $name
|
|
1852
|
+
* @param {s.Schema<Attrs>} $attrs
|
|
1853
|
+
* @param {s.Schema<Children>} $children
|
|
1854
|
+
* @param {HasText} hasText
|
|
1855
|
+
* @param {s.Schema<Formats>} $formats
|
|
1856
|
+
* @param {Recursive} recursive
|
|
1857
|
+
*/
|
|
1858
|
+
constructor ($name, $attrs, $children, hasText, $formats, recursive) {
|
|
1859
|
+
super();
|
|
1860
|
+
const $attrsPartial = schema.$$object.check($attrs) ? $attrs.partial : $attrs;
|
|
1861
|
+
if (recursive) {
|
|
1862
|
+
// @ts-ignore
|
|
1863
|
+
$children = schema.$union($children, this);
|
|
1864
|
+
}
|
|
1865
|
+
this.shape = { $name, $attrs: $attrsPartial, $children, hasText, $formats };
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
/**
|
|
1869
|
+
* @param {any} o
|
|
1870
|
+
* @param {s.ValidationError} [err]
|
|
1871
|
+
* @return {o is Delta<
|
|
1872
|
+
* Name,
|
|
1873
|
+
* Attrs,
|
|
1874
|
+
* Children|(Recursive extends true ? RecursiveDelta<Name,Attrs,Children,HasText extends true ? string : never> : never),
|
|
1875
|
+
* HasText extends true ? string : never,
|
|
1876
|
+
* any>}
|
|
1877
|
+
*/
|
|
1878
|
+
check (o, err = undefined) {
|
|
1879
|
+
const { $name, $attrs, $children, hasText, $formats } = this.shape;
|
|
1880
|
+
if (!(o instanceof Delta)) {
|
|
1881
|
+
err?.extend(null, 'Delta', o?.constructor.name, 'Constructor match failed');
|
|
1882
|
+
} else if (o.name != null && !$name.check(o.name, err)) {
|
|
1883
|
+
err?.extend('Delta.name', $name.toString(), o.name, 'Unexpected node name');
|
|
1884
|
+
} else if (list.toArray(o.children).some(c => (!hasText && $textOp.check(c)) || (hasText && $textOp.check(c) && c.format != null && !$formats.check(c.format)) || ($insertOp.check(c) && !c.insert.every(ins => $children.check(ins))))) {
|
|
1885
|
+
err?.extend('Delta.children', '', '', 'Children don\'t match the schema');
|
|
1886
|
+
} else if (object.some(o.attrs, (op, k) => $insertOp.check(op) && !$attrs.check({ [k]: op.value }, err))) {
|
|
1887
|
+
err?.extend('Delta.attrs', '', '', 'Attrs don\'t match the schema');
|
|
1888
|
+
} else {
|
|
1889
|
+
return true
|
|
1890
|
+
}
|
|
1891
|
+
return false
|
|
1892
|
+
}
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
/**
|
|
1896
|
+
* @template {s.Schema<string>|string|Array<string>} [NodeNameSchema=s.Schema<any>]
|
|
1897
|
+
* @template {s.Schema<{ [key: string|number]: any }>|{ [key:string|number]:any }} [AttrsSchema=s.Schema<{}>]
|
|
1898
|
+
* @template {any} [ChildrenSchema=s.Schema<never>]
|
|
1899
|
+
* @template {boolean} [HasText=false]
|
|
1900
|
+
* @template {boolean} [Recursive=false]
|
|
1901
|
+
* @template {{ [k:string]:any }} [Formats={[k:string]:any}]
|
|
1902
|
+
* @param {object} opts
|
|
1903
|
+
* @param {NodeNameSchema?} [opts.name]
|
|
1904
|
+
* @param {AttrsSchema?} [opts.attrs] What key-value pairs are included.
|
|
1905
|
+
* @param {ChildrenSchema?} [opts.children] The type of content in `insertOp`
|
|
1906
|
+
* @param {HasText} [opts.text] Whether this delta contains text using `textOp`
|
|
1907
|
+
* @param {Formats} [opts.formats]
|
|
1908
|
+
* @param {Recursive} [opts.recursive]
|
|
1909
|
+
* @return {[s.Unwrap<s.ReadSchema<NodeNameSchema>>,s.Unwrap<s.ReadSchema<AttrsSchema>>,s.Unwrap<s.ReadSchema<ChildrenSchema>>] extends [infer NodeName, infer Attrs, infer Children] ? s.Schema<Delta<
|
|
1910
|
+
* NodeName,
|
|
1911
|
+
* Attrs,
|
|
1912
|
+
* Children|(Recursive extends true ? RecursiveDelta<NodeName,Attrs,Children,HasText extends true ? string : never> : never),
|
|
1913
|
+
* HasText extends true ? string : never
|
|
1914
|
+
* >> : never}
|
|
1915
|
+
*/
|
|
1916
|
+
const $delta = ({ name, attrs, children, text, formats, recursive }) => /** @type {any} */ (new $Delta(
|
|
1917
|
+
name == null ? schema.$any : schema.$(name),
|
|
1918
|
+
/** @type {any} */ (attrs == null ? schema.$object({}) : schema.$(attrs)),
|
|
1919
|
+
/** @type {any} */ (children == null ? schema.$never : schema.$(children)),
|
|
1920
|
+
text ?? false,
|
|
1921
|
+
formats == null ? schema.$any : schema.$(formats),
|
|
1922
|
+
recursive ?? false
|
|
1923
|
+
));
|
|
1924
|
+
|
|
1925
|
+
const $$delta = schema.$constructedBy($Delta);
|
|
1926
|
+
|
|
1927
|
+
/**
|
|
1928
|
+
* @todo remove this
|
|
1929
|
+
*
|
|
1757
1930
|
* @template {s.Schema<string>|string|Array<string>} [NodeNameSchema=s.Schema<any>]
|
|
1758
1931
|
* @template {s.Schema<{ [key: string|number]: any }>|{ [key:string|number]:any }} [AttrsSchema=s.Schema<{}>]
|
|
1759
1932
|
* @template {any} [ChildrenSchema=s.Schema<never>]
|
|
@@ -1772,7 +1945,7 @@ class DeltaBuilder extends Delta {
|
|
|
1772
1945
|
* HasText extends true ? string : never
|
|
1773
1946
|
* >> : never}
|
|
1774
1947
|
*/
|
|
1775
|
-
const $delta = ({ name, attrs, children, text, recursive }) => {
|
|
1948
|
+
const _$delta = ({ name, attrs, children, text, recursive }) => {
|
|
1776
1949
|
/**
|
|
1777
1950
|
* @type {s.Schema<Array<any>>}
|
|
1778
1951
|
*/
|
|
@@ -1804,6 +1977,11 @@ const $delta = ({ name, attrs, children, text, recursive }) => {
|
|
|
1804
1977
|
*/
|
|
1805
1978
|
const $deltaAny = /** @type {any} */ (schema.$instanceOf(Delta));
|
|
1806
1979
|
|
|
1980
|
+
/**
|
|
1981
|
+
* @type {s.Schema<DeltaBuilderAny>}
|
|
1982
|
+
*/
|
|
1983
|
+
const $deltaBuilderAny = /** @type {any} */ (schema.$instanceOf(DeltaBuilder));
|
|
1984
|
+
|
|
1807
1985
|
/**
|
|
1808
1986
|
* Helper function to merge attribution and attributes. The latter input "wins".
|
|
1809
1987
|
*
|
|
@@ -1811,7 +1989,9 @@ const $deltaAny = /** @type {any} */ (schema.$instanceOf(Delta));
|
|
|
1811
1989
|
* @param {T | null} a
|
|
1812
1990
|
* @param {T | null} b
|
|
1813
1991
|
*/
|
|
1814
|
-
const mergeAttrs = (a, b) => object.isEmpty(a)
|
|
1992
|
+
const mergeAttrs = (a, b) => object.isEmpty(a)
|
|
1993
|
+
? (object.isEmpty(b) ? null : b)
|
|
1994
|
+
: (object.isEmpty(b) ? a : object.assign({}, a, b));
|
|
1815
1995
|
|
|
1816
1996
|
/**
|
|
1817
1997
|
* @template {DeltaAny|null} D
|
|
@@ -1828,6 +2008,35 @@ const mergeDeltas = (a, b) => {
|
|
|
1828
2008
|
return a == null ? b : (a || null)
|
|
1829
2009
|
};
|
|
1830
2010
|
|
|
2011
|
+
/**
|
|
2012
|
+
* @template {DeltaAny} D
|
|
2013
|
+
* @param {prng.PRNG} gen
|
|
2014
|
+
* @param {s.Schema<D>} $d
|
|
2015
|
+
* @return {D extends Delta<infer NodeName,infer Attrs,infer Children,infer Text,infer Schema> ? DeltaBuilder<NodeName,Attrs,Children,Text,Schema> : never}
|
|
2016
|
+
*/
|
|
2017
|
+
const random = (gen, $d) => {
|
|
2018
|
+
const { $name, $attrs, $children, hasText, $formats: $formats_ } = /** @type {$Delta<any,any,any,boolean,any,any>} */ (/** @type {any} */ ($d)).shape;
|
|
2019
|
+
const d = schema.$$any.check($name) ? create($deltaAny) : create(schema.random(gen, $name), $deltaAny);
|
|
2020
|
+
const $formats = schema.$$any.check($formats_) ? schema.$null : $formats_;
|
|
2021
|
+
prng.bool(gen) && d.setMany(schema.random(gen, $attrs));
|
|
2022
|
+
for (let i = prng.uint32(gen, 0, 5); i > 0; i--) {
|
|
2023
|
+
if (hasText && prng.bool(gen)) {
|
|
2024
|
+
d.insert(prng.word(gen), schema.random(gen, $formats));
|
|
2025
|
+
} else if (!schema.$$never.check($children)) {
|
|
2026
|
+
/**
|
|
2027
|
+
* @type {Array<any>}
|
|
2028
|
+
*/
|
|
2029
|
+
const ins = [];
|
|
2030
|
+
let insN = prng.int32(gen, 0, 5);
|
|
2031
|
+
while (insN--) {
|
|
2032
|
+
ins.push(schema.random(gen, $children));
|
|
2033
|
+
}
|
|
2034
|
+
d.insert(ins, schema.random(gen, $formats));
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
return /** @type {any} */ (d)
|
|
2038
|
+
};
|
|
2039
|
+
|
|
1831
2040
|
/**
|
|
1832
2041
|
* @overload
|
|
1833
2042
|
* @return {DeltaBuilder<any,{},never,never,null>}
|
|
@@ -1888,12 +2097,12 @@ const create = (nodeNameOrSchema, attrsOrSchema, children) => {
|
|
|
1888
2097
|
// DELTA TEXT
|
|
1889
2098
|
|
|
1890
2099
|
/**
|
|
1891
|
-
* @template {
|
|
2100
|
+
* @template {fingerprintTrait.Fingerprintable} [Embeds=never]
|
|
1892
2101
|
* @typedef {Delta<any,{},Embeds,string>} TextDelta
|
|
1893
2102
|
*/
|
|
1894
2103
|
|
|
1895
2104
|
/**
|
|
1896
|
-
* @template {
|
|
2105
|
+
* @template {fingerprintTrait.Fingerprintable} [Embeds=never]
|
|
1897
2106
|
* @typedef {DeltaBuilder<any,{},Embeds,string>} TextDeltaBuilder
|
|
1898
2107
|
*/
|
|
1899
2108
|
|
|
@@ -1913,12 +2122,12 @@ const $textOnly = $text();
|
|
|
1913
2122
|
const text = $schema => /** @type {any} */ (create($schema || $textOnly));
|
|
1914
2123
|
|
|
1915
2124
|
/**
|
|
1916
|
-
* @template {
|
|
2125
|
+
* @template {fingerprintTrait.Fingerprintable} Children
|
|
1917
2126
|
* @typedef {Delta<any,{},Children,never>} ArrayDelta
|
|
1918
2127
|
*/
|
|
1919
2128
|
|
|
1920
2129
|
/**
|
|
1921
|
-
* @template {
|
|
2130
|
+
* @template {fingerprintTrait.Fingerprintable} Children
|
|
1922
2131
|
* @typedef {DeltaBuilder<any,{},Children,never>} ArrayDeltaBuilder
|
|
1923
2132
|
*/
|
|
1924
2133
|
|
|
@@ -1964,7 +2173,7 @@ const map = $schema => /** @type {any} */ (create(/** @type {any} */ ($schema)))
|
|
|
1964
2173
|
* @template {DeltaAny} D
|
|
1965
2174
|
* @param {D} d1
|
|
1966
2175
|
* @param {NoInfer<D>} d2
|
|
1967
|
-
* @return {D}
|
|
2176
|
+
* @return {D extends Delta<infer N,infer Attrs,infer Children,infer Text,any> ? DeltaBuilder<N,Attrs,Children,Text,null> : never}
|
|
1968
2177
|
*/
|
|
1969
2178
|
const diff = (d1, d2) => {
|
|
1970
2179
|
/**
|
|
@@ -2015,32 +2224,136 @@ const diff = (d1, d2) => {
|
|
|
2015
2224
|
d.retain(change.index - lastIndex1);
|
|
2016
2225
|
// insert minimal diff at curred position in d
|
|
2017
2226
|
/**
|
|
2018
|
-
*
|
|
2227
|
+
*
|
|
2228
|
+
* @todo it would be better if these would be slices of delta (an actual delta)
|
|
2229
|
+
*
|
|
2019
2230
|
* @param {ChildrenOpAny[]} opsIs
|
|
2020
2231
|
* @param {ChildrenOpAny[]} opsShould
|
|
2021
|
-
*
|
|
2022
2232
|
*/
|
|
2023
|
-
const diffAndApply = (
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2233
|
+
const diffAndApply = (opsIs, opsShould) => {
|
|
2234
|
+
const d = create();
|
|
2235
|
+
// @todo unoptimized implementation. Convert content to array and diff that based on
|
|
2236
|
+
// generated fingerprints. We probably could do better and cache more information.
|
|
2237
|
+
// - benchmark
|
|
2238
|
+
// - cache fingerprints in ops
|
|
2239
|
+
/**
|
|
2240
|
+
* @type {Array<string|DeltaAny|fingerprintTrait.Fingerprintable>}
|
|
2241
|
+
*/
|
|
2242
|
+
const isContent = opsIs.flatMap(op => $insertOp.check(op) ? op.insert : ($textOp.check(op) ? op.insert.split('') : error.unexpectedCase()));
|
|
2243
|
+
/**
|
|
2244
|
+
* @type {Array<string|DeltaAny|fingerprintTrait.Fingerprintable>}
|
|
2245
|
+
*/
|
|
2246
|
+
const shouldContent = opsShould.flatMap(op => $insertOp.check(op) ? op.insert : ($textOp.check(op) ? op.insert.split('') : error.unexpectedCase()));
|
|
2247
|
+
const isContentFingerprinted = isContent.map(c => schema.$string.check(c) ? c : fingerprint.fingerprint(c));
|
|
2248
|
+
const shouldContentFingerprinted = shouldContent.map(c => schema.$string.check(c) ? c : fingerprint.fingerprint(c));
|
|
2249
|
+
const hasFormatting = opsIs.some(op => !$deleteOp.check(op) && op.format != null) || opsShould.some(op => !$deleteOp.check(op) && op.format != null);
|
|
2250
|
+
/**
|
|
2251
|
+
* @type {{ index: number, insert: Array<string|DeltaAny|fingerprintTrait.Fingerprintable>, remove: Array<string|DeltaAny|fingerprintTrait.Fingerprintable> }[]}
|
|
2252
|
+
*/
|
|
2253
|
+
const cdiff = patience.diff(isContentFingerprinted, shouldContentFingerprinted);
|
|
2254
|
+
// overwrite fingerprinted content with actual content
|
|
2255
|
+
for (let i = 0, adj = 0; i < cdiff.length; i++) {
|
|
2256
|
+
const cd = cdiff[i];
|
|
2257
|
+
cd.remove = isContent.slice(cd.index, cd.index + cd.remove.length);
|
|
2258
|
+
cd.insert = shouldContent.slice(cd.index + adj, cd.index + adj + cd.insert.length);
|
|
2259
|
+
adj += cd.remove.length - cd.insert.length;
|
|
2260
|
+
}
|
|
2261
|
+
for (let i = 0, lastIndex = 0; i < cdiff.length; i++) {
|
|
2262
|
+
const cd = cdiff[i];
|
|
2263
|
+
d.retain(cd.index - lastIndex);
|
|
2264
|
+
let cdii = 0;
|
|
2265
|
+
let cdri = 0;
|
|
2266
|
+
// try to match as much content as possible, preferring to skip over non-deltas
|
|
2267
|
+
for (; cdii < cd.insert.length && cdri < cd.remove.length;) {
|
|
2268
|
+
const a = cd.insert[cdii];
|
|
2269
|
+
const b = cd.remove[cdri];
|
|
2270
|
+
if ($deltaAny.check(a) && $deltaAny.check(b) && a.name === b.name) {
|
|
2271
|
+
d.modify(diff(b, a));
|
|
2272
|
+
cdii++;
|
|
2273
|
+
cdri++;
|
|
2274
|
+
} else if ($deltaAny.check(b)) {
|
|
2275
|
+
d.insert(schema.$string.check(a) ? a : [a]);
|
|
2276
|
+
cdii++;
|
|
2277
|
+
} else {
|
|
2278
|
+
d.delete(1);
|
|
2279
|
+
cdri++;
|
|
2280
|
+
}
|
|
2031
2281
|
}
|
|
2032
|
-
|
|
2282
|
+
for (; cdii < cd.insert.length; cdii++) {
|
|
2283
|
+
const a = cd.insert[cdii];
|
|
2284
|
+
d.insert(schema.$string.check(a) ? a : [a]);
|
|
2285
|
+
}
|
|
2286
|
+
d.delete(cd.remove.length - cdri);
|
|
2287
|
+
}
|
|
2288
|
+
// create the diff for formatting
|
|
2289
|
+
if (hasFormatting) {
|
|
2290
|
+
const formattingDiff = create();
|
|
2291
|
+
// update opsIs with content diff. then we can figure out the formatting diff.
|
|
2292
|
+
const isUpdated = create();
|
|
2293
|
+
// copy opsIs to fresh delta
|
|
2294
|
+
opsIs.forEach(op => {
|
|
2295
|
+
isUpdated.childCnt += op.length;
|
|
2296
|
+
list.pushEnd(isUpdated.children, op.clone());
|
|
2297
|
+
});
|
|
2298
|
+
isUpdated.apply(d);
|
|
2299
|
+
let shouldI = 0;
|
|
2300
|
+
let shouldOffset = 0;
|
|
2301
|
+
let isOp = isUpdated.children.start;
|
|
2302
|
+
let isOffset = 0;
|
|
2303
|
+
while (shouldI < opsShould.length && isOp != null) {
|
|
2304
|
+
const shouldOp = opsShould[shouldI];
|
|
2305
|
+
if (!$deleteOp.check(shouldOp) && !$deleteOp.check(isOp)) {
|
|
2306
|
+
const isFormat = isOp.format;
|
|
2307
|
+
const minForward = math.min(shouldOp.length - shouldOffset, isOp.length - isOffset);
|
|
2308
|
+
shouldOffset += minForward;
|
|
2309
|
+
isOffset += minForward;
|
|
2310
|
+
if (_function.equalityDeep(shouldOp.format, isFormat)) {
|
|
2311
|
+
formattingDiff.retain(minForward);
|
|
2312
|
+
} else {
|
|
2313
|
+
/**
|
|
2314
|
+
* @type {FormattingAttributes}
|
|
2315
|
+
*/
|
|
2316
|
+
const fupdate = {};
|
|
2317
|
+
shouldOp.format != null && object.forEach(shouldOp.format, (v, k) => {
|
|
2318
|
+
if (!_function.equalityDeep(v, isFormat?.[k] || null)) {
|
|
2319
|
+
fupdate[k] = v;
|
|
2320
|
+
}
|
|
2321
|
+
});
|
|
2322
|
+
isFormat && object.forEach(isFormat, (_, k) => {
|
|
2323
|
+
if (shouldOp?.format?.[k] === undefined) {
|
|
2324
|
+
fupdate[k] = null;
|
|
2325
|
+
}
|
|
2326
|
+
});
|
|
2327
|
+
formattingDiff.retain(minForward, fupdate);
|
|
2328
|
+
}
|
|
2329
|
+
// update offset and iterators
|
|
2330
|
+
if (shouldOffset >= shouldOp.length) {
|
|
2331
|
+
shouldI++;
|
|
2332
|
+
shouldOffset = 0;
|
|
2333
|
+
}
|
|
2334
|
+
if (isOffset >= isOp.length) {
|
|
2335
|
+
isOp = isOp.next;
|
|
2336
|
+
isOffset = 0;
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
d.apply(formattingDiff);
|
|
2341
|
+
}
|
|
2342
|
+
return d
|
|
2033
2343
|
};
|
|
2034
|
-
diffAndApply(
|
|
2344
|
+
const subd = diffAndApply(ops1.slice(change.index, change.index + change.remove.length), ops2.slice(change.index + currIndexOffset2, change.index + currIndexOffset2 + change.insert.length));
|
|
2345
|
+
d.append(subd);
|
|
2035
2346
|
lastIndex1 = change.index + change.remove.length;
|
|
2036
2347
|
currIndexOffset2 += change.insert.length - change.remove.length;
|
|
2037
2348
|
}
|
|
2038
2349
|
for (const attr2 of d2.attrs) {
|
|
2039
2350
|
const attr1 = d1.attrs[attr2.key];
|
|
2040
2351
|
if (attr1 == null || (attr1.fingerprint !== attr2.fingerprint)) {
|
|
2352
|
+
/* c8 ignore else */
|
|
2041
2353
|
if ($insertOp.check(attr2)) {
|
|
2042
2354
|
d.set(attr2.key, attr2.value);
|
|
2043
2355
|
} else {
|
|
2356
|
+
/* c8 ignore next 2 */
|
|
2044
2357
|
error.unexpectedCase();
|
|
2045
2358
|
}
|
|
2046
2359
|
}
|
|
@@ -2051,15 +2364,18 @@ const diff = (d1, d2) => {
|
|
|
2051
2364
|
}
|
|
2052
2365
|
}
|
|
2053
2366
|
}
|
|
2054
|
-
return /** @type {
|
|
2367
|
+
return /** @type {any} */ (d.done(false))
|
|
2055
2368
|
};
|
|
2056
2369
|
|
|
2370
|
+
exports.$$delta = $$delta;
|
|
2371
|
+
exports.$Delta = $Delta;
|
|
2057
2372
|
exports.$anyOp = $anyOp;
|
|
2058
2373
|
exports.$array = $array;
|
|
2059
2374
|
exports.$attribution = $attribution;
|
|
2060
2375
|
exports.$deleteOp = $deleteOp;
|
|
2061
2376
|
exports.$delta = $delta;
|
|
2062
2377
|
exports.$deltaAny = $deltaAny;
|
|
2378
|
+
exports.$deltaBuilderAny = $deltaBuilderAny;
|
|
2063
2379
|
exports.$deltaMapChangeJson = $deltaMapChangeJson;
|
|
2064
2380
|
exports.$insertOp = $insertOp;
|
|
2065
2381
|
exports.$insertOpWith = $insertOpWith;
|
|
@@ -2080,6 +2396,7 @@ exports.InsertOp = InsertOp;
|
|
|
2080
2396
|
exports.ModifyOp = ModifyOp;
|
|
2081
2397
|
exports.RetainOp = RetainOp;
|
|
2082
2398
|
exports.TextOp = TextOp;
|
|
2399
|
+
exports._$delta = _$delta;
|
|
2083
2400
|
exports.array = array;
|
|
2084
2401
|
exports.clone = clone;
|
|
2085
2402
|
exports.create = create;
|
|
@@ -2087,5 +2404,6 @@ exports.diff = diff;
|
|
|
2087
2404
|
exports.map = map;
|
|
2088
2405
|
exports.mergeAttrs = mergeAttrs;
|
|
2089
2406
|
exports.mergeDeltas = mergeDeltas;
|
|
2407
|
+
exports.random = random;
|
|
2090
2408
|
exports.text = text;
|
|
2091
|
-
//# sourceMappingURL=
|
|
2409
|
+
//# sourceMappingURL=delta.cjs.map
|