@fluidframework/merge-tree 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.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 (770) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +4 -0
  4. package/api-extractor-cjs.json +8 -0
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -9
  7. package/api-report/merge-tree.api.md +6 -12
  8. package/dist/MergeTreeTextHelper.d.ts +2 -2
  9. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  10. package/dist/MergeTreeTextHelper.js +3 -3
  11. package/dist/MergeTreeTextHelper.js.map +1 -1
  12. package/dist/attributionCollection.d.ts +1 -1
  13. package/dist/attributionCollection.d.ts.map +1 -1
  14. package/dist/attributionCollection.js.map +1 -1
  15. package/dist/attributionPolicy.d.ts +1 -1
  16. package/dist/attributionPolicy.d.ts.map +1 -1
  17. package/dist/attributionPolicy.js +15 -15
  18. package/dist/attributionPolicy.js.map +1 -1
  19. package/dist/client.d.ts +31 -12
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +103 -92
  22. package/dist/client.js.map +1 -1
  23. package/dist/collections/index.d.ts +2 -2
  24. package/dist/collections/index.d.ts.map +1 -1
  25. package/dist/collections/index.js +6 -6
  26. package/dist/collections/index.js.map +1 -1
  27. package/dist/endOfTreeSegment.d.ts +3 -3
  28. package/dist/endOfTreeSegment.d.ts.map +1 -1
  29. package/dist/endOfTreeSegment.js +8 -8
  30. package/dist/endOfTreeSegment.js.map +1 -1
  31. package/dist/index.d.ts +20 -20
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +71 -71
  34. package/dist/index.js.map +1 -1
  35. package/dist/localReference.d.ts +9 -39
  36. package/dist/localReference.d.ts.map +1 -1
  37. package/dist/localReference.js +29 -24
  38. package/dist/localReference.js.map +1 -1
  39. package/dist/merge-tree-alpha.d.ts +28 -450
  40. package/dist/merge-tree-beta.d.ts +0 -438
  41. package/dist/merge-tree-public.d.ts +0 -438
  42. package/dist/merge-tree-untrimmed.d.ts +28 -787
  43. package/dist/mergeTree.d.ts +11 -19
  44. package/dist/mergeTree.d.ts.map +1 -1
  45. package/dist/mergeTree.js +201 -189
  46. package/dist/mergeTree.js.map +1 -1
  47. package/dist/mergeTreeDeltaCallback.d.ts +3 -7
  48. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  49. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  50. package/dist/mergeTreeNodeWalk.d.ts +1 -1
  51. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  52. package/dist/mergeTreeNodeWalk.js.map +1 -1
  53. package/dist/mergeTreeNodes.d.ts +17 -14
  54. package/dist/mergeTreeNodes.d.ts.map +1 -1
  55. package/dist/mergeTreeNodes.js +32 -32
  56. package/dist/mergeTreeNodes.js.map +1 -1
  57. package/dist/mergeTreeTracking.d.ts +2 -2
  58. package/dist/mergeTreeTracking.d.ts.map +1 -1
  59. package/dist/mergeTreeTracking.js +2 -2
  60. package/dist/mergeTreeTracking.js.map +1 -1
  61. package/dist/opBuilder.d.ts +3 -3
  62. package/dist/opBuilder.d.ts.map +1 -1
  63. package/dist/opBuilder.js +7 -7
  64. package/dist/opBuilder.js.map +1 -1
  65. package/dist/package.json +3 -0
  66. package/dist/partialLengths.d.ts +5 -5
  67. package/dist/partialLengths.d.ts.map +1 -1
  68. package/dist/partialLengths.js +29 -29
  69. package/dist/partialLengths.js.map +1 -1
  70. package/dist/referencePositions.d.ts +4 -4
  71. package/dist/referencePositions.d.ts.map +1 -1
  72. package/dist/referencePositions.js +2 -2
  73. package/dist/referencePositions.js.map +1 -1
  74. package/dist/revertibles.d.ts +7 -7
  75. package/dist/revertibles.d.ts.map +1 -1
  76. package/dist/revertibles.js +39 -39
  77. package/dist/revertibles.js.map +1 -1
  78. package/dist/segmentGroupCollection.d.ts +1 -1
  79. package/dist/segmentGroupCollection.d.ts.map +1 -1
  80. package/dist/segmentGroupCollection.js +3 -3
  81. package/dist/segmentGroupCollection.js.map +1 -1
  82. package/dist/segmentPropertiesManager.d.ts +2 -2
  83. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  84. package/dist/segmentPropertiesManager.js +8 -8
  85. package/dist/segmentPropertiesManager.js.map +1 -1
  86. package/dist/snapshotChunks.d.ts +3 -3
  87. package/dist/snapshotChunks.d.ts.map +1 -1
  88. package/dist/snapshotChunks.js +5 -5
  89. package/dist/snapshotChunks.js.map +1 -1
  90. package/dist/snapshotLoader.d.ts +3 -3
  91. package/dist/snapshotLoader.d.ts.map +1 -1
  92. package/dist/snapshotLoader.js +19 -19
  93. package/dist/snapshotLoader.js.map +1 -1
  94. package/dist/snapshotV1.d.ts +3 -3
  95. package/dist/snapshotV1.d.ts.map +1 -1
  96. package/dist/snapshotV1.js +35 -18
  97. package/dist/snapshotV1.js.map +1 -1
  98. package/dist/snapshotlegacy.d.ts +2 -2
  99. package/dist/snapshotlegacy.d.ts.map +1 -1
  100. package/dist/snapshotlegacy.js +22 -10
  101. package/dist/snapshotlegacy.js.map +1 -1
  102. package/dist/sortedSegmentSet.d.ts +3 -3
  103. package/dist/sortedSegmentSet.d.ts.map +1 -1
  104. package/dist/sortedSegmentSet.js +7 -5
  105. package/dist/sortedSegmentSet.js.map +1 -1
  106. package/dist/test/Insertion.perf.spec.js +15 -15
  107. package/dist/test/Insertion.perf.spec.js.map +1 -1
  108. package/dist/test/PartialLengths.perf.spec.js +13 -13
  109. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  110. package/dist/test/Removal.perf.spec.js +25 -25
  111. package/dist/test/Removal.perf.spec.js.map +1 -1
  112. package/dist/test/Snapshot.perf.spec.js +3 -3
  113. package/dist/test/Snapshot.perf.spec.js.map +1 -1
  114. package/dist/test/attributionCollection.perf.spec.js +9 -9
  115. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  116. package/dist/test/attributionCollection.spec.js +46 -46
  117. package/dist/test/attributionCollection.spec.js.map +1 -1
  118. package/dist/test/attributionPolicy.spec.js +13 -13
  119. package/dist/test/attributionPolicy.spec.js.map +1 -1
  120. package/dist/test/{beastTest.d.ts → beastTest.spec.d.ts} +3 -3
  121. package/dist/test/beastTest.spec.d.ts.map +1 -0
  122. package/dist/test/{beastTest.js → beastTest.spec.js} +120 -119
  123. package/dist/test/beastTest.spec.js.map +1 -0
  124. package/dist/test/client.annotateMarker.spec.js +13 -13
  125. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  126. package/dist/test/{client.apis.d.ts → client.apis.spec.d.ts} +1 -1
  127. package/dist/test/client.apis.spec.d.ts.map +1 -0
  128. package/dist/test/{client.apis.js → client.apis.spec.js} +8 -8
  129. package/dist/test/client.apis.spec.js.map +1 -0
  130. package/dist/test/client.applyMsg.spec.js +106 -43
  131. package/dist/test/client.applyMsg.spec.js.map +1 -1
  132. package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  133. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  134. package/dist/test/client.applyStashedOpFarm.spec.js +33 -21
  135. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  136. package/dist/test/client.attributionFarm.spec.d.ts +1 -1
  137. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  138. package/dist/test/client.attributionFarm.spec.js +13 -13
  139. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  140. package/dist/test/client.conflictFarm.spec.d.ts +1 -1
  141. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  142. package/dist/test/client.conflictFarm.spec.js +9 -9
  143. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  144. package/dist/test/client.getPosition.spec.js +4 -4
  145. package/dist/test/client.getPosition.spec.js.map +1 -1
  146. package/dist/test/client.localReference.spec.js +140 -109
  147. package/dist/test/client.localReference.spec.js.map +1 -1
  148. package/dist/test/client.localReferenceFarm.spec.js +18 -18
  149. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  150. package/dist/test/client.rebasePosition.spec.js +2 -2
  151. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  152. package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
  153. package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
  154. package/dist/test/client.reconnectFarm.spec.js +10 -10
  155. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  156. package/dist/test/client.replay.spec.js +11 -11
  157. package/dist/test/client.replay.spec.js.map +1 -1
  158. package/dist/test/client.rollback.spec.js +83 -83
  159. package/dist/test/client.rollback.spec.js.map +1 -1
  160. package/dist/test/client.rollbackFarm.spec.js +9 -9
  161. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  162. package/dist/test/client.searchForMarker.spec.js +137 -137
  163. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  164. package/dist/test/client.walkSegments.spec.js +2 -2
  165. package/dist/test/client.walkSegments.spec.js.map +1 -1
  166. package/dist/test/collections.list.spec.js +4 -4
  167. package/dist/test/collections.list.spec.js.map +1 -1
  168. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +4 -4
  169. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
  170. package/dist/test/dirname.cjs +16 -0
  171. package/dist/test/dirname.cjs.map +1 -0
  172. package/dist/test/dirname.d.cts +6 -0
  173. package/dist/test/dirname.d.cts.map +1 -0
  174. package/dist/test/index.d.ts +8 -8
  175. package/dist/test/index.d.ts.map +1 -1
  176. package/dist/test/index.js +82 -81
  177. package/dist/test/index.js.map +1 -1
  178. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +39 -39
  179. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  180. package/dist/test/mergeTree.annotate.spec.js +39 -39
  181. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  182. package/dist/test/mergeTree.insert.deltaCallback.spec.js +35 -35
  183. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  184. package/dist/test/mergeTree.insertingWalk.spec.js +77 -77
  185. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  186. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +42 -42
  187. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  188. package/dist/test/mergeTree.markRangeRemoved.spec.js +15 -15
  189. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  190. package/dist/test/mergeTree.walk.spec.js +14 -14
  191. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  192. package/dist/test/mergeTree.zamboni.spec.js +9 -9
  193. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  194. package/dist/test/mergeTreeOperationRunner.d.ts +4 -4
  195. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  196. package/dist/test/mergeTreeOperationRunner.js +16 -15
  197. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  198. package/dist/test/mergeTreeOperationRunner.spec.js +5 -5
  199. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  200. package/dist/test/obliterate.concurrent.spec.js +85 -88
  201. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  202. package/dist/test/obliterate.deltaCallback.spec.d.ts +6 -0
  203. package/dist/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
  204. package/dist/test/obliterate.deltaCallback.spec.js +146 -0
  205. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -0
  206. package/dist/test/obliterate.partialLength.spec.js +39 -44
  207. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  208. package/dist/test/obliterate.reconnect.spec.js +15 -18
  209. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  210. package/dist/test/obliterate.spec.js +16 -16
  211. package/dist/test/obliterate.spec.js.map +1 -1
  212. package/dist/test/ordinal.spec.js +5 -5
  213. package/dist/test/ordinal.spec.js.map +1 -1
  214. package/dist/test/partialLength.spec.js +58 -64
  215. package/dist/test/partialLength.spec.js.map +1 -1
  216. package/dist/test/properties.spec.js +15 -15
  217. package/dist/test/properties.spec.js.map +1 -1
  218. package/dist/test/reconnectHelper.d.ts +8 -8
  219. package/dist/test/reconnectHelper.d.ts.map +1 -1
  220. package/dist/test/reconnectHelper.js +3 -3
  221. package/dist/test/reconnectHelper.js.map +1 -1
  222. package/dist/test/resetPendingSegmentsToOp.spec.js +18 -18
  223. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  224. package/dist/test/revertibleFarm.spec.js +21 -21
  225. package/dist/test/revertibleFarm.spec.js.map +1 -1
  226. package/dist/test/revertibles.spec.js +67 -67
  227. package/dist/test/revertibles.spec.js.map +1 -1
  228. package/dist/test/segmentGroupCollection.spec.js +3 -3
  229. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  230. package/dist/test/snapshot.spec.js +16 -16
  231. package/dist/test/snapshot.spec.js.map +1 -1
  232. package/dist/test/snapshot.utils.d.ts +4 -4
  233. package/dist/test/snapshot.utils.d.ts.map +1 -1
  234. package/dist/test/snapshot.utils.js +11 -11
  235. package/dist/test/snapshot.utils.js.map +1 -1
  236. package/dist/test/snapshotlegacy.spec.js +22 -22
  237. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  238. package/dist/test/sortedSegmentSet.spec.js +9 -9
  239. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  240. package/dist/test/testClient.d.ts +13 -16
  241. package/dist/test/testClient.d.ts.map +1 -1
  242. package/dist/test/testClient.js +57 -59
  243. package/dist/test/testClient.js.map +1 -1
  244. package/dist/test/testClientLogger.d.ts +3 -3
  245. package/dist/test/testClientLogger.d.ts.map +1 -1
  246. package/dist/test/testClientLogger.js +19 -19
  247. package/dist/test/testClientLogger.js.map +1 -1
  248. package/dist/test/testServer.d.ts +3 -3
  249. package/dist/test/testServer.d.ts.map +1 -1
  250. package/dist/test/testServer.js +8 -8
  251. package/dist/test/testServer.js.map +1 -1
  252. package/dist/test/testUtils.d.ts +14 -6
  253. package/dist/test/testUtils.d.ts.map +1 -1
  254. package/dist/test/testUtils.js +36 -17
  255. package/dist/test/testUtils.js.map +1 -1
  256. package/dist/test/text.d.ts +2 -2
  257. package/dist/test/text.d.ts.map +1 -1
  258. package/dist/test/text.js +10 -10
  259. package/dist/test/text.js.map +1 -1
  260. package/dist/test/tracking.spec.js +12 -12
  261. package/dist/test/tracking.spec.js.map +1 -1
  262. package/dist/test/{wordUnitTests.d.ts → wordUnitTests.spec.d.ts} +1 -1
  263. package/dist/test/wordUnitTests.spec.d.ts.map +1 -0
  264. package/dist/test/{wordUnitTests.js → wordUnitTests.spec.js} +16 -15
  265. package/dist/test/wordUnitTests.spec.js.map +1 -0
  266. package/dist/textSegment.d.ts +3 -3
  267. package/dist/textSegment.d.ts.map +1 -1
  268. package/dist/textSegment.js +2 -2
  269. package/dist/textSegment.js.map +1 -1
  270. package/dist/tsdoc-metadata.json +1 -1
  271. package/dist/zamboni.d.ts +2 -2
  272. package/dist/zamboni.d.ts.map +1 -1
  273. package/dist/zamboni.js +19 -19
  274. package/dist/zamboni.js.map +1 -1
  275. package/lib/{MergeTreeTextHelper.d.mts → MergeTreeTextHelper.d.ts} +3 -3
  276. package/lib/MergeTreeTextHelper.d.ts.map +1 -0
  277. package/lib/{MergeTreeTextHelper.mjs → MergeTreeTextHelper.js} +3 -2
  278. package/lib/MergeTreeTextHelper.js.map +1 -0
  279. package/lib/{attributionCollection.d.mts → attributionCollection.d.ts} +2 -2
  280. package/lib/attributionCollection.d.ts.map +1 -0
  281. package/lib/{attributionCollection.mjs → attributionCollection.js} +1 -1
  282. package/lib/attributionCollection.js.map +1 -0
  283. package/lib/{attributionPolicy.d.mts → attributionPolicy.d.ts} +2 -2
  284. package/lib/attributionPolicy.d.ts.map +1 -0
  285. package/lib/{attributionPolicy.mjs → attributionPolicy.js} +4 -4
  286. package/lib/attributionPolicy.js.map +1 -0
  287. package/lib/{client.d.mts → client.d.ts} +32 -13
  288. package/lib/client.d.ts.map +1 -0
  289. package/lib/{client.mjs → client.js} +42 -31
  290. package/lib/client.js.map +1 -0
  291. package/lib/collections/{index.d.mts → index.d.ts} +3 -3
  292. package/lib/collections/index.d.ts.map +1 -0
  293. package/lib/collections/index.js +7 -0
  294. package/lib/collections/index.js.map +1 -0
  295. package/lib/collections/{list.d.mts → list.d.ts} +1 -1
  296. package/lib/collections/list.d.ts.map +1 -0
  297. package/lib/collections/{list.mjs → list.js} +1 -1
  298. package/lib/collections/list.js.map +1 -0
  299. package/lib/collections/{rbTree.d.mts → rbTree.d.ts} +1 -1
  300. package/lib/collections/rbTree.d.ts.map +1 -0
  301. package/lib/collections/{rbTree.mjs → rbTree.js} +1 -1
  302. package/lib/collections/rbTree.js.map +1 -0
  303. package/lib/{constants.d.mts → constants.d.ts} +1 -1
  304. package/lib/constants.d.ts.map +1 -0
  305. package/lib/{constants.mjs → constants.js} +1 -1
  306. package/lib/constants.js.map +1 -0
  307. package/lib/{endOfTreeSegment.d.mts → endOfTreeSegment.d.ts} +4 -4
  308. package/lib/endOfTreeSegment.d.ts.map +1 -0
  309. package/lib/{endOfTreeSegment.mjs → endOfTreeSegment.js} +3 -3
  310. package/lib/endOfTreeSegment.js.map +1 -0
  311. package/lib/{index.d.mts → index.d.ts} +21 -21
  312. package/lib/index.d.ts.map +1 -0
  313. package/lib/{index.mjs → index.js} +20 -20
  314. package/lib/index.js.map +1 -0
  315. package/lib/{localReference.d.mts → localReference.d.ts} +10 -40
  316. package/lib/localReference.d.ts.map +1 -0
  317. package/lib/{localReference.mjs → localReference.js} +12 -6
  318. package/lib/localReference.js.map +1 -0
  319. package/lib/{merge-tree-alpha.d.mts → merge-tree-alpha.d.ts} +28 -450
  320. package/lib/merge-tree-beta.d.ts +230 -0
  321. package/lib/merge-tree-public.d.ts +230 -0
  322. package/lib/{merge-tree-untrimmed.d.mts → merge-tree-untrimmed.d.ts} +28 -787
  323. package/lib/{mergeTree.d.mts → mergeTree.d.ts} +12 -20
  324. package/lib/mergeTree.d.ts.map +1 -0
  325. package/lib/{mergeTree.mjs → mergeTree.js} +47 -32
  326. package/lib/mergeTree.js.map +1 -0
  327. package/lib/{mergeTreeDeltaCallback.d.mts → mergeTreeDeltaCallback.d.ts} +8 -8
  328. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -0
  329. package/lib/{mergeTreeDeltaCallback.mjs → mergeTreeDeltaCallback.js} +1 -1
  330. package/lib/mergeTreeDeltaCallback.js.map +1 -0
  331. package/lib/{mergeTreeNodeWalk.d.mts → mergeTreeNodeWalk.d.ts} +2 -2
  332. package/lib/mergeTreeNodeWalk.d.ts.map +1 -0
  333. package/lib/{mergeTreeNodeWalk.mjs → mergeTreeNodeWalk.js} +1 -1
  334. package/lib/mergeTreeNodeWalk.js.map +1 -0
  335. package/lib/{mergeTreeNodes.d.mts → mergeTreeNodes.d.ts} +18 -15
  336. package/lib/mergeTreeNodes.d.ts.map +1 -0
  337. package/lib/{mergeTreeNodes.mjs → mergeTreeNodes.js} +12 -10
  338. package/lib/mergeTreeNodes.js.map +1 -0
  339. package/lib/{mergeTreeTracking.d.mts → mergeTreeTracking.d.ts} +3 -3
  340. package/lib/mergeTreeTracking.d.ts.map +1 -0
  341. package/lib/{mergeTreeTracking.mjs → mergeTreeTracking.js} +3 -2
  342. package/lib/mergeTreeTracking.js.map +1 -0
  343. package/lib/{opBuilder.d.mts → opBuilder.d.ts} +4 -4
  344. package/lib/{opBuilder.d.mts.map → opBuilder.d.ts.map} +1 -1
  345. package/lib/{opBuilder.mjs → opBuilder.js} +2 -2
  346. package/lib/opBuilder.js.map +1 -0
  347. package/lib/{ops.d.mts → ops.d.ts} +1 -1
  348. package/lib/ops.d.ts.map +1 -0
  349. package/lib/{ops.mjs → ops.js} +1 -1
  350. package/lib/ops.js.map +1 -0
  351. package/lib/{ordinal.d.mts → ordinal.d.ts} +1 -1
  352. package/lib/ordinal.d.ts.map +1 -0
  353. package/lib/{ordinal.mjs → ordinal.js} +2 -1
  354. package/lib/ordinal.js.map +1 -0
  355. package/lib/{partialLengths.d.mts → partialLengths.d.ts} +6 -6
  356. package/lib/partialLengths.d.ts.map +1 -0
  357. package/lib/{partialLengths.mjs → partialLengths.js} +11 -10
  358. package/lib/partialLengths.js.map +1 -0
  359. package/lib/{properties.d.mts → properties.d.ts} +1 -1
  360. package/lib/properties.d.ts.map +1 -0
  361. package/lib/{properties.mjs → properties.js} +1 -1
  362. package/lib/properties.js.map +1 -0
  363. package/lib/{referencePositions.d.mts → referencePositions.d.ts} +5 -5
  364. package/lib/referencePositions.d.ts.map +1 -0
  365. package/lib/{referencePositions.mjs → referencePositions.js} +2 -2
  366. package/lib/referencePositions.js.map +1 -0
  367. package/lib/{revertibles.d.mts → revertibles.d.ts} +8 -8
  368. package/lib/revertibles.d.ts.map +1 -0
  369. package/lib/{revertibles.mjs → revertibles.js} +13 -13
  370. package/lib/revertibles.js.map +1 -0
  371. package/lib/{segmentGroupCollection.d.mts → segmentGroupCollection.d.ts} +2 -2
  372. package/lib/segmentGroupCollection.d.ts.map +1 -0
  373. package/lib/{segmentGroupCollection.mjs → segmentGroupCollection.js} +2 -2
  374. package/lib/segmentGroupCollection.js.map +1 -0
  375. package/lib/{segmentPropertiesManager.d.mts → segmentPropertiesManager.d.ts} +3 -3
  376. package/lib/segmentPropertiesManager.d.ts.map +1 -0
  377. package/lib/{segmentPropertiesManager.mjs → segmentPropertiesManager.js} +5 -3
  378. package/lib/segmentPropertiesManager.js.map +1 -0
  379. package/lib/{snapshotChunks.d.mts → snapshotChunks.d.ts} +4 -4
  380. package/lib/snapshotChunks.d.ts.map +1 -0
  381. package/lib/{snapshotChunks.mjs → snapshotChunks.js} +2 -2
  382. package/lib/snapshotChunks.js.map +1 -0
  383. package/lib/{snapshotLoader.d.mts → snapshotLoader.d.ts} +4 -4
  384. package/lib/snapshotLoader.d.ts.map +1 -0
  385. package/lib/{snapshotLoader.mjs → snapshotLoader.js} +10 -9
  386. package/lib/snapshotLoader.js.map +1 -0
  387. package/lib/{snapshotV1.d.mts → snapshotV1.d.ts} +4 -4
  388. package/lib/snapshotV1.d.ts.map +1 -0
  389. package/lib/{snapshotV1.mjs → snapshotV1.js} +24 -7
  390. package/lib/snapshotV1.js.map +1 -0
  391. package/lib/{snapshotlegacy.d.mts → snapshotlegacy.d.ts} +3 -3
  392. package/lib/snapshotlegacy.d.ts.map +1 -0
  393. package/lib/{snapshotlegacy.mjs → snapshotlegacy.js} +17 -4
  394. package/lib/snapshotlegacy.js.map +1 -0
  395. package/lib/{sortedSegmentSet.d.mts → sortedSegmentSet.d.ts} +4 -4
  396. package/lib/sortedSegmentSet.d.ts.map +1 -0
  397. package/lib/{sortedSegmentSet.mjs → sortedSegmentSet.js} +8 -5
  398. package/lib/sortedSegmentSet.js.map +1 -0
  399. package/lib/{sortedSet.d.mts → sortedSet.d.ts} +1 -1
  400. package/lib/sortedSet.d.ts.map +1 -0
  401. package/lib/{sortedSet.mjs → sortedSet.js} +1 -1
  402. package/lib/sortedSet.js.map +1 -0
  403. package/lib/test/Insertion.perf.spec.d.ts +6 -0
  404. package/lib/test/Insertion.perf.spec.d.ts.map +1 -0
  405. package/lib/test/Insertion.perf.spec.js +111 -0
  406. package/lib/test/Insertion.perf.spec.js.map +1 -0
  407. package/lib/test/PartialLengths.perf.spec.d.ts +6 -0
  408. package/lib/test/PartialLengths.perf.spec.d.ts.map +1 -0
  409. package/lib/test/PartialLengths.perf.spec.js +65 -0
  410. package/lib/test/PartialLengths.perf.spec.js.map +1 -0
  411. package/lib/test/Removal.perf.spec.d.ts +6 -0
  412. package/lib/test/Removal.perf.spec.d.ts.map +1 -0
  413. package/lib/test/Removal.perf.spec.js +164 -0
  414. package/lib/test/Removal.perf.spec.js.map +1 -0
  415. package/lib/test/Snapshot.perf.spec.d.ts +6 -0
  416. package/lib/test/Snapshot.perf.spec.d.ts.map +1 -0
  417. package/lib/test/Snapshot.perf.spec.js +31 -0
  418. package/lib/test/Snapshot.perf.spec.js.map +1 -0
  419. package/lib/test/attributionCollection.perf.spec.d.ts +6 -0
  420. package/lib/test/attributionCollection.perf.spec.d.ts.map +1 -0
  421. package/lib/test/attributionCollection.perf.spec.js +229 -0
  422. package/lib/test/attributionCollection.perf.spec.js.map +1 -0
  423. package/lib/test/attributionCollection.spec.d.ts +6 -0
  424. package/lib/test/attributionCollection.spec.d.ts.map +1 -0
  425. package/lib/test/attributionCollection.spec.js +484 -0
  426. package/lib/test/attributionCollection.spec.js.map +1 -0
  427. package/lib/test/attributionPolicy.spec.d.ts +6 -0
  428. package/lib/test/attributionPolicy.spec.d.ts.map +1 -0
  429. package/lib/test/attributionPolicy.spec.js +187 -0
  430. package/lib/test/attributionPolicy.spec.js.map +1 -0
  431. package/lib/test/beastTest.spec.d.ts +54 -0
  432. package/lib/test/beastTest.spec.d.ts.map +1 -0
  433. package/lib/test/beastTest.spec.js +1318 -0
  434. package/lib/test/beastTest.spec.js.map +1 -0
  435. package/lib/test/client.annotateMarker.spec.d.ts +6 -0
  436. package/lib/test/client.annotateMarker.spec.d.ts.map +1 -0
  437. package/lib/test/client.annotateMarker.spec.js +43 -0
  438. package/lib/test/client.annotateMarker.spec.js.map +1 -0
  439. package/lib/test/client.apis.spec.d.ts +7 -0
  440. package/lib/test/client.apis.spec.d.ts.map +1 -0
  441. package/lib/test/client.apis.spec.js +67 -0
  442. package/lib/test/client.apis.spec.js.map +1 -0
  443. package/lib/test/client.applyMsg.spec.d.ts +6 -0
  444. package/lib/test/client.applyMsg.spec.d.ts.map +1 -0
  445. package/lib/test/client.applyMsg.spec.js +561 -0
  446. package/lib/test/client.applyMsg.spec.js.map +1 -0
  447. package/lib/test/client.applyStashedOpFarm.spec.d.ts +12 -0
  448. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -0
  449. package/lib/test/client.applyStashedOpFarm.spec.js +153 -0
  450. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -0
  451. package/lib/test/client.attributionFarm.spec.d.ts +7 -0
  452. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -0
  453. package/lib/test/client.attributionFarm.spec.js +92 -0
  454. package/lib/test/client.attributionFarm.spec.js.map +1 -0
  455. package/lib/test/client.conflictFarm.spec.d.ts +15 -0
  456. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -0
  457. package/lib/test/client.conflictFarm.spec.js +85 -0
  458. package/lib/test/client.conflictFarm.spec.js.map +1 -0
  459. package/lib/test/client.getPosition.spec.d.ts +6 -0
  460. package/lib/test/client.getPosition.spec.d.ts.map +1 -0
  461. package/lib/test/client.getPosition.spec.js +52 -0
  462. package/lib/test/client.getPosition.spec.js.map +1 -0
  463. package/lib/test/client.localReference.spec.d.ts +6 -0
  464. package/lib/test/client.localReference.spec.d.ts.map +1 -0
  465. package/lib/test/client.localReference.spec.js +468 -0
  466. package/lib/test/client.localReference.spec.js.map +1 -0
  467. package/lib/test/client.localReferenceFarm.spec.d.ts +6 -0
  468. package/lib/test/client.localReferenceFarm.spec.d.ts.map +1 -0
  469. package/lib/test/client.localReferenceFarm.spec.js +86 -0
  470. package/lib/test/client.localReferenceFarm.spec.js.map +1 -0
  471. package/lib/test/client.rebasePosition.spec.d.ts +6 -0
  472. package/lib/test/client.rebasePosition.spec.d.ts.map +1 -0
  473. package/lib/test/client.rebasePosition.spec.js +100 -0
  474. package/lib/test/client.rebasePosition.spec.js.map +1 -0
  475. package/lib/test/client.reconnectFarm.spec.d.ts +12 -0
  476. package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -0
  477. package/lib/test/client.reconnectFarm.spec.js +88 -0
  478. package/lib/test/client.reconnectFarm.spec.js.map +1 -0
  479. package/lib/test/client.replay.spec.d.ts +6 -0
  480. package/lib/test/client.replay.spec.d.ts.map +1 -0
  481. package/lib/test/client.replay.spec.js +57 -0
  482. package/lib/test/client.replay.spec.js.map +1 -0
  483. package/lib/test/client.rollback.spec.d.ts +6 -0
  484. package/lib/test/client.rollback.spec.d.ts.map +1 -0
  485. package/lib/test/client.rollback.spec.js +451 -0
  486. package/lib/test/client.rollback.spec.js.map +1 -0
  487. package/lib/test/client.rollbackFarm.spec.d.ts +6 -0
  488. package/lib/test/client.rollbackFarm.spec.d.ts.map +1 -0
  489. package/lib/test/client.rollbackFarm.spec.js +46 -0
  490. package/lib/test/client.rollbackFarm.spec.js.map +1 -0
  491. package/lib/test/client.searchForMarker.spec.d.ts +6 -0
  492. package/lib/test/client.searchForMarker.spec.d.ts.map +1 -0
  493. package/lib/test/client.searchForMarker.spec.js +495 -0
  494. package/lib/test/client.searchForMarker.spec.js.map +1 -0
  495. package/lib/test/client.walkSegments.spec.d.ts +6 -0
  496. package/lib/test/client.walkSegments.spec.d.ts.map +1 -0
  497. package/lib/test/client.walkSegments.spec.js +52 -0
  498. package/lib/test/client.walkSegments.spec.js.map +1 -0
  499. package/lib/test/collections.list.spec.d.ts +6 -0
  500. package/lib/test/collections.list.spec.d.ts.map +1 -0
  501. package/lib/test/collections.list.spec.js +82 -0
  502. package/lib/test/collections.list.spec.js.map +1 -0
  503. package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts +6 -0
  504. package/lib/test/createInsertOnlyAttributionPolicy.spec.d.ts.map +1 -0
  505. package/lib/test/createInsertOnlyAttributionPolicy.spec.js +33 -0
  506. package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -0
  507. package/lib/test/dirname.cjs +16 -0
  508. package/lib/test/dirname.cjs.map +1 -0
  509. package/lib/test/dirname.d.cts +6 -0
  510. package/lib/test/dirname.d.cts.map +1 -0
  511. package/lib/test/index.d.ts +13 -0
  512. package/lib/test/index.d.ts.map +1 -0
  513. package/lib/test/index.js +13 -0
  514. package/lib/test/index.js.map +1 -0
  515. package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts +6 -0
  516. package/lib/test/mergeTree.annotate.deltaCallback.spec.d.ts.map +1 -0
  517. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +140 -0
  518. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -0
  519. package/lib/test/mergeTree.annotate.spec.d.ts +6 -0
  520. package/lib/test/mergeTree.annotate.spec.d.ts.map +1 -0
  521. package/lib/test/mergeTree.annotate.spec.js +446 -0
  522. package/lib/test/mergeTree.annotate.spec.js.map +1 -0
  523. package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts +6 -0
  524. package/lib/test/mergeTree.insert.deltaCallback.spec.d.ts.map +1 -0
  525. package/lib/test/mergeTree.insert.deltaCallback.spec.js +124 -0
  526. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -0
  527. package/lib/test/mergeTree.insertingWalk.spec.d.ts +6 -0
  528. package/lib/test/mergeTree.insertingWalk.spec.d.ts.map +1 -0
  529. package/lib/test/mergeTree.insertingWalk.spec.js +277 -0
  530. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -0
  531. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts +6 -0
  532. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts.map +1 -0
  533. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +176 -0
  534. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -0
  535. package/lib/test/mergeTree.markRangeRemoved.spec.d.ts +6 -0
  536. package/lib/test/mergeTree.markRangeRemoved.spec.d.ts.map +1 -0
  537. package/lib/test/mergeTree.markRangeRemoved.spec.js +128 -0
  538. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -0
  539. package/lib/test/mergeTree.walk.spec.d.ts +6 -0
  540. package/lib/test/mergeTree.walk.spec.d.ts.map +1 -0
  541. package/lib/test/mergeTree.walk.spec.js +61 -0
  542. package/lib/test/mergeTree.walk.spec.js.map +1 -0
  543. package/lib/test/mergeTree.zamboni.spec.d.ts +6 -0
  544. package/lib/test/mergeTree.zamboni.spec.d.ts.map +1 -0
  545. package/lib/test/mergeTree.zamboni.spec.js +50 -0
  546. package/lib/test/mergeTree.zamboni.spec.js.map +1 -0
  547. package/lib/test/mergeTreeOperationRunner.d.ts +63 -0
  548. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -0
  549. package/lib/test/mergeTreeOperationRunner.js +207 -0
  550. package/lib/test/mergeTreeOperationRunner.js.map +1 -0
  551. package/lib/test/mergeTreeOperationRunner.spec.d.ts +6 -0
  552. package/lib/test/mergeTreeOperationRunner.spec.d.ts.map +1 -0
  553. package/lib/test/mergeTreeOperationRunner.spec.js +154 -0
  554. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -0
  555. package/lib/test/obliterate.concurrent.spec.d.ts +6 -0
  556. package/lib/test/obliterate.concurrent.spec.d.ts.map +1 -0
  557. package/lib/test/obliterate.concurrent.spec.js +1441 -0
  558. package/lib/test/obliterate.concurrent.spec.js.map +1 -0
  559. package/lib/test/obliterate.deltaCallback.spec.d.ts +6 -0
  560. package/lib/test/obliterate.deltaCallback.spec.d.ts.map +1 -0
  561. package/lib/test/obliterate.deltaCallback.spec.js +144 -0
  562. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -0
  563. package/lib/test/obliterate.partialLength.spec.d.ts +6 -0
  564. package/lib/test/obliterate.partialLength.spec.d.ts.map +1 -0
  565. package/lib/test/obliterate.partialLength.spec.js +272 -0
  566. package/lib/test/obliterate.partialLength.spec.js.map +1 -0
  567. package/lib/test/obliterate.reconnect.spec.d.ts +6 -0
  568. package/lib/test/obliterate.reconnect.spec.d.ts.map +1 -0
  569. package/lib/test/obliterate.reconnect.spec.js +159 -0
  570. package/lib/test/obliterate.reconnect.spec.js.map +1 -0
  571. package/lib/test/obliterate.spec.d.ts +6 -0
  572. package/lib/test/obliterate.spec.d.ts.map +1 -0
  573. package/lib/test/obliterate.spec.js +160 -0
  574. package/lib/test/obliterate.spec.js.map +1 -0
  575. package/lib/test/ordinal.spec.d.ts +2 -0
  576. package/lib/test/ordinal.spec.d.ts.map +1 -0
  577. package/lib/test/ordinal.spec.js +38 -0
  578. package/lib/test/ordinal.spec.js.map +1 -0
  579. package/lib/test/partialLength.spec.d.ts +6 -0
  580. package/lib/test/partialLength.spec.d.ts.map +1 -0
  581. package/lib/test/partialLength.spec.js +274 -0
  582. package/lib/test/partialLength.spec.js.map +1 -0
  583. package/lib/test/properties.spec.d.ts +6 -0
  584. package/lib/test/properties.spec.d.ts.map +1 -0
  585. package/lib/test/properties.spec.js +53 -0
  586. package/lib/test/properties.spec.js.map +1 -0
  587. package/lib/test/reconnectHelper.d.ts +48 -0
  588. package/lib/test/reconnectHelper.d.ts.map +1 -0
  589. package/lib/test/reconnectHelper.js +82 -0
  590. package/lib/test/reconnectHelper.js.map +1 -0
  591. package/lib/test/resetPendingSegmentsToOp.spec.d.ts +6 -0
  592. package/lib/test/resetPendingSegmentsToOp.spec.d.ts.map +1 -0
  593. package/lib/test/resetPendingSegmentsToOp.spec.js +235 -0
  594. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -0
  595. package/lib/test/revertibleFarm.spec.d.ts +6 -0
  596. package/lib/test/revertibleFarm.spec.d.ts.map +1 -0
  597. package/lib/test/revertibleFarm.spec.js +119 -0
  598. package/lib/test/revertibleFarm.spec.js.map +1 -0
  599. package/lib/test/revertibles.spec.d.ts +17 -0
  600. package/lib/test/revertibles.spec.d.ts.map +1 -0
  601. package/lib/test/revertibles.spec.js +381 -0
  602. package/lib/test/revertibles.spec.js.map +1 -0
  603. package/lib/test/segmentGroupCollection.spec.d.ts +6 -0
  604. package/lib/test/segmentGroupCollection.spec.d.ts.map +1 -0
  605. package/lib/test/segmentGroupCollection.spec.js +58 -0
  606. package/lib/test/segmentGroupCollection.spec.js.map +1 -0
  607. package/lib/test/snapshot.spec.d.ts +6 -0
  608. package/lib/test/snapshot.spec.d.ts.map +1 -0
  609. package/lib/test/snapshot.spec.js +176 -0
  610. package/lib/test/snapshot.spec.js.map +1 -0
  611. package/lib/test/snapshot.utils.d.ts +33 -0
  612. package/lib/test/snapshot.utils.d.ts.map +1 -0
  613. package/lib/test/snapshot.utils.js +104 -0
  614. package/lib/test/snapshot.utils.js.map +1 -0
  615. package/lib/test/snapshotlegacy.spec.d.ts +6 -0
  616. package/lib/test/snapshotlegacy.spec.d.ts.map +1 -0
  617. package/lib/test/snapshotlegacy.spec.js +137 -0
  618. package/lib/test/snapshotlegacy.spec.js.map +1 -0
  619. package/lib/test/sortedSegmentSet.spec.d.ts +6 -0
  620. package/lib/test/sortedSegmentSet.spec.d.ts.map +1 -0
  621. package/lib/test/sortedSegmentSet.spec.js +93 -0
  622. package/lib/test/sortedSegmentSet.spec.js.map +1 -0
  623. package/lib/test/testClient.d.ts +116 -0
  624. package/lib/test/testClient.d.ts.map +1 -0
  625. package/lib/test/testClient.js +430 -0
  626. package/lib/test/testClient.js.map +1 -0
  627. package/lib/test/testClientLogger.d.ts +44 -0
  628. package/lib/test/testClientLogger.d.ts.map +1 -0
  629. package/lib/test/testClientLogger.js +282 -0
  630. package/lib/test/testClientLogger.js.map +1 -0
  631. package/lib/test/testSerializer.d.ts +18 -0
  632. package/lib/test/testSerializer.d.ts.map +1 -0
  633. package/lib/test/testSerializer.js +29 -0
  634. package/lib/test/testSerializer.js.map +1 -0
  635. package/lib/test/testServer.d.ts +36 -0
  636. package/lib/test/testServer.d.ts.map +1 -0
  637. package/lib/test/testServer.js +133 -0
  638. package/lib/test/testServer.js.map +1 -0
  639. package/lib/test/testUtils.d.ts +77 -0
  640. package/lib/test/testUtils.d.ts.map +1 -0
  641. package/lib/test/testUtils.js +151 -0
  642. package/lib/test/testUtils.js.map +1 -0
  643. package/lib/test/text.d.ts +9 -0
  644. package/lib/test/text.d.ts.map +1 -0
  645. package/lib/test/text.js +71 -0
  646. package/lib/test/text.js.map +1 -0
  647. package/lib/test/tracking.spec.d.ts +6 -0
  648. package/lib/test/tracking.spec.d.ts.map +1 -0
  649. package/lib/test/tracking.spec.js +118 -0
  650. package/lib/test/tracking.spec.js.map +1 -0
  651. package/lib/test/types/validateMergeTreePrevious.generated.d.ts +2 -0
  652. package/lib/test/types/validateMergeTreePrevious.generated.d.ts.map +1 -0
  653. package/lib/test/types/validateMergeTreePrevious.generated.js +228 -0
  654. package/lib/test/types/validateMergeTreePrevious.generated.js.map +1 -0
  655. package/lib/test/wordUnitTests.spec.d.ts +6 -0
  656. package/lib/test/wordUnitTests.spec.d.ts.map +1 -0
  657. package/lib/test/wordUnitTests.spec.js +166 -0
  658. package/lib/test/wordUnitTests.spec.js.map +1 -0
  659. package/lib/{textSegment.d.mts → textSegment.d.ts} +4 -4
  660. package/lib/textSegment.d.ts.map +1 -0
  661. package/lib/{textSegment.mjs → textSegment.js} +2 -2
  662. package/lib/textSegment.js.map +1 -0
  663. package/lib/{zamboni.d.mts → zamboni.d.ts} +3 -3
  664. package/lib/zamboni.d.ts.map +1 -0
  665. package/lib/{zamboni.mjs → zamboni.js} +7 -6
  666. package/lib/zamboni.js.map +1 -0
  667. package/package.json +50 -57
  668. package/src/MergeTreeTextHelper.ts +4 -4
  669. package/src/attributionCollection.ts +1 -1
  670. package/src/attributionPolicy.ts +5 -5
  671. package/src/client.ts +50 -41
  672. package/src/collections/index.ts +2 -2
  673. package/src/endOfTreeSegment.ts +5 -5
  674. package/src/index.ts +20 -20
  675. package/src/localReference.ts +13 -7
  676. package/src/mergeTree.ts +53 -44
  677. package/src/mergeTreeDeltaCallback.ts +3 -8
  678. package/src/mergeTreeNodeWalk.ts +1 -1
  679. package/src/mergeTreeNodes.ts +21 -19
  680. package/src/mergeTreeTracking.ts +3 -3
  681. package/src/opBuilder.ts +3 -3
  682. package/src/partialLengths.ts +10 -10
  683. package/src/referencePositions.ts +4 -4
  684. package/src/revertibles.ts +14 -18
  685. package/src/segmentGroupCollection.ts +2 -2
  686. package/src/segmentPropertiesManager.ts +3 -3
  687. package/src/snapshotChunks.ts +4 -4
  688. package/src/snapshotLoader.ts +14 -11
  689. package/src/snapshotV1.ts +29 -9
  690. package/src/snapshotlegacy.ts +19 -5
  691. package/src/sortedSegmentSet.ts +8 -6
  692. package/src/textSegment.ts +3 -3
  693. package/src/zamboni.ts +7 -7
  694. package/tsconfig.cjs.json +7 -0
  695. package/tsconfig.json +2 -5
  696. package/api-extractor-esm.json +0 -17
  697. package/dist/test/beastTest.d.ts.map +0 -1
  698. package/dist/test/beastTest.js.map +0 -1
  699. package/dist/test/client.apis.d.ts.map +0 -1
  700. package/dist/test/client.apis.js.map +0 -1
  701. package/dist/test/wordUnitTests.d.ts.map +0 -1
  702. package/dist/test/wordUnitTests.js.map +0 -1
  703. package/lib/MergeTreeTextHelper.d.mts.map +0 -1
  704. package/lib/MergeTreeTextHelper.mjs.map +0 -1
  705. package/lib/attributionCollection.d.mts.map +0 -1
  706. package/lib/attributionCollection.mjs.map +0 -1
  707. package/lib/attributionPolicy.d.mts.map +0 -1
  708. package/lib/attributionPolicy.mjs.map +0 -1
  709. package/lib/client.d.mts.map +0 -1
  710. package/lib/client.mjs.map +0 -1
  711. package/lib/collections/index.d.mts.map +0 -1
  712. package/lib/collections/index.mjs +0 -7
  713. package/lib/collections/index.mjs.map +0 -1
  714. package/lib/collections/list.d.mts.map +0 -1
  715. package/lib/collections/list.mjs.map +0 -1
  716. package/lib/collections/rbTree.d.mts.map +0 -1
  717. package/lib/collections/rbTree.mjs.map +0 -1
  718. package/lib/constants.d.mts.map +0 -1
  719. package/lib/constants.mjs.map +0 -1
  720. package/lib/endOfTreeSegment.d.mts.map +0 -1
  721. package/lib/endOfTreeSegment.mjs.map +0 -1
  722. package/lib/index.d.mts.map +0 -1
  723. package/lib/index.mjs.map +0 -1
  724. package/lib/localReference.d.mts.map +0 -1
  725. package/lib/localReference.mjs.map +0 -1
  726. package/lib/merge-tree-beta.d.mts +0 -668
  727. package/lib/merge-tree-public.d.mts +0 -668
  728. package/lib/mergeTree.d.mts.map +0 -1
  729. package/lib/mergeTree.mjs.map +0 -1
  730. package/lib/mergeTreeDeltaCallback.d.mts.map +0 -1
  731. package/lib/mergeTreeDeltaCallback.mjs.map +0 -1
  732. package/lib/mergeTreeNodeWalk.d.mts.map +0 -1
  733. package/lib/mergeTreeNodeWalk.mjs.map +0 -1
  734. package/lib/mergeTreeNodes.d.mts.map +0 -1
  735. package/lib/mergeTreeNodes.mjs.map +0 -1
  736. package/lib/mergeTreeTracking.d.mts.map +0 -1
  737. package/lib/mergeTreeTracking.mjs.map +0 -1
  738. package/lib/opBuilder.mjs.map +0 -1
  739. package/lib/ops.d.mts.map +0 -1
  740. package/lib/ops.mjs.map +0 -1
  741. package/lib/ordinal.d.mts.map +0 -1
  742. package/lib/ordinal.mjs.map +0 -1
  743. package/lib/partialLengths.d.mts.map +0 -1
  744. package/lib/partialLengths.mjs.map +0 -1
  745. package/lib/properties.d.mts.map +0 -1
  746. package/lib/properties.mjs.map +0 -1
  747. package/lib/referencePositions.d.mts.map +0 -1
  748. package/lib/referencePositions.mjs.map +0 -1
  749. package/lib/revertibles.d.mts.map +0 -1
  750. package/lib/revertibles.mjs.map +0 -1
  751. package/lib/segmentGroupCollection.d.mts.map +0 -1
  752. package/lib/segmentGroupCollection.mjs.map +0 -1
  753. package/lib/segmentPropertiesManager.d.mts.map +0 -1
  754. package/lib/segmentPropertiesManager.mjs.map +0 -1
  755. package/lib/snapshotChunks.d.mts.map +0 -1
  756. package/lib/snapshotChunks.mjs.map +0 -1
  757. package/lib/snapshotLoader.d.mts.map +0 -1
  758. package/lib/snapshotLoader.mjs.map +0 -1
  759. package/lib/snapshotV1.d.mts.map +0 -1
  760. package/lib/snapshotV1.mjs.map +0 -1
  761. package/lib/snapshotlegacy.d.mts.map +0 -1
  762. package/lib/snapshotlegacy.mjs.map +0 -1
  763. package/lib/sortedSegmentSet.d.mts.map +0 -1
  764. package/lib/sortedSegmentSet.mjs.map +0 -1
  765. package/lib/sortedSet.d.mts.map +0 -1
  766. package/lib/sortedSet.mjs.map +0 -1
  767. package/lib/textSegment.d.mts.map +0 -1
  768. package/lib/textSegment.mjs.map +0 -1
  769. package/lib/zamboni.d.mts.map +0 -1
  770. package/lib/zamboni.mjs.map +0 -1
@@ -0,0 +1,133 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Heap } from "@fluidframework/core-utils";
6
+ import { RedBlackTree } from "../collections/index.js";
7
+ import { compareNumbers } from "../mergeTreeNodes.js";
8
+ import { MergeTreeTextHelper } from "../MergeTreeTextHelper.js";
9
+ import { TestClient } from "./testClient.js";
10
+ const clientSeqComparer = {
11
+ min: { refSeq: -1, clientId: "" },
12
+ compare: (a, b) => a.refSeq - b.refSeq,
13
+ };
14
+ /**
15
+ * Server for tests. Simulates client communication by directing placing
16
+ * messages in client queues.
17
+ */
18
+ export class TestServer extends TestClient {
19
+ constructor(options) {
20
+ super(options);
21
+ this.seq = 1;
22
+ this.clients = [];
23
+ this.clientSeqNumbers = new Heap(clientSeqComparer);
24
+ this.upstreamMap = new RedBlackTree(compareNumbers);
25
+ this.minSeq = 0;
26
+ }
27
+ addClients(clients) {
28
+ this.clientSeqNumbers = new Heap(clientSeqComparer);
29
+ this.clients = clients;
30
+ for (const client of clients) {
31
+ this.clientSeqNumbers.add({
32
+ refSeq: client.getCurrentSeq(),
33
+ clientId: client.longClientId ?? "",
34
+ });
35
+ }
36
+ }
37
+ applyMsg(msg) {
38
+ super.applyMsg(msg);
39
+ if (TestClient.useCheckQ) {
40
+ const clid = this.getShortClientId(msg.clientId);
41
+ return checkTextMatchRelative(msg.referenceSequenceNumber, clid, this, msg);
42
+ }
43
+ else {
44
+ return false;
45
+ }
46
+ }
47
+ // TODO: remove mappings when no longer needed using min seq
48
+ // in upstream message
49
+ transformUpstreamMessage(msg) {
50
+ if (msg.referenceSequenceNumber > 0) {
51
+ msg.referenceSequenceNumber =
52
+ this.upstreamMap.get(msg.referenceSequenceNumber)?.data ?? 0;
53
+ }
54
+ msg.origin = {
55
+ id: "A",
56
+ sequenceNumber: msg.sequenceNumber,
57
+ minimumSequenceNumber: msg.minimumSequenceNumber,
58
+ };
59
+ this.upstreamMap.put(msg.sequenceNumber, this.seq);
60
+ msg.sequenceNumber = -1;
61
+ }
62
+ copyMsg(msg) {
63
+ return {
64
+ clientId: msg.clientId,
65
+ clientSequenceNumber: msg.clientSequenceNumber,
66
+ contents: msg.contents,
67
+ minimumSequenceNumber: msg.minimumSequenceNumber,
68
+ referenceSequenceNumber: msg.referenceSequenceNumber,
69
+ sequenceNumber: msg.sequenceNumber,
70
+ type: msg.type,
71
+ };
72
+ }
73
+ applyMessages(msgCount) {
74
+ let _msgCount = msgCount;
75
+ while (_msgCount > 0) {
76
+ const msg = this.dequeueMsg();
77
+ if (msg) {
78
+ if (msg.sequenceNumber >= 0) {
79
+ this.transformUpstreamMessage(msg);
80
+ }
81
+ msg.sequenceNumber = this.seq++;
82
+ msg.minimumSequenceNumber = this.minSeq;
83
+ if (this.applyMsg(msg)) {
84
+ return true;
85
+ }
86
+ if (this.clients) {
87
+ let minCli = this.clientSeqNumbers.peek()?.value;
88
+ if (minCli &&
89
+ minCli.clientId === msg.clientId &&
90
+ minCli.refSeq < msg.referenceSequenceNumber) {
91
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
92
+ const cliSeq = this.clientSeqNumbers.get();
93
+ const oldSeq = cliSeq.refSeq;
94
+ cliSeq.refSeq = msg.referenceSequenceNumber;
95
+ this.clientSeqNumbers.add(cliSeq);
96
+ minCli = this.clientSeqNumbers.peek()?.value;
97
+ if (minCli && minCli.refSeq > oldSeq) {
98
+ msg.minimumSequenceNumber = minCli.refSeq;
99
+ this.minSeq = minCli.refSeq;
100
+ }
101
+ }
102
+ for (const client of this.clients) {
103
+ client.enqueueMsg(msg);
104
+ }
105
+ }
106
+ }
107
+ else {
108
+ break;
109
+ }
110
+ _msgCount--;
111
+ }
112
+ return false;
113
+ }
114
+ }
115
+ /**
116
+ * Used for in-memory testing. This will queue a reference string for each client message.
117
+ */
118
+ export function checkTextMatchRelative(refSeq, clientId, server, msg) {
119
+ const client = server.clients[clientId];
120
+ const serverText = new MergeTreeTextHelper(server.mergeTree).getText(refSeq, clientId);
121
+ const cliText = client.checkQ.shift()?.data;
122
+ if (cliText === undefined || cliText !== serverText) {
123
+ console.log(`mismatch `);
124
+ console.log(msg);
125
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
126
+ console.log(server.mergeTree.toString());
127
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
128
+ console.log(client.mergeTree.toString());
129
+ return true;
130
+ }
131
+ return false;
132
+ }
133
+ //# sourceMappingURL=testServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testServer.js","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { Heap, IComparer } from \"@fluidframework/core-utils\";\nimport { RedBlackTree } from \"../collections/index.js\";\nimport { compareNumbers } from \"../mergeTreeNodes.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { TestClient } from \"./testClient.js\";\n\ninterface ClientSeq {\n\trefSeq: number;\n\tclientId: string;\n}\n\nconst clientSeqComparer: IComparer<ClientSeq> = {\n\tmin: { refSeq: -1, clientId: \"\" },\n\tcompare: (a, b) => a.refSeq - b.refSeq,\n};\n\n/**\n * Server for tests. Simulates client communication by directing placing\n * messages in client queues.\n */\nexport class TestServer extends TestClient {\n\tseq = 1;\n\tclients: TestClient[] = [];\n\tclientSeqNumbers: Heap<ClientSeq> = new Heap<ClientSeq>(clientSeqComparer);\n\tupstreamMap: RedBlackTree<number, number> = new RedBlackTree<number, number>(compareNumbers);\n\tconstructor(options?: PropertySet) {\n\t\tsuper(options);\n\t}\n\n\taddClients(clients: TestClient[]) {\n\t\tthis.clientSeqNumbers = new Heap<ClientSeq>(clientSeqComparer);\n\t\tthis.clients = clients;\n\t\tfor (const client of clients) {\n\t\t\tthis.clientSeqNumbers.add({\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t\tclientId: client.longClientId ?? \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\tapplyMsg(msg: ISequencedDocumentMessage) {\n\t\tsuper.applyMsg(msg);\n\t\tif (TestClient.useCheckQ) {\n\t\t\tconst clid = this.getShortClientId(msg.clientId as string);\n\t\t\treturn checkTextMatchRelative(msg.referenceSequenceNumber, clid, this, msg);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// TODO: remove mappings when no longer needed using min seq\n\t// in upstream message\n\ttransformUpstreamMessage(msg: ISequencedDocumentMessage) {\n\t\tif (msg.referenceSequenceNumber > 0) {\n\t\t\tmsg.referenceSequenceNumber =\n\t\t\t\tthis.upstreamMap.get(msg.referenceSequenceNumber)?.data ?? 0;\n\t\t}\n\t\tmsg.origin = {\n\t\t\tid: \"A\",\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t};\n\t\tthis.upstreamMap.put(msg.sequenceNumber, this.seq);\n\t\tmsg.sequenceNumber = -1;\n\t}\n\n\tcopyMsg(msg: ISequencedDocumentMessage) {\n\t\treturn {\n\t\t\tclientId: msg.clientId,\n\t\t\tclientSequenceNumber: msg.clientSequenceNumber,\n\t\t\tcontents: msg.contents,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t\treferenceSequenceNumber: msg.referenceSequenceNumber,\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\ttype: msg.type,\n\t\t} as any as ISequencedDocumentMessage;\n\t}\n\n\tprivate minSeq = 0;\n\n\tapplyMessages(msgCount: number) {\n\t\tlet _msgCount = msgCount;\n\t\twhile (_msgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tif (msg.sequenceNumber >= 0) {\n\t\t\t\t\tthis.transformUpstreamMessage(msg);\n\t\t\t\t}\n\t\t\t\tmsg.sequenceNumber = this.seq++;\n\t\t\t\tmsg.minimumSequenceNumber = this.minSeq;\n\t\t\t\tif (this.applyMsg(msg)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (this.clients) {\n\t\t\t\t\tlet minCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\tif (\n\t\t\t\t\t\tminCli &&\n\t\t\t\t\t\tminCli.clientId === msg.clientId &&\n\t\t\t\t\t\tminCli.refSeq < msg.referenceSequenceNumber\n\t\t\t\t\t) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tconst cliSeq = this.clientSeqNumbers.get()!;\n\t\t\t\t\t\tconst oldSeq = cliSeq.refSeq;\n\t\t\t\t\t\tcliSeq.refSeq = msg.referenceSequenceNumber;\n\t\t\t\t\t\tthis.clientSeqNumbers.add(cliSeq);\n\t\t\t\t\t\tminCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\t\tif (minCli && minCli.refSeq > oldSeq) {\n\t\t\t\t\t\t\tmsg.minimumSequenceNumber = minCli.refSeq;\n\t\t\t\t\t\t\tthis.minSeq = minCli.refSeq;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const client of this.clients) {\n\t\t\t\t\t\tclient.enqueueMsg(msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t_msgCount--;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n/**\n * Used for in-memory testing. This will queue a reference string for each client message.\n */\nexport function checkTextMatchRelative(\n\trefSeq: number,\n\tclientId: number,\n\tserver: TestServer,\n\tmsg: ISequencedDocumentMessage,\n) {\n\tconst client = server.clients[clientId];\n\tconst serverText = new MergeTreeTextHelper(server.mergeTree).getText(refSeq, clientId);\n\tconst cliText = client.checkQ.shift()?.data;\n\tif (cliText === undefined || cliText !== serverText) {\n\t\tconsole.log(`mismatch `);\n\t\tconsole.log(msg);\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(server.mergeTree.toString());\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(client.mergeTree.toString());\n\t\treturn true;\n\t}\n\treturn false;\n}\n"]}
@@ -0,0 +1,77 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { IMergeBlock, ISegment } from "../mergeTreeNodes.js";
6
+ import { IMergeTreeDeltaOpArgs } from "../mergeTreeDeltaCallback.js";
7
+ import { ReferenceType } from "../ops.js";
8
+ import { PropertySet } from "../properties.js";
9
+ import { MergeTree } from "../mergeTree.js";
10
+ import { LocalReferenceCollection } from "../localReference.js";
11
+ export declare function loadTextFromFile(filename: string, mergeTree: MergeTree, segLimit?: number): MergeTree;
12
+ export declare function loadTextFromFileWithMarkers(filename: string, mergeTree: MergeTree, segLimit?: number): MergeTree;
13
+ interface InsertMarkerArgs {
14
+ mergeTree: MergeTree;
15
+ pos: number;
16
+ refSeq: number;
17
+ clientId: number;
18
+ seq: number;
19
+ behaviors: ReferenceType;
20
+ props: PropertySet | undefined;
21
+ opArgs: IMergeTreeDeltaOpArgs;
22
+ }
23
+ export declare function insertMarker({ mergeTree, pos, refSeq, clientId, seq, behaviors, props, opArgs, }: InsertMarkerArgs): void;
24
+ interface InsertTextArgs {
25
+ mergeTree: MergeTree;
26
+ pos: number;
27
+ refSeq: number;
28
+ clientId: number;
29
+ seq: number;
30
+ text: string;
31
+ props?: PropertySet;
32
+ opArgs?: IMergeTreeDeltaOpArgs;
33
+ }
34
+ export declare function insertText({ mergeTree, pos, refSeq, clientId, seq, text, props, opArgs, }: InsertTextArgs): void;
35
+ interface InsertSegmentsArgs {
36
+ mergeTree: MergeTree;
37
+ pos: number;
38
+ segments: ISegment[];
39
+ refSeq: number;
40
+ clientId: number;
41
+ seq: number;
42
+ opArgs: IMergeTreeDeltaOpArgs | undefined;
43
+ }
44
+ export declare function insertSegments({ mergeTree, pos, segments, refSeq, clientId, seq, opArgs, }: InsertSegmentsArgs): void;
45
+ interface MarkRangeRemovedArgs {
46
+ mergeTree: MergeTree;
47
+ start: number;
48
+ end: number;
49
+ refSeq: number;
50
+ clientId: number;
51
+ seq: number;
52
+ overwrite: boolean;
53
+ opArgs: IMergeTreeDeltaOpArgs;
54
+ }
55
+ export declare function markRangeRemoved({ mergeTree, start, end, refSeq, clientId, seq, overwrite, opArgs, }: MarkRangeRemovedArgs): void;
56
+ export declare function nodeOrdinalsHaveIntegrity(block: IMergeBlock): boolean;
57
+ /**
58
+ * Returns an object that tallies each delta and maintenance operation observed
59
+ * for the given 'mergeTree'.
60
+ */
61
+ export declare function countOperations(mergeTree: MergeTree): {};
62
+ export declare function validatePartialLengths(clientId: number, mergeTree: MergeTree, expectedValues?: {
63
+ seq: number;
64
+ len: number;
65
+ localSeq?: number;
66
+ }[], localSeq?: number, mergeBlock?: IMergeBlock): void;
67
+ export declare function validateRefCount(collection?: LocalReferenceCollection): void;
68
+ /**
69
+ * Enable stricter partial length assertions inside tests
70
+ *
71
+ * Note that these assertions can be expensive, and so should not be enabled in
72
+ * production code or tests that run through thousands of ops (e.g. the SharedString
73
+ * fuzz tests).
74
+ */
75
+ export declare function useStrictPartialLengthChecks(): void;
76
+ export {};
77
+ //# sourceMappingURL=testUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "assert";
6
+ import fs from "fs";
7
+ import { Marker } from "../mergeTreeNodes.js";
8
+ import { TextSegment } from "../textSegment.js";
9
+ import { walkAllChildSegments } from "../mergeTreeNodeWalk.js";
10
+ import { UnassignedSequenceNumber } from "../constants.js";
11
+ import { PartialSequenceLengths, verifyExpectedPartialLengths, verifyPartialLengths, } from "../partialLengths.js";
12
+ import { loadText } from "./text.js";
13
+ export function loadTextFromFile(filename, mergeTree, segLimit = 0) {
14
+ const content = fs.readFileSync(filename, "utf8");
15
+ return loadText(content, mergeTree, segLimit);
16
+ }
17
+ export function loadTextFromFileWithMarkers(filename, mergeTree, segLimit = 0) {
18
+ const content = fs.readFileSync(filename, "utf8");
19
+ return loadText(content, mergeTree, segLimit, true);
20
+ }
21
+ export function insertMarker({ mergeTree, pos, refSeq, clientId, seq, behaviors, props, opArgs, }) {
22
+ mergeTree.insertSegments(pos, [Marker.make(behaviors, props)], refSeq, clientId, seq, opArgs);
23
+ }
24
+ export function insertText({ mergeTree, pos, refSeq, clientId, seq, text, props, opArgs, }) {
25
+ mergeTree.insertSegments(pos, [TextSegment.make(text, props)], refSeq, clientId, seq, opArgs);
26
+ }
27
+ export function insertSegments({ mergeTree, pos, segments, refSeq, clientId, seq, opArgs, }) {
28
+ mergeTree.insertSegments(pos, segments, refSeq, clientId, seq, opArgs);
29
+ }
30
+ export function markRangeRemoved({ mergeTree, start, end, refSeq, clientId, seq, overwrite = false, opArgs, }) {
31
+ mergeTree.markRangeRemoved(start, end, refSeq, clientId, seq, overwrite, opArgs);
32
+ }
33
+ export function nodeOrdinalsHaveIntegrity(block) {
34
+ const olen = block.ordinal.length;
35
+ for (let i = 0; i < block.childCount; i++) {
36
+ if (block.children[i].ordinal) {
37
+ if (olen !== block.children[i].ordinal.length - 1) {
38
+ console.log("node integrity issue");
39
+ return false;
40
+ }
41
+ if (i > 0) {
42
+ if (block.children[i].ordinal <= block.children[i - 1].ordinal) {
43
+ console.log("node sib integrity issue");
44
+ return false;
45
+ }
46
+ }
47
+ if (!block.children[i].isLeaf()) {
48
+ return nodeOrdinalsHaveIntegrity(block.children[i]);
49
+ }
50
+ }
51
+ else {
52
+ console.log(`node child ordinal not set ${i}`);
53
+ return false;
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+ /**
59
+ * Returns an object that tallies each delta and maintenance operation observed
60
+ * for the given 'mergeTree'.
61
+ */
62
+ export function countOperations(mergeTree) {
63
+ const counts = {};
64
+ assert.strictEqual(mergeTree.mergeTreeDeltaCallback, undefined);
65
+ assert.strictEqual(mergeTree.mergeTreeMaintenanceCallback, undefined);
66
+ const fn = (deltaArgs) => {
67
+ const previous = counts[deltaArgs.operation];
68
+ counts[deltaArgs.operation] = previous === undefined ? 1 : previous + 1;
69
+ };
70
+ mergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs) => {
71
+ fn(deltaArgs);
72
+ };
73
+ mergeTree.mergeTreeMaintenanceCallback = fn;
74
+ return counts;
75
+ }
76
+ function getPartialLengths(clientId, seq, mergeTree, localSeq, mergeBlock = mergeTree.root) {
77
+ const partialLen = mergeBlock.partialLengths?.getPartialLength(seq, clientId, localSeq);
78
+ let actualLen = 0;
79
+ const isInserted = (segment) => segment.seq === undefined ||
80
+ (segment.seq !== UnassignedSequenceNumber && segment.seq <= seq) ||
81
+ (localSeq !== undefined &&
82
+ segment.seq === UnassignedSequenceNumber &&
83
+ segment.localSeq !== undefined &&
84
+ segment.localSeq <= localSeq);
85
+ const isRemoved = (segment) => segment.removedSeq !== undefined &&
86
+ ((localSeq !== undefined &&
87
+ segment.removedSeq === UnassignedSequenceNumber &&
88
+ segment.localRemovedSeq !== undefined &&
89
+ segment.localRemovedSeq <= localSeq) ||
90
+ (segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq <= seq));
91
+ const isMoved = (segment) => segment.movedSeq !== undefined &&
92
+ ((localSeq !== undefined &&
93
+ segment.movedSeq === UnassignedSequenceNumber &&
94
+ segment.localMovedSeq !== undefined &&
95
+ segment.localMovedSeq <= localSeq) ||
96
+ (segment.movedSeq !== UnassignedSequenceNumber && segment.movedSeq <= seq));
97
+ walkAllChildSegments(mergeBlock, (segment) => {
98
+ if (isInserted(segment) && !isRemoved(segment) && !isMoved(segment)) {
99
+ actualLen += segment.cachedLength;
100
+ }
101
+ return true;
102
+ });
103
+ return {
104
+ partialLen,
105
+ actualLen,
106
+ };
107
+ }
108
+ export function validatePartialLengths(clientId, mergeTree, expectedValues, localSeq, mergeBlock = mergeTree.root) {
109
+ mergeTree.computeLocalPartials(0);
110
+ for (let i = mergeTree.collabWindow.minSeq + 1; i <= mergeTree.collabWindow.currentSeq; i++) {
111
+ const { partialLen, actualLen } = getPartialLengths(clientId, i, mergeTree, localSeq, mergeBlock);
112
+ if (partialLen && partialLen < 0) {
113
+ assert.fail("Negative partial length returned");
114
+ }
115
+ assert.equal(partialLen, actualLen);
116
+ }
117
+ if (!expectedValues) {
118
+ return;
119
+ }
120
+ for (const { seq, len, localSeq: expectedLocalSeq } of expectedValues) {
121
+ const { partialLen, actualLen } = getPartialLengths(clientId, seq, mergeTree, expectedLocalSeq ?? localSeq, mergeBlock);
122
+ assert.equal(partialLen, len);
123
+ assert.equal(actualLen, len);
124
+ }
125
+ }
126
+ export function validateRefCount(collection) {
127
+ if (!collection) {
128
+ return;
129
+ }
130
+ const expectedLength = Array.from(collection).length;
131
+ // eslint-disable-next-line @typescript-eslint/dot-notation
132
+ assert.equal(collection["refCount"], expectedLength);
133
+ }
134
+ /**
135
+ * Enable stricter partial length assertions inside tests
136
+ *
137
+ * Note that these assertions can be expensive, and so should not be enabled in
138
+ * production code or tests that run through thousands of ops (e.g. the SharedString
139
+ * fuzz tests).
140
+ */
141
+ export function useStrictPartialLengthChecks() {
142
+ beforeEach(() => {
143
+ PartialSequenceLengths.options.verifier = verifyPartialLengths;
144
+ PartialSequenceLengths.options.verifyExpected = verifyExpectedPartialLengths;
145
+ });
146
+ afterEach(() => {
147
+ PartialSequenceLengths.options.verifier = undefined;
148
+ PartialSequenceLengths.options.verifyExpected = undefined;
149
+ });
150
+ }
151
+ //# sourceMappingURL=testUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport fs from \"fs\";\nimport { IMergeBlock, ISegment, Marker } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeDeltaOpArgs } from \"../mergeTreeDeltaCallback.js\";\nimport { TextSegment } from \"../textSegment.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { LocalReferenceCollection } from \"../localReference.js\";\nimport {\n\tPartialSequenceLengths,\n\tverifyExpectedPartialLengths,\n\tverifyPartialLengths,\n} from \"../partialLengths.js\";\nimport { loadText } from \"./text.js\";\n\nexport function loadTextFromFile(filename: string, mergeTree: MergeTree, segLimit = 0) {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit);\n}\n\nexport function loadTextFromFileWithMarkers(filename: string, mergeTree: MergeTree, segLimit = 0) {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit, true);\n}\n\ninterface InsertMarkerArgs {\n\tmergeTree: MergeTree;\n\tpos: number;\n\trefSeq: number;\n\tclientId: number;\n\tseq: number;\n\tbehaviors: ReferenceType;\n\tprops: PropertySet | undefined;\n\topArgs: IMergeTreeDeltaOpArgs;\n}\n\nexport function insertMarker({\n\tmergeTree,\n\tpos,\n\trefSeq,\n\tclientId,\n\tseq,\n\tbehaviors,\n\tprops,\n\topArgs,\n}: InsertMarkerArgs) {\n\tmergeTree.insertSegments(pos, [Marker.make(behaviors, props)], refSeq, clientId, seq, opArgs);\n}\n\ninterface InsertTextArgs {\n\tmergeTree: MergeTree;\n\tpos: number;\n\trefSeq: number;\n\tclientId: number;\n\tseq: number;\n\ttext: string;\n\tprops?: PropertySet;\n\topArgs?: IMergeTreeDeltaOpArgs;\n}\n\nexport function insertText({\n\tmergeTree,\n\tpos,\n\trefSeq,\n\tclientId,\n\tseq,\n\ttext,\n\tprops,\n\topArgs,\n}: InsertTextArgs) {\n\tmergeTree.insertSegments(pos, [TextSegment.make(text, props)], refSeq, clientId, seq, opArgs);\n}\n\ninterface InsertSegmentsArgs {\n\tmergeTree: MergeTree;\n\tpos: number;\n\tsegments: ISegment[];\n\trefSeq: number;\n\tclientId: number;\n\tseq: number;\n\topArgs: IMergeTreeDeltaOpArgs | undefined;\n}\n\nexport function insertSegments({\n\tmergeTree,\n\tpos,\n\tsegments,\n\trefSeq,\n\tclientId,\n\tseq,\n\topArgs,\n}: InsertSegmentsArgs): void {\n\tmergeTree.insertSegments(pos, segments, refSeq, clientId, seq, opArgs);\n}\n\ninterface MarkRangeRemovedArgs {\n\tmergeTree: MergeTree;\n\tstart: number;\n\tend: number;\n\trefSeq: number;\n\tclientId: number;\n\tseq: number;\n\toverwrite: boolean;\n\topArgs: IMergeTreeDeltaOpArgs;\n}\n\nexport function markRangeRemoved({\n\tmergeTree,\n\tstart,\n\tend,\n\trefSeq,\n\tclientId,\n\tseq,\n\toverwrite = false,\n\topArgs,\n}: MarkRangeRemovedArgs): void {\n\tmergeTree.markRangeRemoved(start, end, refSeq, clientId, seq, overwrite, opArgs);\n}\n\nexport function nodeOrdinalsHaveIntegrity(block: IMergeBlock): boolean {\n\tconst olen = block.ordinal.length;\n\tfor (let i = 0; i < block.childCount; i++) {\n\t\tif (block.children[i].ordinal) {\n\t\t\tif (olen !== block.children[i].ordinal.length - 1) {\n\t\t\t\tconsole.log(\"node integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (i > 0) {\n\t\t\t\tif (block.children[i].ordinal <= block.children[i - 1].ordinal) {\n\t\t\t\t\tconsole.log(\"node sib integrity issue\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!block.children[i].isLeaf()) {\n\t\t\t\treturn nodeOrdinalsHaveIntegrity(block.children[i] as IMergeBlock);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(`node child ordinal not set ${i}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Returns an object that tallies each delta and maintenance operation observed\n * for the given 'mergeTree'.\n */\nexport function countOperations(mergeTree: MergeTree) {\n\tconst counts = {};\n\n\tassert.strictEqual(mergeTree.mergeTreeDeltaCallback, undefined);\n\tassert.strictEqual(mergeTree.mergeTreeMaintenanceCallback, undefined);\n\n\tconst fn = (deltaArgs) => {\n\t\tconst previous = counts[deltaArgs.operation] as undefined | number;\n\t\tcounts[deltaArgs.operation] = previous === undefined ? 1 : previous + 1;\n\t};\n\n\tmergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs) => {\n\t\tfn(deltaArgs);\n\t};\n\tmergeTree.mergeTreeMaintenanceCallback = fn;\n\n\treturn counts;\n}\n\nfunction getPartialLengths(\n\tclientId: number,\n\tseq: number,\n\tmergeTree: MergeTree,\n\tlocalSeq?: number,\n\tmergeBlock: IMergeBlock = mergeTree.root,\n) {\n\tconst partialLen = mergeBlock.partialLengths?.getPartialLength(seq, clientId, localSeq);\n\n\tlet actualLen = 0;\n\n\tconst isInserted = (segment: ISegment) =>\n\t\tsegment.seq === undefined ||\n\t\t(segment.seq !== UnassignedSequenceNumber && segment.seq <= seq) ||\n\t\t(localSeq !== undefined &&\n\t\t\tsegment.seq === UnassignedSequenceNumber &&\n\t\t\tsegment.localSeq !== undefined &&\n\t\t\tsegment.localSeq <= localSeq);\n\n\tconst isRemoved = (segment: ISegment) =>\n\t\tsegment.removedSeq !== undefined &&\n\t\t((localSeq !== undefined &&\n\t\t\tsegment.removedSeq === UnassignedSequenceNumber &&\n\t\t\tsegment.localRemovedSeq !== undefined &&\n\t\t\tsegment.localRemovedSeq <= localSeq) ||\n\t\t\t(segment.removedSeq !== UnassignedSequenceNumber && segment.removedSeq <= seq));\n\n\tconst isMoved = (segment: ISegment) =>\n\t\tsegment.movedSeq !== undefined &&\n\t\t((localSeq !== undefined &&\n\t\t\tsegment.movedSeq === UnassignedSequenceNumber &&\n\t\t\tsegment.localMovedSeq !== undefined &&\n\t\t\tsegment.localMovedSeq <= localSeq) ||\n\t\t\t(segment.movedSeq !== UnassignedSequenceNumber && segment.movedSeq <= seq));\n\n\twalkAllChildSegments(mergeBlock, (segment) => {\n\t\tif (isInserted(segment) && !isRemoved(segment) && !isMoved(segment)) {\n\t\t\tactualLen += segment.cachedLength;\n\t\t}\n\t\treturn true;\n\t});\n\n\treturn {\n\t\tpartialLen,\n\t\tactualLen,\n\t};\n}\n\nexport function validatePartialLengths(\n\tclientId: number,\n\tmergeTree: MergeTree,\n\texpectedValues?: { seq: number; len: number; localSeq?: number }[],\n\tlocalSeq?: number,\n\tmergeBlock: IMergeBlock = mergeTree.root,\n): void {\n\tmergeTree.computeLocalPartials(0);\n\tfor (let i = mergeTree.collabWindow.minSeq + 1; i <= mergeTree.collabWindow.currentSeq; i++) {\n\t\tconst { partialLen, actualLen } = getPartialLengths(\n\t\t\tclientId,\n\t\t\ti,\n\t\t\tmergeTree,\n\t\t\tlocalSeq,\n\t\t\tmergeBlock,\n\t\t);\n\n\t\tif (partialLen && partialLen < 0) {\n\t\t\tassert.fail(\"Negative partial length returned\");\n\t\t}\n\t\tassert.equal(partialLen, actualLen);\n\t}\n\n\tif (!expectedValues) {\n\t\treturn;\n\t}\n\n\tfor (const { seq, len, localSeq: expectedLocalSeq } of expectedValues) {\n\t\tconst { partialLen, actualLen } = getPartialLengths(\n\t\t\tclientId,\n\t\t\tseq,\n\t\t\tmergeTree,\n\t\t\texpectedLocalSeq ?? localSeq,\n\t\t\tmergeBlock,\n\t\t);\n\n\t\tassert.equal(partialLen, len);\n\t\tassert.equal(actualLen, len);\n\t}\n}\n\nexport function validateRefCount(collection?: LocalReferenceCollection) {\n\tif (!collection) {\n\t\treturn;\n\t}\n\n\tconst expectedLength = Array.from(collection).length;\n\n\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\tassert.equal(collection[\"refCount\"], expectedLength);\n}\n\n/**\n * Enable stricter partial length assertions inside tests\n *\n * Note that these assertions can be expensive, and so should not be enabled in\n * production code or tests that run through thousands of ops (e.g. the SharedString\n * fuzz tests).\n */\nexport function useStrictPartialLengthChecks() {\n\tbeforeEach(() => {\n\t\tPartialSequenceLengths.options.verifier = verifyPartialLengths;\n\t\tPartialSequenceLengths.options.verifyExpected = verifyExpectedPartialLengths;\n\t});\n\n\tafterEach(() => {\n\t\tPartialSequenceLengths.options.verifier = undefined;\n\t\tPartialSequenceLengths.options.verifyExpected = undefined;\n\t});\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { ISegment } from "../mergeTreeNodes.js";
6
+ import { MergeTree } from "../mergeTree.js";
7
+ export declare function loadSegments(content: string, segLimit: number, markers?: boolean, withProps?: boolean): ISegment[];
8
+ export declare function loadText(content: string, mergeTree: MergeTree, segLimit: number, markers?: boolean): MergeTree;
9
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/test/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAU,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAe,EACxB,SAAS,GAAE,OAAc,cA6DzB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,UAAQ,aAIhG"}
@@ -0,0 +1,71 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Marker } from "../mergeTreeNodes.js";
6
+ import { ReferenceType } from "../ops.js";
7
+ import { reservedTileLabelsKey } from "../referencePositions.js";
8
+ import { TextSegment } from "../textSegment.js";
9
+ export function loadSegments(content, segLimit, markers = false, withProps = true) {
10
+ const BOMFreeContent = content.replace(/^\uFEFF/, "");
11
+ const paragraphs = BOMFreeContent.split(/\r?\n/);
12
+ for (let i = 0, len = paragraphs.length; i < len; i++) {
13
+ paragraphs[i] = paragraphs[i]
14
+ .replace(/\r?\n/g, " ")
15
+ .replace(/\u201c|\u201d/g, '"')
16
+ .replace(/\u2019/g, "'");
17
+ if (!markers && i !== paragraphs.length - 1) {
18
+ paragraphs[i] += "\n";
19
+ }
20
+ }
21
+ const segments = [];
22
+ for (const paragraph of paragraphs) {
23
+ let pgMarker;
24
+ if (markers) {
25
+ pgMarker = Marker.make(ReferenceType.Tile, { [reservedTileLabelsKey]: ["pg"] });
26
+ }
27
+ if (withProps) {
28
+ if (paragraph.includes("Chapter") || paragraph.includes("PRIDE AND PREJ")) {
29
+ if (pgMarker) {
30
+ pgMarker.addProperties({ header: 2 });
31
+ segments.push(new TextSegment(paragraph));
32
+ }
33
+ else {
34
+ segments.push(TextSegment.make(paragraph, { fontSize: "140%", lineHeight: "150%" }));
35
+ }
36
+ }
37
+ else {
38
+ const emphStrings = paragraph.split("_");
39
+ for (let i = 0, len = emphStrings.length; i < len; i++) {
40
+ // eslint-disable-next-line no-bitwise
41
+ if (i & 1) {
42
+ if (emphStrings[i].length > 0) {
43
+ segments.push(TextSegment.make(emphStrings[i], { fontStyle: "italic" }));
44
+ }
45
+ }
46
+ else {
47
+ if (emphStrings[i].length > 0) {
48
+ segments.push(new TextSegment(emphStrings[i]));
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ else {
55
+ segments.push(new TextSegment(paragraph));
56
+ }
57
+ if (pgMarker) {
58
+ segments.push(pgMarker);
59
+ }
60
+ }
61
+ if (segLimit > 0) {
62
+ segments.length = segLimit;
63
+ }
64
+ return segments;
65
+ }
66
+ export function loadText(content, mergeTree, segLimit, markers = false) {
67
+ const segments = loadSegments(content, segLimit, markers);
68
+ mergeTree.reloadFromSegments(segments);
69
+ return mergeTree;
70
+ }
71
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/test/text.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ISegment, Marker } from \"../mergeTreeNodes.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nexport function loadSegments(\n\tcontent: string,\n\tsegLimit: number,\n\tmarkers: boolean = false,\n\twithProps: boolean = true,\n) {\n\tconst BOMFreeContent = content.replace(/^\\uFEFF/, \"\");\n\n\tconst paragraphs = BOMFreeContent.split(/\\r?\\n/);\n\tfor (let i = 0, len = paragraphs.length; i < len; i++) {\n\t\tparagraphs[i] = paragraphs[i]\n\t\t\t.replace(/\\r?\\n/g, \" \")\n\t\t\t.replace(/\\u201c|\\u201d/g, '\"')\n\t\t\t.replace(/\\u2019/g, \"'\");\n\t\tif (!markers && i !== paragraphs.length - 1) {\n\t\t\tparagraphs[i] += \"\\n\";\n\t\t}\n\t}\n\n\tconst segments = [] as ISegment[];\n\tfor (const paragraph of paragraphs) {\n\t\tlet pgMarker: Marker | undefined;\n\t\tif (markers) {\n\t\t\tpgMarker = Marker.make(ReferenceType.Tile, { [reservedTileLabelsKey]: [\"pg\"] });\n\t\t}\n\t\tif (withProps) {\n\t\t\tif (paragraph.includes(\"Chapter\") || paragraph.includes(\"PRIDE AND PREJ\")) {\n\t\t\t\tif (pgMarker) {\n\t\t\t\t\tpgMarker.addProperties({ header: 2 });\n\t\t\t\t\tsegments.push(new TextSegment(paragraph));\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(\n\t\t\t\t\t\tTextSegment.make(paragraph, { fontSize: \"140%\", lineHeight: \"150%\" }),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst emphStrings = paragraph.split(\"_\");\n\t\t\t\tfor (let i = 0, len = emphStrings.length; i < len; i++) {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (i & 1) {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\tTextSegment.make(emphStrings[i], { fontStyle: \"italic\" }),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(new TextSegment(emphStrings[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsegments.push(new TextSegment(paragraph));\n\t\t}\n\t\tif (pgMarker) {\n\t\t\tsegments.push(pgMarker);\n\t\t}\n\t}\n\n\tif (segLimit > 0) {\n\t\tsegments.length = segLimit;\n\t}\n\n\treturn segments;\n}\n\nexport function loadText(content: string, mergeTree: MergeTree, segLimit: number, markers = false) {\n\tconst segments = loadSegments(content, segLimit, markers);\n\tmergeTree.reloadFromSegments(segments);\n\treturn mergeTree;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=tracking.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.spec.d.ts","sourceRoot":"","sources":["../../src/test/tracking.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,118 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "assert";
6
+ import { TrackingGroup } from "../mergeTreeTracking.js";
7
+ import { ReferenceType } from "../ops.js";
8
+ import { TestClient } from "./testClient.js";
9
+ describe("MergeTree.tracking", () => {
10
+ let testClient;
11
+ beforeEach(() => {
12
+ testClient = new TestClient();
13
+ testClient.startOrUpdateCollaboration("me");
14
+ });
15
+ it("Inserted segment should have empty tracking groups", () => {
16
+ testClient.insertTextLocal(0, "abc");
17
+ assert.equal(testClient.getLength(), 3);
18
+ const segmentInfo = testClient.getContainingSegment(0);
19
+ assert(segmentInfo?.segment?.trackingCollection.empty);
20
+ });
21
+ it("Insert single segment with single tracking group", () => {
22
+ const trackingGroup = new TrackingGroup();
23
+ testClient.on("delta", (opArgs, deltaArgs) => {
24
+ deltaArgs.deltaSegments.forEach((sg) => sg.segment.trackingCollection.link(trackingGroup));
25
+ });
26
+ testClient.insertTextLocal(0, "abc");
27
+ assert.equal(trackingGroup.size, 1);
28
+ const segmentInfo = testClient.getContainingSegment(0);
29
+ assert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);
30
+ assert(trackingGroup.unlink(segmentInfo.segment), "unlink segment should be true");
31
+ assert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 0);
32
+ });
33
+ it("Splitting segment should split tracking group", () => {
34
+ const trackingGroup = new TrackingGroup();
35
+ testClient.on("delta", (opArgs, deltaArgs) => {
36
+ deltaArgs.deltaSegments.forEach((sg) => sg.segment.trackingCollection.link(trackingGroup));
37
+ });
38
+ const ops = [testClient.insertTextLocal(0, "abc")];
39
+ testClient.removeAllListeners("delta");
40
+ assert.equal(trackingGroup.size, 1);
41
+ ops.push(testClient.insertTextLocal(1, "z"));
42
+ assert.equal(testClient.getLength(), 4);
43
+ assert.equal(trackingGroup.size, 2);
44
+ const segmentInfo = testClient.getContainingSegment(0);
45
+ assert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);
46
+ });
47
+ it("Zamboni should merge matching tracking groups", () => {
48
+ const trackingGroup = new TrackingGroup();
49
+ testClient.on("delta", (opArgs, deltaArgs) => {
50
+ deltaArgs.deltaSegments.forEach((sg) => sg.segment.trackingCollection.link(trackingGroup));
51
+ });
52
+ const ops = [testClient.insertTextLocal(0, "abc")];
53
+ assert.equal(trackingGroup.size, 1);
54
+ ops.push(testClient.insertTextLocal(1, "z"));
55
+ assert.equal(testClient.getLength(), 4);
56
+ assert.equal(trackingGroup.size, 3);
57
+ let segmentInfo = testClient.getContainingSegment(0);
58
+ assert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);
59
+ let seq = 1;
60
+ ops.forEach((op) => testClient.applyMsg(testClient.makeOpMessage(op, ++seq)));
61
+ assert.equal(trackingGroup.size, 3);
62
+ segmentInfo = testClient.getContainingSegment(0);
63
+ assert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);
64
+ testClient.updateMinSeq(seq);
65
+ assert.equal(trackingGroup.size, 1);
66
+ segmentInfo = testClient.getContainingSegment(0);
67
+ assert.equal(segmentInfo?.segment?.trackingCollection.trackingGroups.size, 1);
68
+ });
69
+ it("Newly created local reference should have empty tracking group", () => {
70
+ testClient.insertTextLocal(0, "abc");
71
+ assert.equal(testClient.getLength(), 3);
72
+ const segmentInfo = testClient.getContainingSegment(0);
73
+ assert(segmentInfo.segment);
74
+ const ref = testClient.createLocalReferencePosition(segmentInfo.segment, 0, ReferenceType.SlideOnRemove, undefined);
75
+ assert(ref.trackingCollection.empty);
76
+ });
77
+ it("Local reference can be added an removed from tracking group", () => {
78
+ testClient.insertTextLocal(0, "abc");
79
+ assert.equal(testClient.getLength(), 3);
80
+ const segmentInfo = testClient.getContainingSegment(0);
81
+ assert(segmentInfo.segment);
82
+ const ref = testClient.createLocalReferencePosition(segmentInfo.segment, 0, ReferenceType.SlideOnRemove, undefined);
83
+ const trackingGroup = new TrackingGroup();
84
+ ref.trackingCollection.link(trackingGroup);
85
+ assert.equal(trackingGroup.size, 1);
86
+ assert.equal(trackingGroup.has(ref), true);
87
+ assert.equal(trackingGroup.tracked.includes(ref), true);
88
+ assert.equal(ref.trackingCollection.trackingGroups.size, 1);
89
+ ref.trackingCollection.unlink(trackingGroup);
90
+ assert.equal(trackingGroup.size, 0);
91
+ assert.equal(trackingGroup.has(ref), false);
92
+ assert.equal(trackingGroup.tracked.includes(ref), false);
93
+ assert.equal(ref.trackingCollection.trackingGroups.size, 0);
94
+ });
95
+ it("unlink segment from tracking group", () => {
96
+ const trackingGroup = new TrackingGroup();
97
+ testClient.insertTextLocal(0, "abc");
98
+ const { segment } = testClient.getContainingSegment(0);
99
+ segment?.trackingCollection.link(trackingGroup);
100
+ assert.equal(segment?.trackingCollection.trackingGroups.size, 1);
101
+ assert(trackingGroup.unlink(segment), "unlink segment should be true");
102
+ assert.equal(segment?.trackingCollection.trackingGroups.size, 0);
103
+ assert.equal(trackingGroup.unlink(segment), false, "repeat unlink segment should be false");
104
+ assert.equal(segment.trackingCollection.unlink(trackingGroup), false, "repeat unlink trackingGroup should be false");
105
+ });
106
+ it("unlink tracking group from collection", () => {
107
+ const trackingGroup = new TrackingGroup();
108
+ testClient.insertTextLocal(0, "abc");
109
+ const { segment } = testClient.getContainingSegment(0);
110
+ segment?.trackingCollection.link(trackingGroup);
111
+ assert.equal(segment?.trackingCollection.trackingGroups.size, 1);
112
+ assert(segment.trackingCollection.unlink(trackingGroup), "unlink trackingGroup should be true");
113
+ assert.equal(segment?.trackingCollection.trackingGroups.size, 0);
114
+ assert.equal(trackingGroup.unlink(segment), false, "repeat unlink segment should be false");
115
+ assert.equal(segment.trackingCollection.unlink(trackingGroup), false, "repeat unlink trackingGroup should be false");
116
+ });
117
+ });
118
+ //# sourceMappingURL=tracking.spec.js.map