@fluidframework/merge-tree 2.30.0 → 2.31.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 (308) hide show
  1. package/CHANGELOG.md +403 -399
  2. package/api-report/merge-tree.legacy.alpha.api.md +1 -0
  3. package/dist/MergeTreeTextHelper.d.ts +9 -3
  4. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  5. package/dist/MergeTreeTextHelper.js +5 -5
  6. package/dist/MergeTreeTextHelper.js.map +1 -1
  7. package/dist/client.d.ts +7 -13
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +136 -110
  10. package/dist/client.js.map +1 -1
  11. package/dist/endOfTreeSegment.d.ts +12 -8
  12. package/dist/endOfTreeSegment.d.ts.map +1 -1
  13. package/dist/endOfTreeSegment.js +2 -4
  14. package/dist/endOfTreeSegment.js.map +1 -1
  15. package/dist/index.d.ts +6 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/mergeTree.d.ts +37 -23
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +400 -483
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeDeltaCallback.d.ts +4 -8
  24. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  25. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +32 -10
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +43 -28
  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 +181 -109
  33. package/dist/partialLengths.js.map +1 -1
  34. package/dist/perspective.d.ts +8 -27
  35. package/dist/perspective.d.ts.map +1 -1
  36. package/dist/perspective.js +7 -67
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/revertibles.d.ts.map +1 -1
  39. package/dist/revertibles.js +2 -2
  40. package/dist/revertibles.js.map +1 -1
  41. package/dist/segmentInfos.d.ts +20 -106
  42. package/dist/segmentInfos.d.ts.map +1 -1
  43. package/dist/segmentInfos.js +28 -42
  44. package/dist/segmentInfos.js.map +1 -1
  45. package/dist/segmentPropertiesManager.d.ts +1 -14
  46. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  47. package/dist/segmentPropertiesManager.js +3 -17
  48. package/dist/segmentPropertiesManager.js.map +1 -1
  49. package/dist/snapshotLoader.d.ts.map +1 -1
  50. package/dist/snapshotLoader.js +62 -19
  51. package/dist/snapshotLoader.js.map +1 -1
  52. package/dist/snapshotV1.d.ts.map +1 -1
  53. package/dist/snapshotV1.js +55 -24
  54. package/dist/snapshotV1.js.map +1 -1
  55. package/dist/snapshotlegacy.d.ts.map +1 -1
  56. package/dist/snapshotlegacy.js +6 -9
  57. package/dist/snapshotlegacy.js.map +1 -1
  58. package/dist/stamps.d.ts +1 -1
  59. package/dist/stamps.js +1 -1
  60. package/dist/stamps.js.map +1 -1
  61. package/dist/test/Insertion.perf.spec.js +6 -51
  62. package/dist/test/Insertion.perf.spec.js.map +1 -1
  63. package/dist/test/PartialLengths.perf.spec.js +18 -25
  64. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  65. package/dist/test/Removal.perf.spec.js +13 -41
  66. package/dist/test/Removal.perf.spec.js.map +1 -1
  67. package/dist/test/beastTest.spec.d.ts.map +1 -1
  68. package/dist/test/beastTest.spec.js +41 -66
  69. package/dist/test/beastTest.spec.js.map +1 -1
  70. package/dist/test/client.annotateMarker.spec.js +1 -11
  71. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  72. package/dist/test/client.applyMsg.spec.js +14 -14
  73. package/dist/test/client.applyMsg.spec.js.map +1 -1
  74. package/dist/test/client.getPosition.spec.js +1 -1
  75. package/dist/test/client.getPosition.spec.js.map +1 -1
  76. package/dist/test/client.localReference.spec.js +1 -1
  77. package/dist/test/client.localReference.spec.js.map +1 -1
  78. package/dist/test/client.rollback.spec.js +49 -58
  79. package/dist/test/client.rollback.spec.js.map +1 -1
  80. package/dist/test/client.rollbackFarm.spec.js +1 -1
  81. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  82. package/dist/test/client.searchForMarker.spec.js +4 -21
  83. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  84. package/dist/test/index.d.ts +2 -2
  85. package/dist/test/index.d.ts.map +1 -1
  86. package/dist/test/index.js +2 -6
  87. package/dist/test/index.js.map +1 -1
  88. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +14 -59
  89. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  90. package/dist/test/mergeTree.annotate.spec.js +47 -63
  91. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  92. package/dist/test/mergeTree.insert.deltaCallback.spec.js +9 -62
  93. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  94. package/dist/test/mergeTree.insertingWalk.spec.js +59 -125
  95. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  96. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +12 -93
  97. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  98. package/dist/test/mergeTree.markRangeRemoved.spec.js +10 -7
  99. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  100. package/dist/test/mergeTree.walk.spec.js +2 -14
  101. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  102. package/dist/test/mergeTreeOperationRunner.js +2 -2
  103. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  104. package/dist/test/obliterate.concurrent.spec.js +18 -23
  105. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  106. package/dist/test/obliterate.partialLength.spec.js +166 -136
  107. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  108. package/dist/test/obliterate.spec.js +16 -126
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/partialLength.spec.js +28 -196
  111. package/dist/test/partialLength.spec.js.map +1 -1
  112. package/dist/test/perspective.spec.js +34 -0
  113. package/dist/test/perspective.spec.js.map +1 -1
  114. package/dist/test/propertyManager.spec.js +1 -1
  115. package/dist/test/propertyManager.spec.js.map +1 -1
  116. package/dist/test/resetPendingSegmentsToOp.spec.js +0 -2
  117. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  118. package/dist/test/segmentGroupCollection.spec.js +10 -4
  119. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  120. package/dist/test/testClient.d.ts +1 -0
  121. package/dist/test/testClient.d.ts.map +1 -1
  122. package/dist/test/testClient.js +16 -26
  123. package/dist/test/testClient.js.map +1 -1
  124. package/dist/test/testClientLogger.d.ts.map +1 -1
  125. package/dist/test/testClientLogger.js +3 -10
  126. package/dist/test/testClientLogger.js.map +1 -1
  127. package/dist/test/testServer.d.ts +2 -1
  128. package/dist/test/testServer.d.ts.map +1 -1
  129. package/dist/test/testServer.js +7 -5
  130. package/dist/test/testServer.js.map +1 -1
  131. package/dist/test/testUtils.d.ts +36 -56
  132. package/dist/test/testUtils.d.ts.map +1 -1
  133. package/dist/test/testUtils.js +68 -77
  134. package/dist/test/testUtils.js.map +1 -1
  135. package/dist/test/text.d.ts +2 -2
  136. package/dist/test/text.d.ts.map +1 -1
  137. package/dist/test/text.js +5 -2
  138. package/dist/test/text.js.map +1 -1
  139. package/dist/textSegment.d.ts +0 -6
  140. package/dist/textSegment.d.ts.map +1 -1
  141. package/dist/textSegment.js.map +1 -1
  142. package/dist/zamboni.d.ts.map +1 -1
  143. package/dist/zamboni.js +53 -26
  144. package/dist/zamboni.js.map +1 -1
  145. package/lib/MergeTreeTextHelper.d.ts +9 -3
  146. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  147. package/lib/MergeTreeTextHelper.js +5 -5
  148. package/lib/MergeTreeTextHelper.js.map +1 -1
  149. package/lib/client.d.ts +7 -13
  150. package/lib/client.d.ts.map +1 -1
  151. package/lib/client.js +117 -116
  152. package/lib/client.js.map +1 -1
  153. package/lib/endOfTreeSegment.d.ts +12 -8
  154. package/lib/endOfTreeSegment.d.ts.map +1 -1
  155. package/lib/endOfTreeSegment.js +2 -4
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +6 -3
  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/mergeTree.d.ts +37 -23
  162. package/lib/mergeTree.d.ts.map +1 -1
  163. package/lib/mergeTree.js +381 -488
  164. package/lib/mergeTree.js.map +1 -1
  165. package/lib/mergeTreeDeltaCallback.d.ts +4 -8
  166. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  167. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  168. package/lib/mergeTreeNodes.d.ts +32 -10
  169. package/lib/mergeTreeNodes.d.ts.map +1 -1
  170. package/lib/mergeTreeNodes.js +42 -29
  171. package/lib/mergeTreeNodes.js.map +1 -1
  172. package/lib/partialLengths.d.ts +2 -2
  173. package/lib/partialLengths.d.ts.map +1 -1
  174. package/lib/partialLengths.js +160 -111
  175. package/lib/partialLengths.js.map +1 -1
  176. package/lib/perspective.d.ts +8 -27
  177. package/lib/perspective.d.ts.map +1 -1
  178. package/lib/perspective.js +8 -68
  179. package/lib/perspective.js.map +1 -1
  180. package/lib/revertibles.d.ts.map +1 -1
  181. package/lib/revertibles.js +2 -2
  182. package/lib/revertibles.js.map +1 -1
  183. package/lib/segmentInfos.d.ts +20 -106
  184. package/lib/segmentInfos.d.ts.map +1 -1
  185. package/lib/segmentInfos.js +26 -37
  186. package/lib/segmentInfos.js.map +1 -1
  187. package/lib/segmentPropertiesManager.d.ts +1 -14
  188. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  189. package/lib/segmentPropertiesManager.js +2 -16
  190. package/lib/segmentPropertiesManager.js.map +1 -1
  191. package/lib/snapshotLoader.d.ts.map +1 -1
  192. package/lib/snapshotLoader.js +39 -19
  193. package/lib/snapshotLoader.js.map +1 -1
  194. package/lib/snapshotV1.d.ts.map +1 -1
  195. package/lib/snapshotV1.js +34 -26
  196. package/lib/snapshotV1.js.map +1 -1
  197. package/lib/snapshotlegacy.d.ts.map +1 -1
  198. package/lib/snapshotlegacy.js +7 -10
  199. package/lib/snapshotlegacy.js.map +1 -1
  200. package/lib/stamps.d.ts +1 -1
  201. package/lib/stamps.js +1 -1
  202. package/lib/stamps.js.map +1 -1
  203. package/lib/test/Insertion.perf.spec.js +6 -51
  204. package/lib/test/Insertion.perf.spec.js.map +1 -1
  205. package/lib/test/PartialLengths.perf.spec.js +18 -25
  206. package/lib/test/PartialLengths.perf.spec.js.map +1 -1
  207. package/lib/test/Removal.perf.spec.js +13 -41
  208. package/lib/test/Removal.perf.spec.js.map +1 -1
  209. package/lib/test/beastTest.spec.d.ts.map +1 -1
  210. package/lib/test/beastTest.spec.js +42 -67
  211. package/lib/test/beastTest.spec.js.map +1 -1
  212. package/lib/test/client.annotateMarker.spec.js +1 -11
  213. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  214. package/lib/test/client.applyMsg.spec.js +14 -14
  215. package/lib/test/client.applyMsg.spec.js.map +1 -1
  216. package/lib/test/client.getPosition.spec.js +1 -1
  217. package/lib/test/client.getPosition.spec.js.map +1 -1
  218. package/lib/test/client.localReference.spec.js +1 -1
  219. package/lib/test/client.localReference.spec.js.map +1 -1
  220. package/lib/test/client.rollback.spec.js +50 -59
  221. package/lib/test/client.rollback.spec.js.map +1 -1
  222. package/lib/test/client.rollbackFarm.spec.js +1 -1
  223. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  224. package/lib/test/client.searchForMarker.spec.js +4 -21
  225. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  226. package/lib/test/index.d.ts +2 -2
  227. package/lib/test/index.d.ts.map +1 -1
  228. package/lib/test/index.js +1 -1
  229. package/lib/test/index.js.map +1 -1
  230. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +15 -60
  231. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  232. package/lib/test/mergeTree.annotate.spec.js +48 -64
  233. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  234. package/lib/test/mergeTree.insert.deltaCallback.spec.js +10 -63
  235. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  236. package/lib/test/mergeTree.insertingWalk.spec.js +61 -127
  237. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  238. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +13 -94
  239. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  240. package/lib/test/mergeTree.markRangeRemoved.spec.js +10 -7
  241. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  242. package/lib/test/mergeTree.walk.spec.js +2 -14
  243. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  244. package/lib/test/mergeTreeOperationRunner.js +3 -3
  245. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  246. package/lib/test/obliterate.concurrent.spec.js +18 -23
  247. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  248. package/lib/test/obliterate.partialLength.spec.js +167 -137
  249. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  250. package/lib/test/obliterate.spec.js +17 -127
  251. package/lib/test/obliterate.spec.js.map +1 -1
  252. package/lib/test/partialLength.spec.js +29 -197
  253. package/lib/test/partialLength.spec.js.map +1 -1
  254. package/lib/test/perspective.spec.js +34 -0
  255. package/lib/test/perspective.spec.js.map +1 -1
  256. package/lib/test/propertyManager.spec.js +2 -2
  257. package/lib/test/propertyManager.spec.js.map +1 -1
  258. package/lib/test/resetPendingSegmentsToOp.spec.js +0 -2
  259. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  260. package/lib/test/segmentGroupCollection.spec.js +10 -4
  261. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  262. package/lib/test/testClient.d.ts +1 -0
  263. package/lib/test/testClient.d.ts.map +1 -1
  264. package/lib/test/testClient.js +18 -28
  265. package/lib/test/testClient.js.map +1 -1
  266. package/lib/test/testClientLogger.d.ts.map +1 -1
  267. package/lib/test/testClientLogger.js +3 -10
  268. package/lib/test/testClientLogger.js.map +1 -1
  269. package/lib/test/testServer.d.ts +2 -1
  270. package/lib/test/testServer.d.ts.map +1 -1
  271. package/lib/test/testServer.js +7 -5
  272. package/lib/test/testServer.js.map +1 -1
  273. package/lib/test/testUtils.d.ts +36 -56
  274. package/lib/test/testUtils.d.ts.map +1 -1
  275. package/lib/test/testUtils.js +66 -48
  276. package/lib/test/testUtils.js.map +1 -1
  277. package/lib/test/text.d.ts +2 -2
  278. package/lib/test/text.d.ts.map +1 -1
  279. package/lib/test/text.js +6 -3
  280. package/lib/test/text.js.map +1 -1
  281. package/lib/textSegment.d.ts +0 -6
  282. package/lib/textSegment.d.ts.map +1 -1
  283. package/lib/textSegment.js.map +1 -1
  284. package/lib/tsdoc-metadata.json +1 -1
  285. package/lib/zamboni.d.ts.map +1 -1
  286. package/lib/zamboni.js +32 -28
  287. package/lib/zamboni.js.map +1 -1
  288. package/package.json +17 -20
  289. package/src/MergeTreeTextHelper.ts +17 -12
  290. package/src/client.ts +141 -197
  291. package/src/endOfTreeSegment.ts +11 -8
  292. package/src/index.ts +4 -3
  293. package/src/mergeTree.ts +482 -633
  294. package/src/mergeTreeDeltaCallback.ts +4 -8
  295. package/src/mergeTreeNodes.ts +66 -45
  296. package/src/partialLengths.ts +181 -137
  297. package/src/perspective.ts +17 -95
  298. package/src/revertibles.ts +2 -7
  299. package/src/segmentInfos.ts +48 -141
  300. package/src/segmentPropertiesManager.ts +2 -16
  301. package/src/snapshotLoader.ts +62 -30
  302. package/src/snapshotV1.ts +36 -28
  303. package/src/snapshotlegacy.ts +7 -16
  304. package/src/stamps.ts +1 -1
  305. package/src/textSegment.ts +0 -13
  306. package/src/zamboni.ts +38 -32
  307. package/tsconfig.json +1 -0
  308. package/prettier.config.cjs +0 -8
@@ -16,11 +16,11 @@ import {
16
16
  createChildLogger,
17
17
  } from "@fluidframework/telemetry-utils/internal";
18
18
 
19
- import { NonCollabClient, UnassignedSequenceNumber } from "./constants.js";
19
+ import { NonCollabClient } from "./constants.js";
20
20
  import { MergeTree } from "./mergeTree.js";
21
- import { type ISegmentPrivate } from "./mergeTreeNodes.js";
21
+ import { isSegmentLeaf, type ISegmentPrivate } from "./mergeTreeNodes.js";
22
+ import { PriorPerspective } from "./perspective.js";
22
23
  import { matchProperties } from "./properties.js";
23
- import { isInserted, isRemoved } from "./segmentInfos.js";
24
24
  import {
25
25
  JsonSegmentSpecs,
26
26
  MergeTreeChunkLegacy,
@@ -195,11 +195,9 @@ export class SnapshotLegacy {
195
195
  extractSync(): ISegmentPrivate[] {
196
196
  const collabWindow = this.mergeTree.collabWindow;
197
197
  const seq = (this.seq = collabWindow.minSeq);
198
+ const minSeqPerspective = new PriorPerspective(this.seq, NonCollabClient);
198
199
  this.header = {
199
- segmentsTotalLength: this.mergeTree.getLength(
200
- this.mergeTree.collabWindow.minSeq,
201
- NonCollabClient,
202
- ),
200
+ segmentsTotalLength: this.mergeTree.getLength(minSeqPerspective),
203
201
  seq: this.mergeTree.collabWindow.minSeq,
204
202
  };
205
203
 
@@ -208,14 +206,7 @@ export class SnapshotLegacy {
208
206
  const segs: ISegmentPrivate[] = [];
209
207
  let prev: ISegmentPrivate | undefined;
210
208
  const extractSegment = (segment: ISegmentPrivate): boolean => {
211
- if (
212
- isInserted(segment) &&
213
- segment.seq !== UnassignedSequenceNumber &&
214
- segment.seq <= seq &&
215
- (!isRemoved(segment) ||
216
- segment.removedSeq === UnassignedSequenceNumber ||
217
- segment.removedSeq > seq)
218
- ) {
209
+ if (isSegmentLeaf(segment) && minSeqPerspective.isSegmentPresent(segment)) {
219
210
  originalSegments += 1;
220
211
  const properties =
221
212
  segment.propertyManager?.getAtSeq(segment.properties, seq) ?? segment.properties;
@@ -230,7 +221,7 @@ export class SnapshotLegacy {
230
221
  return true;
231
222
  };
232
223
 
233
- this.mergeTree.mapRange(extractSegment, this.seq, NonCollabClient, undefined);
224
+ this.mergeTree.mapRange(extractSegment, minSeqPerspective, undefined);
234
225
 
235
226
  this.segments = [];
236
227
  let totalLength: number = 0;
package/src/stamps.ts CHANGED
@@ -130,7 +130,7 @@ export function isAcked(a: OperationStamp): boolean {
130
130
  * Inserts a stamp into a sorted list of stamps in the correct (sorted) position.
131
131
  *
132
132
  * Beware that this uses Array.splice, thus requires asymptotics considerations.
133
- * If inserting a variable number of timestamp, consider just pushing them and sorting the list
133
+ * If inserting a variable number of timestamps, consider just pushing them and sorting the list
134
134
  * after using {@link compare} instead.
135
135
  */
136
136
  export function spliceIntoList(list: OperationStamp[], stamp: OperationStamp): void {
@@ -104,16 +104,3 @@ export class TextSegment extends BaseSegment {
104
104
  }
105
105
  }
106
106
  }
107
-
108
- /**
109
- * @internal
110
- */
111
- export interface IMergeTreeTextHelper {
112
- getText(
113
- refSeq: number,
114
- clientId: number,
115
- placeholder: string,
116
- start?: number,
117
- end?: number,
118
- ): string;
119
- }
package/src/zamboni.ts CHANGED
@@ -11,20 +11,25 @@ import { MergeTreeMaintenanceType } from "./mergeTreeDeltaCallback.js";
11
11
  import {
12
12
  type MergeBlock,
13
13
  assignChild,
14
+ getMinSeqStamp,
14
15
  IMergeNode,
15
16
  ISegmentPrivate,
16
17
  Marker,
17
18
  MaxNodesInBlock,
18
- seqLTE,
19
19
  } from "./mergeTreeNodes.js";
20
20
  import { matchProperties } from "./properties.js";
21
- import { toRemovalInfo, toMoveInfo, removeMergeNodeInfo } from "./segmentInfos.js";
21
+ import { toRemovalInfo, removeMergeNodeInfo } from "./segmentInfos.js";
22
+ import * as opstampUtils from "./stamps.js";
23
+ import type { OperationStamp } from "./stamps.js";
22
24
 
23
25
  export const zamboniSegmentsMax = 2;
24
26
  function underflow(node: MergeBlock): boolean {
25
27
  return node.childCount < MaxNodesInBlock / 2;
26
28
  }
27
29
 
30
+ // blockUpdatePathLengths requires an OperationStamp but it is unused when passing `newStructure: true`.
31
+ const dummyStamp: OperationStamp = { seq: UnassignedSequenceNumber, clientId: -1 };
32
+
28
33
  export function zamboniSegments(
29
34
  mergeTree: MergeTree,
30
35
  zamboniSegmentsMaxCount = zamboniSegmentsMax,
@@ -67,7 +72,7 @@ export function zamboniSegments(
67
72
  packParent(block.parent, mergeTree);
68
73
  } else {
69
74
  mergeTree.nodeUpdateOrdinals(block);
70
- mergeTree.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);
75
+ mergeTree.blockUpdatePathLengths(block, dummyStamp, true);
71
76
  }
72
77
  }
73
78
  }
@@ -129,7 +134,7 @@ export function packParent(parent: MergeBlock, mergeTree: MergeTree): void {
129
134
  packParent(parent.parent, mergeTree);
130
135
  } else {
131
136
  mergeTree.nodeUpdateOrdinals(parent);
132
- mergeTree.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);
137
+ mergeTree.blockUpdatePathLengths(parent, dummyStamp, true);
133
138
  }
134
139
  }
135
140
 
@@ -148,34 +153,10 @@ function scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTr
148
153
 
149
154
  const segment = childNode;
150
155
  const removalInfo = toRemovalInfo(segment);
151
- const moveInfo = toMoveInfo(segment);
152
- if (removalInfo !== undefined || moveInfo !== undefined) {
153
- // If the segment's removal is below the MSN and it's not being held onto by a tracking group,
154
- // it can be unlinked (i.e. removed from the merge-tree)
155
- if (
156
- ((!!removalInfo && seqLTE(removalInfo.removedSeq, mergeTree.collabWindow.minSeq)) ||
157
- (!!moveInfo && seqLTE(moveInfo.movedSeq, mergeTree.collabWindow.minSeq))) &&
158
- segment.trackingCollection.empty
159
- ) {
160
- mergeTree.mergeTreeMaintenanceCallback?.(
161
- {
162
- operation: MergeTreeMaintenanceType.UNLINK,
163
- deltaSegments: [{ segment }],
164
- },
165
- undefined,
166
- );
167
- if (Marker.is(segment)) {
168
- mergeTree.unlinkMarker(segment);
169
- }
170
- removeMergeNodeInfo(segment);
171
- } else {
172
- holdNodes.push(segment);
173
- }
174
-
175
- prevSegment = undefined;
176
- } else {
177
- if (segment.seq <= mergeTree.collabWindow.minSeq) {
178
- const segmentHasPositiveLength = (mergeTree.localNetLength(segment) ?? 0) > 0;
156
+ const minSeqStamp = getMinSeqStamp(mergeTree.collabWindow);
157
+ if (removalInfo === undefined) {
158
+ if (opstampUtils.lte(segment.insert, minSeqStamp)) {
159
+ const segmentHasPositiveLength = (mergeTree.leafLength(segment) ?? 0) > 0;
179
160
  const canAppend =
180
161
  prevSegment?.canAppend(segment) &&
181
162
  matchProperties(prevSegment.properties, segment.properties) &&
@@ -202,6 +183,31 @@ function scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTr
202
183
  holdNodes.push(segment);
203
184
  prevSegment = undefined;
204
185
  }
186
+ } else {
187
+ const firstRemove = removalInfo.removes[0];
188
+ // If the segment's removal is below the MSN and it's not being held onto by a tracking group,
189
+ // it can be unlinked (i.e. removed from the merge-tree)
190
+ if (
191
+ !!firstRemove &&
192
+ opstampUtils.lte(firstRemove, minSeqStamp) &&
193
+ segment.trackingCollection.empty
194
+ ) {
195
+ mergeTree.mergeTreeMaintenanceCallback?.(
196
+ {
197
+ operation: MergeTreeMaintenanceType.UNLINK,
198
+ deltaSegments: [{ segment }],
199
+ },
200
+ undefined,
201
+ );
202
+ if (Marker.is(segment)) {
203
+ mergeTree.unlinkMarker(segment);
204
+ }
205
+ removeMergeNodeInfo(segment);
206
+ } else {
207
+ holdNodes.push(segment);
208
+ }
209
+
210
+ prevSegment = undefined;
205
211
  }
206
212
  }
207
213
  }
package/tsconfig.json CHANGED
@@ -7,6 +7,7 @@
7
7
  "outDir": "./lib",
8
8
  "preserveConstEnums": true,
9
9
  "noImplicitAny": true,
10
+ // TODO: AB#34171 Enable noUncheckedIndexedAccess for packages/dds/merge-tree
10
11
  "noUncheckedIndexedAccess": false,
11
12
  "exactOptionalPropertyTypes": false,
12
13
  },
@@ -1,8 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- module.exports = {
7
- ...require("@fluidframework/build-common/prettier.config.cjs"),
8
- };