@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
@@ -33,7 +33,7 @@ class PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number>
33
33
  public addOrUpdate(
34
34
  newItem: PartialSequenceLength,
35
35
  update?: (existingItem: PartialSequenceLength, newItem: PartialSequenceLength) => void,
36
- ) {
36
+ ): void {
37
37
  const prev = this.latestLeq(newItem.seq);
38
38
 
39
39
  if (prev?.seq !== newItem.seq) {
@@ -92,15 +92,21 @@ class PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number>
92
92
  const mindex = this.latestLeqIndex(minSeq);
93
93
  let minLength = 0;
94
94
  if (mindex >= 0) {
95
- minLength = this.keySortedItems[mindex].len;
95
+ // TODO Non null asserting, why is this not null?
96
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
97
+ minLength = this.keySortedItems[mindex]!.len;
96
98
  const seqCount = this.size;
97
99
  if (mindex <= seqCount - 1) {
98
100
  // Still some entries remaining
99
101
  const remainingCount = seqCount - mindex - 1;
100
102
  // Copy down
101
103
  for (let i = 0; i < remainingCount; i++) {
102
- this.keySortedItems[i] = this.keySortedItems[i + mindex + 1];
103
- this.keySortedItems[i].len -= minLength;
104
+ // TODO Non null asserting, why is this not null?
105
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
106
+ this.keySortedItems[i] = this.keySortedItems[i + mindex + 1]!;
107
+ // TODO Non null asserting, why is this not null?
108
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
109
+ this.keySortedItems[i]!.len -= minLength;
104
110
  }
105
111
  this.keySortedItems.length = remainingCount;
106
112
  }
@@ -301,7 +307,9 @@ export class PartialSequenceLengths {
301
307
  let hasInternalChild = false;
302
308
  const childPartials: PartialSequenceLengths[] = [];
303
309
  for (let i = 0; i < block.childCount; i++) {
304
- const child = block.children[i];
310
+ // TODO Non null asserting, why is this not null?
311
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
312
+ const child = block.children[i]!;
305
313
  if (!child.isLeaf()) {
306
314
  hasInternalChild = true;
307
315
  if (recur) {
@@ -335,7 +343,9 @@ export class PartialSequenceLengths {
335
343
  const childOverlapRemoves: LocalPartialSequenceLength[][] = [];
336
344
  for (let i = 0; i < childPartialsLen; i++) {
337
345
  const { segmentCount, minLength, partialLengths, unsequencedRecords } =
338
- childPartials[i];
346
+ // TODO Non null asserting, why is this not null?
347
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
348
+ childPartials[i]!;
339
349
  combinedPartialLengths.segmentCount += segmentCount;
340
350
  combinedPartialLengths.minLength += minLength;
341
351
  childPartialLengths.push(partialLengths.items as PartialSequenceLength[]);
@@ -352,7 +362,7 @@ export class PartialSequenceLengths {
352
362
  if (computeLocalPartials) {
353
363
  combinedPartialLengths.unsequencedRecords = {
354
364
  partialLengths: mergePartialLengths(childUnsequencedPartialLengths),
355
- overlappingRemoves: Array.from(mergeSortedListsBySeq(childOverlapRemoves)),
365
+ overlappingRemoves: [...mergeSortedListsBySeq(childOverlapRemoves)],
356
366
  cachedOverlappingByRefSeq: new Map(),
357
367
  };
358
368
  }
@@ -371,8 +381,8 @@ export class PartialSequenceLengths {
371
381
  }
372
382
 
373
383
  /**
374
- * @returns a PartialSequenceLengths structure which tracks only lengths of leaf children of the provided
375
- * MergeBlock.
384
+ * Creates and returns a PartialSequenceLengths structure that tracks the lengths of only the
385
+ * leaf children of the provided MergeBlock.
376
386
  */
377
387
  private static fromLeaves(
378
388
  block: MergeBlock,
@@ -387,7 +397,9 @@ export class PartialSequenceLengths {
387
397
  combinedPartialLengths.segmentCount = block.childCount;
388
398
 
389
399
  for (let i = 0; i < block.childCount; i++) {
390
- const child = block.children[i];
400
+ // TODO Non null asserting, why is this not null?
401
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
402
+ const child = block.children[i]!;
391
403
  if (child.isLeaf()) {
392
404
  // Leaf segment
393
405
  const segment = child;
@@ -438,7 +450,10 @@ export class PartialSequenceLengths {
438
450
  return combinedPartialLengths;
439
451
  }
440
452
 
441
- private static getOverlapClients(overlapClientIds: number[], seglen: number) {
453
+ private static getOverlapClients(
454
+ overlapClientIds: number[],
455
+ seglen: number,
456
+ ): RedBlackTree<number, IOverlapClient> {
442
457
  const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);
443
458
  for (const clientId of overlapClientIds) {
444
459
  bst.put(clientId, { clientId, seglen });
@@ -450,14 +465,14 @@ export class PartialSequenceLengths {
450
465
  partialLength: PartialSequenceLength,
451
466
  overlapRemoveClientIds: number[],
452
467
  seglen: number,
453
- ) {
468
+ ): void {
454
469
  if (partialLength.overlapRemoveClients) {
455
470
  for (const clientId of overlapRemoveClientIds) {
456
471
  const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);
457
- if (!overlapClientNode) {
458
- partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });
459
- } else {
472
+ if (overlapClientNode) {
460
473
  overlapClientNode.data.seglen += seglen;
474
+ } else {
475
+ partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });
461
476
  }
462
477
  }
463
478
  } else {
@@ -472,14 +487,14 @@ export class PartialSequenceLengths {
472
487
  partialLength: PartialSequenceLength,
473
488
  overlapMoveClientIds: number[],
474
489
  seglen: number,
475
- ) {
490
+ ): void {
476
491
  if (partialLength.overlapObliterateClients) {
477
492
  for (const clientId of overlapMoveClientIds) {
478
493
  const overlapClientNode = partialLength.overlapObliterateClients.get(clientId);
479
- if (!overlapClientNode) {
480
- partialLength.overlapObliterateClients.put(clientId, { clientId, seglen });
481
- } else {
494
+ if (overlapClientNode) {
482
495
  overlapClientNode.data.seglen += seglen;
496
+ } else {
497
+ partialLength.overlapObliterateClients.put(clientId, { clientId, seglen });
483
498
  }
484
499
  }
485
500
  } else {
@@ -504,7 +519,7 @@ export class PartialSequenceLengths {
504
519
  segment: ISegment,
505
520
  firstGte: PartialSequenceLength,
506
521
  clientIds: number[],
507
- ) {
522
+ ): void {
508
523
  const nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);
509
524
 
510
525
  PartialSequenceLengths.accumulateMoveClientOverlap(
@@ -527,6 +542,8 @@ export class PartialSequenceLengths {
527
542
  }
528
543
 
529
544
  /**
545
+ * Tracks which clients have made concurrent obliterates.
546
+ *
530
547
  * @param obliterateOverlapLen - Length of segment with overlap
531
548
  * @param clientIds - Ids of clients that have concurrently obliterated this
532
549
  * segment
@@ -562,7 +579,7 @@ export class PartialSequenceLengths {
562
579
  clientId: number,
563
580
  removeClientOverlap: number[] | undefined,
564
581
  moveClientOverlap: number[] | undefined,
565
- ) {
582
+ ): void {
566
583
  const firstGte = partials.firstGte(seq);
567
584
 
568
585
  let partialLengthEntry: PartialSequenceLength;
@@ -636,7 +653,7 @@ export class PartialSequenceLengths {
636
653
  segment: ISegment,
637
654
  removalInfo?: IRemovalInfo,
638
655
  moveInfo?: IMoveInfo,
639
- ) {
656
+ ): void {
640
657
  const removalIsLocal =
641
658
  !!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;
642
659
  const moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;
@@ -670,13 +687,17 @@ export class PartialSequenceLengths {
670
687
  segmentLen = -segmentLen;
671
688
  // The client who performed the remove is always stored
672
689
  // in the first position of removalInfo.
673
- clientId = removalInfo.removedClientIds[0];
690
+ // TODO Non null asserting, why is this not null?
691
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
692
+ clientId = removalInfo.removedClientIds[0]!;
674
693
  const hasOverlap = removalInfo.removedClientIds.length > 1;
675
694
  removeClientOverlap = hasOverlap ? removalInfo.removedClientIds : undefined;
676
695
  } else if (moveInfo) {
677
696
  // The client who performed the move is always stored
678
697
  // in the first position of moveInfo.
679
- clientId = moveInfo.movedClientIds[0];
698
+ // TODO Non null asserting, why is this not null?
699
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
700
+ clientId = moveInfo.movedClientIds[0]!;
680
701
 
681
702
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
682
703
  seqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;
@@ -712,7 +733,9 @@ export class PartialSequenceLengths {
712
733
  if (moveInfo && removalInfo && removeHappenedFirst && !moveIsLocal) {
713
734
  // The client who performed the remove is always stored
714
735
  // in the first position of removalInfo.
715
- const moveClientId = moveInfo.movedClientIds[0];
736
+ // TODO Non null asserting, why is this not null?
737
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
738
+ const moveClientId = moveInfo.movedClientIds[0]!;
716
739
  const hasOverlap = moveInfo.movedClientIds.length > 1;
717
740
 
718
741
  PartialSequenceLengths.updatePartialsAfterInsertion(
@@ -735,7 +758,9 @@ export class PartialSequenceLengths {
735
758
  : removalInfo.removedSeq;
736
759
  // The client who performed the remove is always stored
737
760
  // in the first position of removalInfo.
738
- const removeClientId = removalInfo.removedClientIds[0];
761
+ // TODO Non null asserting, why is this not null?
762
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
763
+ const removeClientId = removalInfo.removedClientIds[0]!;
739
764
  const hasOverlap = removalInfo.removedClientIds.length > 1;
740
765
 
741
766
  PartialSequenceLengths.updatePartialsAfterInsertion(
@@ -781,7 +806,11 @@ export class PartialSequenceLengths {
781
806
  localIndexFirstGTE < unsequencedRecords.overlappingRemoves.length;
782
807
  localIndexFirstGTE++
783
808
  ) {
784
- if (unsequencedRecords.overlappingRemoves[localIndexFirstGTE].seq >= seqOrLocalSeq) {
809
+ if (
810
+ // TODO Non null asserting, why is this not null?
811
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
812
+ unsequencedRecords.overlappingRemoves[localIndexFirstGTE]!.seq >= seqOrLocalSeq
813
+ ) {
785
814
  break;
786
815
  }
787
816
  }
@@ -807,7 +836,7 @@ export class PartialSequenceLengths {
807
836
  seqSeglen: number,
808
837
  remoteObliteratedLen?: number,
809
838
  clientId?: number,
810
- ) {
839
+ ): void {
811
840
  let seqPartialLen: PartialSequenceLength | undefined;
812
841
  let penultPartialLen: PartialSequenceLength | undefined;
813
842
  let pLen = partialLengths.latestLeq(seq);
@@ -822,7 +851,7 @@ export class PartialSequenceLengths {
822
851
  penultPartialLen = pLen;
823
852
  }
824
853
  }
825
- const len = penultPartialLen !== undefined ? penultPartialLen.len + seqSeglen : seqSeglen;
854
+ const len = penultPartialLen === undefined ? seqSeglen : penultPartialLen.len + seqSeglen;
826
855
  if (seqPartialLen === undefined) {
827
856
  seqPartialLen = {
828
857
  clientId,
@@ -903,25 +932,16 @@ export class PartialSequenceLengths {
903
932
  clientId: number,
904
933
  // eslint-disable-next-line import/no-deprecated
905
934
  collabWindow: CollaborationWindow,
906
- ) {
935
+ ): void {
907
936
  let seqSeglen = 0;
908
937
  let remoteObliteratedLen = 0;
909
938
  let segCount = 0;
910
939
  // Compute length for seq across children
911
940
  for (let i = 0; i < node.childCount; i++) {
912
- const child = node.children[i];
913
- if (!child.isLeaf()) {
914
- const childBlock = child;
915
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
916
- const branchPartialLengths = childBlock.partialLengths!;
917
- const partialLengths = branchPartialLengths.partialLengths;
918
- const leqPartial = partialLengths.latestLeq(seq);
919
- if (leqPartial && leqPartial.seq === seq) {
920
- seqSeglen += leqPartial.seglen;
921
- remoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;
922
- }
923
- segCount += branchPartialLengths.segmentCount;
924
- } else {
941
+ // TODO Non null asserting, why is this not null?
942
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
943
+ const child = node.children[i]!;
944
+ if (child.isLeaf()) {
925
945
  const segment = child;
926
946
  const removalInfo = toRemovalInfo(segment);
927
947
  const moveInfo = toMoveInfo(segment);
@@ -978,6 +998,17 @@ export class PartialSequenceLengths {
978
998
  }
979
999
  }
980
1000
  segCount++;
1001
+ } else {
1002
+ const childBlock = child;
1003
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1004
+ const branchPartialLengths = childBlock.partialLengths!;
1005
+ const partialLengths = branchPartialLengths.partialLengths;
1006
+ const leqPartial = partialLengths.latestLeq(seq);
1007
+ if (leqPartial && leqPartial.seq === seq) {
1008
+ seqSeglen += leqPartial.seglen;
1009
+ remoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;
1010
+ }
1011
+ segCount += branchPartialLengths.segmentCount;
981
1012
  }
982
1013
  }
983
1014
  this.segmentCount = segCount;
@@ -992,7 +1023,9 @@ export class PartialSequenceLengths {
992
1023
  );
993
1024
  this.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();
994
1025
  PartialSequenceLengths.addSeq(
995
- this.clientSeqNumbers[clientId],
1026
+ // TODO Non null asserting, why is this not null?
1027
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1028
+ this.clientSeqNumbers[clientId]!,
996
1029
  seq,
997
1030
  seqSeglen + remoteObliteratedLen,
998
1031
  undefined,
@@ -1015,15 +1048,19 @@ export class PartialSequenceLengths {
1015
1048
  * Note: the local case (where `localSeq !== undefined`) is only supported on a PartialSequenceLength object
1016
1049
  * constructed with `computeLocalPartials` set to true and not subsequently updated with `update`.
1017
1050
  */
1018
- public getPartialLength(refSeq: number, clientId: number, localSeq?: number) {
1051
+ public getPartialLength(refSeq: number, clientId: number, localSeq?: number): number {
1019
1052
  let pLen = this.minLength;
1020
1053
  const cliLatestIndex = this.cliLatest(clientId);
1021
- const cliSeq = this.clientSeqNumbers[clientId];
1054
+ // TODO Non null asserting, why is this not null?
1055
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1056
+ const cliSeq = this.clientSeqNumbers[clientId]!;
1022
1057
  pLen += this.partialLengths.latestLeq(refSeq)?.len ?? 0;
1023
1058
 
1024
1059
  if (localSeq === undefined) {
1025
1060
  if (cliLatestIndex >= 0) {
1026
- const cliLatest = cliSeq.items[cliLatestIndex];
1061
+ // TODO Non null asserting, why is this not null?
1062
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1063
+ const cliLatest = cliSeq.items[cliLatestIndex]!;
1027
1064
  if (cliLatest.seq > refSeq) {
1028
1065
  // The client has local edits after refSeq, add in the length adjustments
1029
1066
  pLen += cliLatest.len;
@@ -1103,19 +1140,21 @@ export class PartialSequenceLengths {
1103
1140
  return overlap?.len ?? 0;
1104
1141
  }
1105
1142
 
1106
- public toString(glc?: (id: number) => string, indentCount = 0) {
1143
+ public toString(glc?: (id: number) => string, indentCount = 0): string {
1107
1144
  let buf = "";
1108
1145
  for (const partial of this.partialLengths.items) {
1109
1146
  buf += `(${partial.seq},${partial.len}) `;
1110
1147
  }
1111
1148
 
1112
- // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax
1149
+ // TODO Non null asserting, why is this not null?
1150
+ // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax, guard-for-in
1113
1151
  for (const clientId in this.clientSeqNumbers) {
1114
- if (this.clientSeqNumbers[clientId].size > 0) {
1152
+ const seqNumber = this.clientSeqNumbers[clientId];
1153
+ if (seqNumber !== undefined && seqNumber.size > 0) {
1115
1154
  buf += `Client `;
1116
1155
  buf += glc ? `${glc(+clientId)}` : `${clientId}`;
1117
1156
  buf += "[";
1118
- for (const partial of this.clientSeqNumbers[clientId].items) {
1157
+ for (const partial of seqNumber.items) {
1119
1158
  buf += `(${partial.seq},${partial.len})`;
1120
1159
  }
1121
1160
  buf += "]";
@@ -1127,7 +1166,7 @@ export class PartialSequenceLengths {
1127
1166
 
1128
1167
  // Clear away partial sums for sequence numbers earlier than the current window
1129
1168
  // eslint-disable-next-line import/no-deprecated
1130
- private zamboni(segmentWindow: CollaborationWindow) {
1169
+ private zamboni(segmentWindow: CollaborationWindow): void {
1131
1170
  this.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);
1132
1171
  this.minSeq = segmentWindow.minSeq;
1133
1172
  // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax
@@ -1139,14 +1178,16 @@ export class PartialSequenceLengths {
1139
1178
  }
1140
1179
  }
1141
1180
 
1142
- private addClientSeqNumber(clientId: number, seq: number, seglen: number) {
1181
+ private addClientSeqNumber(clientId: number, seq: number, seglen: number): void {
1143
1182
  this.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();
1144
- const cli = this.clientSeqNumbers[clientId];
1183
+ // TODO Non null asserting, why is this not null?
1184
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1185
+ const cli = this.clientSeqNumbers[clientId]!;
1145
1186
  cli.addOrUpdate({ seq, len: 0, seglen });
1146
1187
  }
1147
1188
 
1148
1189
  // Assumes sequence number already coalesced and that this is called in increasing `seq` order.
1149
- private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {
1190
+ private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength): void {
1150
1191
  const seglen = partialLength.seglen + (partialLength.remoteObliteratedLen ?? 0);
1151
1192
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1152
1193
  this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, seglen);
@@ -1174,7 +1215,7 @@ export class PartialSequenceLengths {
1174
1215
  return this.clientSeqNumbers[clientId]?.latestLeq(refSeq);
1175
1216
  }
1176
1217
 
1177
- private cliLatest(clientId: number) {
1218
+ private cliLatest(clientId: number): number {
1178
1219
  const cliSeqs = this.clientSeqNumbers[clientId];
1179
1220
  return cliSeqs && cliSeqs.size > 0 ? cliSeqs.size - 1 : -1;
1180
1221
  }
@@ -1268,7 +1309,7 @@ export function verifyExpectedPartialLengths(
1268
1309
  refSeq: number,
1269
1310
  clientId: number,
1270
1311
  localSeq?: number,
1271
- ) {
1312
+ ): void {
1272
1313
  if (
1273
1314
  (!mergeTree.collabWindow.collaborating || mergeTree.collabWindow.clientId === clientId) &&
1274
1315
  (node.isLeaf() || localSeq === undefined)
@@ -1301,7 +1342,7 @@ export function verifyExpectedPartialLengths(
1301
1342
  }
1302
1343
  }
1303
1344
 
1304
- export function verifyPartialLengths(partialSeqLengths: PartialSequenceLengths) {
1345
+ export function verifyPartialLengths(partialSeqLengths: PartialSequenceLengths): void {
1305
1346
  if (partialSeqLengths["clientSeqNumbers"]) {
1306
1347
  for (const cliSeq of partialSeqLengths["clientSeqNumbers"]) {
1307
1348
  if (cliSeq) {
@@ -1343,6 +1384,27 @@ function cloneOverlapRemoveClients(
1343
1384
  return newTree;
1344
1385
  }
1345
1386
 
1387
+ function combineForOverlapClients(
1388
+ treeA: RedBlackTree<number, IOverlapClient> | undefined,
1389
+ treeB: RedBlackTree<number, IOverlapClient> | undefined,
1390
+ ): RedBlackTree<number, IOverlapClient> | undefined {
1391
+ if (treeA) {
1392
+ if (treeB) {
1393
+ treeB.map((bProp: Property<number, IOverlapClient>) => {
1394
+ const aProp = treeA.get(bProp.key);
1395
+ if (aProp) {
1396
+ aProp.data.seglen += bProp.data.seglen;
1397
+ } else {
1398
+ treeA.put(bProp.data.clientId, { ...bProp.data });
1399
+ }
1400
+ return true;
1401
+ });
1402
+ }
1403
+ } else {
1404
+ return cloneOverlapRemoveClients(treeB);
1405
+ }
1406
+ }
1407
+
1346
1408
  /**
1347
1409
  * Combines the `overlapRemoveClients` and `overlapObliterateClients` fields of
1348
1410
  * two `PartialSequenceLength` objects, modifying the first PartialSequenceLength's
@@ -1350,34 +1412,19 @@ function cloneOverlapRemoveClients(
1350
1412
  *
1351
1413
  * Combination is performed additively on `seglen` on a per-client basis.
1352
1414
  */
1353
- export function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {
1354
- function combine(
1355
- treeA: RedBlackTree<number, IOverlapClient> | undefined,
1356
- treeB: RedBlackTree<number, IOverlapClient> | undefined,
1357
- ): RedBlackTree<number, IOverlapClient> | undefined {
1358
- if (treeA) {
1359
- if (treeB) {
1360
- treeB.map((bProp: Property<number, IOverlapClient>) => {
1361
- const aProp = treeA.get(bProp.key);
1362
- if (aProp) {
1363
- aProp.data.seglen += bProp.data.seglen;
1364
- } else {
1365
- treeA.put(bProp.data.clientId, { ...bProp.data });
1366
- }
1367
- return true;
1368
- });
1369
- }
1370
- } else {
1371
- return cloneOverlapRemoveClients(treeB);
1372
- }
1373
- }
1374
-
1375
- const overlapRemoveClients = combine(a.overlapRemoveClients, b.overlapRemoveClients);
1415
+ export function combineOverlapClients(
1416
+ a: PartialSequenceLength,
1417
+ b: PartialSequenceLength,
1418
+ ): void {
1419
+ const overlapRemoveClients = combineForOverlapClients(
1420
+ a.overlapRemoveClients,
1421
+ b.overlapRemoveClients,
1422
+ );
1376
1423
  if (overlapRemoveClients) {
1377
1424
  a.overlapRemoveClients = overlapRemoveClients;
1378
1425
  }
1379
1426
 
1380
- const overlapObliterateClients = combine(
1427
+ const overlapObliterateClients = combineForOverlapClients(
1381
1428
  a.overlapObliterateClients,
1382
1429
  b.overlapObliterateClients,
1383
1430
  );
@@ -1433,7 +1480,7 @@ function mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): I
1433
1480
  private readonly nextSmallestIndex: number[];
1434
1481
 
1435
1482
  constructor(private readonly sublists: T[][]) {
1436
- this.nextSmallestIndex = new Array(sublists.length);
1483
+ this.nextSmallestIndex = Array.from({ length: sublists.length });
1437
1484
  for (let i = 0; i < sublists.length; i++) {
1438
1485
  this.nextSmallestIndex[i] = 0;
1439
1486
  }
@@ -1444,9 +1491,16 @@ function mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): I
1444
1491
  let currentMin: T | undefined;
1445
1492
  let currentMinIndex: number | undefined;
1446
1493
  for (let i = 0; i < len; i++) {
1447
- const candidateIndex = this.nextSmallestIndex[i];
1448
- if (candidateIndex < this.sublists[i].length) {
1449
- const candidate = this.sublists[i][candidateIndex];
1494
+ // TODO Non null asserting, why is this not null?
1495
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1496
+ const candidateIndex = this.nextSmallestIndex[i]!;
1497
+ // TODO Non null asserting, why is this not null?
1498
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1499
+ const list = this.sublists[i]!;
1500
+ if (candidateIndex < list.length) {
1501
+ // TODO Non null asserting, why is this not null?
1502
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1503
+ const candidate = list[candidateIndex]!;
1450
1504
  if (!currentMin || candidate.seq < currentMin.seq) {
1451
1505
  currentMin = candidate;
1452
1506
  currentMinIndex = i;
@@ -1470,7 +1524,9 @@ function mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): I
1470
1524
  function insertIntoList<T>(list: T[], index: number, elem: T): void {
1471
1525
  if (index < list.length) {
1472
1526
  for (let k = list.length; k > index; k--) {
1473
- list[k] = list[k - 1];
1527
+ // TODO Non null asserting, why is this not null?
1528
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1529
+ list[k] = list[k - 1]!;
1474
1530
  }
1475
1531
  list[index] = elem;
1476
1532
  } else {
@@ -49,7 +49,7 @@ export class PerspectiveImpl implements Perspective {
49
49
  */
50
50
  public nextSegment(segment: ISegment, forward: boolean = true): ISegment {
51
51
  let next: ISegment | undefined;
52
- const action = (seg: ISegment) => {
52
+ const action = (seg: ISegment): boolean | undefined => {
53
53
  if (isSegmentPresent(seg, this._seqTime)) {
54
54
  next = seg;
55
55
  return LeafAction.Exit;
@@ -60,6 +60,7 @@ export class PerspectiveImpl implements Perspective {
60
60
  }
61
61
 
62
62
  /**
63
+ * Finds the segment prior to the given segment.
63
64
  * @param segment - The segment to start from.
64
65
  * @returns the previous segment, or the start of the tree if there is no previous segment.
65
66
  * @remarks This is a convenient equivalent to calling `nextSegment(segment, false)`.
@@ -70,6 +71,7 @@ export class PerspectiveImpl implements Perspective {
70
71
  }
71
72
 
72
73
  /**
74
+ * Determines if the given segment was removed before the given perspective.
73
75
  * @param seg - The segment to check.
74
76
  * @param seq - The latest sequence number to consider.
75
77
  * @param localSeq - The latest local sequence number to consider.
@@ -87,6 +89,7 @@ export function wasRemovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime):
87
89
  }
88
90
 
89
91
  /**
92
+ * Determines if the given segment was moved before the given perspective.
90
93
  * @param seg - The segment to check.
91
94
  * @param refSeq - The latest sequence number to consider.
92
95
  * @param localSeq - The latest local sequence number to consider.
@@ -111,7 +114,7 @@ export function wasRemovedOrMovedBefore(seg: ISegment, seqTime: SeqTime): boolea
111
114
  }
112
115
 
113
116
  /**
114
- *
117
+ * Determines if the given segment is present in the given perspective.
115
118
  * @param seg - The segment to check.
116
119
  * @param seqTime - The latest sequence number and local sequence number to consider.
117
120
  * @returns true iff this segment was inserted before the given perspective,
@@ -126,13 +129,13 @@ export function isSegmentPresent(seg: ISegment, seqTime: SeqTime): boolean {
126
129
  if (!seqLTE(seg.seq, refSeq)) {
127
130
  return false;
128
131
  }
129
- } else if (seg.localSeq !== undefined) {
130
- // seg.seq === UnassignedSequenceNumber
132
+ } else if (
133
+ seg.localSeq !== undefined && // seg.seq === UnassignedSequenceNumber
131
134
  // If the current perspective does not include local sequence numbers,
132
135
  // then this segment does not exist yet.
133
- if (localSeq === undefined || seg.localSeq > localSeq) {
134
- return false;
135
- }
136
+ (localSeq === undefined || seg.localSeq > localSeq)
137
+ ) {
138
+ return false;
136
139
  }
137
140
  }
138
141
  if (wasRemovedOrMovedBefore(seg, seqTime)) {