@fluidframework/merge-tree 2.1.0-276985 → 2.1.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 (524) hide show
  1. package/.eslintrc.cjs +2 -4
  2. package/CHANGELOG.md +15 -0
  3. package/README.md +109 -1
  4. package/api-extractor/api-extractor.current.json +5 -0
  5. package/api-extractor/api-extractor.legacy.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/merge-tree.legacy.alpha.api.md +10 -22
  8. package/api-report/merge-tree.legacy.public.api.md +9 -0
  9. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  10. package/dist/MergeTreeTextHelper.js +1 -1
  11. package/dist/MergeTreeTextHelper.js.map +1 -1
  12. package/dist/attributionCollection.d.ts.map +1 -1
  13. package/dist/attributionCollection.js +65 -17
  14. package/dist/attributionCollection.js.map +1 -1
  15. package/dist/attributionPolicy.d.ts +2 -1
  16. package/dist/attributionPolicy.d.ts.map +1 -1
  17. package/dist/attributionPolicy.js +10 -3
  18. package/dist/attributionPolicy.js.map +1 -1
  19. package/dist/client.d.ts +3 -1
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +65 -37
  22. package/dist/client.js.map +1 -1
  23. package/dist/collections/list.d.ts.map +1 -1
  24. package/dist/collections/list.js +5 -2
  25. package/dist/collections/list.js.map +1 -1
  26. package/dist/collections/rbTree.d.ts +2 -2
  27. package/dist/collections/rbTree.d.ts.map +1 -1
  28. package/dist/collections/rbTree.js +23 -35
  29. package/dist/collections/rbTree.js.map +1 -1
  30. package/dist/endOfTreeSegment.d.ts.map +1 -1
  31. package/dist/endOfTreeSegment.js +4 -1
  32. package/dist/endOfTreeSegment.js.map +1 -1
  33. package/dist/legacy.d.ts +1 -1
  34. package/dist/localReference.d.ts +16 -6
  35. package/dist/localReference.d.ts.map +1 -1
  36. package/dist/localReference.js +31 -20
  37. package/dist/localReference.js.map +1 -1
  38. package/dist/mergeTree.d.ts +0 -1
  39. package/dist/mergeTree.d.ts.map +1 -1
  40. package/dist/mergeTree.js +127 -112
  41. package/dist/mergeTree.js.map +1 -1
  42. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  43. package/dist/mergeTreeNodeWalk.js +1 -1
  44. package/dist/mergeTreeNodeWalk.js.map +1 -1
  45. package/dist/mergeTreeNodes.d.ts +6 -5
  46. package/dist/mergeTreeNodes.d.ts.map +1 -1
  47. package/dist/mergeTreeNodes.js +29 -20
  48. package/dist/mergeTreeNodes.js.map +1 -1
  49. package/dist/mergeTreeTracking.js +3 -3
  50. package/dist/mergeTreeTracking.js.map +1 -1
  51. package/dist/opBuilder.d.ts +6 -1
  52. package/dist/opBuilder.d.ts.map +1 -1
  53. package/dist/opBuilder.js +5 -0
  54. package/dist/opBuilder.js.map +1 -1
  55. package/dist/ops.d.ts.map +1 -1
  56. package/dist/ops.js.map +1 -1
  57. package/dist/ordinal.d.ts.map +1 -1
  58. package/dist/ordinal.js +7 -0
  59. package/dist/ordinal.js.map +1 -1
  60. package/dist/partialLengths.d.ts +4 -2
  61. package/dist/partialLengths.d.ts.map +1 -1
  62. package/dist/partialLengths.js +101 -53
  63. package/dist/partialLengths.js.map +1 -1
  64. package/dist/perspective.d.ts +4 -1
  65. package/dist/perspective.d.ts.map +1 -1
  66. package/dist/perspective.js +7 -6
  67. package/dist/perspective.js.map +1 -1
  68. package/dist/properties.d.ts +13 -10
  69. package/dist/properties.d.ts.map +1 -1
  70. package/dist/properties.js +22 -11
  71. package/dist/properties.js.map +1 -1
  72. package/dist/public.d.ts +1 -1
  73. package/dist/referencePositions.d.ts +7 -0
  74. package/dist/referencePositions.d.ts.map +1 -1
  75. package/dist/referencePositions.js +7 -0
  76. package/dist/referencePositions.js.map +1 -1
  77. package/dist/revertibles.d.ts +6 -0
  78. package/dist/revertibles.d.ts.map +1 -1
  79. package/dist/revertibles.js +50 -21
  80. package/dist/revertibles.js.map +1 -1
  81. package/dist/segmentGroupCollection.d.ts.map +1 -1
  82. package/dist/segmentGroupCollection.js +2 -0
  83. package/dist/segmentGroupCollection.js.map +1 -1
  84. package/dist/segmentPropertiesManager.d.ts +7 -3
  85. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  86. package/dist/segmentPropertiesManager.js +20 -15
  87. package/dist/segmentPropertiesManager.js.map +1 -1
  88. package/dist/snapshotChunks.d.ts.map +1 -1
  89. package/dist/snapshotChunks.js +10 -5
  90. package/dist/snapshotChunks.js.map +1 -1
  91. package/dist/snapshotLoader.d.ts.map +1 -1
  92. package/dist/snapshotLoader.js +14 -10
  93. package/dist/snapshotLoader.js.map +1 -1
  94. package/dist/snapshotV1.d.ts.map +1 -1
  95. package/dist/snapshotV1.js +20 -8
  96. package/dist/snapshotV1.js.map +1 -1
  97. package/dist/snapshotlegacy.d.ts.map +1 -1
  98. package/dist/snapshotlegacy.js +4 -2
  99. package/dist/snapshotlegacy.js.map +1 -1
  100. package/dist/sortedSegmentSet.d.ts.map +1 -1
  101. package/dist/sortedSegmentSet.js +8 -1
  102. package/dist/sortedSegmentSet.js.map +1 -1
  103. package/dist/sortedSet.d.ts.map +1 -1
  104. package/dist/sortedSet.js +4 -0
  105. package/dist/sortedSet.js.map +1 -1
  106. package/dist/test/Insertion.perf.spec.js.map +1 -1
  107. package/dist/test/Removal.perf.spec.js.map +1 -1
  108. package/dist/test/Snapshot.perf.spec.js +1 -0
  109. package/dist/test/Snapshot.perf.spec.js.map +1 -1
  110. package/dist/test/attributionCollection.perf.spec.js +3 -1
  111. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  112. package/dist/test/attributionCollection.spec.js +69 -68
  113. package/dist/test/attributionCollection.spec.js.map +1 -1
  114. package/dist/test/attributionPolicy.spec.js +29 -27
  115. package/dist/test/attributionPolicy.spec.js.map +1 -1
  116. package/dist/test/beastTest.spec.d.ts +1 -4
  117. package/dist/test/beastTest.spec.d.ts.map +1 -1
  118. package/dist/test/beastTest.spec.js +32 -30
  119. package/dist/test/beastTest.spec.js.map +1 -1
  120. package/dist/test/client.annotateMarker.spec.js +5 -5
  121. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  122. package/dist/test/client.apis.spec.d.ts.map +1 -1
  123. package/dist/test/client.apis.spec.js +5 -7
  124. package/dist/test/client.apis.spec.js.map +1 -1
  125. package/dist/test/client.applyMsg.spec.js +125 -103
  126. package/dist/test/client.applyMsg.spec.js.map +1 -1
  127. package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
  128. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  129. package/dist/test/client.attributionFarm.spec.js +13 -8
  130. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  131. package/dist/test/client.conflictFarm.spec.js +4 -2
  132. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  133. package/dist/test/client.getPosition.spec.js +10 -10
  134. package/dist/test/client.getPosition.spec.js.map +1 -1
  135. package/dist/test/client.localReference.spec.js +111 -104
  136. package/dist/test/client.localReference.spec.js.map +1 -1
  137. package/dist/test/client.localReferenceFarm.spec.js +14 -10
  138. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  139. package/dist/test/client.rebasePosition.spec.js +12 -12
  140. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  141. package/dist/test/client.reconnectFarm.spec.js +12 -9
  142. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  143. package/dist/test/client.replay.spec.js +11 -10
  144. package/dist/test/client.replay.spec.js.map +1 -1
  145. package/dist/test/client.rollback.spec.js +87 -84
  146. package/dist/test/client.rollback.spec.js.map +1 -1
  147. package/dist/test/client.rollbackFarm.spec.js +3 -1
  148. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  149. package/dist/test/client.searchForMarker.spec.js +122 -112
  150. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  151. package/dist/test/client.walkSegments.spec.js +7 -7
  152. package/dist/test/client.walkSegments.spec.js.map +1 -1
  153. package/dist/test/collections.list.spec.js +14 -14
  154. package/dist/test/collections.list.spec.js.map +1 -1
  155. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
  156. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  157. package/dist/test/dirname.cjs +1 -0
  158. package/dist/test/dirname.cjs.map +1 -1
  159. package/dist/test/dirname.d.cts.map +1 -1
  160. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
  161. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  162. package/dist/test/mergeTree.annotate.spec.js +87 -87
  163. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  164. package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
  165. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  166. package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
  167. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  168. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
  169. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  170. package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
  171. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  172. package/dist/test/mergeTree.walk.spec.js +3 -3
  173. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  174. package/dist/test/mergeTree.zamboni.spec.js +10 -10
  175. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  176. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  177. package/dist/test/mergeTreeOperationRunner.js +28 -16
  178. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  179. package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
  180. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  181. package/dist/test/obliterate.concurrent.spec.js +165 -165
  182. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  183. package/dist/test/obliterate.deltaCallback.spec.js +20 -21
  184. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
  185. package/dist/test/obliterate.partialLength.spec.js +7 -7
  186. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  187. package/dist/test/obliterate.reconnect.spec.js +13 -13
  188. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  189. package/dist/test/obliterate.spec.js +9 -9
  190. package/dist/test/obliterate.spec.js.map +1 -1
  191. package/dist/test/ordinal.spec.js +10 -4
  192. package/dist/test/ordinal.spec.js.map +1 -1
  193. package/dist/test/partialLength.spec.js.map +1 -1
  194. package/dist/test/properties.spec.js +15 -15
  195. package/dist/test/properties.spec.js.map +1 -1
  196. package/dist/test/reconnectHelper.d.ts +4 -4
  197. package/dist/test/reconnectHelper.d.ts.map +1 -1
  198. package/dist/test/reconnectHelper.js +28 -20
  199. package/dist/test/reconnectHelper.js.map +1 -1
  200. package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
  201. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  202. package/dist/test/revertibleFarm.spec.js +11 -10
  203. package/dist/test/revertibleFarm.spec.js.map +1 -1
  204. package/dist/test/revertibles.spec.d.ts.map +1 -1
  205. package/dist/test/revertibles.spec.js +96 -57
  206. package/dist/test/revertibles.spec.js.map +1 -1
  207. package/dist/test/segmentGroupCollection.spec.js +17 -17
  208. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  209. package/dist/test/snapshot.spec.js +5 -5
  210. package/dist/test/snapshot.spec.js.map +1 -1
  211. package/dist/test/snapshot.utils.d.ts.map +1 -1
  212. package/dist/test/snapshot.utils.js +6 -6
  213. package/dist/test/snapshot.utils.js.map +1 -1
  214. package/dist/test/snapshotlegacy.spec.js +18 -13
  215. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  216. package/dist/test/sortedSegmentSet.spec.js +22 -18
  217. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  218. package/dist/test/testClient.d.ts +6 -5
  219. package/dist/test/testClient.d.ts.map +1 -1
  220. package/dist/test/testClient.js +30 -32
  221. package/dist/test/testClient.js.map +1 -1
  222. package/dist/test/testClientLogger.d.ts.map +1 -1
  223. package/dist/test/testClientLogger.js +39 -38
  224. package/dist/test/testClientLogger.js.map +1 -1
  225. package/dist/test/testSerializer.d.ts +5 -5
  226. package/dist/test/testSerializer.d.ts.map +1 -1
  227. package/dist/test/testSerializer.js +0 -1
  228. package/dist/test/testSerializer.js.map +1 -1
  229. package/dist/test/testServer.d.ts.map +1 -1
  230. package/dist/test/testServer.js.map +1 -1
  231. package/dist/test/testUtils.d.ts +1 -1
  232. package/dist/test/testUtils.d.ts.map +1 -1
  233. package/dist/test/testUtils.js +15 -17
  234. package/dist/test/testUtils.js.map +1 -1
  235. package/dist/test/text.d.ts.map +1 -1
  236. package/dist/test/text.js +1 -1
  237. package/dist/test/text.js.map +1 -1
  238. package/dist/test/tracking.spec.js +50 -46
  239. package/dist/test/tracking.spec.js.map +1 -1
  240. package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
  241. package/dist/test/wordUnitTests.spec.js +10 -10
  242. package/dist/test/wordUnitTests.spec.js.map +1 -1
  243. package/dist/textSegment.d.ts +1 -1
  244. package/dist/textSegment.d.ts.map +1 -1
  245. package/dist/textSegment.js +3 -3
  246. package/dist/textSegment.js.map +1 -1
  247. package/dist/zamboni.d.ts.map +1 -1
  248. package/dist/zamboni.js +7 -2
  249. package/dist/zamboni.js.map +1 -1
  250. package/internal.d.ts +1 -1
  251. package/legacy.d.ts +1 -1
  252. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  253. package/lib/MergeTreeTextHelper.js +1 -1
  254. package/lib/MergeTreeTextHelper.js.map +1 -1
  255. package/lib/attributionCollection.d.ts.map +1 -1
  256. package/lib/attributionCollection.js +65 -17
  257. package/lib/attributionCollection.js.map +1 -1
  258. package/lib/attributionPolicy.d.ts +2 -1
  259. package/lib/attributionPolicy.d.ts.map +1 -1
  260. package/lib/attributionPolicy.js +10 -3
  261. package/lib/attributionPolicy.js.map +1 -1
  262. package/lib/client.d.ts +3 -1
  263. package/lib/client.d.ts.map +1 -1
  264. package/lib/client.js +65 -37
  265. package/lib/client.js.map +1 -1
  266. package/lib/collections/list.d.ts.map +1 -1
  267. package/lib/collections/list.js +5 -2
  268. package/lib/collections/list.js.map +1 -1
  269. package/lib/collections/rbTree.d.ts +2 -2
  270. package/lib/collections/rbTree.d.ts.map +1 -1
  271. package/lib/collections/rbTree.js +23 -35
  272. package/lib/collections/rbTree.js.map +1 -1
  273. package/lib/endOfTreeSegment.d.ts.map +1 -1
  274. package/lib/endOfTreeSegment.js +4 -1
  275. package/lib/endOfTreeSegment.js.map +1 -1
  276. package/lib/legacy.d.ts +1 -1
  277. package/lib/localReference.d.ts +16 -6
  278. package/lib/localReference.d.ts.map +1 -1
  279. package/lib/localReference.js +31 -20
  280. package/lib/localReference.js.map +1 -1
  281. package/lib/mergeTree.d.ts +0 -1
  282. package/lib/mergeTree.d.ts.map +1 -1
  283. package/lib/mergeTree.js +127 -112
  284. package/lib/mergeTree.js.map +1 -1
  285. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  286. package/lib/mergeTreeNodeWalk.js +1 -1
  287. package/lib/mergeTreeNodeWalk.js.map +1 -1
  288. package/lib/mergeTreeNodes.d.ts +6 -5
  289. package/lib/mergeTreeNodes.d.ts.map +1 -1
  290. package/lib/mergeTreeNodes.js +29 -20
  291. package/lib/mergeTreeNodes.js.map +1 -1
  292. package/lib/mergeTreeTracking.js +3 -3
  293. package/lib/mergeTreeTracking.js.map +1 -1
  294. package/lib/opBuilder.d.ts +6 -1
  295. package/lib/opBuilder.d.ts.map +1 -1
  296. package/lib/opBuilder.js +5 -0
  297. package/lib/opBuilder.js.map +1 -1
  298. package/lib/ops.d.ts.map +1 -1
  299. package/lib/ops.js.map +1 -1
  300. package/lib/ordinal.d.ts.map +1 -1
  301. package/lib/ordinal.js +7 -0
  302. package/lib/ordinal.js.map +1 -1
  303. package/lib/partialLengths.d.ts +4 -2
  304. package/lib/partialLengths.d.ts.map +1 -1
  305. package/lib/partialLengths.js +101 -53
  306. package/lib/partialLengths.js.map +1 -1
  307. package/lib/perspective.d.ts +4 -1
  308. package/lib/perspective.d.ts.map +1 -1
  309. package/lib/perspective.js +7 -6
  310. package/lib/perspective.js.map +1 -1
  311. package/lib/properties.d.ts +13 -10
  312. package/lib/properties.d.ts.map +1 -1
  313. package/lib/properties.js +22 -11
  314. package/lib/properties.js.map +1 -1
  315. package/lib/public.d.ts +1 -1
  316. package/lib/referencePositions.d.ts +7 -0
  317. package/lib/referencePositions.d.ts.map +1 -1
  318. package/lib/referencePositions.js +7 -0
  319. package/lib/referencePositions.js.map +1 -1
  320. package/lib/revertibles.d.ts +6 -0
  321. package/lib/revertibles.d.ts.map +1 -1
  322. package/lib/revertibles.js +50 -21
  323. package/lib/revertibles.js.map +1 -1
  324. package/lib/segmentGroupCollection.d.ts.map +1 -1
  325. package/lib/segmentGroupCollection.js +2 -0
  326. package/lib/segmentGroupCollection.js.map +1 -1
  327. package/lib/segmentPropertiesManager.d.ts +7 -3
  328. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  329. package/lib/segmentPropertiesManager.js +20 -15
  330. package/lib/segmentPropertiesManager.js.map +1 -1
  331. package/lib/snapshotChunks.d.ts.map +1 -1
  332. package/lib/snapshotChunks.js +10 -5
  333. package/lib/snapshotChunks.js.map +1 -1
  334. package/lib/snapshotLoader.d.ts.map +1 -1
  335. package/lib/snapshotLoader.js +14 -10
  336. package/lib/snapshotLoader.js.map +1 -1
  337. package/lib/snapshotV1.d.ts.map +1 -1
  338. package/lib/snapshotV1.js +20 -8
  339. package/lib/snapshotV1.js.map +1 -1
  340. package/lib/snapshotlegacy.d.ts.map +1 -1
  341. package/lib/snapshotlegacy.js +4 -2
  342. package/lib/snapshotlegacy.js.map +1 -1
  343. package/lib/sortedSegmentSet.d.ts.map +1 -1
  344. package/lib/sortedSegmentSet.js +8 -1
  345. package/lib/sortedSegmentSet.js.map +1 -1
  346. package/lib/sortedSet.d.ts.map +1 -1
  347. package/lib/sortedSet.js +4 -0
  348. package/lib/sortedSet.js.map +1 -1
  349. package/lib/test/Insertion.perf.spec.js.map +1 -1
  350. package/lib/test/Removal.perf.spec.js.map +1 -1
  351. package/lib/test/Snapshot.perf.spec.js +1 -0
  352. package/lib/test/Snapshot.perf.spec.js.map +1 -1
  353. package/lib/test/attributionCollection.perf.spec.js +3 -1
  354. package/lib/test/attributionCollection.perf.spec.js.map +1 -1
  355. package/lib/test/attributionCollection.spec.js +3 -2
  356. package/lib/test/attributionCollection.spec.js.map +1 -1
  357. package/lib/test/attributionPolicy.spec.js +3 -1
  358. package/lib/test/attributionPolicy.spec.js.map +1 -1
  359. package/lib/test/beastTest.spec.d.ts +1 -4
  360. package/lib/test/beastTest.spec.d.ts.map +1 -1
  361. package/lib/test/beastTest.spec.js +26 -24
  362. package/lib/test/beastTest.spec.js.map +1 -1
  363. package/lib/test/client.annotateMarker.spec.js +1 -1
  364. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  365. package/lib/test/client.apis.spec.d.ts.map +1 -1
  366. package/lib/test/client.apis.spec.js +4 -6
  367. package/lib/test/client.apis.spec.js.map +1 -1
  368. package/lib/test/client.applyMsg.spec.js +72 -50
  369. package/lib/test/client.applyMsg.spec.js.map +1 -1
  370. package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
  371. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  372. package/lib/test/client.attributionFarm.spec.js +12 -7
  373. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  374. package/lib/test/client.conflictFarm.spec.js +4 -2
  375. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  376. package/lib/test/client.getPosition.spec.js +1 -1
  377. package/lib/test/client.getPosition.spec.js.map +1 -1
  378. package/lib/test/client.localReference.spec.js +14 -7
  379. package/lib/test/client.localReference.spec.js.map +1 -1
  380. package/lib/test/client.localReferenceFarm.spec.js +13 -9
  381. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  382. package/lib/test/client.rebasePosition.spec.js +1 -1
  383. package/lib/test/client.rebasePosition.spec.js.map +1 -1
  384. package/lib/test/client.reconnectFarm.spec.js +11 -8
  385. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  386. package/lib/test/client.replay.spec.js +8 -7
  387. package/lib/test/client.replay.spec.js.map +1 -1
  388. package/lib/test/client.rollback.spec.js +14 -11
  389. package/lib/test/client.rollback.spec.js.map +1 -1
  390. package/lib/test/client.rollbackFarm.spec.js +3 -1
  391. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  392. package/lib/test/client.searchForMarker.spec.js +29 -19
  393. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  394. package/lib/test/client.walkSegments.spec.js +1 -1
  395. package/lib/test/client.walkSegments.spec.js.map +1 -1
  396. package/lib/test/collections.list.spec.js +1 -1
  397. package/lib/test/collections.list.spec.js.map +1 -1
  398. package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
  399. package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  400. package/lib/test/dirname.cjs +1 -0
  401. package/lib/test/dirname.cjs.map +1 -1
  402. package/lib/test/dirname.d.cts.map +1 -1
  403. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
  404. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  405. package/lib/test/mergeTree.annotate.spec.js +1 -1
  406. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  407. package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
  408. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  409. package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
  410. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  411. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
  412. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  413. package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
  414. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  415. package/lib/test/mergeTree.walk.spec.js +1 -1
  416. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  417. package/lib/test/mergeTree.zamboni.spec.js +1 -1
  418. package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
  419. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  420. package/lib/test/mergeTreeOperationRunner.js +27 -15
  421. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  422. package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
  423. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
  424. package/lib/test/obliterate.concurrent.spec.js +4 -4
  425. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  426. package/lib/test/obliterate.deltaCallback.spec.js +2 -3
  427. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
  428. package/lib/test/obliterate.partialLength.spec.js +1 -1
  429. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  430. package/lib/test/obliterate.reconnect.spec.js +1 -1
  431. package/lib/test/obliterate.reconnect.spec.js.map +1 -1
  432. package/lib/test/obliterate.spec.js +1 -1
  433. package/lib/test/obliterate.spec.js.map +1 -1
  434. package/lib/test/ordinal.spec.js +7 -1
  435. package/lib/test/ordinal.spec.js.map +1 -1
  436. package/lib/test/partialLength.spec.js.map +1 -1
  437. package/lib/test/properties.spec.js +1 -1
  438. package/lib/test/properties.spec.js.map +1 -1
  439. package/lib/test/reconnectHelper.d.ts +4 -4
  440. package/lib/test/reconnectHelper.d.ts.map +1 -1
  441. package/lib/test/reconnectHelper.js +22 -14
  442. package/lib/test/reconnectHelper.js.map +1 -1
  443. package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
  444. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  445. package/lib/test/revertibleFarm.spec.js +8 -7
  446. package/lib/test/revertibleFarm.spec.js.map +1 -1
  447. package/lib/test/revertibles.spec.d.ts.map +1 -1
  448. package/lib/test/revertibles.spec.js +93 -54
  449. package/lib/test/revertibles.spec.js.map +1 -1
  450. package/lib/test/segmentGroupCollection.spec.js +1 -1
  451. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  452. package/lib/test/snapshot.spec.js +1 -1
  453. package/lib/test/snapshot.spec.js.map +1 -1
  454. package/lib/test/snapshot.utils.d.ts.map +1 -1
  455. package/lib/test/snapshot.utils.js +1 -1
  456. package/lib/test/snapshot.utils.js.map +1 -1
  457. package/lib/test/snapshotlegacy.spec.js +10 -5
  458. package/lib/test/snapshotlegacy.spec.js.map +1 -1
  459. package/lib/test/sortedSegmentSet.spec.js +6 -2
  460. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  461. package/lib/test/testClient.d.ts +6 -5
  462. package/lib/test/testClient.d.ts.map +1 -1
  463. package/lib/test/testClient.js +25 -27
  464. package/lib/test/testClient.js.map +1 -1
  465. package/lib/test/testClientLogger.d.ts.map +1 -1
  466. package/lib/test/testClientLogger.js +37 -36
  467. package/lib/test/testClientLogger.js.map +1 -1
  468. package/lib/test/testSerializer.d.ts +5 -5
  469. package/lib/test/testSerializer.d.ts.map +1 -1
  470. package/lib/test/testSerializer.js +0 -1
  471. package/lib/test/testSerializer.js.map +1 -1
  472. package/lib/test/testServer.d.ts.map +1 -1
  473. package/lib/test/testServer.js.map +1 -1
  474. package/lib/test/testUtils.d.ts +1 -1
  475. package/lib/test/testUtils.d.ts.map +1 -1
  476. package/lib/test/testUtils.js +6 -8
  477. package/lib/test/testUtils.js.map +1 -1
  478. package/lib/test/text.d.ts.map +1 -1
  479. package/lib/test/text.js +1 -1
  480. package/lib/test/text.js.map +1 -1
  481. package/lib/test/tracking.spec.js +9 -5
  482. package/lib/test/tracking.spec.js.map +1 -1
  483. package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
  484. package/lib/test/wordUnitTests.spec.js +9 -9
  485. package/lib/test/wordUnitTests.spec.js.map +1 -1
  486. package/lib/textSegment.d.ts +1 -1
  487. package/lib/textSegment.d.ts.map +1 -1
  488. package/lib/textSegment.js +3 -3
  489. package/lib/textSegment.js.map +1 -1
  490. package/lib/zamboni.d.ts.map +1 -1
  491. package/lib/zamboni.js +7 -2
  492. package/lib/zamboni.js.map +1 -1
  493. package/package.json +29 -27
  494. package/src/MergeTreeTextHelper.ts +2 -2
  495. package/src/attributionCollection.ts +71 -28
  496. package/src/attributionPolicy.ts +14 -9
  497. package/src/client.ts +120 -71
  498. package/src/collections/list.ts +9 -6
  499. package/src/collections/rbTree.ts +62 -71
  500. package/src/endOfTreeSegment.ts +21 -10
  501. package/src/localReference.ts +61 -43
  502. package/src/mergeTree.ts +229 -178
  503. package/src/mergeTreeNodeWalk.ts +2 -1
  504. package/src/mergeTreeNodes.ts +59 -46
  505. package/src/mergeTreeTracking.ts +3 -3
  506. package/src/opBuilder.ts +6 -1
  507. package/src/ops.ts +5 -0
  508. package/src/ordinal.ts +8 -1
  509. package/src/partialLengths.ts +143 -87
  510. package/src/perspective.ts +10 -7
  511. package/src/properties.ts +36 -18
  512. package/src/referencePositions.ts +7 -0
  513. package/src/revertibles.ts +71 -41
  514. package/src/segmentGroupCollection.ts +8 -6
  515. package/src/segmentPropertiesManager.ts +28 -24
  516. package/src/snapshotChunks.ts +12 -7
  517. package/src/snapshotLoader.ts +20 -17
  518. package/src/snapshotV1.ts +36 -18
  519. package/src/snapshotlegacy.ts +7 -5
  520. package/src/sortedSegmentSet.ts +9 -3
  521. package/src/sortedSet.ts +7 -3
  522. package/src/textSegment.ts +9 -9
  523. package/src/zamboni.ts +14 -10
  524. package/tsconfig.json +0 -1
package/lib/mergeTree.js CHANGED
@@ -19,7 +19,6 @@ import { createAnnotateRangeOp, createInsertSegmentOp, createRemoveRangeOp, } fr
19
19
  import { MergeTreeDeltaType, ReferenceType, } from "./ops.js";
20
20
  import { PartialSequenceLengths } from "./partialLengths.js";
21
21
  import { PerspectiveImpl, isSegmentPresent } from "./perspective.js";
22
- // eslint-disable-next-line import/no-deprecated
23
22
  import { createMap, extend, extendIfUndefined } from "./properties.js";
24
23
  import { DetachedReferencePosition, refGetTileLabels, refHasTileLabel, refTypeIncludesFlag, } from "./referencePositions.js";
25
24
  import { PropertiesRollback } from "./segmentPropertiesManager.js";
@@ -30,7 +29,7 @@ function wasRemovedAfter(seg, seq) {
30
29
  }
31
30
  function markSegmentMoved(seg, moveInfo) {
32
31
  seg.moveDst = moveInfo.moveDst;
33
- seg.movedClientIds = moveInfo.movedClientIds.slice();
32
+ seg.movedClientIds = [...moveInfo.movedClientIds];
34
33
  seg.movedSeqs = [moveInfo.movedSeq];
35
34
  seg.movedSeq = moveInfo.movedSeq;
36
35
  seg.localMovedSeq = moveInfo.localMovedSeq;
@@ -76,17 +75,18 @@ export function findRootMergeBlock(segmentOrNode) {
76
75
  while (maybeRoot?.parent !== undefined) {
77
76
  maybeRoot = maybeRoot.parent;
78
77
  }
79
- return maybeRoot?.mergeTree !== undefined ? maybeRoot : undefined;
78
+ return maybeRoot?.mergeTree === undefined ? undefined : maybeRoot;
80
79
  }
81
80
  /**
81
+ * Find the segment to which a reference will slide if it needs to slide, or undefined if there
82
+ * is no valid segment (i.e. the tree is empty).
83
+ *
82
84
  * @param segment - The segment to slide from.
83
85
  * @param cache - Optional cache mapping segments to their sliding destinations.
84
86
  * Excursions will be avoided for segments in the cache, and the cache will be populated with
85
87
  * entries for all segments visited during excursion.
86
88
  * This can reduce the number of times the tree needs to be scanned if a range containing many
87
89
  * SlideOnRemove references is removed.
88
- * @returns The segment a SlideOnRemove reference should slide to, or undefined if there is no
89
- * valid segment (i.e. the tree is empty).
90
90
  * @internal
91
91
  */
92
92
  function getSlideToSegment(segment, slidingPreference = SlidingPreference.FORWARD, cache, useNewSlidingBehavior = false) {
@@ -167,6 +167,8 @@ export function getSlideToSegoff(segoff, slidingPreference = SlidingPreference.F
167
167
  offset,
168
168
  };
169
169
  }
170
+ const forwardPred = (ref) => ref.slidingPreference !== SlidingPreference.BACKWARD;
171
+ const backwardPred = (ref) => ref.slidingPreference === SlidingPreference.BACKWARD;
170
172
  /**
171
173
  * @internal
172
174
  */
@@ -274,7 +276,18 @@ export class MergeTree {
274
276
  assert(refSeq !== undefined, 0x398 /* localSeq provided for local length without refSeq */);
275
277
  assert(segment.seq !== undefined, 0x399 /* segment with no seq in mergeTree */);
276
278
  const { seq, removedSeq, localRemovedSeq, movedSeq, localMovedSeq } = segment;
277
- if (seq !== UnassignedSequenceNumber) {
279
+ if (seq === UnassignedSequenceNumber) {
280
+ assert(segment.localSeq !== undefined, 0x39a /* unacked segment with undefined localSeq */);
281
+ // inserted locally, still un-acked
282
+ if (segment.localSeq > localSeq ||
283
+ (localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||
284
+ (localMovedSeq !== undefined && localMovedSeq <= localSeq)) {
285
+ return 0;
286
+ }
287
+ const { cachedLength } = segment;
288
+ return cachedLength;
289
+ }
290
+ else {
278
291
  // inserted remotely
279
292
  if (seq > refSeq ||
280
293
  (removedSeq !== undefined &&
@@ -289,16 +302,6 @@ export class MergeTree {
289
302
  }
290
303
  return segment.cachedLength;
291
304
  }
292
- else {
293
- assert(segment.localSeq !== undefined, 0x39a /* unacked segment with undefined localSeq */);
294
- // inserted locally, still un-acked
295
- if (segment.localSeq > localSeq ||
296
- (localRemovedSeq !== undefined && localRemovedSeq <= localSeq) ||
297
- (localMovedSeq !== undefined && localMovedSeq <= localSeq)) {
298
- return 0;
299
- }
300
- return segment.cachedLength;
301
- }
302
305
  }
303
306
  unlinkMarker(marker) {
304
307
  const id = marker.getId();
@@ -318,7 +321,7 @@ export class MergeTree {
318
321
  // Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.
319
322
  const buildMergeBlock = (nodes) => {
320
323
  const blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree
321
- const blocks = new Array(blockCount); // Pre-alloc array to collect nodes
324
+ const blocks = Array.from({ length: blockCount }); // Pre-alloc array to collect nodes
322
325
  // For each block in this level of the B-Tree...
323
326
  for (let nodeIndex = 0, blockIndex = 0; // Start with the first block and first node
324
327
  blockIndex < blockCount; // If we have more blocks, we also have more nodes to insert
@@ -331,6 +334,7 @@ export class MergeTree {
331
334
  childIndex++, nodeIndex++ // Advance to next child & node
332
335
  ) {
333
336
  // Insert the next node into the current block
337
+ // TODO Non null asserting, why is this not null?
334
338
  this.addNode(block, nodes[nodeIndex]);
335
339
  }
336
340
  // Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,
@@ -339,7 +343,8 @@ export class MergeTree {
339
343
  this.blockUpdate(block);
340
344
  }
341
345
  return blocks.length === 1 // If there is only one block at this layer...
342
- ? blocks[0] // ...then we're done. Return the root.
346
+ ? // Non null asserting here because of the length check above
347
+ blocks[0] // ...then we're done. Return the root.
343
348
  : buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.
344
349
  };
345
350
  if (segments.length > 0) {
@@ -387,6 +392,7 @@ export class MergeTree {
387
392
  while (parent) {
388
393
  const children = parent.children;
389
394
  for (let childIndex = 0; childIndex < parent.childCount; childIndex++) {
395
+ // TODO Non null asserting, why is this not null?
390
396
  const child = children[childIndex];
391
397
  if ((!!prevParent && child === prevParent) || child === node) {
392
398
  break;
@@ -437,11 +443,9 @@ export class MergeTree {
437
443
  let currentForwardMaybeEndpoint;
438
444
  let currentForwardSlideDestination;
439
445
  let currentForwardSlideIsForward;
440
- const forwardPred = (ref) => ref.slidingPreference !== SlidingPreference.BACKWARD;
441
446
  let currentBackwardMaybeEndpoint;
442
447
  let currentBackwardSlideDestination;
443
448
  let currentBackwardSlideIsForward;
444
- const backwardPred = (ref) => ref.slidingPreference === SlidingPreference.BACKWARD;
445
449
  const slideGroup = (currentSlideDestination, currentSlideIsForward, currentSlideGroup, pred, maybeEndpoint) => {
446
450
  if (currentSlideIsForward === undefined) {
447
451
  return;
@@ -458,16 +462,7 @@ export class MergeTree {
458
462
  localRefs.addAfterTombstones(...endpointRefsToAdd);
459
463
  }
460
464
  }
461
- if (currentSlideDestination !== undefined) {
462
- const localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);
463
- if (currentSlideIsForward) {
464
- localRefs.addBeforeTombstones(...nonEndpointRefsToAdd);
465
- }
466
- else {
467
- localRefs.addAfterTombstones(...nonEndpointRefsToAdd);
468
- }
469
- }
470
- else {
465
+ if (currentSlideDestination === undefined) {
471
466
  for (const collection of currentSlideGroup) {
472
467
  for (const ref of collection) {
473
468
  if (pred(ref) && !refTypeIncludesFlag(ref, ReferenceType.StayOnRemove)) {
@@ -478,6 +473,15 @@ export class MergeTree {
478
473
  }
479
474
  }
480
475
  }
476
+ else {
477
+ const localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);
478
+ if (currentSlideIsForward) {
479
+ localRefs.addBeforeTombstones(...nonEndpointRefsToAdd);
480
+ }
481
+ else {
482
+ localRefs.addAfterTombstones(...nonEndpointRefsToAdd);
483
+ }
484
+ }
481
485
  };
482
486
  const trySlideSegment = (segment, currentSlideDestination, currentSlideIsForward, currentSlideGroup, pred, slidingPreference, currentMaybeEndpoint, reassign) => {
483
487
  // avoid sliding logic if this segment doesn't have any references
@@ -564,12 +568,7 @@ export class MergeTree {
564
568
  }
565
569
  else {
566
570
  // Sequence number within window
567
- if (!node.isLeaf()) {
568
- const partialLen = node.partialLengths.getPartialLength(refSeq, clientId);
569
- PartialSequenceLengths.options.verifyExpected?.(this, node, refSeq, clientId);
570
- return partialLen;
571
- }
572
- else {
571
+ if (node.isLeaf()) {
573
572
  const segment = node;
574
573
  const removalInfo = toRemovalInfo(segment);
575
574
  const moveInfo = toMoveInfo(segment);
@@ -595,6 +594,11 @@ export class MergeTree {
595
594
  ? segment.cachedLength
596
595
  : 0;
597
596
  }
597
+ else {
598
+ const partialLen = node.partialLengths.getPartialLength(refSeq, clientId);
599
+ PartialSequenceLengths.options.verifyExpected?.(this, node, refSeq, clientId);
600
+ return partialLen;
601
+ }
598
602
  }
599
603
  }
600
604
  setMinSeq(minSeq) {
@@ -618,7 +622,6 @@ export class MergeTree {
618
622
  * Defaults to including all edits which have been applied.
619
623
  * @param clientId - The ID of the client from whose perspective to resolve this reference. Defaults to the current client.
620
624
  * @param localSeq - The local sequence number to consider. Defaults to including all local edits.
621
- * @returns the count of elements before the given reference position in the given perspective.
622
625
  */
623
626
  referencePositionToLocalPosition(refPos, refSeq = Number.MAX_SAFE_INTEGER, clientId = this.collabWindow.clientId, localSeq = this.collabWindow.localSeq) {
624
627
  const seg = refPos.getSegment();
@@ -686,7 +689,7 @@ export class MergeTree {
686
689
  foundMarker = marker;
687
690
  }
688
691
  }
689
- return foundMarker !== undefined ? NodeAction.Exit : NodeAction.Skip;
692
+ return foundMarker === undefined ? NodeAction.Skip : NodeAction.Exit;
690
693
  }, undefined, undefined, forwards);
691
694
  return foundMarker;
692
695
  }
@@ -718,6 +721,8 @@ export class MergeTree {
718
721
  if (opArgs.op.type === MergeTreeDeltaType.OBLITERATE && localMovedSeq !== undefined) {
719
722
  const locallyMovedSegments = this.locallyMovedSegments.get(localMovedSeq);
720
723
  if (locallyMovedSegments) {
724
+ // Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored
725
+ // eslint-disable-next-line unicorn/no-array-for-each
721
726
  locallyMovedSegments.segments.forEach((segment) => {
722
727
  segment.localMovedSeq = undefined;
723
728
  if (!nodesToUpdate.includes(segment.parent)) {
@@ -818,15 +823,15 @@ export class MergeTree {
818
823
  }
819
824
  if (marker) {
820
825
  pos = this.getPosition(marker, refseq, clientId);
821
- if (!relativePos.before) {
822
- pos += marker.cachedLength;
826
+ if (relativePos.before) {
823
827
  if (relativePos.offset !== undefined) {
824
- pos += relativePos.offset;
828
+ pos -= relativePos.offset;
825
829
  }
826
830
  }
827
831
  else {
832
+ pos += marker.cachedLength;
828
833
  if (relativePos.offset !== undefined) {
829
- pos -= relativePos.offset;
834
+ pos += relativePos.offset;
830
835
  }
831
836
  }
832
837
  }
@@ -885,6 +890,8 @@ export class MergeTree {
885
890
  }
886
891
  }
887
892
  blockInsert(pos, refSeq, clientId, seq, localSeq, newSegments) {
893
+ // Keeping this function within the scope of blockInsert for readability.
894
+ // eslint-disable-next-line unicorn/consistent-function-scoping
888
895
  const continueFrom = (node) => {
889
896
  let siblingExists = false;
890
897
  forwardExcursion(node, () => {
@@ -943,7 +950,7 @@ export class MergeTree {
943
950
  });
944
951
  if (newSegment.parent === undefined) {
945
952
  // Indicates an attempt to insert past the end of the merge-tree's content.
946
- const errorConstructor = localSeq !== undefined ? UsageError : DataProcessingError;
953
+ const errorConstructor = localSeq === undefined ? DataProcessingError : UsageError;
947
954
  throw new errorConstructor("MergeTree insert failed", {
948
955
  currentSeq: this.collabWindow.currentSeq,
949
956
  minSeq: this.collabWindow.minSeq,
@@ -1085,6 +1092,7 @@ export class MergeTree {
1085
1092
  let newNode;
1086
1093
  let fromSplit;
1087
1094
  for (childIndex = 0; childIndex < block.childCount; childIndex++) {
1095
+ // TODO Non null asserting, why is this not null?
1088
1096
  child = children[childIndex];
1089
1097
  // ensure we walk down the far edge of the tree, even if all sub-tree is eligible for zamboni
1090
1098
  const isLastNonLeafBlock = isLastChildBlock && !child.isLeaf() && childIndex === block.childCount - 1;
@@ -1097,7 +1105,23 @@ export class MergeTree {
1097
1105
  assert(len >= 0, 0x4bc /* Length should not be negative */);
1098
1106
  if (_pos < len || (_pos === len && this.breakTie(_pos, child, seq))) {
1099
1107
  // Found entry containing pos
1100
- if (!child.isLeaf()) {
1108
+ if (child.isLeaf()) {
1109
+ const segment = child;
1110
+ const segmentChanges = context.leaf(segment, _pos, context);
1111
+ if (segmentChanges.replaceCurrent) {
1112
+ block.assignChild(segmentChanges.replaceCurrent, childIndex, false);
1113
+ segmentChanges.replaceCurrent.ordinal = child.ordinal;
1114
+ }
1115
+ if (segmentChanges.next) {
1116
+ newNode = segmentChanges.next;
1117
+ childIndex++; // Insert after
1118
+ }
1119
+ else {
1120
+ // No change
1121
+ return undefined;
1122
+ }
1123
+ }
1124
+ else {
1101
1125
  const childBlock = child;
1102
1126
  // Internal node
1103
1127
  const splitNode = this.insertingWalk(childBlock, _pos, refSeq, clientId, seq, context, isLastNonLeafBlock);
@@ -1115,43 +1139,27 @@ export class MergeTree {
1115
1139
  childIndex++; // Insert after
1116
1140
  }
1117
1141
  }
1118
- else {
1119
- const segment = child;
1120
- const segmentChanges = context.leaf(segment, _pos, context);
1121
- if (segmentChanges.replaceCurrent) {
1122
- block.assignChild(segmentChanges.replaceCurrent, childIndex, false);
1123
- segmentChanges.replaceCurrent.ordinal = child.ordinal;
1124
- }
1125
- if (segmentChanges.next) {
1126
- newNode = segmentChanges.next;
1127
- childIndex++; // Insert after
1128
- }
1129
- else {
1130
- // No change
1131
- return undefined;
1132
- }
1133
- }
1134
1142
  break;
1135
1143
  }
1136
1144
  else {
1137
1145
  _pos -= len;
1138
1146
  }
1139
1147
  }
1140
- if (!newNode) {
1141
- if (_pos === 0) {
1142
- if (context.continuePredicate?.(block)) {
1143
- return MergeTree.theUnfinishedNode;
1144
- }
1145
- else {
1146
- const segmentChanges = context.leaf(undefined, _pos, context);
1147
- newNode = segmentChanges.next;
1148
- // Assert segmentChanges.replaceCurrent === undefined
1149
- }
1148
+ if (!newNode && _pos === 0) {
1149
+ if (context.continuePredicate?.(block)) {
1150
+ return MergeTree.theUnfinishedNode;
1151
+ }
1152
+ else {
1153
+ const segmentChanges = context.leaf(undefined, _pos, context);
1154
+ newNode = segmentChanges.next;
1155
+ // Assert segmentChanges.replaceCurrent === undefined
1150
1156
  }
1151
1157
  }
1152
1158
  if (newNode) {
1153
1159
  for (let i = block.childCount; i > childIndex; i--) {
1160
+ // TODO Non null asserting, why is this not null?
1154
1161
  block.children[i] = block.children[i - 1];
1162
+ // TODO Non null asserting, why is this not null?
1155
1163
  block.children[i].index = i;
1156
1164
  }
1157
1165
  block.assignChild(newNode, childIndex, false);
@@ -1183,6 +1191,7 @@ export class MergeTree {
1183
1191
  // Update ordinals to reflect lowered child count
1184
1192
  this.nodeUpdateOrdinals(node);
1185
1193
  for (let i = 0; i < halfCount; i++) {
1194
+ // TODO Non null asserting, why is this not null?
1186
1195
  newNode.assignChild(node.children[halfCount + i], i, false);
1187
1196
  node.children[halfCount + i] = undefined;
1188
1197
  }
@@ -1192,6 +1201,7 @@ export class MergeTree {
1192
1201
  }
1193
1202
  nodeUpdateOrdinals(block) {
1194
1203
  for (let i = 0; i < block.childCount; i++) {
1204
+ // TODO Non null asserting, why is this not null?
1195
1205
  const child = block.children[i];
1196
1206
  block.setOrdinal(child, i);
1197
1207
  if (!child.isLeaf()) {
@@ -1245,10 +1255,10 @@ export class MergeTree {
1245
1255
  deltaSegments,
1246
1256
  });
1247
1257
  }
1248
- if (this.collabWindow.collaborating && seq !== UnassignedSequenceNumber) {
1249
- if (MergeTree.options.zamboniSegments) {
1250
- zamboniSegments(this);
1251
- }
1258
+ if (this.collabWindow.collaborating &&
1259
+ seq !== UnassignedSequenceNumber &&
1260
+ MergeTree.options.zamboniSegments) {
1261
+ zamboniSegments(this);
1252
1262
  }
1253
1263
  }
1254
1264
  obliterateRange(start, end, refSeq, clientId, seq, overwrite = false, opArgs) {
@@ -1277,7 +1287,16 @@ export class MergeTree {
1277
1287
  (refSeq < segment.seq || segment.seq === UnassignedSequenceNumber)) {
1278
1288
  segment.wasMovedOnInsert = true;
1279
1289
  }
1280
- if (existingMoveInfo !== undefined) {
1290
+ if (existingMoveInfo === undefined) {
1291
+ segment.movedClientIds = [clientId];
1292
+ segment.movedSeq = seq;
1293
+ segment.localMovedSeq = localSeq;
1294
+ segment.movedSeqs = [seq];
1295
+ if (!toRemovalInfo(segment)) {
1296
+ movedSegments.push({ segment });
1297
+ }
1298
+ }
1299
+ else {
1281
1300
  _overwrite = true;
1282
1301
  if (existingMoveInfo.movedSeq === UnassignedSequenceNumber) {
1283
1302
  // we moved this locally, but someone else moved it first
@@ -1297,15 +1316,6 @@ export class MergeTree {
1297
1316
  existingMoveInfo.movedSeqs.push(seq);
1298
1317
  }
1299
1318
  }
1300
- else {
1301
- segment.movedClientIds = [clientId];
1302
- segment.movedSeq = seq;
1303
- segment.localMovedSeq = localSeq;
1304
- segment.movedSeqs = [seq];
1305
- if (!toRemovalInfo(segment)) {
1306
- movedSegments.push({ segment });
1307
- }
1308
- }
1309
1319
  // Save segment so can assign moved sequence number when acked by server
1310
1320
  if (this.collabWindow.collaborating) {
1311
1321
  if (segment.movedSeq === UnassignedSequenceNumber &&
@@ -1329,7 +1339,7 @@ export class MergeTree {
1329
1339
  }
1330
1340
  return true;
1331
1341
  };
1332
- this.nodeMap(refSeq, clientId, markMoved, undefined, afterMarkMoved, start, end, undefined, seq !== UnassignedSequenceNumber ? seq : undefined);
1342
+ this.nodeMap(refSeq, clientId, markMoved, undefined, afterMarkMoved, start, end, undefined, seq === UnassignedSequenceNumber ? undefined : seq);
1333
1343
  this.slideAckedRemovedSegmentReferences(localOverlapWithRefs);
1334
1344
  // opArgs == undefined => test code
1335
1345
  if (movedSegments.length > 0) {
@@ -1347,10 +1357,10 @@ export class MergeTree {
1347
1357
  if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
1348
1358
  this.slideAckedRemovedSegmentReferences(movedSegments.map(({ segment }) => segment));
1349
1359
  }
1350
- if (this.collabWindow.collaborating && seq !== UnassignedSequenceNumber) {
1351
- if (MergeTree.options.zamboniSegments) {
1352
- zamboniSegments(this);
1353
- }
1360
+ if (this.collabWindow.collaborating &&
1361
+ seq !== UnassignedSequenceNumber &&
1362
+ MergeTree.options.zamboniSegments) {
1363
+ zamboniSegments(this);
1354
1364
  }
1355
1365
  }
1356
1366
  markRangeRemoved(start, end, refSeq, clientId, seq, overwrite = false, opArgs) {
@@ -1364,7 +1374,15 @@ export class MergeTree {
1364
1374
  const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;
1365
1375
  const markRemoved = (segment, pos, _start, _end) => {
1366
1376
  const existingRemovalInfo = toRemovalInfo(segment);
1367
- if (existingRemovalInfo !== undefined) {
1377
+ if (existingRemovalInfo === undefined) {
1378
+ segment.removedClientIds = [clientId];
1379
+ segment.removedSeq = seq;
1380
+ segment.localRemovedSeq = localSeq;
1381
+ if (!toMoveInfo(segment)) {
1382
+ removedSegments.push({ segment });
1383
+ }
1384
+ }
1385
+ else {
1368
1386
  _overwrite = true;
1369
1387
  if (existingRemovalInfo.removedSeq === UnassignedSequenceNumber) {
1370
1388
  // we removed this locally, but someone else removed it first
@@ -1382,14 +1400,6 @@ export class MergeTree {
1382
1400
  existingRemovalInfo.removedClientIds.push(clientId);
1383
1401
  }
1384
1402
  }
1385
- else {
1386
- segment.removedClientIds = [clientId];
1387
- segment.removedSeq = seq;
1388
- segment.localRemovedSeq = localSeq;
1389
- if (!toMoveInfo(segment)) {
1390
- removedSegments.push({ segment });
1391
- }
1392
- }
1393
1403
  // Save segment so we can assign removed sequence number when acked by server
1394
1404
  if (this.collabWindow.collaborating) {
1395
1405
  if (segment.removedSeq === UnassignedSequenceNumber &&
@@ -1430,10 +1440,10 @@ export class MergeTree {
1430
1440
  if (!this.collabWindow.collaborating || clientId !== this.collabWindow.clientId) {
1431
1441
  this.slideAckedRemovedSegmentReferences(removedSegments.map(({ segment }) => segment));
1432
1442
  }
1433
- if (this.collabWindow.collaborating && seq !== UnassignedSequenceNumber) {
1434
- if (MergeTree.options.zamboniSegments) {
1435
- zamboniSegments(this);
1436
- }
1443
+ if (this.collabWindow.collaborating &&
1444
+ seq !== UnassignedSequenceNumber &&
1445
+ MergeTree.options.zamboniSegments) {
1446
+ zamboniSegments(this);
1437
1447
  }
1438
1448
  }
1439
1449
  /**
@@ -1446,6 +1456,8 @@ export class MergeTree {
1446
1456
  if (pendingSegmentGroup === undefined || pendingSegmentGroup !== localOpMetadata) {
1447
1457
  throw new Error("Rollback op doesn't match last edit");
1448
1458
  }
1459
+ // Disabling because a for of loop causes the type of segment to be ISegment, which does not have parent information stored
1460
+ // eslint-disable-next-line unicorn/no-array-for-each
1449
1461
  pendingSegmentGroup.segments.forEach((segment) => {
1450
1462
  const segmentSegmentGroup = segment.segmentGroups?.pop?.();
1451
1463
  assert(segmentSegmentGroup === pendingSegmentGroup, 0x3ee /* Unexpected segmentGroup in segment */);
@@ -1485,6 +1497,7 @@ export class MergeTree {
1485
1497
  this.markRangeRemoved(start, start + segment.cachedLength, UniversalSequenceNumber, this.collabWindow.clientId, UniversalSequenceNumber, false, { op: removeOp });
1486
1498
  } /* op.type === MergeTreeDeltaType.ANNOTATE */
1487
1499
  else {
1500
+ // TODO Non null asserting, why is this not null?
1488
1501
  const props = pendingSegmentGroup.previousProps[i];
1489
1502
  const annotateOp = createAnnotateRangeOp(start, start + segment.cachedLength, props);
1490
1503
  this.annotateRange(start, start + segment.cachedLength, props, UniversalSequenceNumber, this.collabWindow.clientId, UniversalSequenceNumber, { op: annotateOp }, PropertiesRollback.Rollback);
@@ -1589,18 +1602,20 @@ export class MergeTree {
1589
1602
  }
1590
1603
  }
1591
1604
  }
1592
- const newOrder = Array.from(affectedSegments.map(({ data }) => data));
1593
- newOrder.forEach((seg) => seg.localRefs?.walkReferences((lref) => lref.callbacks?.beforeSlide?.(lref)));
1605
+ const newOrder = Array.from(affectedSegments, ({ data }) => data);
1606
+ for (const seg of newOrder)
1607
+ seg.localRefs?.walkReferences((lref) => lref.callbacks?.beforeSlide?.(lref));
1594
1608
  const perSegmentTrackingGroups = new Map();
1595
1609
  for (const segment of newOrder) {
1596
1610
  const { trackingCollection } = segment;
1597
- const trackingGroups = Array.from(trackingCollection.trackingGroups);
1611
+ const trackingGroups = [...trackingCollection.trackingGroups];
1598
1612
  perSegmentTrackingGroups.set(segment, trackingGroups);
1599
1613
  for (const group of trackingCollection.trackingGroups) {
1600
1614
  trackingCollection.unlink(group);
1601
1615
  }
1602
1616
  }
1603
1617
  for (let i = 0; i < newOrder.length; i++) {
1618
+ // TODO Non null asserting, why is this not null?
1604
1619
  const seg = newOrder[i];
1605
1620
  const { parent, index, ordinal } = currentOrder[i];
1606
1621
  parent?.assignChild(seg, index, false);
@@ -1620,13 +1635,16 @@ export class MergeTree {
1620
1635
  }
1621
1636
  return depths.get(block);
1622
1637
  };
1623
- newOrder.forEach(computeDepth);
1624
- for (const [node] of Array.from(depths.entries()).sort((a, b) => b[1] - a[1])) {
1638
+ for (const element of newOrder) {
1639
+ computeDepth(element);
1640
+ }
1641
+ for (const [node] of [...depths.entries()].sort((a, b) => b[1] - a[1])) {
1625
1642
  if (!node.isLeaf()) {
1626
1643
  this.nodeUpdateLengthNewStructure(node);
1627
1644
  }
1628
1645
  }
1629
- newOrder.forEach((seg) => seg.localRefs?.walkReferences((lref) => lref.callbacks?.afterSlide?.(lref)));
1646
+ for (const seg of newOrder)
1647
+ seg.localRefs?.walkReferences((lref) => lref.callbacks?.afterSlide?.(lref));
1630
1648
  }
1631
1649
  /**
1632
1650
  * Normalizes the segments nearby `segmentGroup` to be ordered as they would if the op submitting `segmentGroup`
@@ -1681,11 +1699,10 @@ export class MergeTree {
1681
1699
  }
1682
1700
  blockUpdate(block) {
1683
1701
  let len;
1684
- // eslint-disable-next-line import/no-deprecated
1685
1702
  const rightmostTiles = createMap();
1686
- // eslint-disable-next-line import/no-deprecated
1687
1703
  const leftmostTiles = createMap();
1688
1704
  for (let i = 0; i < block.childCount; i++) {
1705
+ // TODO Non null asserting, why is this not null?
1689
1706
  const node = block.children[i];
1690
1707
  const nodeLength = nodeTotalLength(this, node);
1691
1708
  if (nodeLength !== undefined) {
@@ -1716,9 +1733,7 @@ export class MergeTree {
1716
1733
  }
1717
1734
  }
1718
1735
  else {
1719
- // eslint-disable-next-line import/no-deprecated
1720
1736
  extend(rightmostTiles, node.rightmostTiles);
1721
- // eslint-disable-next-line import/no-deprecated
1722
1737
  extendIfUndefined(leftmostTiles, node.leftmostTiles);
1723
1738
  }
1724
1739
  }