lib0 0.2.115-4 → 0.2.115-5

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.
Files changed (235) hide show
  1. package/coverage/tmp/coverage-42121-1764767245409-0.json +1 -0
  2. package/coverage/tmp/{coverage-32703-1763495370274-0.json → coverage-42122-1764767192180-0.json} +1 -1
  3. package/delta/binding.d.ts +11 -9
  4. package/delta/binding.d.ts.map +1 -1
  5. package/delta/binding.js +5 -2
  6. package/delta/binding.test.d.ts.map +1 -1
  7. package/delta/delta-pitch.test.d.ts +5 -0
  8. package/delta/delta-pitch.test.d.ts.map +1 -0
  9. package/delta/{d2.d.ts → delta.d.ts} +117 -34
  10. package/delta/delta.d.ts.map +1 -0
  11. package/delta/{d2.js → delta.js} +244 -53
  12. package/delta/{d2.test.d.ts → delta.test.d.ts} +6 -1
  13. package/delta/delta.test.d.ts.map +1 -0
  14. package/delta/t3.test.d.ts +1 -1
  15. package/delta/t3.test.d.ts.map +1 -1
  16. package/dist/array.cjs +17 -60
  17. package/dist/array.cjs.map +1 -1
  18. package/dist/binding.cjs +114 -28
  19. package/dist/binding.cjs.map +1 -1
  20. package/dist/{broadcastchannel-d0c108a2.cjs → broadcastchannel-94897809.cjs} +2 -2
  21. package/dist/{broadcastchannel-d0c108a2.cjs.map → broadcastchannel-94897809.cjs.map} +1 -1
  22. package/dist/broadcastchannel.cjs +6 -6
  23. package/dist/{buffer-7f6fa8fa.cjs → buffer-8d110bf4.cjs} +2 -2
  24. package/dist/{buffer-7f6fa8fa.cjs.map → buffer-8d110bf4.cjs.map} +1 -1
  25. package/dist/buffer.cjs +5 -5
  26. package/dist/cache.cjs +3 -3
  27. package/dist/component.cjs +12 -8
  28. package/dist/component.cjs.map +1 -1
  29. package/dist/delta/binding.d.ts +11 -9
  30. package/dist/delta/binding.d.ts.map +1 -1
  31. package/dist/delta/binding.test.d.ts.map +1 -1
  32. package/dist/delta/delta-pitch.test.d.ts +5 -0
  33. package/dist/delta/delta-pitch.test.d.ts.map +1 -0
  34. package/dist/delta/{d2.d.ts → delta.d.ts} +117 -34
  35. package/dist/delta/delta.d.ts.map +1 -0
  36. package/dist/delta/{d2.test.d.ts → delta.test.d.ts} +6 -1
  37. package/dist/delta/delta.test.d.ts.map +1 -0
  38. package/dist/delta/t3.test.d.ts +1 -1
  39. package/dist/delta/t3.test.d.ts.map +1 -1
  40. package/dist/{d2.cjs → delta.cjs} +253 -58
  41. package/dist/delta.cjs.map +1 -0
  42. package/dist/{diff-1832cb43.cjs → diff-dc7bdc65.cjs} +2 -2
  43. package/dist/{diff-1832cb43.cjs.map → diff-dc7bdc65.cjs.map} +1 -1
  44. package/dist/diff.cjs +4 -4
  45. package/dist/{dom-f5047a64.cjs → dom-cad267af.cjs} +1 -1
  46. package/dist/{dom-f5047a64.cjs.map → dom-cad267af.cjs.map} +1 -1
  47. package/dist/dom.cjs +12 -5
  48. package/dist/dom.cjs.map +1 -1
  49. package/dist/{environment-90227ead.cjs → environment-98bcf64f.cjs} +2 -2
  50. package/dist/{environment-90227ead.cjs.map → environment-98bcf64f.cjs.map} +1 -1
  51. package/dist/environment.cjs +4 -4
  52. package/dist/equality.cjs +34 -0
  53. package/dist/equality.cjs.map +1 -0
  54. package/dist/fingerprint.cjs +44 -0
  55. package/dist/fingerprint.cjs.map +1 -0
  56. package/dist/{function-e7d18feb.cjs → function-b4e49016.cjs} +6 -6
  57. package/dist/function-b4e49016.cjs.map +1 -0
  58. package/dist/function.cjs +3 -3
  59. package/dist/index.cjs +9 -9
  60. package/dist/indexeddbV2.cjs +2 -2
  61. package/dist/jwt.cjs +5 -5
  62. package/dist/list.cjs +18 -5
  63. package/dist/list.cjs.map +1 -1
  64. package/dist/list.d.ts +9 -2
  65. package/dist/list.d.ts.map +1 -1
  66. package/dist/list.test.d.ts.map +1 -1
  67. package/dist/logging.cjs +11 -5
  68. package/dist/logging.cjs.map +1 -1
  69. package/dist/logging.common.cjs +4 -4
  70. package/dist/logging.node.cjs +4 -4
  71. package/dist/map.cjs +7 -314
  72. package/dist/map.cjs.map +1 -1
  73. package/dist/{object-18980796.cjs → object-dec41ef9.cjs} +3 -3
  74. package/dist/object-dec41ef9.cjs.map +1 -0
  75. package/dist/object.cjs +2 -2
  76. package/dist/object.d.ts.map +1 -1
  77. package/dist/performance.node.cjs +3 -3
  78. package/dist/pledge.cjs +2 -2
  79. package/dist/{prng-99204216.cjs → prng-aa81e812.cjs} +2 -2
  80. package/dist/{prng-99204216.cjs.map → prng-aa81e812.cjs.map} +1 -1
  81. package/dist/prng.cjs +6 -6
  82. package/dist/rabin-gf2-polynomial.cjs +5 -5
  83. package/dist/rabin-uncached.cjs +5 -5
  84. package/dist/rabin.cjs +5 -5
  85. package/dist/schema.cjs +202 -22
  86. package/dist/schema.cjs.map +1 -1
  87. package/dist/schema.d.ts +86 -29
  88. package/dist/schema.d.ts.map +1 -1
  89. package/dist/schema.test.d.ts +4 -0
  90. package/dist/schema.test.d.ts.map +1 -1
  91. package/dist/testing.cjs +9 -9
  92. package/dist/testing.cjs.map +1 -1
  93. package/dist/{traits.d.ts → trait/equality.d.ts} +1 -1
  94. package/dist/trait/equality.d.ts.map +1 -0
  95. package/dist/trait/fingerprint.d.ts +13 -0
  96. package/dist/trait/fingerprint.d.ts.map +1 -0
  97. package/dist/trait/traits.d.ts +3 -0
  98. package/dist/trait/traits.d.ts.map +1 -0
  99. package/dist/trait/traits.test.d.ts +5 -0
  100. package/dist/trait/traits.test.d.ts.map +1 -0
  101. package/dist/traits.cjs +23 -26
  102. package/dist/traits.cjs.map +1 -1
  103. package/dist/url.cjs +2 -2
  104. package/function.js +4 -4
  105. package/list.d.ts +9 -2
  106. package/list.d.ts.map +1 -1
  107. package/list.js +17 -3
  108. package/list.test.d.ts.map +1 -1
  109. package/object.d.ts.map +1 -1
  110. package/object.js +2 -2
  111. package/package.json +8 -10
  112. package/schema.d.ts +86 -29
  113. package/schema.d.ts.map +1 -1
  114. package/schema.js +191 -20
  115. package/schema.test.d.ts +4 -0
  116. package/schema.test.d.ts.map +1 -1
  117. package/test.html +2 -4
  118. package/test.js +7 -13
  119. package/testing.js +3 -3
  120. package/{traits.d.ts → trait/equality.d.ts} +1 -1
  121. package/trait/equality.d.ts.map +1 -0
  122. package/trait/fingerprint.d.ts +13 -0
  123. package/trait/fingerprint.d.ts.map +1 -0
  124. package/trait/fingerprint.js +21 -0
  125. package/trait/traits.d.ts +3 -0
  126. package/trait/traits.d.ts.map +1 -0
  127. package/trait/traits.js +2 -0
  128. package/trait/traits.test.d.ts +5 -0
  129. package/{traits.test.d.ts.map → trait/traits.test.d.ts.map} +1 -1
  130. package/delta/abstract-array.d.ts +0 -166
  131. package/delta/abstract-array.d.ts.map +0 -1
  132. package/delta/abstract-array.js +0 -421
  133. package/delta/abstract.d.ts +0 -69
  134. package/delta/abstract.d.ts.map +0 -1
  135. package/delta/abstract.js +0 -102
  136. package/delta/array.d.ts +0 -23
  137. package/delta/array.d.ts.map +0 -1
  138. package/delta/array.js +0 -45
  139. package/delta/array.test.d.ts +0 -2
  140. package/delta/array.test.d.ts.map +0 -1
  141. package/delta/d2.d.ts.map +0 -1
  142. package/delta/d2.test.d.ts.map +0 -1
  143. package/delta/index.d.ts +0 -14
  144. package/delta/index.d.ts.map +0 -1
  145. package/delta/index.js +0 -79
  146. package/delta/map.d.ts +0 -226
  147. package/delta/map.d.ts.map +0 -1
  148. package/delta/map.js +0 -304
  149. package/delta/node.d.ts +0 -117
  150. package/delta/node.d.ts.map +0 -1
  151. package/delta/node.js +0 -183
  152. package/delta/node.test.d.ts +0 -4
  153. package/delta/node.test.d.ts.map +0 -1
  154. package/delta/ops.d.ts +0 -464
  155. package/delta/ops.d.ts.map +0 -1
  156. package/delta/ops.js +0 -544
  157. package/delta/t2.d.ts +0 -184
  158. package/delta/t2.d.ts.map +0 -1
  159. package/delta/t2.js +0 -890
  160. package/delta/text.d.ts +0 -43
  161. package/delta/text.d.ts.map +0 -1
  162. package/delta/text.js +0 -54
  163. package/delta/text.test.d.ts +0 -6
  164. package/delta/text.test.d.ts.map +0 -1
  165. package/delta/transformer.d.ts +0 -164
  166. package/delta/transformer.d.ts.map +0 -1
  167. package/delta/transformer.js +0 -888
  168. package/delta/transformer.test.d.ts +0 -13
  169. package/delta/transformer.test.d.ts.map +0 -1
  170. package/delta/value.d.ts +0 -84
  171. package/delta/value.d.ts.map +0 -1
  172. package/delta/value.js +0 -168
  173. package/dist/abstract-array.cjs +0 -433
  174. package/dist/abstract-array.cjs.map +0 -1
  175. package/dist/abstract.cjs +0 -122
  176. package/dist/abstract.cjs.map +0 -1
  177. package/dist/array2.cjs +0 -26
  178. package/dist/array2.cjs.map +0 -1
  179. package/dist/d2.cjs.map +0 -1
  180. package/dist/delta/abstract-array.d.ts +0 -166
  181. package/dist/delta/abstract-array.d.ts.map +0 -1
  182. package/dist/delta/abstract.d.ts +0 -69
  183. package/dist/delta/abstract.d.ts.map +0 -1
  184. package/dist/delta/array.d.ts +0 -23
  185. package/dist/delta/array.d.ts.map +0 -1
  186. package/dist/delta/array.test.d.ts +0 -2
  187. package/dist/delta/array.test.d.ts.map +0 -1
  188. package/dist/delta/d2.d.ts.map +0 -1
  189. package/dist/delta/d2.test.d.ts.map +0 -1
  190. package/dist/delta/index.d.ts +0 -14
  191. package/dist/delta/index.d.ts.map +0 -1
  192. package/dist/delta/map.d.ts +0 -226
  193. package/dist/delta/map.d.ts.map +0 -1
  194. package/dist/delta/node.d.ts +0 -117
  195. package/dist/delta/node.d.ts.map +0 -1
  196. package/dist/delta/node.test.d.ts +0 -4
  197. package/dist/delta/node.test.d.ts.map +0 -1
  198. package/dist/delta/ops.d.ts +0 -464
  199. package/dist/delta/ops.d.ts.map +0 -1
  200. package/dist/delta/t2.d.ts +0 -184
  201. package/dist/delta/t2.d.ts.map +0 -1
  202. package/dist/delta/text.d.ts +0 -43
  203. package/dist/delta/text.d.ts.map +0 -1
  204. package/dist/delta/text.test.d.ts +0 -6
  205. package/dist/delta/text.test.d.ts.map +0 -1
  206. package/dist/delta/transformer.d.ts +0 -164
  207. package/dist/delta/transformer.d.ts.map +0 -1
  208. package/dist/delta/transformer.test.d.ts +0 -13
  209. package/dist/delta/transformer.test.d.ts.map +0 -1
  210. package/dist/delta/value.d.ts +0 -84
  211. package/dist/delta/value.d.ts.map +0 -1
  212. package/dist/function-e7d18feb.cjs.map +0 -1
  213. package/dist/index2.cjs +0 -71
  214. package/dist/index2.cjs.map +0 -1
  215. package/dist/map2.cjs +0 -15
  216. package/dist/map2.cjs.map +0 -1
  217. package/dist/node.cjs +0 -206
  218. package/dist/node.cjs.map +0 -1
  219. package/dist/object-18980796.cjs.map +0 -1
  220. package/dist/ops.cjs +0 -575
  221. package/dist/ops.cjs.map +0 -1
  222. package/dist/t2.cjs +0 -932
  223. package/dist/t2.cjs.map +0 -1
  224. package/dist/text.cjs +0 -79
  225. package/dist/text.cjs.map +0 -1
  226. package/dist/traits.d.ts.map +0 -1
  227. package/dist/traits.test.d.ts +0 -4
  228. package/dist/traits.test.d.ts.map +0 -1
  229. package/dist/transformer.cjs +0 -930
  230. package/dist/transformer.cjs.map +0 -1
  231. package/dist/value.cjs +0 -187
  232. package/dist/value.cjs.map +0 -1
  233. package/traits.d.ts.map +0 -1
  234. package/traits.test.d.ts +0 -4
  235. /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-18980796.cjs');
7
- var traits = require('./traits.cjs');
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-e7d18feb.cjs');
10
+ var _function = require('./function-b4e49016.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-7f6fa8fa.cjs');
16
+ var buffer = require('./buffer-8d110bf4.cjs');
16
17
  var patience = require('./patience.cjs');
18
+ var prng = require('./prng-aa81e812.cjs');
17
19
  require('./set-5b47859e.cjs');
18
- require('./environment-90227ead.cjs');
20
+ require('./environment-98bcf64f.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
- [traits.EqualityTraitSymbol] (other) {
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 {encoding.AnyEncodable|DeltaAny} ArrayContent
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
- if ($deltaAny.check(ins)) {
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
- [traits.EqualityTraitSymbol] (other) {
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 {encoding.AnyEncodable|DeltaAny} [Children=never]
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
- [traits.EqualityTraitSymbol] (other) {
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
- [traits.EqualityTraitSymbol] (other) {
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
- [traits.EqualityTraitSymbol] (other) {
580
- return this.value[traits.EqualityTraitSymbol](other.value) && _function.equalityDeep(this.format, other.format) && _function.equalityDeep(this.attribution, other.attribution)
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 {encoding.AnyEncodable|DeltaAny} V
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
- [traits.EqualityTraitSymbol] (other) {
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
- [traits.EqualityTraitSymbol] (other) {
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
- [traits.EqualityTraitSymbol] (other) {
817
- return this.key === other.key && this.value[traits.EqualityTraitSymbol](other.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 {encoding.AnyEncodable|DeltaAny} Content
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 {encoding.AnyEncodable|DeltaAny|never} [Children=never]
921
- * @template {string|never} [Text=never]
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,14 +1031,14 @@ class Delta {
1034
1031
  * @return {boolean}
1035
1032
  */
1036
1033
  equals (other) {
1037
- return this[traits.EqualityTraitSymbol](other)
1034
+ return this[equality.EqualityTraitSymbol](other)
1038
1035
  }
1039
1036
 
1040
1037
  /**
1041
1038
  * @param {any} other
1042
1039
  * @return {boolean}
1043
1040
  */
1044
- [traits.EqualityTraitSymbol] (other) {
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
@@ -1171,8 +1168,8 @@ const modDeltaCheck = d => {
1171
1168
  /**
1172
1169
  * @template {string} [NodeName=any]
1173
1170
  * @template {{[key:string|number]:any}} [Attrs={}]
1174
- * @template {encoding.AnyEncodable|DeltaAny|never} [Children=never]
1175
- * @template {string|never} [Text=never]
1171
+ * @template {fingerprintTrait.Fingerprintable} [Children=never]
1172
+ * @template {string} [Text=never]
1176
1173
  * @template {s.Schema<Delta<any,any,any,any,any>>|null} [Schema=any]
1177
1174
  * @extends {Delta<NodeName,Attrs,Children,Text,Schema>}
1178
1175
  */
@@ -1436,7 +1433,7 @@ class DeltaBuilder extends Delta {
1436
1433
  modDeltaCheck(this);
1437
1434
  this.$schema?.expect(other);
1438
1435
  // apply attrs
1439
- for (let op of other.attrs) {
1436
+ for (const op of other.attrs) {
1440
1437
  const c = /** @type {AttrInsertOp<any,any>|AttrDeleteOp<any>|AttrModifyOp<any,any>} */ (this.attrs[op.key]);
1441
1438
  if ($modifyOp.check(op)) {
1442
1439
  if ($deltaAny.check(c?.value)) {
@@ -1446,12 +1443,14 @@ class DeltaBuilder extends Delta {
1446
1443
  // @ts-ignore
1447
1444
  this.attrs[op.key] = op.clone();
1448
1445
  }
1449
- } else {
1450
- op = /** @type {any} */ (op.clone());
1446
+ } else if ($insertOp.check(op)) {
1451
1447
  // @ts-ignore
1452
1448
  op.prevValue = c?.value;
1453
1449
  // @ts-ignore
1454
- this.attrs[op.key] = op;
1450
+ this.attrs[op.key] = op.clone();
1451
+ } else if ($deleteOp.check(op)) {
1452
+ op.prevValue = c?.value;
1453
+ delete this.attrs[op.key];
1455
1454
  }
1456
1455
  }
1457
1456
  // apply children
@@ -1533,6 +1532,7 @@ class DeltaBuilder extends Delta {
1533
1532
  offset = 0;
1534
1533
  scheduleForMerge(opsI.next);
1535
1534
  list.remove(this.children, opsI);
1535
+ opsI = opsI.next;
1536
1536
  } else if (offset === 0) {
1537
1537
  // case 2
1538
1538
  offset = 0;
@@ -1743,17 +1743,135 @@ class DeltaBuilder extends Delta {
1743
1743
  console.info('method rebaseOnInverse unimplemented');
1744
1744
  return this
1745
1745
  }
1746
+
1747
+ /**
1748
+ * Append child ops from one op to the other.
1749
+ *
1750
+ * delta.create().insert('a').append(delta.create().insert('b')) // => insert "ab"
1751
+ *
1752
+ * @template {DeltaAny} OtherDelta
1753
+ * @param {OtherDelta} other
1754
+ * @return {CastToDelta<OtherDelta> extends Delta<any,any,infer OtherChildren,infer OtherText,any> ? DeltaBuilder<NodeName,Attrs,Children|OtherChildren,Text|OtherText,Schema> : never}
1755
+ */
1756
+ append (other) {
1757
+ // @todo Investigate. Above is a typescript issue. It is necessary to cast OtherDelta to a Delta first before
1758
+ // inferring type, otherwise Children will contain Text.
1759
+ for (const child of other.children) {
1760
+ list.pushEnd(this.children, child.clone());
1761
+ }
1762
+ // @ts-ignore
1763
+ return this
1764
+ }
1746
1765
  }
1747
1766
 
1767
+ /**
1768
+ * @template {DeltaAny} D
1769
+ * @typedef {D extends DeltaBuilder<infer N,infer Attrs,infer Children,infer Text,infer Schema> ? Delta<N,Attrs,Children,Text,Schema> : D} CastToDelta
1770
+ */
1771
+
1748
1772
  /**
1749
1773
  * @template {string} NodeName
1750
1774
  * @template {{ [key: string|number]: any }} [Attrs={}]
1751
- * @template {encoding.AnyEncodable|DeltaAny|never} [Children=never]
1775
+ * @template {fingerprintTrait.Fingerprintable|never} [Children=never]
1752
1776
  * @template {string|never} [Text=never]
1753
1777
  * @typedef {Delta<NodeName,Attrs,Children|Delta<NodeName,Attrs,Children,Text>|RecursiveDelta<NodeName,Attrs,Children,Text>,Text>} RecursiveDelta
1754
1778
  */
1755
1779
 
1756
1780
  /**
1781
+ * @template {string} Name
1782
+ * @template {{[k:string|number]:any}} Attrs
1783
+ * @template {fingerprintTrait.Fingerprintable} Children
1784
+ * @template {boolean} HasText
1785
+ * @template {{ [k:string]:any }} Formats
1786
+ * @template {boolean} Recursive
1787
+ * @extends {s.Schema<Delta<
1788
+ * Name,
1789
+ * Attrs,
1790
+ * Children|(Recursive extends true ? RecursiveDelta<Name,Attrs,Children,HasText extends true ? string : never> : never),
1791
+ * HasText extends true ? string : never,
1792
+ * any>>}
1793
+ */
1794
+ class $Delta extends schema.Schema {
1795
+ /**
1796
+ * @param {s.Schema<Name>} $name
1797
+ * @param {s.Schema<Attrs>} $attrs
1798
+ * @param {s.Schema<Children>} $children
1799
+ * @param {HasText} hasText
1800
+ * @param {s.Schema<Formats>} $formats
1801
+ * @param {Recursive} recursive
1802
+ */
1803
+ constructor ($name, $attrs, $children, hasText, $formats, recursive) {
1804
+ super();
1805
+ const $attrsPartial = schema.$$object.check($attrs) ? $attrs.partial : $attrs;
1806
+ if (recursive) {
1807
+ // @ts-ignore
1808
+ $children = schema.$union($children, this);
1809
+ }
1810
+ this.shape = { $name, $attrs: $attrsPartial, $children, hasText, $formats };
1811
+ }
1812
+
1813
+ /**
1814
+ * @param {any} o
1815
+ * @param {s.ValidationError} [err]
1816
+ * @return {o is Delta<
1817
+ * Name,
1818
+ * Attrs,
1819
+ * Children|(Recursive extends true ? RecursiveDelta<Name,Attrs,Children,HasText extends true ? string : never> : never),
1820
+ * HasText extends true ? string : never,
1821
+ * any>}
1822
+ */
1823
+ check (o, err = undefined) {
1824
+ const { $name, $attrs, $children, hasText, $formats } = this.shape;
1825
+ if (!(o instanceof Delta)) {
1826
+ err?.extend(null, 'Delta', o?.constructor.name, 'Constructor match failed');
1827
+ } else if (!$name.check(o.name, err)) {
1828
+ err?.extend('Delta.name', $name.toString(), o.name, 'Constructor match failed');
1829
+ } 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))))) {
1830
+ err?.extend('Delta.children', '', '', 'Children don\'t match the schema');
1831
+ } else if (object.some(o.attrs, (op, k) => $insertOp.check(op) && !$attrs.check({ [k]: op.value }, err))) {
1832
+ err?.extend('Delta.attrs', '', '', 'Attrs don\'t match the schema');
1833
+ } else {
1834
+ return true
1835
+ }
1836
+ return false
1837
+ }
1838
+ }
1839
+
1840
+ /**
1841
+ * @template {s.Schema<string>|string|Array<string>} [NodeNameSchema=s.Schema<any>]
1842
+ * @template {s.Schema<{ [key: string|number]: any }>|{ [key:string|number]:any }} [AttrsSchema=s.Schema<{}>]
1843
+ * @template {any} [ChildrenSchema=s.Schema<never>]
1844
+ * @template {boolean} [HasText=false]
1845
+ * @template {boolean} [Recursive=false]
1846
+ * @template {{ [k:string]:any }} [Formats={[k:string]:any}]
1847
+ * @param {object} opts
1848
+ * @param {NodeNameSchema?} [opts.name]
1849
+ * @param {AttrsSchema?} [opts.attrs] What key-value pairs are included.
1850
+ * @param {ChildrenSchema?} [opts.children] The type of content in `insertOp`
1851
+ * @param {HasText} [opts.text] Whether this delta contains text using `textOp`
1852
+ * @param {Formats} [opts.formats]
1853
+ * @param {Recursive} [opts.recursive]
1854
+ * @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<
1855
+ * NodeName,
1856
+ * Attrs,
1857
+ * Children|(Recursive extends true ? RecursiveDelta<NodeName,Attrs,Children,HasText extends true ? string : never> : never),
1858
+ * HasText extends true ? string : never
1859
+ * >> : never}
1860
+ */
1861
+ const $delta = ({ name, attrs, children, text, formats, recursive }) => /** @type {any} */ (new $Delta(
1862
+ name == null ? schema.$any : schema.$(name),
1863
+ /** @type {any} */ (attrs == null ? schema.$object({}) : schema.$(attrs)),
1864
+ /** @type {any} */ (children == null ? schema.$never : schema.$(children)),
1865
+ text ?? false,
1866
+ formats == null ? schema.$any : schema.$(formats),
1867
+ recursive ?? false
1868
+ ));
1869
+
1870
+ const $$delta = schema.$constructedBy($Delta);
1871
+
1872
+ /**
1873
+ * @todo remove this
1874
+ *
1757
1875
  * @template {s.Schema<string>|string|Array<string>} [NodeNameSchema=s.Schema<any>]
1758
1876
  * @template {s.Schema<{ [key: string|number]: any }>|{ [key:string|number]:any }} [AttrsSchema=s.Schema<{}>]
1759
1877
  * @template {any} [ChildrenSchema=s.Schema<never>]
@@ -1772,7 +1890,7 @@ class DeltaBuilder extends Delta {
1772
1890
  * HasText extends true ? string : never
1773
1891
  * >> : never}
1774
1892
  */
1775
- const $delta = ({ name, attrs, children, text, recursive }) => {
1893
+ const _$delta = ({ name, attrs, children, text, recursive }) => {
1776
1894
  /**
1777
1895
  * @type {s.Schema<Array<any>>}
1778
1896
  */
@@ -1828,6 +1946,35 @@ const mergeDeltas = (a, b) => {
1828
1946
  return a == null ? b : (a || null)
1829
1947
  };
1830
1948
 
1949
+ /**
1950
+ * @template {DeltaAny} D
1951
+ * @param {prng.PRNG} gen
1952
+ * @param {s.Schema<D>} $d
1953
+ * @return {D extends Delta<infer NodeName,infer Attrs,infer Children,infer Text,infer Schema> ? DeltaBuilder<NodeName,Attrs,Children,Text,Schema> : never}
1954
+ */
1955
+ const random = (gen, $d) => {
1956
+ const { $name, $attrs, $children, hasText, $formats: $formats_ } = /** @type {$Delta<any,any,any,boolean,any,any>} */ (/** @type {any} */ ($d)).shape;
1957
+ const d = schema.$$any.check($name) ? create($deltaAny) : create(schema.random(gen, $name), $deltaAny);
1958
+ const $formats = schema.$$any.check($formats_) ? schema.$null : $formats_;
1959
+ prng.bool(gen) && d.setMany(schema.random(gen, $attrs));
1960
+ for (let i = prng.uint32(gen, 0, 5); i > 0; i--) {
1961
+ if (hasText && prng.bool(gen)) {
1962
+ d.insert(prng.word(gen), schema.random(gen, $formats));
1963
+ } else if (!schema.$$never.check($children)) {
1964
+ /**
1965
+ * @type {Array<any>}
1966
+ */
1967
+ const ins = [];
1968
+ let insN = prng.int32(gen, 0, 5);
1969
+ while (insN--) {
1970
+ ins.push(schema.random(gen, $children));
1971
+ }
1972
+ d.insert(ins, schema.random(gen, $formats));
1973
+ }
1974
+ }
1975
+ return /** @type {any} */ (d)
1976
+ };
1977
+
1831
1978
  /**
1832
1979
  * @overload
1833
1980
  * @return {DeltaBuilder<any,{},never,never,null>}
@@ -1888,12 +2035,12 @@ const create = (nodeNameOrSchema, attrsOrSchema, children) => {
1888
2035
  // DELTA TEXT
1889
2036
 
1890
2037
  /**
1891
- * @template {encoding.AnyEncodable|DeltaAny} [Embeds=never]
2038
+ * @template {fingerprintTrait.Fingerprintable} [Embeds=never]
1892
2039
  * @typedef {Delta<any,{},Embeds,string>} TextDelta
1893
2040
  */
1894
2041
 
1895
2042
  /**
1896
- * @template {encoding.AnyEncodable|DeltaAny} [Embeds=never]
2043
+ * @template {fingerprintTrait.Fingerprintable} [Embeds=never]
1897
2044
  * @typedef {DeltaBuilder<any,{},Embeds,string>} TextDeltaBuilder
1898
2045
  */
1899
2046
 
@@ -1913,12 +2060,12 @@ const $textOnly = $text();
1913
2060
  const text = $schema => /** @type {any} */ (create($schema || $textOnly));
1914
2061
 
1915
2062
  /**
1916
- * @template {encoding.AnyEncodable|DeltaAny} Children
2063
+ * @template {fingerprintTrait.Fingerprintable} Children
1917
2064
  * @typedef {Delta<any,{},Children,never>} ArrayDelta
1918
2065
  */
1919
2066
 
1920
2067
  /**
1921
- * @template {encoding.AnyEncodable|DeltaAny} Children
2068
+ * @template {fingerprintTrait.Fingerprintable} Children
1922
2069
  * @typedef {DeltaBuilder<any,{},Children,never>} ArrayDeltaBuilder
1923
2070
  */
1924
2071
 
@@ -2018,29 +2165,73 @@ const diff = (d1, d2) => {
2018
2165
  * @param {DeltaBuilderAny} d
2019
2166
  * @param {ChildrenOpAny[]} opsIs
2020
2167
  * @param {ChildrenOpAny[]} opsShould
2021
- *
2022
2168
  */
2023
2169
  const diffAndApply = (d, opsIs, opsShould) => {
2024
- // naive implementation
2025
- d.delete(opsIs.reduce((currLen, op) => currLen + op.length, 0));
2026
- opsShould.forEach(newIns => {
2027
- if ($insertOp.check(newIns) || $textOp.check(newIns)) {
2028
- d.insert(newIns.insert);
2029
- } else {
2030
- error.unexpectedCase();
2170
+ // @todo unoptimized implementation. Convert content to array and diff that based on
2171
+ // generated fingerprints. We probably could do better and cache more information.
2172
+ // - benchmark
2173
+ // - cache fingerprints in ops
2174
+ /**
2175
+ * @type {Array<string|DeltaAny|fingerprintTrait.Fingerprintable>}
2176
+ */
2177
+ const isContent = opsIs.flatMap(op => $insertOp.check(op) ? op.insert : ($textOp.check(op) ? op.insert.split('') : error.unexpectedCase()));
2178
+ /**
2179
+ * @type {Array<string|DeltaAny|fingerprintTrait.Fingerprintable>}
2180
+ */
2181
+ const shouldContent = opsShould.flatMap(op => $insertOp.check(op) ? op.insert : ($textOp.check(op) ? op.insert.split('') : error.unexpectedCase()));
2182
+ const isContentFingerprinted = isContent.map(c => schema.$string.check(c) ? c : fingerprint.fingerprint(c));
2183
+ const shouldContentFingerprinted = shouldContent.map(c => schema.$string.check(c) ? c : fingerprint.fingerprint(c));
2184
+ /**
2185
+ * @type {{ index: number, insert: Array<string|DeltaAny|fingerprintTrait.Fingerprintable>, remove: Array<string|DeltaAny|fingerprintTrait.Fingerprintable> }[]}
2186
+ */
2187
+ const cdiff = patience.diff(isContentFingerprinted, shouldContentFingerprinted);
2188
+ // overwrite fingerprinted content with actual content
2189
+ for (let i = 0, adj = 0; i < cdiff.length; i++) {
2190
+ const cd = cdiff[i];
2191
+ cd.remove = isContent.slice(cd.index, cd.index + cd.remove.length);
2192
+ cd.insert = shouldContent.slice(cd.index + adj, cd.index + adj + cd.insert.length);
2193
+ adj += cd.remove.length - cd.insert.length;
2194
+ }
2195
+ for (let i = 0, lastIndex = 0; i < cdiff.length; i++) {
2196
+ const cd = cdiff[i];
2197
+ d.retain(cd.index - lastIndex);
2198
+ let cdii = 0;
2199
+ let cdri = 0;
2200
+ // try to match as much content as possible, preferring to skip over non-deltas
2201
+ for (; cdii < cd.insert.length && cdri < cd.remove.length;) {
2202
+ const a = cd.insert[cdii];
2203
+ const b = cd.remove[cdri];
2204
+ if ($deltaAny.check(a) && $deltaAny.check(b) && a.name === b.name) {
2205
+ d.modify(diff(a, b));
2206
+ cdii++;
2207
+ cdri++;
2208
+ } else if ($deltaAny.check(b)) {
2209
+ d.insert(schema.$string.check(a) ? a : [a]);
2210
+ cdii++;
2211
+ } else {
2212
+ d.delete(1);
2213
+ cdri++;
2214
+ }
2031
2215
  }
2032
- });
2216
+ for (; cdii < cd.insert.length; cdii++) {
2217
+ const a = cd.insert[cdii];
2218
+ d.insert(schema.$string.check(a) ? a : [a]);
2219
+ }
2220
+ d.delete(cd.remove.length - cdri);
2221
+ }
2033
2222
  };
2034
- diffAndApply(d, ops1.slice(change.index, change.index + change.remove.length), ops2.slice(change.index + currIndexOffset2, change.insert.length));
2223
+ diffAndApply(d, ops1.slice(change.index, change.index + change.remove.length), ops2.slice(change.index + currIndexOffset2, change.index + currIndexOffset2 + change.insert.length));
2035
2224
  lastIndex1 = change.index + change.remove.length;
2036
2225
  currIndexOffset2 += change.insert.length - change.remove.length;
2037
2226
  }
2038
2227
  for (const attr2 of d2.attrs) {
2039
2228
  const attr1 = d1.attrs[attr2.key];
2040
2229
  if (attr1 == null || (attr1.fingerprint !== attr2.fingerprint)) {
2230
+ /* c8 ignore else */
2041
2231
  if ($insertOp.check(attr2)) {
2042
2232
  d.set(attr2.key, attr2.value);
2043
2233
  } else {
2234
+ /* c8 ignore next 2 */
2044
2235
  error.unexpectedCase();
2045
2236
  }
2046
2237
  }
@@ -2051,9 +2242,11 @@ const diff = (d1, d2) => {
2051
2242
  }
2052
2243
  }
2053
2244
  }
2054
- return /** @type {D} */ (d.done())
2245
+ return /** @type {D} */ (d.done(false))
2055
2246
  };
2056
2247
 
2248
+ exports.$$delta = $$delta;
2249
+ exports.$Delta = $Delta;
2057
2250
  exports.$anyOp = $anyOp;
2058
2251
  exports.$array = $array;
2059
2252
  exports.$attribution = $attribution;
@@ -2080,6 +2273,7 @@ exports.InsertOp = InsertOp;
2080
2273
  exports.ModifyOp = ModifyOp;
2081
2274
  exports.RetainOp = RetainOp;
2082
2275
  exports.TextOp = TextOp;
2276
+ exports._$delta = _$delta;
2083
2277
  exports.array = array;
2084
2278
  exports.clone = clone;
2085
2279
  exports.create = create;
@@ -2087,5 +2281,6 @@ exports.diff = diff;
2087
2281
  exports.map = map;
2088
2282
  exports.mergeAttrs = mergeAttrs;
2089
2283
  exports.mergeDeltas = mergeDeltas;
2284
+ exports.random = random;
2090
2285
  exports.text = text;
2091
- //# sourceMappingURL=d2.cjs.map
2286
+ //# sourceMappingURL=delta.cjs.map