@fluidframework/merge-tree 2.11.0 → 2.12.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 (174) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/api-report/merge-tree.legacy.alpha.api.md +50 -19
  3. package/dist/MergeTreeTextHelper.js.map +1 -1
  4. package/dist/attributionPolicy.d.ts.map +1 -1
  5. package/dist/attributionPolicy.js +2 -1
  6. package/dist/attributionPolicy.js.map +1 -1
  7. package/dist/client.js.map +1 -1
  8. package/dist/endOfTreeSegment.d.ts +3 -3
  9. package/dist/endOfTreeSegment.d.ts.map +1 -1
  10. package/dist/endOfTreeSegment.js.map +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/legacy.d.ts +2 -1
  16. package/dist/localReference.d.ts +1 -0
  17. package/dist/localReference.d.ts.map +1 -1
  18. package/dist/localReference.js +1 -0
  19. package/dist/localReference.js.map +1 -1
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +19 -2
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeNodeWalk.d.ts +5 -5
  24. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  25. package/dist/mergeTreeNodeWalk.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +115 -7
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +25 -1
  29. package/dist/mergeTreeNodes.js.map +1 -1
  30. package/dist/partialLengths.d.ts +2 -2
  31. package/dist/partialLengths.d.ts.map +1 -1
  32. package/dist/partialLengths.js +5 -1
  33. package/dist/partialLengths.js.map +1 -1
  34. package/dist/perspective.d.ts +9 -9
  35. package/dist/perspective.d.ts.map +1 -1
  36. package/dist/perspective.js.map +1 -1
  37. package/dist/revertibles.d.ts.map +1 -1
  38. package/dist/revertibles.js +3 -0
  39. package/dist/revertibles.js.map +1 -1
  40. package/dist/snapshotLoader.js.map +1 -1
  41. package/dist/snapshotV1.js.map +1 -1
  42. package/dist/snapshotlegacy.d.ts +2 -2
  43. package/dist/snapshotlegacy.d.ts.map +1 -1
  44. package/dist/snapshotlegacy.js.map +1 -1
  45. package/dist/sortedSegmentSet.d.ts +4 -4
  46. package/dist/sortedSegmentSet.d.ts.map +1 -1
  47. package/dist/sortedSegmentSet.js.map +1 -1
  48. package/dist/test/beastTest.spec.d.ts.map +1 -1
  49. package/dist/test/beastTest.spec.js.map +1 -1
  50. package/dist/test/client.applyMsg.spec.js.map +1 -1
  51. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  52. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  53. package/dist/test/client.getPosition.spec.js.map +1 -1
  54. package/dist/test/client.localReference.spec.js.map +1 -1
  55. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  56. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  57. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  58. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  59. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  60. package/dist/test/snapshot.utils.d.ts +2 -2
  61. package/dist/test/snapshot.utils.d.ts.map +1 -1
  62. package/dist/test/snapshot.utils.js.map +1 -1
  63. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  64. package/dist/test/testClient.d.ts +6 -6
  65. package/dist/test/testClient.d.ts.map +1 -1
  66. package/dist/test/testClient.js.map +1 -1
  67. package/dist/test/testClientLogger.js.map +1 -1
  68. package/dist/test/testUtils.d.ts +2 -2
  69. package/dist/test/testUtils.d.ts.map +1 -1
  70. package/dist/test/testUtils.js.map +1 -1
  71. package/dist/test/text.d.ts +2 -2
  72. package/dist/test/text.d.ts.map +1 -1
  73. package/dist/test/text.js.map +1 -1
  74. package/dist/test/tracking.spec.js.map +1 -1
  75. package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
  76. package/dist/test/wordUnitTests.spec.js +3 -1
  77. package/dist/test/wordUnitTests.spec.js.map +1 -1
  78. package/dist/zamboni.js.map +1 -1
  79. package/lib/MergeTreeTextHelper.js.map +1 -1
  80. package/lib/attributionPolicy.d.ts.map +1 -1
  81. package/lib/attributionPolicy.js +2 -1
  82. package/lib/attributionPolicy.js.map +1 -1
  83. package/lib/client.js.map +1 -1
  84. package/lib/endOfTreeSegment.d.ts +3 -3
  85. package/lib/endOfTreeSegment.d.ts.map +1 -1
  86. package/lib/endOfTreeSegment.js.map +1 -1
  87. package/lib/index.d.ts +1 -1
  88. package/lib/index.d.ts.map +1 -1
  89. package/lib/index.js +1 -1
  90. package/lib/index.js.map +1 -1
  91. package/lib/legacy.d.ts +2 -1
  92. package/lib/localReference.d.ts +1 -0
  93. package/lib/localReference.d.ts.map +1 -1
  94. package/lib/localReference.js +1 -0
  95. package/lib/localReference.js.map +1 -1
  96. package/lib/mergeTree.d.ts.map +1 -1
  97. package/lib/mergeTree.js +22 -3
  98. package/lib/mergeTree.js.map +1 -1
  99. package/lib/mergeTreeNodeWalk.d.ts +5 -5
  100. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  101. package/lib/mergeTreeNodeWalk.js.map +1 -1
  102. package/lib/mergeTreeNodes.d.ts +115 -7
  103. package/lib/mergeTreeNodes.d.ts.map +1 -1
  104. package/lib/mergeTreeNodes.js +23 -0
  105. package/lib/mergeTreeNodes.js.map +1 -1
  106. package/lib/partialLengths.d.ts +2 -2
  107. package/lib/partialLengths.d.ts.map +1 -1
  108. package/lib/partialLengths.js +5 -1
  109. package/lib/partialLengths.js.map +1 -1
  110. package/lib/perspective.d.ts +9 -9
  111. package/lib/perspective.d.ts.map +1 -1
  112. package/lib/perspective.js.map +1 -1
  113. package/lib/revertibles.d.ts.map +1 -1
  114. package/lib/revertibles.js +4 -1
  115. package/lib/revertibles.js.map +1 -1
  116. package/lib/snapshotLoader.js.map +1 -1
  117. package/lib/snapshotV1.js.map +1 -1
  118. package/lib/snapshotlegacy.d.ts +2 -2
  119. package/lib/snapshotlegacy.d.ts.map +1 -1
  120. package/lib/snapshotlegacy.js.map +1 -1
  121. package/lib/sortedSegmentSet.d.ts +4 -4
  122. package/lib/sortedSegmentSet.d.ts.map +1 -1
  123. package/lib/sortedSegmentSet.js.map +1 -1
  124. package/lib/test/beastTest.spec.d.ts.map +1 -1
  125. package/lib/test/beastTest.spec.js.map +1 -1
  126. package/lib/test/client.applyMsg.spec.js.map +1 -1
  127. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
  128. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  129. package/lib/test/client.getPosition.spec.js.map +1 -1
  130. package/lib/test/client.localReference.spec.js.map +1 -1
  131. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  132. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  133. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  134. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  135. package/lib/test/resetPendingSegmentsToOp.spec.js +1 -1
  136. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  137. package/lib/test/snapshot.utils.d.ts +2 -2
  138. package/lib/test/snapshot.utils.d.ts.map +1 -1
  139. package/lib/test/snapshot.utils.js.map +1 -1
  140. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  141. package/lib/test/testClient.d.ts +6 -6
  142. package/lib/test/testClient.d.ts.map +1 -1
  143. package/lib/test/testClient.js +1 -1
  144. package/lib/test/testClient.js.map +1 -1
  145. package/lib/test/testClientLogger.js.map +1 -1
  146. package/lib/test/testUtils.d.ts +2 -2
  147. package/lib/test/testUtils.d.ts.map +1 -1
  148. package/lib/test/testUtils.js.map +1 -1
  149. package/lib/test/text.d.ts +2 -2
  150. package/lib/test/text.d.ts.map +1 -1
  151. package/lib/test/text.js.map +1 -1
  152. package/lib/test/tracking.spec.js.map +1 -1
  153. package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
  154. package/lib/test/wordUnitTests.spec.js +3 -1
  155. package/lib/test/wordUnitTests.spec.js.map +1 -1
  156. package/lib/zamboni.js.map +1 -1
  157. package/package.json +17 -17
  158. package/src/MergeTreeTextHelper.ts +2 -2
  159. package/src/attributionPolicy.ts +3 -1
  160. package/src/client.ts +1 -1
  161. package/src/endOfTreeSegment.ts +6 -3
  162. package/src/index.ts +1 -0
  163. package/src/localReference.ts +1 -0
  164. package/src/mergeTree.ts +19 -0
  165. package/src/mergeTreeNodeWalk.ts +6 -6
  166. package/src/mergeTreeNodes.ts +136 -9
  167. package/src/partialLengths.ts +9 -5
  168. package/src/perspective.ts +11 -11
  169. package/src/revertibles.ts +9 -11
  170. package/src/snapshotLoader.ts +7 -7
  171. package/src/snapshotV1.ts +4 -4
  172. package/src/snapshotlegacy.ts +6 -6
  173. package/src/sortedSegmentSet.ts +8 -9
  174. package/src/zamboni.ts +2 -2
@@ -19,6 +19,7 @@ import {
19
19
  IMergeTreeSegmentDelta,
20
20
  MergeTreeMaintenanceType,
21
21
  } from "./mergeTreeDeltaCallback.js";
22
+ import type { ISegmentLeaf } from "./mergeTreeNodes.js";
22
23
  import { MergeTreeDeltaType } from "./ops.js";
23
24
 
24
25
  // Note: these thinly wrap MergeTreeDeltaCallback and MergeTreeMaintenanceCallback to provide the client.
@@ -102,7 +103,8 @@ const attributeInsertionOnSegments = (
102
103
  key: AttributionKey,
103
104
  ): void => {
104
105
  for (const { segment } of deltaSegments) {
105
- if (segment.seq !== undefined) {
106
+ const seg: ISegmentLeaf = segment;
107
+ if (seg.seq !== undefined) {
106
108
  segment.attribution?.update(
107
109
  undefined,
108
110
  new AttributionCollection(segment.cachedLength, key),
package/src/client.ts CHANGED
@@ -396,7 +396,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
396
396
  ): void {
397
397
  let localInserts = 0;
398
398
  let localRemoves = 0;
399
- walkAllChildSegments(this._mergeTree.root, (seg) => {
399
+ walkAllChildSegments(this._mergeTree.root, (seg: ISegmentLeaf) => {
400
400
  if (seg.seq === UnassignedSequenceNumber) {
401
401
  localInserts++;
402
402
  }
@@ -6,10 +6,12 @@
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import { LocalClientId } from "./constants.js";
9
+ // eslint-disable-next-line import/no-deprecated
9
10
  import { LocalReferenceCollection } from "./localReference.js";
10
11
  import { MergeTree } from "./mergeTree.js";
11
12
  import { NodeAction, depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
12
- import { IRemovalInfo, ISegment, ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
13
+ // eslint-disable-next-line import/no-deprecated
14
+ import { ISegment, ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
13
15
 
14
16
  /**
15
17
  * This is a special segment that is not bound or known by the merge tree itself,
@@ -71,6 +73,7 @@ abstract class BaseEndpointSegment {
71
73
 
72
74
  abstract get ordinal(): string;
73
75
 
76
+ // eslint-disable-next-line import/no-deprecated
74
77
  localRefs?: LocalReferenceCollection;
75
78
 
76
79
  /*
@@ -99,7 +102,7 @@ const notSupported = (): never => {
99
102
  /**
100
103
  * The position immediately prior to the start of the tree
101
104
  */
102
- export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment, IRemovalInfo {
105
+ export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment {
103
106
  type: string = "StartOfTreeSegment";
104
107
  readonly endpointType = "start";
105
108
 
@@ -149,7 +152,7 @@ export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment,
149
152
  /**
150
153
  * The position immediately after the end of the tree
151
154
  */
152
- export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment, IRemovalInfo {
155
+ export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment {
153
156
  type: string = "EndOfTreeSegment";
154
157
  readonly endpointType = "end";
155
158
 
package/src/index.ts CHANGED
@@ -63,6 +63,7 @@ export {
63
63
  IMergeNodeCommon,
64
64
  IMoveInfo,
65
65
  IRemovalInfo,
66
+ segmentIsRemoved,
66
67
  ISegment,
67
68
  ISegmentAction,
68
69
  Marker,
@@ -228,6 +228,7 @@ export function setValidateRefCount(
228
228
  *
229
229
  * @legacy
230
230
  * @alpha
231
+ * @deprecated - This class will be removed in 2.20 with no replacement.
231
232
  */
232
233
  export class LocalReferenceCollection {
233
234
  public static append(seg1: ISegment, seg2: ISegment): void {
package/src/mergeTree.ts CHANGED
@@ -20,6 +20,7 @@ import {
20
20
  } from "./constants.js";
21
21
  import { EndOfTreeSegment, StartOfTreeSegment } from "./endOfTreeSegment.js";
22
22
  import {
23
+ // eslint-disable-next-line import/no-deprecated
23
24
  LocalReferenceCollection,
24
25
  LocalReferencePosition,
25
26
  SlidingPreference,
@@ -46,7 +47,9 @@ import {
46
47
  // eslint-disable-next-line import/no-deprecated
47
48
  CollaborationWindow,
48
49
  IMergeNode,
50
+ // eslint-disable-next-line import/no-deprecated
49
51
  IMoveInfo,
52
+ // eslint-disable-next-line import/no-deprecated
50
53
  IRemovalInfo,
51
54
  ISegmentAction,
52
55
  ISegmentChanges,
@@ -100,6 +103,7 @@ import { Side, type InteriorSequencePlace } from "./sequencePlace.js";
100
103
  import { SortedSegmentSet } from "./sortedSegmentSet.js";
101
104
  import { zamboniSegments } from "./zamboni.js";
102
105
 
106
+ // eslint-disable-next-line import/no-deprecated
103
107
  function markSegmentMoved(seg: ISegmentLeaf, moveInfo: IMoveInfo): void {
104
108
  seg.moveDst = moveInfo.moveDst;
105
109
  seg.movedClientIds = [...moveInfo.movedClientIds];
@@ -109,19 +113,23 @@ function markSegmentMoved(seg: ISegmentLeaf, moveInfo: IMoveInfo): void {
109
113
  seg.wasMovedOnInsert = moveInfo.wasMovedOnInsert;
110
114
  }
111
115
 
116
+ // eslint-disable-next-line import/no-deprecated
112
117
  function isMoved(segment: ISegmentLeaf): segment is ISegmentLeaf & IMoveInfo {
113
118
  return toMoveInfo(segment) !== undefined;
114
119
  }
115
120
 
121
+ // eslint-disable-next-line import/no-deprecated
116
122
  function isRemoved(segment: ISegmentLeaf): segment is ISegmentLeaf & IRemovalInfo {
117
123
  return toRemovalInfo(segment) !== undefined;
118
124
  }
119
125
 
126
+ // eslint-disable-next-line import/no-deprecated
120
127
  function isRemovedAndAcked(segment: ISegmentLeaf): segment is ISegmentLeaf & IRemovalInfo {
121
128
  const removalInfo = toRemovalInfo(segment);
122
129
  return removalInfo !== undefined && removalInfo.removedSeq !== UnassignedSequenceNumber;
123
130
  }
124
131
 
132
+ // eslint-disable-next-line import/no-deprecated
125
133
  function isMovedAndAcked(segment: ISegmentLeaf): segment is ISegmentLeaf & IMoveInfo {
126
134
  const moveInfo = toMoveInfo(segment);
127
135
  return moveInfo !== undefined && moveInfo.movedSeq !== UnassignedSequenceNumber;
@@ -180,6 +188,7 @@ function ackSegment(
180
188
  }
181
189
 
182
190
  case MergeTreeDeltaType.REMOVE: {
191
+ // eslint-disable-next-line import/no-deprecated
183
192
  const removalInfo: IRemovalInfo | undefined = toRemovalInfo(segment);
184
193
  assert(removalInfo !== undefined, 0x046 /* "On remove ack, missing removal info!" */);
185
194
  segment.localRemovedSeq = undefined;
@@ -192,6 +201,7 @@ function ackSegment(
192
201
 
193
202
  case MergeTreeDeltaType.OBLITERATE:
194
203
  case MergeTreeDeltaType.OBLITERATE_SIDED: {
204
+ // eslint-disable-next-line import/no-deprecated
195
205
  const moveInfo: IMoveInfo | undefined = toMoveInfo(segment);
196
206
  assert(moveInfo !== undefined, 0x86e /* On obliterate ack, missing move info! */);
197
207
  const obliterateInfo = segmentGroup.obliterateInfo;
@@ -877,7 +887,9 @@ export class MergeTree {
877
887
  */
878
888
  private slideAckedRemovedSegmentReferences(segments: ISegmentLeaf[]): void {
879
889
  // References are slid in groups to preserve their order.
890
+ // eslint-disable-next-line import/no-deprecated
880
891
  let currentForwardSlideGroup: LocalReferenceCollection[] = [];
892
+ // eslint-disable-next-line import/no-deprecated
881
893
  let currentBackwardSlideGroup: LocalReferenceCollection[] = [];
882
894
 
883
895
  let currentForwardMaybeEndpoint: "start" | "end" | undefined;
@@ -891,6 +903,7 @@ export class MergeTree {
891
903
  const slideGroup = (
892
904
  currentSlideDestination: ISegmentLeaf | undefined,
893
905
  currentSlideIsForward: boolean | undefined,
906
+ // eslint-disable-next-line import/no-deprecated
894
907
  currentSlideGroup: LocalReferenceCollection[],
895
908
  pred: (ref: LocalReferencePosition) => boolean,
896
909
  maybeEndpoint: "start" | "end" | undefined,
@@ -915,6 +928,7 @@ export class MergeTree {
915
928
 
916
929
  if (maybeEndpoint) {
917
930
  const endpoint = maybeEndpoint === "start" ? this.startOfTree : this.endOfTree;
931
+ // eslint-disable-next-line import/no-deprecated
918
932
  const localRefs = LocalReferenceCollection.setOrGet(endpoint);
919
933
  if (currentSlideIsForward) {
920
934
  localRefs.addBeforeTombstones(...endpointRefsToAdd);
@@ -934,6 +948,7 @@ export class MergeTree {
934
948
  }
935
949
  }
936
950
  } else {
951
+ // eslint-disable-next-line import/no-deprecated
937
952
  const localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);
938
953
  if (currentSlideIsForward) {
939
954
  localRefs.addBeforeTombstones(...nonEndpointRefsToAdd);
@@ -947,11 +962,13 @@ export class MergeTree {
947
962
  segment: ISegmentLeaf,
948
963
  currentSlideDestination: ISegmentLeaf | undefined,
949
964
  currentSlideIsForward: boolean | undefined,
965
+ // eslint-disable-next-line import/no-deprecated
950
966
  currentSlideGroup: LocalReferenceCollection[],
951
967
  pred: (ref: LocalReferencePosition) => boolean,
952
968
  slidingPreference: SlidingPreference,
953
969
  currentMaybeEndpoint: "start" | "end" | undefined,
954
970
  reassign: (
971
+ // eslint-disable-next-line import/no-deprecated
955
972
  localRefs: LocalReferenceCollection,
956
973
  slideToSegment: ISegmentLeaf | undefined,
957
974
  slideIsForward: boolean,
@@ -1649,6 +1666,7 @@ export class MergeTree {
1649
1666
  }
1650
1667
 
1651
1668
  if (oldest && newest?.clientId !== clientId) {
1669
+ // eslint-disable-next-line import/no-deprecated
1652
1670
  const moveInfo: IMoveInfo = {
1653
1671
  movedClientIds,
1654
1672
  movedSeq: oldest.seq,
@@ -2510,6 +2528,7 @@ export class MergeTree {
2510
2528
  segment = _segment;
2511
2529
  }
2512
2530
 
2531
+ // eslint-disable-next-line import/no-deprecated
2513
2532
  const localRefs = LocalReferenceCollection.setOrGet(segment);
2514
2533
 
2515
2534
  const segRef = localRefs.createLocalRef(
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { type MergeBlock, IMergeNode, ISegment } from "./mergeTreeNodes.js";
6
+ import { type ISegmentLeaf, type MergeBlock, IMergeNode } from "./mergeTreeNodes.js";
7
7
 
8
8
  export const LeafAction = {
9
9
  Exit: false,
@@ -38,7 +38,7 @@ export function depthFirstNodeWalk(
38
38
  startBlock: MergeBlock,
39
39
  startChild: IMergeNode | undefined,
40
40
  downAction?: (node: IMergeNode) => NodeAction,
41
- leafActionOverride?: (seg: ISegment) => LeafAction,
41
+ leafActionOverride?: (seg: ISegmentLeaf) => LeafAction,
42
42
  upAction?: (block: MergeBlock) => void,
43
43
  forward: boolean = true,
44
44
  ): boolean {
@@ -77,7 +77,7 @@ export function depthFirstNodeWalk(
77
77
  for (let i = start.index; i !== -1 && i !== childCount; i += increment) {
78
78
  // the above loop ensures start is a leaf or undefined, so all children
79
79
  // will be leaves if start exits, so the cast is safe
80
- if (leafAction(block.children[i] as ISegment) === LeafAction.Exit) {
80
+ if (leafAction(block.children[i] as ISegmentLeaf) === LeafAction.Exit) {
81
81
  exit = true;
82
82
  break;
83
83
  }
@@ -122,7 +122,7 @@ export function depthFirstNodeWalk(
122
122
  */
123
123
  export function forwardExcursion(
124
124
  startNode: IMergeNode,
125
- leafAction: (seg: ISegment) => boolean | undefined,
125
+ leafAction: (seg: ISegmentLeaf) => boolean | undefined,
126
126
  ): boolean {
127
127
  if (startNode.parent === undefined) {
128
128
  return true;
@@ -145,7 +145,7 @@ export function forwardExcursion(
145
145
  */
146
146
  export function backwardExcursion(
147
147
  startNode: IMergeNode,
148
- leafAction: (seg: ISegment) => boolean | undefined,
148
+ leafAction: (seg: ISegmentLeaf) => boolean | undefined,
149
149
  ): boolean {
150
150
  if (startNode.parent === undefined) {
151
151
  return true;
@@ -171,7 +171,7 @@ export function backwardExcursion(
171
171
  */
172
172
  export function walkAllChildSegments(
173
173
  startBlock: MergeBlock,
174
- leafAction: (segment: ISegment) => boolean | undefined | void,
174
+ leafAction: (segment: ISegmentLeaf) => boolean | undefined | void,
175
175
  ): boolean {
176
176
  if (startBlock.childCount === 0) {
177
177
  return true;
@@ -14,6 +14,7 @@ import {
14
14
  UnassignedSequenceNumber,
15
15
  UniversalSequenceNumber,
16
16
  } from "./constants.js";
17
+ // eslint-disable-next-line import/no-deprecated
17
18
  import { LocalReferenceCollection, type LocalReferencePosition } from "./localReference.js";
18
19
  import { TrackingGroupCollection } from "./mergeTreeTracking.js";
19
20
  import { IJSONSegment, IMarkerDef, ReferenceType } from "./ops.js";
@@ -34,6 +35,7 @@ import { PropertiesManager } from "./segmentPropertiesManager.js";
34
35
  * Common properties for a node in a merge tree.
35
36
  * @legacy
36
37
  * @alpha
38
+ * @deprecated - This interface will be removed in 2.20 with no replacement.
37
39
  */
38
40
  export interface IMergeNodeCommon {
39
41
  /**
@@ -58,9 +60,13 @@ export interface IMergeNodeCommon {
58
60
  *
59
61
  * @internal
60
62
  */
61
- export type ISegmentInternal = ISegment & {
62
- localRefs?: LocalReferenceCollection;
63
- };
63
+ export type ISegmentInternal = Omit<ISegment, keyof IRemovalInfo | keyof IMoveInfo> &
64
+ Partial<IMergeNodeCommon> &
65
+ Partial<IRemovalInfo> &
66
+ Partial<IMoveInfo> & {
67
+ // eslint-disable-next-line import/no-deprecated
68
+ localRefs?: LocalReferenceCollection;
69
+ };
64
70
 
65
71
  /**
66
72
  * We use tiered interface to control visibility of segment properties.
@@ -89,6 +95,7 @@ export type IMergeNode = MergeBlock | ISegmentLeaf;
89
95
  * Contains removal information associated to an {@link ISegment}.
90
96
  * @legacy
91
97
  * @alpha
98
+ * @deprecated - This interface will be removed in 2.20 with no replacement.
92
99
  */
93
100
  export interface IRemovalInfo {
94
101
  /**
@@ -133,6 +140,7 @@ export function toRemovalInfo(
133
140
  * in the future, when moves _are_ supported.
134
141
  * @legacy
135
142
  * @alpha
143
+ * @deprecated - This interface will be removed in 2.20 with no replacement.
136
144
  */
137
145
  export interface IMoveInfo {
138
146
  /**
@@ -211,7 +219,7 @@ export function toMoveInfo(maybe: Partial<IMoveInfo> | undefined): IMoveInfo | u
211
219
  * @legacy
212
220
  * @alpha
213
221
  */
214
- export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Partial<IMoveInfo> {
222
+ export interface ISegment {
215
223
  readonly type: string;
216
224
 
217
225
  readonly trackingCollection: TrackingGroupCollection;
@@ -223,6 +231,7 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
223
231
  * after the tree. These segments cannot be referenced by regular operations
224
232
  * and exist primarily as a bucket for local references to slide onto during
225
233
  * deletion of regular segments.
234
+ * @deprecated - This property will be removed in 2.20 with no replacement.
226
235
  */
227
236
  readonly endpointType?: "start" | "end";
228
237
 
@@ -254,6 +263,7 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
254
263
  *
255
264
  * @privateRemarks
256
265
  * See {@link CollaborationWindow.localSeq} for more information on the semantics of localSeq.
266
+ * @deprecated - This property will be removed in 2.20 with no replacement.
257
267
  */
258
268
  localSeq?: number;
259
269
  /**
@@ -265,20 +275,25 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
265
275
  *
266
276
  * @privateRemarks
267
277
  * See {@link CollaborationWindow.localSeq} for more information on the semantics of localSeq.
278
+ * @deprecated - This property will be removed in 2.20 with no replacement.
268
279
  */
269
280
  localRemovedSeq?: number;
270
281
  /**
271
282
  * Seq at which this segment was inserted.
272
283
  * If undefined, it is assumed the segment was inserted prior to the collab window's minimum sequence number.
284
+ * @deprecated - This property will be removed in 2.20 with no replacement.
273
285
  */
274
286
  seq?: number;
275
287
  /**
276
288
  * Short clientId for the client that inserted this segment.
289
+ * @deprecated - This property will be removed in 2.20 with no replacement.
277
290
  */
278
291
  clientId: number;
279
292
  /**
280
293
  * Local references added to this segment.
294
+ * @deprecated - This property will be removed in 2.20 with no replacement.
281
295
  */
296
+ // eslint-disable-next-line import/no-deprecated
282
297
  localRefs?: LocalReferenceCollection;
283
298
  /**
284
299
  * Properties that have been added to this segment via annotation.
@@ -292,6 +307,70 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
292
307
  // Changing this to something other than any would break consumers.
293
308
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
294
309
  toJSONObject(): any;
310
+ isLeaf(): this is ISegment;
311
+
312
+ /**
313
+ * {@inheritDoc @fluidframework/merge-tree#IMergeNodeCommon.index}
314
+ * @deprecated - This property will be removed in 2.20 with no replacement.
315
+ */
316
+ index: number;
317
+ /**
318
+ * {@inheritDoc @fluidframework/merge-tree#IMergeNodeCommon.ordinal}
319
+ * @deprecated - This property will be removed in 2.20 with no replacement.
320
+ */
321
+ ordinal: string;
322
+
323
+ /**
324
+ * {@inheritDoc @fluidframework/merge-tree#IRemovalInfo.removedSeq}
325
+ * @deprecated - This property will be removed in 2.20 with no replacement.
326
+ */
327
+ removedSeq?: number;
328
+ /**
329
+ * {@inheritDoc @fluidframework/merge-tree#IRemovalInfo.removedClientIds}
330
+ * @deprecated - This property will be removed in 2.20 with no replacement.
331
+ */
332
+ removedClientIds?: number[];
333
+ /**
334
+ * {@inheritDoc @fluidframework/merge-tree#IMoveInfo.localMovedSeq}
335
+ * @deprecated - This property will be removed in 2.20 with no replacement.
336
+ */
337
+ localMovedSeq?: number;
338
+ /**
339
+ * {@inheritDoc @fluidframework/merge-tree#IMoveInfo.movedSeq}
340
+ * @deprecated - This property will be removed in 2.20 with no replacement.
341
+ */
342
+ movedSeq?: number;
343
+
344
+ /**
345
+ * {@inheritDoc @fluidframework/merge-tree#IMoveInfo.movedSeqs}
346
+ * @deprecated - This property will be removed in 2.20 with no replacement.
347
+ */
348
+ movedSeqs?: number[];
349
+ /**
350
+ * {@inheritDoc @fluidframework/merge-tree#IMoveInfo.moveDst}
351
+ * @deprecated - This property will be removed in 2.20 with no replacement.
352
+ */
353
+ moveDst?: ReferencePosition;
354
+ /**
355
+ * {@inheritDoc @fluidframework/merge-tree#IMoveInfo.movedClientIds}
356
+ * @deprecated - This property will be removed in 2.20 with no replacement.
357
+ */
358
+ movedClientIds?: number[];
359
+ /**
360
+ * {@inheritDoc @fluidframework/merge-tree#IMoveInfo.wasMovedOnInsert}
361
+ * @deprecated - This property will be removed in 2.20 with no replacement.
362
+ */
363
+ wasMovedOnInsert?: boolean;
364
+ }
365
+
366
+ /**
367
+ * Determine if a segment has been removed.
368
+ * @legacy
369
+ * @alpha
370
+ */
371
+ export function segmentIsRemoved(segment: ISegment): boolean {
372
+ const leaf: ISegmentLeaf = segment;
373
+ return leaf.removedSeq !== undefined;
295
374
  }
296
375
 
297
376
  /**
@@ -322,8 +401,8 @@ export interface ISegmentAction<TClientData> {
322
401
  * @internal
323
402
  */
324
403
  export interface ISegmentChanges {
325
- next?: ISegment;
326
- replaceCurrent?: ISegment;
404
+ next?: ISegmentInternal;
405
+ replaceCurrent?: ISegmentInternal;
327
406
  }
328
407
  /**
329
408
  * @internal
@@ -361,8 +440,12 @@ export interface NodeAction<TClientData> {
361
440
  * @internal
362
441
  */
363
442
  export interface InsertContext {
364
- candidateSegment?: ISegment;
365
- leaf: (segment: ISegment | undefined, pos: number, ic: InsertContext) => ISegmentChanges;
443
+ candidateSegment?: ISegmentInternal;
444
+ leaf: (
445
+ segment: ISegmentInternal | undefined,
446
+ pos: number,
447
+ ic: InsertContext,
448
+ ) => ISegmentChanges;
366
449
  continuePredicate?: (continueFromBlock: MergeBlock) => boolean;
367
450
  }
368
451
 
@@ -433,7 +516,7 @@ export class MergeBlock implements IMergeNodeCommon {
433
516
  */
434
517
  public leftmostTiles: Readonly<MapLike<Marker>>;
435
518
 
436
- isLeaf(): this is ISegment {
519
+ isLeaf(): this is ISegmentInternal {
437
520
  return false;
438
521
  }
439
522
 
@@ -490,15 +573,45 @@ export function seqLTE(seq: number, minOrRefSeq: number): boolean {
490
573
  * @alpha
491
574
  */
492
575
  export abstract class BaseSegment implements ISegment {
576
+ /**
577
+ * @deprecated - This property will be removed in 2.20 with no replacement.
578
+ */
493
579
  public clientId: number = LocalClientId;
580
+ /**
581
+ * @deprecated - This property will be removed in 2.20 with no replacement.
582
+ */
494
583
  public seq: number = UniversalSequenceNumber;
584
+ /**
585
+ * @deprecated - This property will be removed in 2.20 with no replacement.
586
+ */
495
587
  public removedSeq?: number;
588
+ /**
589
+ * @deprecated - This property will be removed in 2.20 with no replacement.
590
+ */
496
591
  public removedClientIds?: number[];
592
+ /**
593
+ * @deprecated - This property will be removed in 2.20 with no replacement.
594
+ */
497
595
  public movedSeq?: number;
596
+ /**
597
+ * @deprecated - This property will be removed in 2.20 with no replacement.
598
+ */
498
599
  public movedSeqs?: number[];
600
+ /**
601
+ * @deprecated - This property will be removed in 2.20 with no replacement.
602
+ */
499
603
  public movedClientIds?: number[];
604
+ /**
605
+ * @deprecated - This property will be removed in 2.20 with no replacement.
606
+ */
500
607
  public wasMovedOnInsert?: boolean | undefined;
608
+ /**
609
+ * @deprecated - This property will be removed in 2.20 with no replacement.
610
+ */
501
611
  public index: number = 0;
612
+ /**
613
+ * @deprecated - This property will be removed in 2.20 with no replacement.
614
+ */
502
615
  public ordinal: string = "";
503
616
  public cachedLength: number = 0;
504
617
 
@@ -509,10 +622,23 @@ export abstract class BaseSegment implements ISegment {
509
622
  public attribution?: IAttributionCollection<AttributionKey>;
510
623
 
511
624
  public properties?: PropertySet;
625
+ /**
626
+ * @deprecated - This property will be removed in 2.20 with no replacement.
627
+ */
628
+ // eslint-disable-next-line import/no-deprecated
512
629
  public localRefs?: LocalReferenceCollection;
513
630
  public abstract readonly type: string;
631
+ /**
632
+ * @deprecated - This property will be removed in 2.20 with no replacement.
633
+ */
514
634
  public localSeq?: number;
635
+ /**
636
+ * @deprecated - This property will be removed in 2.20 with no replacement.
637
+ */
515
638
  public localRemovedSeq?: number;
639
+ /**
640
+ * @deprecated - This property will be removed in 2.20 with no replacement.
641
+ */
516
642
  public localMovedSeq?: number;
517
643
 
518
644
  public constructor(properties?: PropertySet) {
@@ -606,6 +732,7 @@ export abstract class BaseSegment implements ISegment {
606
732
  public append(other: ISegment): void {
607
733
  // Note: Must call 'appendLocalRefs' before modifying this segment's length as
608
734
  // 'this.cachedLength' is used to adjust the offsets of the local refs.
735
+ // eslint-disable-next-line import/no-deprecated
609
736
  LocalReferenceCollection.append(this, other);
610
737
  if (this.attribution) {
611
738
  assert(
@@ -12,9 +12,11 @@ import {
12
12
  // eslint-disable-next-line import/no-deprecated
13
13
  CollaborationWindow,
14
14
  IMergeNode,
15
+ // eslint-disable-next-line import/no-deprecated
15
16
  IMoveInfo,
17
+ // eslint-disable-next-line import/no-deprecated
16
18
  IRemovalInfo,
17
- ISegment,
19
+ ISegmentLeaf,
18
20
  compareNumbers,
19
21
  seqLTE,
20
22
  toMoveInfo,
@@ -504,7 +506,7 @@ export class PartialSequenceLengths {
504
506
  */
505
507
  static accumulateMoveOverlapForExisting(
506
508
  segmentLen: number,
507
- segment: ISegment,
509
+ segment: ISegmentLeaf,
508
510
  firstGte: PartialSequenceLength,
509
511
  clientIds: number[],
510
512
  ): void {
@@ -537,7 +539,7 @@ export class PartialSequenceLengths {
537
539
  * segment
538
540
  */
539
541
  private static getMoveOverlapForExisting(
540
- segment: ISegment,
542
+ segment: ISegmentLeaf,
541
543
  obliterateOverlapLen: number,
542
544
  clientIds: number[],
543
545
  ): RedBlackTree<number, IOverlapClient> {
@@ -558,7 +560,7 @@ export class PartialSequenceLengths {
558
560
  }
559
561
 
560
562
  private static updatePartialsAfterInsertion(
561
- segment: ISegment,
563
+ segment: ISegmentLeaf,
562
564
  segmentLen: number,
563
565
  remoteObliteratedLen: number | undefined,
564
566
  obliterateOverlapLen: number = segmentLen,
@@ -638,8 +640,10 @@ export class PartialSequenceLengths {
638
640
  */
639
641
  private static insertSegment(
640
642
  combinedPartialLengths: PartialSequenceLengths,
641
- segment: ISegment,
643
+ segment: ISegmentLeaf,
644
+ // eslint-disable-next-line import/no-deprecated
642
645
  removalInfo?: IRemovalInfo,
646
+ // eslint-disable-next-line import/no-deprecated
643
647
  moveInfo?: IMoveInfo,
644
648
  ): void {
645
649
  const removalIsLocal =
@@ -6,14 +6,14 @@
6
6
  import { UnassignedSequenceNumber } from "./constants.js";
7
7
  import { type MergeTree } from "./mergeTree.js";
8
8
  import { LeafAction, backwardExcursion, forwardExcursion } from "./mergeTreeNodeWalk.js";
9
- import { seqLTE, type ISegment } from "./mergeTreeNodes.js";
9
+ import { seqLTE, type ISegmentLeaf } from "./mergeTreeNodes.js";
10
10
 
11
11
  /**
12
12
  * Provides a view of a MergeTree from the perspective of a specific client at a specific sequence number.
13
13
  */
14
14
  export interface Perspective {
15
- nextSegment(segment: ISegment, forward?: boolean): ISegment;
16
- previousSegment(segment: ISegment): ISegment;
15
+ nextSegment(segment: ISegmentLeaf, forward?: boolean): ISegmentLeaf;
16
+ previousSegment(segment: ISegmentLeaf): ISegmentLeaf;
17
17
  }
18
18
 
19
19
  /**
@@ -47,9 +47,9 @@ export class PerspectiveImpl implements Perspective {
47
47
  * @param forward - The direction to search.
48
48
  * @returns the next segment in the specified direction, or the start or end of the tree if there is no next segment.
49
49
  */
50
- public nextSegment(segment: ISegment, forward: boolean = true): ISegment {
51
- let next: ISegment | undefined;
52
- const action = (seg: ISegment): boolean | undefined => {
50
+ public nextSegment(segment: ISegmentLeaf, forward: boolean = true): ISegmentLeaf {
51
+ let next: ISegmentLeaf | undefined;
52
+ const action = (seg: ISegmentLeaf): boolean | undefined => {
53
53
  if (isSegmentPresent(seg, this._seqTime)) {
54
54
  next = seg;
55
55
  return LeafAction.Exit;
@@ -65,7 +65,7 @@ export class PerspectiveImpl implements Perspective {
65
65
  * @returns the previous segment, or the start of the tree if there is no previous segment.
66
66
  * @remarks This is a convenient equivalent to calling `nextSegment(segment, false)`.
67
67
  */
68
- public previousSegment(segment: ISegment): ISegment {
68
+ public previousSegment(segment: ISegmentLeaf): ISegmentLeaf {
69
69
  return this.nextSegment(segment, false);
70
70
  }
71
71
  }
@@ -77,7 +77,7 @@ export class PerspectiveImpl implements Perspective {
77
77
  * @param localSeq - The latest local sequence number to consider.
78
78
  * @returns true iff this segment was removed in the given perspective.
79
79
  */
80
- export function wasRemovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime): boolean {
80
+ export function wasRemovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime): boolean {
81
81
  if (
82
82
  seg.removedSeq === UnassignedSequenceNumber &&
83
83
  localSeq !== undefined &&
@@ -95,7 +95,7 @@ export function wasRemovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime):
95
95
  * @param localSeq - The latest local sequence number to consider.
96
96
  * @returns true iff this segment was moved (aka obliterated) in the given perspective.
97
97
  */
98
- export function wasMovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime): boolean {
98
+ export function wasMovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime): boolean {
99
99
  if (
100
100
  seg.movedSeq === UnassignedSequenceNumber &&
101
101
  localSeq !== undefined &&
@@ -109,7 +109,7 @@ export function wasMovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime): bo
109
109
  /**
110
110
  * See {@link wasRemovedBefore} and {@link wasMovedBefore}.
111
111
  */
112
- export function wasRemovedOrMovedBefore(seg: ISegment, seqTime: SeqTime): boolean {
112
+ export function wasRemovedOrMovedBefore(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
113
113
  return wasRemovedBefore(seg, seqTime) || wasMovedBefore(seg, seqTime);
114
114
  }
115
115
 
@@ -120,7 +120,7 @@ export function wasRemovedOrMovedBefore(seg: ISegment, seqTime: SeqTime): boolea
120
120
  * @returns true iff this segment was inserted before the given perspective,
121
121
  * and it was not removed or moved in the given perspective.
122
122
  */
123
- export function isSegmentPresent(seg: ISegment, seqTime: SeqTime): boolean {
123
+ export function isSegmentPresent(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
124
124
  const { refSeq, localSeq } = seqTime;
125
125
  // If seg.seq is undefined, then this segment has existed since minSeq.
126
126
  // It may have been moved or removed since.