@fluidframework/merge-tree 2.12.0 → 2.20.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.
Files changed (307) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/api-report/merge-tree.legacy.alpha.api.md +0 -108
  3. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  4. package/dist/MergeTreeTextHelper.js +0 -2
  5. package/dist/MergeTreeTextHelper.js.map +1 -1
  6. package/dist/attributionPolicy.d.ts.map +1 -1
  7. package/dist/attributionPolicy.js +6 -16
  8. package/dist/attributionPolicy.js.map +1 -1
  9. package/dist/client.d.ts +3 -4
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +39 -28
  12. package/dist/client.js.map +1 -1
  13. package/dist/endOfTreeSegment.d.ts +2 -1
  14. package/dist/endOfTreeSegment.d.ts.map +1 -1
  15. package/dist/endOfTreeSegment.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -4
  19. package/dist/index.js.map +1 -1
  20. package/dist/legacy.d.ts +0 -4
  21. package/dist/localReference.d.ts +5 -7
  22. package/dist/localReference.d.ts.map +1 -1
  23. package/dist/localReference.js +1 -3
  24. package/dist/localReference.js.map +1 -1
  25. package/dist/mergeTree.d.ts +8 -7
  26. package/dist/mergeTree.d.ts.map +1 -1
  27. package/dist/mergeTree.js +187 -228
  28. package/dist/mergeTree.js.map +1 -1
  29. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  30. package/dist/mergeTreeNodeWalk.js +3 -2
  31. package/dist/mergeTreeNodeWalk.js.map +1 -1
  32. package/dist/mergeTreeNodes.d.ts +65 -325
  33. package/dist/mergeTreeNodes.d.ts.map +1 -1
  34. package/dist/mergeTreeNodes.js +96 -130
  35. package/dist/mergeTreeNodes.js.map +1 -1
  36. package/dist/mergeTreeTracking.d.ts.map +1 -1
  37. package/dist/mergeTreeTracking.js +0 -2
  38. package/dist/mergeTreeTracking.js.map +1 -1
  39. package/dist/opBuilder.d.ts +0 -5
  40. package/dist/opBuilder.d.ts.map +1 -1
  41. package/dist/opBuilder.js +0 -5
  42. package/dist/opBuilder.js.map +1 -1
  43. package/dist/package.json +2 -1
  44. package/dist/partialLengths.d.ts +2 -2
  45. package/dist/partialLengths.d.ts.map +1 -1
  46. package/dist/partialLengths.js +29 -31
  47. package/dist/partialLengths.js.map +1 -1
  48. package/dist/perspective.d.ts +3 -2
  49. package/dist/perspective.d.ts.map +1 -1
  50. package/dist/perspective.js +5 -2
  51. package/dist/perspective.js.map +1 -1
  52. package/dist/referencePositions.d.ts.map +1 -1
  53. package/dist/referencePositions.js +4 -1
  54. package/dist/referencePositions.js.map +1 -1
  55. package/dist/revertibles.d.ts.map +1 -1
  56. package/dist/revertibles.js +10 -14
  57. package/dist/revertibles.js.map +1 -1
  58. package/dist/segmentGroupCollection.d.ts +4 -4
  59. package/dist/segmentGroupCollection.d.ts.map +1 -1
  60. package/dist/segmentGroupCollection.js +0 -6
  61. package/dist/segmentGroupCollection.js.map +1 -1
  62. package/dist/segmentInfos.d.ts +251 -0
  63. package/dist/segmentInfos.d.ts.map +1 -0
  64. package/dist/segmentInfos.js +166 -0
  65. package/dist/segmentInfos.js.map +1 -0
  66. package/dist/snapshotLoader.d.ts.map +1 -1
  67. package/dist/snapshotLoader.js +36 -44
  68. package/dist/snapshotLoader.js.map +1 -1
  69. package/dist/snapshotV1.d.ts.map +1 -1
  70. package/dist/snapshotV1.js +9 -12
  71. package/dist/snapshotV1.js.map +1 -1
  72. package/dist/snapshotlegacy.d.ts +2 -2
  73. package/dist/snapshotlegacy.d.ts.map +1 -1
  74. package/dist/snapshotlegacy.js +5 -3
  75. package/dist/snapshotlegacy.js.map +1 -1
  76. package/dist/sortedSegmentSet.d.ts.map +1 -1
  77. package/dist/sortedSegmentSet.js +5 -8
  78. package/dist/sortedSegmentSet.js.map +1 -1
  79. package/dist/test/beastTest.spec.d.ts +0 -2
  80. package/dist/test/beastTest.spec.d.ts.map +1 -1
  81. package/dist/test/beastTest.spec.js +1 -5
  82. package/dist/test/beastTest.spec.js.map +1 -1
  83. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  84. package/dist/test/client.applyMsg.spec.js +15 -12
  85. package/dist/test/client.applyMsg.spec.js.map +1 -1
  86. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  87. package/dist/test/client.getPosition.spec.js +3 -2
  88. package/dist/test/client.getPosition.spec.js.map +1 -1
  89. package/dist/test/client.localReference.spec.js +6 -6
  90. package/dist/test/client.localReference.spec.js.map +1 -1
  91. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  92. package/dist/test/client.rollback.spec.js.map +1 -1
  93. package/dist/test/dirname.cjs +0 -1
  94. package/dist/test/dirname.cjs.map +1 -1
  95. package/dist/test/index.d.ts +1 -1
  96. package/dist/test/index.d.ts.map +1 -1
  97. package/dist/test/index.js +2 -4
  98. package/dist/test/index.js.map +1 -1
  99. package/dist/test/mergeTree.annotate.spec.js +3 -0
  100. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  101. package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
  102. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  103. package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
  104. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  105. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  106. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  107. package/dist/test/mergeTreeOperationRunner.js +2 -3
  108. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/propertyManager.spec.js.map +1 -1
  111. package/dist/test/reconnectHelper.d.ts +2 -1
  112. package/dist/test/reconnectHelper.d.ts.map +1 -1
  113. package/dist/test/reconnectHelper.js.map +1 -1
  114. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  115. package/dist/test/revertibleFarm.spec.js.map +1 -1
  116. package/dist/test/segmentGroupCollection.spec.js +15 -3
  117. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  118. package/dist/test/snapshot.utils.d.ts +2 -2
  119. package/dist/test/snapshot.utils.d.ts.map +1 -1
  120. package/dist/test/snapshot.utils.js.map +1 -1
  121. package/dist/test/sortedSegmentSet.spec.js +4 -3
  122. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  123. package/dist/test/testClient.d.ts +8 -6
  124. package/dist/test/testClient.d.ts.map +1 -1
  125. package/dist/test/testClient.js +28 -27
  126. package/dist/test/testClient.js.map +1 -1
  127. package/dist/test/testClientLogger.d.ts.map +1 -1
  128. package/dist/test/testClientLogger.js +6 -4
  129. package/dist/test/testClientLogger.js.map +1 -1
  130. package/dist/test/testUtils.d.ts +2 -2
  131. package/dist/test/testUtils.d.ts.map +1 -1
  132. package/dist/test/testUtils.js +32 -8
  133. package/dist/test/testUtils.js.map +1 -1
  134. package/dist/test/text.d.ts +2 -2
  135. package/dist/test/text.d.ts.map +1 -1
  136. package/dist/test/text.js +12 -6
  137. package/dist/test/text.js.map +1 -1
  138. package/dist/test/tracking.spec.js.map +1 -1
  139. package/dist/test/wordUnitTests.spec.js +1 -1
  140. package/dist/test/wordUnitTests.spec.js.map +1 -1
  141. package/dist/zamboni.d.ts.map +1 -1
  142. package/dist/zamboni.js +8 -7
  143. package/dist/zamboni.js.map +1 -1
  144. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  145. package/lib/MergeTreeTextHelper.js +0 -2
  146. package/lib/MergeTreeTextHelper.js.map +1 -1
  147. package/lib/attributionPolicy.d.ts.map +1 -1
  148. package/lib/attributionPolicy.js +6 -16
  149. package/lib/attributionPolicy.js.map +1 -1
  150. package/lib/client.d.ts +3 -4
  151. package/lib/client.d.ts.map +1 -1
  152. package/lib/client.js +40 -29
  153. package/lib/client.js.map +1 -1
  154. package/lib/endOfTreeSegment.d.ts +2 -1
  155. package/lib/endOfTreeSegment.d.ts.map +1 -1
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +1 -1
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +1 -1
  160. package/lib/index.js.map +1 -1
  161. package/lib/legacy.d.ts +0 -4
  162. package/lib/localReference.d.ts +5 -7
  163. package/lib/localReference.d.ts.map +1 -1
  164. package/lib/localReference.js +1 -3
  165. package/lib/localReference.js.map +1 -1
  166. package/lib/mergeTree.d.ts +8 -7
  167. package/lib/mergeTree.d.ts.map +1 -1
  168. package/lib/mergeTree.js +175 -220
  169. package/lib/mergeTree.js.map +1 -1
  170. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  171. package/lib/mergeTreeNodeWalk.js +3 -2
  172. package/lib/mergeTreeNodeWalk.js.map +1 -1
  173. package/lib/mergeTreeNodes.d.ts +65 -325
  174. package/lib/mergeTreeNodes.d.ts.map +1 -1
  175. package/lib/mergeTreeNodes.js +92 -127
  176. package/lib/mergeTreeNodes.js.map +1 -1
  177. package/lib/mergeTreeTracking.d.ts.map +1 -1
  178. package/lib/mergeTreeTracking.js +0 -2
  179. package/lib/mergeTreeTracking.js.map +1 -1
  180. package/lib/opBuilder.d.ts +0 -5
  181. package/lib/opBuilder.d.ts.map +1 -1
  182. package/lib/opBuilder.js +0 -5
  183. package/lib/opBuilder.js.map +1 -1
  184. package/lib/partialLengths.d.ts +2 -2
  185. package/lib/partialLengths.d.ts.map +1 -1
  186. package/lib/partialLengths.js +26 -28
  187. package/lib/partialLengths.js.map +1 -1
  188. package/lib/perspective.d.ts +3 -2
  189. package/lib/perspective.d.ts.map +1 -1
  190. package/lib/perspective.js +5 -2
  191. package/lib/perspective.js.map +1 -1
  192. package/lib/referencePositions.d.ts.map +1 -1
  193. package/lib/referencePositions.js +4 -1
  194. package/lib/referencePositions.js.map +1 -1
  195. package/lib/revertibles.d.ts.map +1 -1
  196. package/lib/revertibles.js +8 -12
  197. package/lib/revertibles.js.map +1 -1
  198. package/lib/segmentGroupCollection.d.ts +4 -4
  199. package/lib/segmentGroupCollection.d.ts.map +1 -1
  200. package/lib/segmentGroupCollection.js +0 -6
  201. package/lib/segmentGroupCollection.js.map +1 -1
  202. package/lib/segmentInfos.d.ts +251 -0
  203. package/lib/segmentInfos.d.ts.map +1 -0
  204. package/lib/segmentInfos.js +145 -0
  205. package/lib/segmentInfos.js.map +1 -0
  206. package/lib/snapshotLoader.d.ts.map +1 -1
  207. package/lib/snapshotLoader.js +36 -44
  208. package/lib/snapshotLoader.js.map +1 -1
  209. package/lib/snapshotV1.d.ts.map +1 -1
  210. package/lib/snapshotV1.js +9 -12
  211. package/lib/snapshotV1.js.map +1 -1
  212. package/lib/snapshotlegacy.d.ts +2 -2
  213. package/lib/snapshotlegacy.d.ts.map +1 -1
  214. package/lib/snapshotlegacy.js +5 -3
  215. package/lib/snapshotlegacy.js.map +1 -1
  216. package/lib/sortedSegmentSet.d.ts.map +1 -1
  217. package/lib/sortedSegmentSet.js +5 -8
  218. package/lib/sortedSegmentSet.js.map +1 -1
  219. package/lib/test/beastTest.spec.d.ts +0 -2
  220. package/lib/test/beastTest.spec.d.ts.map +1 -1
  221. package/lib/test/beastTest.spec.js +0 -3
  222. package/lib/test/beastTest.spec.js.map +1 -1
  223. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  224. package/lib/test/client.applyMsg.spec.js +15 -12
  225. package/lib/test/client.applyMsg.spec.js.map +1 -1
  226. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  227. package/lib/test/client.getPosition.spec.js +3 -2
  228. package/lib/test/client.getPosition.spec.js.map +1 -1
  229. package/lib/test/client.localReference.spec.js +1 -1
  230. package/lib/test/client.localReference.spec.js.map +1 -1
  231. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  232. package/lib/test/client.rollback.spec.js +1 -1
  233. package/lib/test/client.rollback.spec.js.map +1 -1
  234. package/lib/test/dirname.cjs +0 -1
  235. package/lib/test/dirname.cjs.map +1 -1
  236. package/lib/test/index.d.ts +1 -1
  237. package/lib/test/index.d.ts.map +1 -1
  238. package/lib/test/index.js +1 -1
  239. package/lib/test/index.js.map +1 -1
  240. package/lib/test/mergeTree.annotate.spec.js +3 -0
  241. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  242. package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
  243. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  244. package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
  245. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  246. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  247. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  248. package/lib/test/mergeTreeOperationRunner.js +1 -2
  249. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  250. package/lib/test/obliterate.spec.js.map +1 -1
  251. package/lib/test/propertyManager.spec.js.map +1 -1
  252. package/lib/test/reconnectHelper.d.ts +2 -1
  253. package/lib/test/reconnectHelper.d.ts.map +1 -1
  254. package/lib/test/reconnectHelper.js.map +1 -1
  255. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  256. package/lib/test/revertibleFarm.spec.js.map +1 -1
  257. package/lib/test/segmentGroupCollection.spec.js +15 -3
  258. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  259. package/lib/test/snapshot.utils.d.ts +2 -2
  260. package/lib/test/snapshot.utils.d.ts.map +1 -1
  261. package/lib/test/snapshot.utils.js.map +1 -1
  262. package/lib/test/sortedSegmentSet.spec.js +4 -3
  263. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  264. package/lib/test/testClient.d.ts +8 -6
  265. package/lib/test/testClient.d.ts.map +1 -1
  266. package/lib/test/testClient.js +29 -28
  267. package/lib/test/testClient.js.map +1 -1
  268. package/lib/test/testClientLogger.d.ts.map +1 -1
  269. package/lib/test/testClientLogger.js +5 -3
  270. package/lib/test/testClientLogger.js.map +1 -1
  271. package/lib/test/testUtils.d.ts +2 -2
  272. package/lib/test/testUtils.d.ts.map +1 -1
  273. package/lib/test/testUtils.js +9 -8
  274. package/lib/test/testUtils.js.map +1 -1
  275. package/lib/test/text.d.ts +2 -2
  276. package/lib/test/text.d.ts.map +1 -1
  277. package/lib/test/text.js +12 -6
  278. package/lib/test/text.js.map +1 -1
  279. package/lib/test/tracking.spec.js.map +1 -1
  280. package/lib/test/wordUnitTests.spec.js +1 -1
  281. package/lib/test/wordUnitTests.spec.js.map +1 -1
  282. package/lib/zamboni.d.ts.map +1 -1
  283. package/lib/zamboni.js +7 -6
  284. package/lib/zamboni.js.map +1 -1
  285. package/package.json +77 -19
  286. package/src/MergeTreeTextHelper.ts +2 -4
  287. package/src/attributionPolicy.ts +5 -13
  288. package/src/client.ts +55 -44
  289. package/src/endOfTreeSegment.ts +3 -5
  290. package/src/index.ts +0 -7
  291. package/src/localReference.ts +6 -8
  292. package/src/mergeTree.ts +233 -290
  293. package/src/mergeTreeNodeWalk.ts +3 -2
  294. package/src/mergeTreeNodes.ts +160 -490
  295. package/src/mergeTreeTracking.ts +0 -3
  296. package/src/opBuilder.ts +0 -5
  297. package/src/partialLengths.ts +40 -29
  298. package/src/perspective.ts +23 -4
  299. package/src/referencePositions.ts +4 -1
  300. package/src/revertibles.ts +19 -16
  301. package/src/segmentGroupCollection.ts +7 -18
  302. package/src/segmentInfos.ts +371 -0
  303. package/src/snapshotLoader.ts +56 -57
  304. package/src/snapshotV1.ts +14 -16
  305. package/src/snapshotlegacy.ts +12 -17
  306. package/src/sortedSegmentSet.ts +6 -8
  307. package/src/zamboni.ts +10 -12
@@ -5,7 +5,6 @@
5
5
 
6
6
  import { LocalReferencePosition } from "./localReference.js";
7
7
  import { ISegment } from "./mergeTreeNodes.js";
8
- // eslint-disable-next-line import/no-deprecated
9
8
  import { SortedSegmentSet } from "./sortedSegmentSet.js";
10
9
 
11
10
  /**
@@ -31,11 +30,9 @@ export interface ITrackingGroup {
31
30
  * @alpha
32
31
  */
33
32
  export class TrackingGroup implements ITrackingGroup {
34
- // eslint-disable-next-line import/no-deprecated
35
33
  private readonly trackedSet: SortedSegmentSet<Trackable>;
36
34
 
37
35
  constructor() {
38
- // eslint-disable-next-line import/no-deprecated
39
36
  this.trackedSet = new SortedSegmentSet<Trackable>();
40
37
  }
41
38
 
package/src/opBuilder.ts CHANGED
@@ -184,11 +184,6 @@ export function createInsertOp(pos: number, segSpec: unknown): IMergeTreeInsertM
184
184
  *
185
185
  * @param ops - The ops to group
186
186
  *
187
- * @deprecated The ability to create group ops will be removed in an upcoming
188
- * release, as group ops are redundant with he native batching capabilities of
189
- * the runtime
190
- *
191
- * @deprecated The ability to create group ops will be removed in an upcoming release, as group ops are redundant with he native batching capabilities of the runtime
192
187
  * @internal
193
188
  */
194
189
  // eslint-disable-next-line import/no-deprecated
@@ -9,24 +9,23 @@ import { Property, RedBlackTree } from "./collections/index.js";
9
9
  import { UnassignedSequenceNumber } from "./constants.js";
10
10
  import { MergeTree } from "./mergeTree.js";
11
11
  import {
12
- // eslint-disable-next-line import/no-deprecated
13
12
  CollaborationWindow,
14
13
  IMergeNode,
15
- // eslint-disable-next-line import/no-deprecated
16
- IMoveInfo,
17
- // eslint-disable-next-line import/no-deprecated
18
- IRemovalInfo,
19
- ISegmentLeaf,
14
+ ISegmentPrivate,
20
15
  compareNumbers,
21
16
  seqLTE,
22
- toMoveInfo,
23
- toRemovalInfo,
24
17
  type MergeBlock,
25
18
  } from "./mergeTreeNodes.js";
26
- // eslint-disable-next-line import/no-deprecated
19
+ import {
20
+ toRemovalInfo,
21
+ toMoveInfo,
22
+ IRemovalInfo,
23
+ IMoveInfo,
24
+ assertInserted,
25
+ isRemoved,
26
+ } from "./segmentInfos.js";
27
27
  import { SortedSet } from "./sortedSet.js";
28
28
 
29
- // eslint-disable-next-line import/no-deprecated
30
29
  class PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number> {
31
30
  protected getKey(item: PartialSequenceLength): number {
32
31
  return item.seq;
@@ -289,7 +288,7 @@ export class PartialSequenceLengths {
289
288
  */
290
289
  public static combine(
291
290
  block: MergeBlock,
292
- // eslint-disable-next-line import/no-deprecated
291
+
293
292
  collabWindow: CollaborationWindow,
294
293
  recur = false,
295
294
  computeLocalPartials = false,
@@ -378,7 +377,7 @@ export class PartialSequenceLengths {
378
377
  */
379
378
  private static fromLeaves(
380
379
  block: MergeBlock,
381
- // eslint-disable-next-line import/no-deprecated
380
+
382
381
  collabWindow: CollaborationWindow,
383
382
  computeLocalPartials: boolean,
384
383
  ): PartialSequenceLengths {
@@ -506,10 +505,11 @@ export class PartialSequenceLengths {
506
505
  */
507
506
  static accumulateMoveOverlapForExisting(
508
507
  segmentLen: number,
509
- segment: ISegmentLeaf,
508
+ segment: ISegmentPrivate,
510
509
  firstGte: PartialSequenceLength,
511
510
  clientIds: number[],
512
511
  ): void {
512
+ assertInserted(segment);
513
513
  const nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);
514
514
 
515
515
  PartialSequenceLengths.accumulateMoveClientOverlap(
@@ -526,7 +526,7 @@ export class PartialSequenceLengths {
526
526
  PartialSequenceLengths.accumulateMoveClientOverlap(
527
527
  firstGte,
528
528
  [segment.clientId],
529
- segment.wasMovedOnInsert ? -segment.cachedLength : segmentLen,
529
+ toMoveInfo(segment)?.wasMovedOnInsert ? -segment.cachedLength : segmentLen,
530
530
  );
531
531
  }
532
532
  }
@@ -539,10 +539,11 @@ export class PartialSequenceLengths {
539
539
  * segment
540
540
  */
541
541
  private static getMoveOverlapForExisting(
542
- segment: ISegmentLeaf,
542
+ segment: ISegmentPrivate,
543
543
  obliterateOverlapLen: number,
544
544
  clientIds: number[],
545
545
  ): RedBlackTree<number, IOverlapClient> {
546
+ assertInserted(segment);
546
547
  const nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);
547
548
  const overlapObliterateClients = PartialSequenceLengths.getOverlapClients(
548
549
  nonInsertingClientIds,
@@ -552,7 +553,9 @@ export class PartialSequenceLengths {
552
553
  if (clientIds.length !== nonInsertingClientIds.length) {
553
554
  overlapObliterateClients.put(segment.clientId, {
554
555
  clientId: segment.clientId,
555
- seglen: segment.wasMovedOnInsert ? -segment.cachedLength : obliterateOverlapLen,
556
+ seglen: toMoveInfo(segment)?.wasMovedOnInsert
557
+ ? -segment.cachedLength
558
+ : obliterateOverlapLen,
556
559
  });
557
560
  }
558
561
 
@@ -560,7 +563,7 @@ export class PartialSequenceLengths {
560
563
  }
561
564
 
562
565
  private static updatePartialsAfterInsertion(
563
- segment: ISegmentLeaf,
566
+ segment: ISegmentPrivate,
564
567
  segmentLen: number,
565
568
  remoteObliteratedLen: number | undefined,
566
569
  obliterateOverlapLen: number = segmentLen,
@@ -640,12 +643,12 @@ export class PartialSequenceLengths {
640
643
  */
641
644
  private static insertSegment(
642
645
  combinedPartialLengths: PartialSequenceLengths,
643
- segment: ISegmentLeaf,
644
- // eslint-disable-next-line import/no-deprecated
646
+ segment: ISegmentPrivate,
645
647
  removalInfo?: IRemovalInfo,
646
- // eslint-disable-next-line import/no-deprecated
647
648
  moveInfo?: IMoveInfo,
648
649
  ): void {
650
+ assertInserted(segment);
651
+
649
652
  const removalIsLocal =
650
653
  !!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;
651
654
  const moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;
@@ -654,7 +657,7 @@ export class PartialSequenceLengths {
654
657
  (!!removalInfo && removalIsLocal && (!moveInfo || moveIsLocal)) ||
655
658
  (!!moveInfo && moveIsLocal && (!removalInfo || removalIsLocal));
656
659
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
657
- let seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq!;
660
+ let seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq;
658
661
  let segmentLen = segment.cachedLength;
659
662
  let clientId = segment.clientId;
660
663
  let removeClientOverlap: number[] | undefined;
@@ -690,7 +693,7 @@ export class PartialSequenceLengths {
690
693
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
691
694
  seqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;
692
695
 
693
- if (segment.wasMovedOnInsert) {
696
+ if (moveInfo.wasMovedOnInsert) {
694
697
  assert(
695
698
  moveInfo.movedSeq !== -1,
696
699
  0x871 /* wasMovedOnInsert should only be set on acked obliterates */,
@@ -702,7 +705,10 @@ export class PartialSequenceLengths {
702
705
 
703
706
  const hasOverlap = moveInfo.movedClientIds.length > 1;
704
707
  moveClientOverlap = hasOverlap ? moveInfo.movedClientIds : undefined;
705
- } else if (segment.wasMovedOnInsert) {
708
+ } // BUG BUG: something fishy here around how/when move info is passed or not
709
+ // this condition only hits if it is not passed, so we can't rely on the passed move info
710
+ // and need to inspect the segment directly. maybe related to AB#15630.
711
+ else if (toMoveInfo(segment)?.wasMovedOnInsert) {
706
712
  // if this segment was obliterated on insert, its length is only
707
713
  // visible to the client that inserted it
708
714
  segmentLen = 0;
@@ -775,7 +781,12 @@ export class PartialSequenceLengths {
775
781
  // todo: the below block needs to be changed to handle obliterate, which
776
782
  // doesn't have great support for reconnect at the moment. see ADO #3714
777
783
  const { unsequencedRecords } = combinedPartialLengths;
778
- if (unsequencedRecords && removeClientOverlap && segment.localRemovedSeq !== undefined) {
784
+ if (
785
+ unsequencedRecords &&
786
+ removeClientOverlap &&
787
+ isRemoved(segment) &&
788
+ segment.localRemovedSeq !== undefined
789
+ ) {
779
790
  const localSeq = segment.localRemovedSeq;
780
791
  const localPartialLengthEntry: LocalPartialSequenceLength = {
781
792
  seq: seqOrLocalSeq,
@@ -910,7 +921,7 @@ export class PartialSequenceLengths {
910
921
  node: MergeBlock,
911
922
  seq: number,
912
923
  clientId: number,
913
- // eslint-disable-next-line import/no-deprecated
924
+
914
925
  collabWindow: CollaborationWindow,
915
926
  ): void {
916
927
  let seqSeglen = 0;
@@ -938,10 +949,10 @@ export class PartialSequenceLengths {
938
949
  // if this segment was moved on insert, its length should
939
950
  // only be visible to the inserting client
940
951
  if (
941
- segment.wasMovedOnInsert &&
942
952
  segment.seq !== undefined &&
943
953
  moveInfo &&
944
- moveInfo.movedSeq < segment.seq
954
+ moveInfo.movedSeq < segment.seq &&
955
+ moveInfo.wasMovedOnInsert
945
956
  ) {
946
957
  remoteObliteratedLen += segment.cachedLength;
947
958
  } else {
@@ -964,7 +975,7 @@ export class PartialSequenceLengths {
964
975
  if (removeHappenedFirst) {
965
976
  remoteObliteratedLen -= segment.cachedLength;
966
977
  } else if (
967
- segment.wasMovedOnInsert &&
978
+ moveInfo.wasMovedOnInsert &&
968
979
  segment.seq !== UnassignedSequenceNumber &&
969
980
  segment.seq !== undefined &&
970
981
  moveInfo.movedSeq > segment.seq
@@ -1135,7 +1146,7 @@ export class PartialSequenceLengths {
1135
1146
  }
1136
1147
 
1137
1148
  // Clear away partial sums for sequence numbers earlier than the current window
1138
- // eslint-disable-next-line import/no-deprecated
1149
+
1139
1150
  private zamboni(segmentWindow: CollaborationWindow): void {
1140
1151
  this.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);
1141
1152
  this.minSeq = segmentWindow.minSeq;
@@ -7,6 +7,15 @@ import { UnassignedSequenceNumber } from "./constants.js";
7
7
  import { type MergeTree } from "./mergeTree.js";
8
8
  import { LeafAction, backwardExcursion, forwardExcursion } from "./mergeTreeNodeWalk.js";
9
9
  import { seqLTE, type ISegmentLeaf } from "./mergeTreeNodes.js";
10
+ import {
11
+ isInserted,
12
+ isMoved,
13
+ isRemoved,
14
+ type IInsertionInfo,
15
+ type IMoveInfo,
16
+ type IRemovalInfo,
17
+ type SegmentWithInfo,
18
+ } from "./segmentInfos.js";
10
19
 
11
20
  /**
12
21
  * Provides a view of a MergeTree from the perspective of a specific client at a specific sequence number.
@@ -77,7 +86,10 @@ export class PerspectiveImpl implements Perspective {
77
86
  * @param localSeq - The latest local sequence number to consider.
78
87
  * @returns true iff this segment was removed in the given perspective.
79
88
  */
80
- export function wasRemovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime): boolean {
89
+ export function wasRemovedBefore(
90
+ seg: SegmentWithInfo<IInsertionInfo & IRemovalInfo>,
91
+ { refSeq, localSeq }: SeqTime,
92
+ ): boolean {
81
93
  if (
82
94
  seg.removedSeq === UnassignedSequenceNumber &&
83
95
  localSeq !== undefined &&
@@ -95,7 +107,10 @@ export function wasRemovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTim
95
107
  * @param localSeq - The latest local sequence number to consider.
96
108
  * @returns true iff this segment was moved (aka obliterated) in the given perspective.
97
109
  */
98
- export function wasMovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime): boolean {
110
+ export function wasMovedBefore(
111
+ seg: SegmentWithInfo<IInsertionInfo & IMoveInfo>,
112
+ { refSeq, localSeq }: SeqTime,
113
+ ): boolean {
99
114
  if (
100
115
  seg.movedSeq === UnassignedSequenceNumber &&
101
116
  localSeq !== undefined &&
@@ -110,7 +125,11 @@ export function wasMovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime)
110
125
  * See {@link wasRemovedBefore} and {@link wasMovedBefore}.
111
126
  */
112
127
  export function wasRemovedOrMovedBefore(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
113
- return wasRemovedBefore(seg, seqTime) || wasMovedBefore(seg, seqTime);
128
+ return (
129
+ isInserted(seg) &&
130
+ ((isRemoved(seg) && wasRemovedBefore(seg, seqTime)) ||
131
+ (isMoved(seg) && wasMovedBefore(seg, seqTime)))
132
+ );
114
133
  }
115
134
 
116
135
  /**
@@ -124,7 +143,7 @@ export function isSegmentPresent(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
124
143
  const { refSeq, localSeq } = seqTime;
125
144
  // If seg.seq is undefined, then this segment has existed since minSeq.
126
145
  // It may have been moved or removed since.
127
- if (seg.seq !== undefined) {
146
+ if (isInserted(seg)) {
128
147
  if (seg.seq !== UnassignedSequenceNumber) {
129
148
  if (!seqLTE(seg.seq, refSeq)) {
130
149
  return false;
@@ -7,6 +7,7 @@ import { SlidingPreference } from "./localReference.js";
7
7
  import { ISegment } from "./mergeTreeNodes.js";
8
8
  import { ReferenceType } from "./ops.js";
9
9
  import { PropertySet } from "./properties.js";
10
+ import { isMergeNodeInfo } from "./segmentInfos.js";
10
11
 
11
12
  /**
12
13
  * @internal
@@ -131,6 +132,8 @@ export function compareReferencePositions(a: ReferencePosition, b: ReferencePosi
131
132
  if (aSeg === bSeg) {
132
133
  return a.getOffset() - b.getOffset();
133
134
  } else {
134
- return aSeg === undefined || (bSeg !== undefined && aSeg.ordinal < bSeg.ordinal) ? -1 : 1;
135
+ return !isMergeNodeInfo(aSeg) || (isMergeNodeInfo(bSeg) && aSeg.ordinal < bSeg.ordinal)
136
+ ? -1
137
+ : 1;
135
138
  }
136
139
  }
@@ -8,16 +8,22 @@ import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
8
 
9
9
  import { DoublyLinkedList } from "./collections/index.js";
10
10
  import { EndOfTreeSegment } from "./endOfTreeSegment.js";
11
- // eslint-disable-next-line import/no-deprecated
12
11
  import { LocalReferenceCollection, LocalReferencePosition } from "./localReference.js";
13
12
  import { MergeTree, findRootMergeBlock } from "./mergeTree.js";
14
13
  import { IMergeTreeDeltaCallbackArgs } from "./mergeTreeDeltaCallback.js";
15
14
  import { depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
16
- import { toRemovalInfo, type ISegmentLeaf } from "./mergeTreeNodes.js";
15
+ import {
16
+ assertSegmentLeaf,
17
+ isSegmentLeaf,
18
+ toSegmentLeaf,
19
+ type ISegmentLeaf,
20
+ type ISegmentPrivate,
21
+ } from "./mergeTreeNodes.js";
17
22
  import { ITrackingGroup, Trackable, UnorderedTrackingGroup } from "./mergeTreeTracking.js";
18
23
  import { IJSONSegment, MergeTreeDeltaType, ReferenceType } from "./ops.js";
19
24
  import { PropertySet, matchProperties } from "./properties.js";
20
25
  import { DetachedReferencePosition } from "./referencePositions.js";
26
+ import { toRemovalInfo } from "./segmentInfos.js";
21
27
 
22
28
  /**
23
29
  * @legacy
@@ -86,7 +92,7 @@ export interface MergeTreeWithRevert extends MergeTree {
86
92
  export type PickPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
87
93
  function findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {
88
94
  const segmentOrNode = trackable.isLeaf() ? trackable : trackable.getSegment();
89
- const maybeRoot = findRootMergeBlock(segmentOrNode);
95
+ const maybeRoot = findRootMergeBlock(toSegmentLeaf(segmentOrNode));
90
96
  assert(
91
97
  maybeRoot?.mergeTree !== undefined,
92
98
  0x5c2 /* trackable is invalid as it is not in a rooted merge tree. */,
@@ -99,7 +105,6 @@ function findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {
99
105
  const refCallbacks: MergeTreeWithRevert["__mergeTreeRevertible"]["refCallbacks"] = {
100
106
  afterSlide: (r: LocalReferencePosition) => {
101
107
  if (mergeTree.referencePositionToLocalPosition(r) === DetachedReferencePosition) {
102
- // eslint-disable-next-line import/no-deprecated
103
108
  const refs = LocalReferenceCollection.setOrGet(detachedReferences);
104
109
  refs.addAfterTombstones([r]);
105
110
  }
@@ -243,7 +248,7 @@ export function discardMergeTreeDeltaRevertible(
243
248
  t.trackingCollection.unlink(r.trackingGroup);
244
249
  // remove untracked local references
245
250
  if (t.trackingCollection.empty && !t.isLeaf()) {
246
- const segment: ISegmentLeaf | undefined = t.getSegment();
251
+ const segment: ISegmentPrivate | undefined = t.getSegment();
247
252
  segment?.localRefs?.removeLocalRef(t);
248
253
  }
249
254
  }
@@ -261,7 +266,7 @@ function revertLocalInsert(
261
266
  tracked.trackingCollection.unlink(revertible.trackingGroup),
262
267
  0x3f1 /* tracking group removed */,
263
268
  );
264
- assert(tracked.isLeaf(), 0x3f2 /* inserts must track segments */);
269
+ assert(isSegmentLeaf(tracked), 0x3f2 /* inserts must track segments */);
265
270
  if (toRemovalInfo(tracked) === undefined) {
266
271
  const start = getPosition(mergeTreeWithRevert, tracked);
267
272
  driver.removeRange(start, start + tracked.cachedLength);
@@ -284,14 +289,14 @@ function revertLocalRemove(
284
289
 
285
290
  assert(!tracked.isLeaf(), 0x3f4 /* removes must track local refs */);
286
291
 
287
- const refSeg: ISegmentLeaf | undefined = tracked.getSegment();
292
+ const refSeg = tracked.getSegment();
288
293
  let realPos = mergeTreeWithRevert.referencePositionToLocalPosition(tracked);
289
294
 
290
295
  // References which are on EndOfStringSegment don't return detached for pos,
291
296
  // they will return the length of the merge-tree. this case just catches
292
297
  // random references, likely not created in the revertible flow,
293
298
  // that are tying to be reverted for some reason.
294
- if (realPos === DetachedReferencePosition || refSeg === undefined) {
299
+ if (realPos === DetachedReferencePosition || !isSegmentLeaf(refSeg)) {
295
300
  throw new UsageError("Cannot insert at detached references position");
296
301
  }
297
302
 
@@ -301,12 +306,12 @@ function revertLocalRemove(
301
306
 
302
307
  const props = tracked.properties as RemoveSegmentRefProperties;
303
308
  driver.insertFromSpec(realPos, props.segSpec);
304
- const insertSegment: ISegmentLeaf | undefined = mergeTreeWithRevert.getContainingSegment(
309
+ const insertSegment = mergeTreeWithRevert.getContainingSegment(
305
310
  realPos,
306
311
  mergeTreeWithRevert.collabWindow.currentSeq,
307
312
  mergeTreeWithRevert.collabWindow.clientId,
308
313
  ).segment;
309
- assert(insertSegment !== undefined, 0x3f5 /* insert segment must exist at position */);
314
+ assertSegmentLeaf(insertSegment);
310
315
 
311
316
  const localSlideFilter = (lref: LocalReferencePosition): boolean =>
312
317
  (lref.properties as Partial<RemoveSegmentRefProperties>)?.referenceSpace ===
@@ -333,11 +338,10 @@ function revertLocalRemove(
333
338
  }
334
339
  };
335
340
  depthFirstNodeWalk(
336
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
337
- insertSegment.parent!,
341
+ insertSegment.parent,
338
342
  insertSegment,
339
343
  undefined,
340
- (seg: ISegmentLeaf) => {
344
+ (seg: ISegmentPrivate) => {
341
345
  if (seg.localRefs?.empty === false) {
342
346
  return seg.localRefs.walkReferences(refHandler, undefined, forward);
343
347
  }
@@ -356,7 +360,6 @@ function revertLocalRemove(
356
360
  }
357
361
 
358
362
  if (insertRef !== undefined) {
359
- // eslint-disable-next-line import/no-deprecated
360
363
  const localRefs = LocalReferenceCollection.setOrGet(insertSegment);
361
364
  if (insertRef.before?.empty === false) {
362
365
  localRefs.addBeforeTombstones(insertRef.before.map((n) => n.data));
@@ -370,7 +373,7 @@ function revertLocalRemove(
370
373
  tg.link(insertSegment);
371
374
  tg.unlink(tracked);
372
375
  }
373
- const segment: ISegmentLeaf | undefined = tracked.getSegment();
376
+ const segment: ISegmentPrivate | undefined = tracked.getSegment();
374
377
  segment?.localRefs?.removeLocalRef(tracked);
375
378
  }
376
379
  }
@@ -383,7 +386,7 @@ function revertLocalAnnotate(
383
386
  while (revertible.trackingGroup.size > 0) {
384
387
  const tracked = revertible.trackingGroup.tracked[0];
385
388
  const unlinked = tracked.trackingCollection.unlink(revertible.trackingGroup);
386
- assert(unlinked && tracked.isLeaf(), 0x3f7 /* annotates must track segments */);
389
+ assert(unlinked && isSegmentLeaf(tracked), 0x3f7 /* annotates must track segments */);
387
390
  if (toRemovalInfo(tracked) === undefined) {
388
391
  const start = getPosition(mergeTreeWithRevert, tracked);
389
392
  driver.annotateRange(start, start + tracked.cachedLength, revertible.propertyDeltas);
@@ -4,16 +4,13 @@
4
4
  */
5
5
 
6
6
  import { DoublyLinkedList, walkList } from "./collections/index.js";
7
- // eslint-disable-next-line import/no-deprecated
8
7
  import { SegmentGroup, type ISegmentLeaf } from "./mergeTreeNodes.js";
9
8
 
10
9
  export class SegmentGroupCollection {
11
- // eslint-disable-next-line import/no-deprecated
12
- private readonly segmentGroups: DoublyLinkedList<SegmentGroup<ISegmentLeaf>>;
10
+ private readonly segmentGroups: DoublyLinkedList<SegmentGroup>;
13
11
 
14
12
  constructor(private readonly segment: ISegmentLeaf) {
15
- // eslint-disable-next-line import/no-deprecated
16
- this.segmentGroups = new DoublyLinkedList<SegmentGroup<ISegmentLeaf>>();
13
+ this.segmentGroups = new DoublyLinkedList<SegmentGroup>();
17
14
  }
18
15
 
19
16
  public get size(): number {
@@ -24,19 +21,16 @@ export class SegmentGroupCollection {
24
21
  return this.segmentGroups.empty;
25
22
  }
26
23
 
27
- // eslint-disable-next-line import/no-deprecated
28
- public enqueue(segmentGroup: SegmentGroup<ISegmentLeaf>): void {
24
+ public enqueue(segmentGroup: SegmentGroup): void {
29
25
  this.segmentGroups.push(segmentGroup);
30
26
  segmentGroup.segments.push(this.segment);
31
27
  }
32
28
 
33
- // eslint-disable-next-line import/no-deprecated
34
- public dequeue(): SegmentGroup<ISegmentLeaf> | undefined {
29
+ public dequeue(): SegmentGroup | undefined {
35
30
  return this.segmentGroups.shift()?.data;
36
31
  }
37
32
 
38
- // eslint-disable-next-line import/no-deprecated
39
- public remove?(segmentGroup: SegmentGroup<ISegmentLeaf>): boolean {
33
+ public remove(segmentGroup: SegmentGroup): boolean {
40
34
  const found = this.segmentGroups.find((v) => v.data === segmentGroup);
41
35
  if (found === undefined) {
42
36
  return false;
@@ -45,8 +39,7 @@ export class SegmentGroupCollection {
45
39
  return true;
46
40
  }
47
41
 
48
- // eslint-disable-next-line import/no-deprecated
49
- public pop?(): SegmentGroup<ISegmentLeaf> | undefined {
42
+ public pop(): SegmentGroup | undefined {
50
43
  return this.segmentGroups.pop ? this.segmentGroups.pop()?.data : undefined;
51
44
  }
52
45
 
@@ -54,11 +47,7 @@ export class SegmentGroupCollection {
54
47
  walkList(this.segmentGroups, (sg) => segmentGroups.enqueueOnCopy(sg.data, this.segment));
55
48
  }
56
49
 
57
- // eslint-disable-next-line import/no-deprecated
58
- private enqueueOnCopy(
59
- segmentGroup: SegmentGroup<ISegmentLeaf>,
60
- sourceSegment: ISegmentLeaf,
61
- ): void {
50
+ private enqueueOnCopy(segmentGroup: SegmentGroup, sourceSegment: ISegmentLeaf): void {
62
51
  this.enqueue(segmentGroup);
63
52
  if (segmentGroup.previousProps) {
64
53
  // duplicate the previousProps for this segment