@fluidframework/merge-tree 2.0.0-internal.8.0.0 → 2.0.0-rc.1.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 (481) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +0 -6
  3. package/api-extractor-esm.json +17 -0
  4. package/api-extractor-lint.json +1 -10
  5. package/api-extractor.json +0 -4
  6. package/api-report/merge-tree.api.md +4 -9
  7. package/dist/client.d.ts +0 -7
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +0 -7
  10. package/dist/client.js.map +1 -1
  11. package/dist/merge-tree-alpha.d.ts +27 -12
  12. package/dist/merge-tree-beta.d.ts +0 -16
  13. package/dist/merge-tree-public.d.ts +0 -16
  14. package/dist/merge-tree-untrimmed.d.ts +5 -29
  15. package/dist/mergeTree.d.ts +0 -17
  16. package/dist/mergeTree.d.ts.map +1 -1
  17. package/dist/mergeTree.js +0 -130
  18. package/dist/mergeTree.js.map +1 -1
  19. package/dist/ops.d.ts +1 -1
  20. package/dist/ops.js +1 -1
  21. package/dist/ops.js.map +1 -1
  22. package/dist/revertibles.d.ts +4 -4
  23. package/dist/revertibles.js +3 -3
  24. package/dist/revertibles.js.map +1 -1
  25. package/dist/test/Insertion.perf.spec.d.ts +6 -0
  26. package/dist/test/Insertion.perf.spec.d.ts.map +1 -0
  27. package/dist/test/Insertion.perf.spec.js +113 -0
  28. package/dist/test/Insertion.perf.spec.js.map +1 -0
  29. package/dist/test/PartialLengths.perf.spec.d.ts +6 -0
  30. package/dist/test/PartialLengths.perf.spec.d.ts.map +1 -0
  31. package/dist/test/PartialLengths.perf.spec.js +67 -0
  32. package/dist/test/PartialLengths.perf.spec.js.map +1 -0
  33. package/dist/test/Removal.perf.spec.d.ts +6 -0
  34. package/dist/test/Removal.perf.spec.d.ts.map +1 -0
  35. package/dist/test/Removal.perf.spec.js +166 -0
  36. package/dist/test/Removal.perf.spec.js.map +1 -0
  37. package/dist/test/Snapshot.perf.spec.d.ts +6 -0
  38. package/dist/test/Snapshot.perf.spec.d.ts.map +1 -0
  39. package/dist/test/Snapshot.perf.spec.js +33 -0
  40. package/dist/test/Snapshot.perf.spec.js.map +1 -0
  41. package/dist/test/attributionCollection.perf.spec.d.ts +6 -0
  42. package/dist/test/attributionCollection.perf.spec.d.ts.map +1 -0
  43. package/dist/test/attributionCollection.perf.spec.js +231 -0
  44. package/dist/test/attributionCollection.perf.spec.js.map +1 -0
  45. package/dist/test/attributionCollection.spec.d.ts +6 -0
  46. package/dist/test/attributionCollection.spec.d.ts.map +1 -0
  47. package/dist/test/attributionCollection.spec.js +486 -0
  48. package/dist/test/attributionCollection.spec.js.map +1 -0
  49. package/dist/test/attributionPolicy.spec.d.ts +6 -0
  50. package/dist/test/attributionPolicy.spec.d.ts.map +1 -0
  51. package/dist/test/attributionPolicy.spec.js +189 -0
  52. package/dist/test/attributionPolicy.spec.js.map +1 -0
  53. package/dist/test/beastTest.d.ts +54 -0
  54. package/dist/test/beastTest.d.ts.map +1 -0
  55. package/dist/test/beastTest.js +1333 -0
  56. package/dist/test/beastTest.js.map +1 -0
  57. package/dist/test/client.annotateMarker.spec.d.ts +6 -0
  58. package/dist/test/client.annotateMarker.spec.d.ts.map +1 -0
  59. package/dist/test/client.annotateMarker.spec.js +45 -0
  60. package/dist/test/client.annotateMarker.spec.js.map +1 -0
  61. package/dist/test/client.apis.d.ts +7 -0
  62. package/dist/test/client.apis.d.ts.map +1 -0
  63. package/dist/test/client.apis.js +72 -0
  64. package/dist/test/client.apis.js.map +1 -0
  65. package/dist/test/client.applyMsg.spec.d.ts +6 -0
  66. package/dist/test/client.applyMsg.spec.d.ts.map +1 -0
  67. package/dist/test/client.applyMsg.spec.js +500 -0
  68. package/dist/test/client.applyMsg.spec.js.map +1 -0
  69. package/dist/test/client.applyStashedOpFarm.spec.d.ts +12 -0
  70. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -0
  71. package/dist/test/client.applyStashedOpFarm.spec.js +144 -0
  72. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -0
  73. package/dist/test/client.attributionFarm.spec.d.ts +7 -0
  74. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -0
  75. package/dist/test/client.attributionFarm.spec.js +96 -0
  76. package/dist/test/client.attributionFarm.spec.js.map +1 -0
  77. package/dist/test/client.conflictFarm.spec.d.ts +15 -0
  78. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -0
  79. package/dist/test/client.conflictFarm.spec.js +88 -0
  80. package/dist/test/client.conflictFarm.spec.js.map +1 -0
  81. package/dist/test/client.getPosition.spec.d.ts +6 -0
  82. package/dist/test/client.getPosition.spec.d.ts.map +1 -0
  83. package/dist/test/client.getPosition.spec.js +54 -0
  84. package/dist/test/client.getPosition.spec.js.map +1 -0
  85. package/dist/test/client.localReference.spec.d.ts +6 -0
  86. package/dist/test/client.localReference.spec.d.ts.map +1 -0
  87. package/dist/test/client.localReference.spec.js +439 -0
  88. package/dist/test/client.localReference.spec.js.map +1 -0
  89. package/dist/test/client.localReferenceFarm.spec.d.ts +6 -0
  90. package/dist/test/client.localReferenceFarm.spec.d.ts.map +1 -0
  91. package/dist/test/client.localReferenceFarm.spec.js +88 -0
  92. package/dist/test/client.localReferenceFarm.spec.js.map +1 -0
  93. package/dist/test/client.rebasePosition.spec.d.ts +6 -0
  94. package/dist/test/client.rebasePosition.spec.d.ts.map +1 -0
  95. package/dist/test/client.rebasePosition.spec.js +102 -0
  96. package/dist/test/client.rebasePosition.spec.js.map +1 -0
  97. package/dist/test/client.reconnectFarm.spec.d.ts +12 -0
  98. package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -0
  99. package/dist/test/client.reconnectFarm.spec.js +91 -0
  100. package/dist/test/client.reconnectFarm.spec.js.map +1 -0
  101. package/dist/test/client.replay.spec.d.ts +6 -0
  102. package/dist/test/client.replay.spec.d.ts.map +1 -0
  103. package/dist/test/client.replay.spec.js +85 -0
  104. package/dist/test/client.replay.spec.js.map +1 -0
  105. package/dist/test/client.rollback.spec.d.ts +6 -0
  106. package/dist/test/client.rollback.spec.d.ts.map +1 -0
  107. package/dist/test/client.rollback.spec.js +453 -0
  108. package/dist/test/client.rollback.spec.js.map +1 -0
  109. package/dist/test/client.rollbackFarm.spec.d.ts +6 -0
  110. package/dist/test/client.rollbackFarm.spec.d.ts.map +1 -0
  111. package/dist/test/client.rollbackFarm.spec.js +48 -0
  112. package/dist/test/client.rollbackFarm.spec.js.map +1 -0
  113. package/dist/test/client.searchForMarker.spec.d.ts +6 -0
  114. package/dist/test/client.searchForMarker.spec.d.ts.map +1 -0
  115. package/dist/test/client.searchForMarker.spec.js +446 -0
  116. package/dist/test/client.searchForMarker.spec.js.map +1 -0
  117. package/dist/test/client.walkSegments.spec.d.ts +6 -0
  118. package/dist/test/client.walkSegments.spec.d.ts.map +1 -0
  119. package/dist/test/client.walkSegments.spec.js +54 -0
  120. package/dist/test/client.walkSegments.spec.js.map +1 -0
  121. package/dist/test/collections.list.spec.d.ts +6 -0
  122. package/dist/test/collections.list.spec.d.ts.map +1 -0
  123. package/dist/test/collections.list.spec.js +84 -0
  124. package/dist/test/collections.list.spec.js.map +1 -0
  125. package/dist/test/createInsertOnlyAttributionPolicy.spec.d.ts +6 -0
  126. package/dist/test/createInsertOnlyAttributionPolicy.spec.d.ts.map +1 -0
  127. package/dist/test/createInsertOnlyAttributionPolicy.spec.js +35 -0
  128. package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -0
  129. package/dist/test/index.d.ts +13 -0
  130. package/dist/test/index.d.ts.map +1 -0
  131. package/dist/test/index.js +88 -0
  132. package/dist/test/index.js.map +1 -0
  133. package/dist/test/mergeTree.annotate.deltaCallback.spec.d.ts +6 -0
  134. package/dist/test/mergeTree.annotate.deltaCallback.spec.d.ts.map +1 -0
  135. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +142 -0
  136. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -0
  137. package/dist/test/mergeTree.annotate.spec.d.ts +6 -0
  138. package/dist/test/mergeTree.annotate.spec.d.ts.map +1 -0
  139. package/dist/test/mergeTree.annotate.spec.js +448 -0
  140. package/dist/test/mergeTree.annotate.spec.js.map +1 -0
  141. package/dist/test/mergeTree.insert.deltaCallback.spec.d.ts +6 -0
  142. package/dist/test/mergeTree.insert.deltaCallback.spec.d.ts.map +1 -0
  143. package/dist/test/mergeTree.insert.deltaCallback.spec.js +126 -0
  144. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -0
  145. package/dist/test/mergeTree.insertingWalk.spec.d.ts +6 -0
  146. package/dist/test/mergeTree.insertingWalk.spec.d.ts.map +1 -0
  147. package/dist/test/mergeTree.insertingWalk.spec.js +279 -0
  148. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -0
  149. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts +6 -0
  150. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.d.ts.map +1 -0
  151. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +178 -0
  152. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -0
  153. package/dist/test/mergeTree.markRangeRemoved.spec.d.ts +6 -0
  154. package/dist/test/mergeTree.markRangeRemoved.spec.d.ts.map +1 -0
  155. package/dist/test/mergeTree.markRangeRemoved.spec.js +130 -0
  156. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -0
  157. package/dist/test/mergeTree.walk.spec.d.ts +6 -0
  158. package/dist/test/mergeTree.walk.spec.d.ts.map +1 -0
  159. package/dist/test/mergeTree.walk.spec.js +63 -0
  160. package/dist/test/mergeTree.walk.spec.js.map +1 -0
  161. package/dist/test/mergeTree.zamboni.spec.d.ts +6 -0
  162. package/dist/test/mergeTree.zamboni.spec.d.ts.map +1 -0
  163. package/dist/test/mergeTree.zamboni.spec.js +52 -0
  164. package/dist/test/mergeTree.zamboni.spec.js.map +1 -0
  165. package/dist/test/mergeTreeOperationRunner.d.ts +63 -0
  166. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -0
  167. package/dist/test/mergeTreeOperationRunner.js +245 -0
  168. package/dist/test/mergeTreeOperationRunner.js.map +1 -0
  169. package/dist/test/mergeTreeOperationRunner.spec.d.ts +6 -0
  170. package/dist/test/mergeTreeOperationRunner.spec.d.ts.map +1 -0
  171. package/dist/test/mergeTreeOperationRunner.spec.js +156 -0
  172. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -0
  173. package/dist/test/obliterate.concurrent.spec.d.ts +6 -0
  174. package/dist/test/obliterate.concurrent.spec.d.ts.map +1 -0
  175. package/dist/test/obliterate.concurrent.spec.js +1446 -0
  176. package/dist/test/obliterate.concurrent.spec.js.map +1 -0
  177. package/dist/test/obliterate.partialLength.spec.d.ts +6 -0
  178. package/dist/test/obliterate.partialLength.spec.d.ts.map +1 -0
  179. package/dist/test/obliterate.partialLength.spec.js +279 -0
  180. package/dist/test/obliterate.partialLength.spec.js.map +1 -0
  181. package/dist/test/obliterate.reconnect.spec.d.ts +6 -0
  182. package/dist/test/obliterate.reconnect.spec.d.ts.map +1 -0
  183. package/dist/test/obliterate.reconnect.spec.js +164 -0
  184. package/dist/test/obliterate.reconnect.spec.js.map +1 -0
  185. package/dist/test/obliterate.spec.d.ts +6 -0
  186. package/dist/test/obliterate.spec.d.ts.map +1 -0
  187. package/dist/test/obliterate.spec.js +162 -0
  188. package/dist/test/obliterate.spec.js.map +1 -0
  189. package/dist/test/ordinal.spec.d.ts +2 -0
  190. package/dist/test/ordinal.spec.d.ts.map +1 -0
  191. package/dist/test/ordinal.spec.js +43 -0
  192. package/dist/test/ordinal.spec.js.map +1 -0
  193. package/dist/test/partialLength.spec.d.ts +6 -0
  194. package/dist/test/partialLength.spec.d.ts.map +1 -0
  195. package/dist/test/partialLength.spec.js +282 -0
  196. package/dist/test/partialLength.spec.js.map +1 -0
  197. package/dist/test/properties.spec.d.ts +6 -0
  198. package/dist/test/properties.spec.d.ts.map +1 -0
  199. package/dist/test/properties.spec.js +55 -0
  200. package/dist/test/properties.spec.js.map +1 -0
  201. package/dist/test/reconnectHelper.d.ts +48 -0
  202. package/dist/test/reconnectHelper.d.ts.map +1 -0
  203. package/dist/test/reconnectHelper.js +86 -0
  204. package/dist/test/reconnectHelper.js.map +1 -0
  205. package/dist/test/resetPendingSegmentsToOp.spec.d.ts +6 -0
  206. package/dist/test/resetPendingSegmentsToOp.spec.d.ts.map +1 -0
  207. package/dist/test/resetPendingSegmentsToOp.spec.js +218 -0
  208. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -0
  209. package/dist/test/revertibleFarm.spec.d.ts +6 -0
  210. package/dist/test/revertibleFarm.spec.d.ts.map +1 -0
  211. package/dist/test/revertibleFarm.spec.js +124 -0
  212. package/dist/test/revertibleFarm.spec.js.map +1 -0
  213. package/dist/test/revertibles.spec.d.ts +17 -0
  214. package/dist/test/revertibles.spec.d.ts.map +1 -0
  215. package/dist/test/revertibles.spec.js +385 -0
  216. package/dist/test/revertibles.spec.js.map +1 -0
  217. package/dist/test/segmentGroupCollection.spec.d.ts +6 -0
  218. package/dist/test/segmentGroupCollection.spec.d.ts.map +1 -0
  219. package/dist/test/segmentGroupCollection.spec.js +60 -0
  220. package/dist/test/segmentGroupCollection.spec.js.map +1 -0
  221. package/dist/test/snapshot.spec.d.ts +6 -0
  222. package/dist/test/snapshot.spec.d.ts.map +1 -0
  223. package/dist/test/snapshot.spec.js +178 -0
  224. package/dist/test/snapshot.spec.js.map +1 -0
  225. package/dist/test/snapshot.utils.d.ts +33 -0
  226. package/dist/test/snapshot.utils.d.ts.map +1 -0
  227. package/dist/test/snapshot.utils.js +109 -0
  228. package/dist/test/snapshot.utils.js.map +1 -0
  229. package/dist/test/snapshotlegacy.spec.d.ts +6 -0
  230. package/dist/test/snapshotlegacy.spec.d.ts.map +1 -0
  231. package/dist/test/snapshotlegacy.spec.js +139 -0
  232. package/dist/test/snapshotlegacy.spec.js.map +1 -0
  233. package/dist/test/sortedSegmentSet.spec.d.ts +6 -0
  234. package/dist/test/sortedSegmentSet.spec.d.ts.map +1 -0
  235. package/dist/test/sortedSegmentSet.spec.js +95 -0
  236. package/dist/test/sortedSegmentSet.spec.js.map +1 -0
  237. package/dist/test/testClient.d.ts +119 -0
  238. package/dist/test/testClient.d.ts.map +1 -0
  239. package/dist/test/testClient.js +439 -0
  240. package/dist/test/testClient.js.map +1 -0
  241. package/dist/test/testClientLogger.d.ts +44 -0
  242. package/dist/test/testClientLogger.d.ts.map +1 -0
  243. package/dist/test/testClientLogger.js +287 -0
  244. package/dist/test/testClientLogger.js.map +1 -0
  245. package/dist/test/testSerializer.d.ts +18 -0
  246. package/dist/test/testSerializer.d.ts.map +1 -0
  247. package/dist/test/testSerializer.js +33 -0
  248. package/dist/test/testSerializer.js.map +1 -0
  249. package/dist/test/testServer.d.ts +36 -0
  250. package/dist/test/testServer.d.ts.map +1 -0
  251. package/dist/test/testServer.js +138 -0
  252. package/dist/test/testServer.js.map +1 -0
  253. package/dist/test/testUtils.d.ts +69 -0
  254. package/dist/test/testUtils.d.ts.map +1 -0
  255. package/dist/test/testUtils.js +149 -0
  256. package/dist/test/testUtils.js.map +1 -0
  257. package/dist/test/text.d.ts +9 -0
  258. package/dist/test/text.d.ts.map +1 -0
  259. package/dist/test/text.js +76 -0
  260. package/dist/test/text.js.map +1 -0
  261. package/dist/test/tracking.spec.d.ts +6 -0
  262. package/dist/test/tracking.spec.d.ts.map +1 -0
  263. package/dist/test/tracking.spec.js +120 -0
  264. package/dist/test/tracking.spec.js.map +1 -0
  265. package/dist/test/wordUnitTests.d.ts +6 -0
  266. package/dist/test/wordUnitTests.d.ts.map +1 -0
  267. package/dist/test/wordUnitTests.js +172 -0
  268. package/dist/test/wordUnitTests.js.map +1 -0
  269. package/lib/{MergeTreeTextHelper.d.ts → MergeTreeTextHelper.d.mts} +3 -3
  270. package/lib/MergeTreeTextHelper.d.mts.map +1 -0
  271. package/lib/{MergeTreeTextHelper.js → MergeTreeTextHelper.mjs} +5 -10
  272. package/lib/MergeTreeTextHelper.mjs.map +1 -0
  273. package/lib/{attributionCollection.d.ts → attributionCollection.d.mts} +2 -2
  274. package/lib/attributionCollection.d.mts.map +1 -0
  275. package/lib/{attributionCollection.js → attributionCollection.mjs} +9 -14
  276. package/lib/attributionCollection.mjs.map +1 -0
  277. package/lib/{attributionPolicy.d.ts → attributionPolicy.d.mts} +2 -2
  278. package/lib/attributionPolicy.d.mts.map +1 -0
  279. package/lib/{attributionPolicy.js → attributionPolicy.mjs} +21 -27
  280. package/lib/attributionPolicy.mjs.map +1 -0
  281. package/lib/{client.d.ts → client.d.mts} +9 -16
  282. package/lib/client.d.mts.map +1 -0
  283. package/lib/{client.js → client.mjs} +101 -110
  284. package/lib/client.mjs.map +1 -0
  285. package/lib/collections/{index.d.ts → index.d.mts} +3 -3
  286. package/lib/collections/index.d.mts.map +1 -0
  287. package/lib/collections/index.mjs +7 -0
  288. package/lib/collections/index.mjs.map +1 -0
  289. package/lib/collections/{list.d.ts → list.d.mts} +1 -1
  290. package/lib/collections/list.d.mts.map +1 -0
  291. package/lib/collections/{list.js → list.mjs} +6 -11
  292. package/lib/collections/list.mjs.map +1 -0
  293. package/lib/collections/{rbTree.d.ts → rbTree.d.mts} +1 -1
  294. package/lib/collections/rbTree.d.mts.map +1 -0
  295. package/lib/collections/{rbTree.js → rbTree.mjs} +16 -20
  296. package/lib/collections/rbTree.mjs.map +1 -0
  297. package/lib/{constants.d.ts → constants.d.mts} +1 -1
  298. package/lib/constants.d.mts.map +1 -0
  299. package/lib/constants.mjs +32 -0
  300. package/lib/constants.mjs.map +1 -0
  301. package/lib/{endOfTreeSegment.d.ts → endOfTreeSegment.d.mts} +4 -4
  302. package/lib/endOfTreeSegment.d.mts.map +1 -0
  303. package/lib/{endOfTreeSegment.js → endOfTreeSegment.mjs} +13 -18
  304. package/lib/endOfTreeSegment.mjs.map +1 -0
  305. package/lib/{index.d.ts → index.d.mts} +21 -21
  306. package/lib/index.d.mts.map +1 -0
  307. package/lib/index.mjs +24 -0
  308. package/lib/index.mjs.map +1 -0
  309. package/lib/{localReference.d.ts → localReference.d.mts} +7 -7
  310. package/lib/localReference.d.mts.map +1 -0
  311. package/lib/{localReference.js → localReference.mjs} +38 -47
  312. package/lib/localReference.mjs.map +1 -0
  313. package/lib/{merge-tree-alpha.d.ts → merge-tree-alpha.d.mts} +27 -12
  314. package/lib/{merge-tree-beta.d.ts → merge-tree-beta.d.mts} +0 -16
  315. package/lib/{merge-tree-public.d.ts → merge-tree-public.d.mts} +0 -16
  316. package/lib/{merge-tree-untrimmed.d.ts → merge-tree-untrimmed.d.mts} +5 -29
  317. package/lib/{mergeTree.d.ts → mergeTree.d.mts} +12 -29
  318. package/lib/mergeTree.d.mts.map +1 -0
  319. package/lib/{mergeTree.js → mergeTree.mjs} +203 -340
  320. package/lib/mergeTree.mjs.map +1 -0
  321. package/lib/{mergeTreeDeltaCallback.d.ts → mergeTreeDeltaCallback.d.mts} +4 -8
  322. package/lib/mergeTreeDeltaCallback.d.mts.map +1 -0
  323. package/lib/{mergeTreeDeltaCallback.js → mergeTreeDeltaCallback.mjs} +2 -5
  324. package/lib/mergeTreeDeltaCallback.mjs.map +1 -0
  325. package/lib/{mergeTreeNodeWalk.d.ts → mergeTreeNodeWalk.d.mts} +2 -2
  326. package/lib/mergeTreeNodeWalk.d.mts.map +1 -0
  327. package/lib/{mergeTreeNodeWalk.js → mergeTreeNodeWalk.mjs} +14 -21
  328. package/lib/mergeTreeNodeWalk.mjs.map +1 -0
  329. package/lib/{mergeTreeNodes.d.ts → mergeTreeNodes.d.mts} +12 -12
  330. package/lib/mergeTreeNodes.d.mts.map +1 -0
  331. package/lib/{mergeTreeNodes.js → mergeTreeNodes.mjs} +60 -76
  332. package/lib/mergeTreeNodes.mjs.map +1 -0
  333. package/lib/{mergeTreeTracking.d.ts → mergeTreeTracking.d.mts} +3 -3
  334. package/lib/mergeTreeTracking.d.mts.map +1 -0
  335. package/lib/{mergeTreeTracking.js → mergeTreeTracking.mjs} +6 -13
  336. package/lib/mergeTreeTracking.mjs.map +1 -0
  337. package/lib/{opBuilder.d.ts → opBuilder.d.mts} +4 -4
  338. package/lib/opBuilder.d.mts.map +1 -0
  339. package/lib/{opBuilder.js → opBuilder.mjs} +15 -25
  340. package/lib/opBuilder.mjs.map +1 -0
  341. package/lib/{ops.d.ts → ops.d.mts} +2 -2
  342. package/lib/ops.d.mts.map +1 -0
  343. package/lib/{ops.js → ops.mjs} +5 -8
  344. package/lib/ops.mjs.map +1 -0
  345. package/lib/{ordinal.d.ts → ordinal.d.mts} +1 -1
  346. package/lib/ordinal.d.mts.map +1 -0
  347. package/lib/{ordinal.js → ordinal.mjs} +4 -9
  348. package/lib/ordinal.mjs.map +1 -0
  349. package/lib/{partialLengths.d.ts → partialLengths.d.mts} +4 -4
  350. package/lib/partialLengths.d.mts.map +1 -0
  351. package/lib/{partialLengths.js → partialLengths.mjs} +38 -46
  352. package/lib/partialLengths.mjs.map +1 -0
  353. package/lib/{properties.d.ts → properties.d.mts} +1 -1
  354. package/lib/properties.d.mts.map +1 -0
  355. package/lib/{properties.js → properties.mjs} +7 -16
  356. package/lib/properties.mjs.map +1 -0
  357. package/lib/{referencePositions.d.ts → referencePositions.d.mts} +5 -5
  358. package/lib/referencePositions.d.mts.map +1 -0
  359. package/lib/referencePositions.mjs +70 -0
  360. package/lib/referencePositions.mjs.map +1 -0
  361. package/lib/{revertibles.d.ts → revertibles.d.mts} +12 -12
  362. package/lib/revertibles.d.mts.map +1 -0
  363. package/lib/{revertibles.js → revertibles.mjs} +60 -67
  364. package/lib/revertibles.mjs.map +1 -0
  365. package/lib/{segmentGroupCollection.d.ts → segmentGroupCollection.d.mts} +2 -2
  366. package/lib/segmentGroupCollection.d.mts.map +1 -0
  367. package/lib/{segmentGroupCollection.js → segmentGroupCollection.mjs} +5 -9
  368. package/lib/segmentGroupCollection.mjs.map +1 -0
  369. package/lib/{segmentPropertiesManager.d.ts → segmentPropertiesManager.d.mts} +3 -3
  370. package/lib/segmentPropertiesManager.d.mts.map +1 -0
  371. package/lib/{segmentPropertiesManager.js → segmentPropertiesManager.mjs} +14 -20
  372. package/lib/{segmentPropertiesManager.js.map → segmentPropertiesManager.mjs.map} +1 -1
  373. package/lib/{snapshotChunks.d.ts → snapshotChunks.d.mts} +4 -4
  374. package/lib/snapshotChunks.d.mts.map +1 -0
  375. package/lib/{snapshotChunks.js → snapshotChunks.mjs} +10 -17
  376. package/lib/snapshotChunks.mjs.map +1 -0
  377. package/lib/{snapshotLoader.d.ts → snapshotLoader.d.mts} +3 -3
  378. package/lib/snapshotLoader.d.mts.map +1 -0
  379. package/lib/{snapshotLoader.js → snapshotLoader.mjs} +33 -38
  380. package/lib/snapshotLoader.mjs.map +1 -0
  381. package/lib/{snapshotV1.d.ts → snapshotV1.d.mts} +4 -4
  382. package/lib/snapshotV1.d.mts.map +1 -0
  383. package/lib/{snapshotV1.js → snapshotV1.mjs} +28 -32
  384. package/lib/snapshotV1.mjs.map +1 -0
  385. package/lib/{snapshotlegacy.d.ts → snapshotlegacy.d.mts} +3 -3
  386. package/lib/snapshotlegacy.d.mts.map +1 -0
  387. package/lib/{snapshotlegacy.js → snapshotlegacy.mjs} +21 -26
  388. package/lib/snapshotlegacy.mjs.map +1 -0
  389. package/lib/{sortedSegmentSet.d.ts → sortedSegmentSet.d.mts} +4 -4
  390. package/lib/sortedSegmentSet.d.mts.map +1 -0
  391. package/lib/{sortedSegmentSet.js → sortedSegmentSet.mjs} +3 -8
  392. package/lib/sortedSegmentSet.mjs.map +1 -0
  393. package/lib/{sortedSet.d.ts → sortedSet.d.mts} +1 -1
  394. package/lib/sortedSet.d.mts.map +1 -0
  395. package/lib/{sortedSet.js → sortedSet.mjs} +2 -6
  396. package/lib/sortedSet.mjs.map +1 -0
  397. package/lib/{textSegment.d.ts → textSegment.d.mts} +4 -4
  398. package/lib/textSegment.d.mts.map +1 -0
  399. package/lib/{textSegment.js → textSegment.mjs} +8 -12
  400. package/lib/textSegment.mjs.map +1 -0
  401. package/lib/{zamboni.d.ts → zamboni.d.mts} +3 -3
  402. package/lib/zamboni.d.mts.map +1 -0
  403. package/lib/{zamboni.js → zamboni.mjs} +22 -28
  404. package/lib/zamboni.mjs.map +1 -0
  405. package/package.json +95 -164
  406. package/src/client.ts +0 -8
  407. package/src/mergeTree.ts +0 -226
  408. package/src/ops.ts +1 -1
  409. package/src/revertibles.ts +4 -4
  410. package/lib/MergeTreeTextHelper.d.ts.map +0 -1
  411. package/lib/MergeTreeTextHelper.js.map +0 -1
  412. package/lib/attributionCollection.d.ts.map +0 -1
  413. package/lib/attributionCollection.js.map +0 -1
  414. package/lib/attributionPolicy.d.ts.map +0 -1
  415. package/lib/attributionPolicy.js.map +0 -1
  416. package/lib/client.d.ts.map +0 -1
  417. package/lib/client.js.map +0 -1
  418. package/lib/collections/index.d.ts.map +0 -1
  419. package/lib/collections/index.js +0 -14
  420. package/lib/collections/index.js.map +0 -1
  421. package/lib/collections/list.d.ts.map +0 -1
  422. package/lib/collections/list.js.map +0 -1
  423. package/lib/collections/rbTree.d.ts.map +0 -1
  424. package/lib/collections/rbTree.js.map +0 -1
  425. package/lib/constants.d.ts.map +0 -1
  426. package/lib/constants.js +0 -35
  427. package/lib/constants.js.map +0 -1
  428. package/lib/endOfTreeSegment.d.ts.map +0 -1
  429. package/lib/endOfTreeSegment.js.map +0 -1
  430. package/lib/index.d.ts.map +0 -1
  431. package/lib/index.js +0 -80
  432. package/lib/index.js.map +0 -1
  433. package/lib/localReference.d.ts.map +0 -1
  434. package/lib/localReference.js.map +0 -1
  435. package/lib/mergeTree.d.ts.map +0 -1
  436. package/lib/mergeTree.js.map +0 -1
  437. package/lib/mergeTreeDeltaCallback.d.ts.map +0 -1
  438. package/lib/mergeTreeDeltaCallback.js.map +0 -1
  439. package/lib/mergeTreeNodeWalk.d.ts.map +0 -1
  440. package/lib/mergeTreeNodeWalk.js.map +0 -1
  441. package/lib/mergeTreeNodes.d.ts.map +0 -1
  442. package/lib/mergeTreeNodes.js.map +0 -1
  443. package/lib/mergeTreeTracking.d.ts.map +0 -1
  444. package/lib/mergeTreeTracking.js.map +0 -1
  445. package/lib/opBuilder.d.ts.map +0 -1
  446. package/lib/opBuilder.js.map +0 -1
  447. package/lib/ops.d.ts.map +0 -1
  448. package/lib/ops.js.map +0 -1
  449. package/lib/ordinal.d.ts.map +0 -1
  450. package/lib/ordinal.js.map +0 -1
  451. package/lib/partialLengths.d.ts.map +0 -1
  452. package/lib/partialLengths.js.map +0 -1
  453. package/lib/properties.d.ts.map +0 -1
  454. package/lib/properties.js.map +0 -1
  455. package/lib/referencePositions.d.ts.map +0 -1
  456. package/lib/referencePositions.js +0 -80
  457. package/lib/referencePositions.js.map +0 -1
  458. package/lib/revertibles.d.ts.map +0 -1
  459. package/lib/revertibles.js.map +0 -1
  460. package/lib/segmentGroupCollection.d.ts.map +0 -1
  461. package/lib/segmentGroupCollection.js.map +0 -1
  462. package/lib/segmentPropertiesManager.d.ts.map +0 -1
  463. package/lib/snapshotChunks.d.ts.map +0 -1
  464. package/lib/snapshotChunks.js.map +0 -1
  465. package/lib/snapshotLoader.d.ts.map +0 -1
  466. package/lib/snapshotLoader.js.map +0 -1
  467. package/lib/snapshotV1.d.ts.map +0 -1
  468. package/lib/snapshotV1.js.map +0 -1
  469. package/lib/snapshotlegacy.d.ts.map +0 -1
  470. package/lib/snapshotlegacy.js.map +0 -1
  471. package/lib/sortedSegmentSet.d.ts.map +0 -1
  472. package/lib/sortedSegmentSet.js.map +0 -1
  473. package/lib/sortedSet.d.ts.map +0 -1
  474. package/lib/sortedSet.js.map +0 -1
  475. package/lib/textSegment.d.ts.map +0 -1
  476. package/lib/textSegment.js.map +0 -1
  477. package/lib/zamboni.d.ts.map +0 -1
  478. package/lib/zamboni.js.map +0 -1
  479. package/merge-tree.test-files.tar +0 -0
  480. package/src/mergeTreeExample1.pdf +0 -0
  481. package/tsconfig.esnext.json +0 -6
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const assert_1 = require("assert");
8
+ const constants_1 = require("../constants");
9
+ const mergeTreeDeltaCallback_1 = require("../mergeTreeDeltaCallback");
10
+ const ops_1 = require("../ops");
11
+ const textSegment_1 = require("../textSegment");
12
+ const mergeTree_1 = require("../mergeTree");
13
+ const testUtils_1 = require("./testUtils");
14
+ describe("MergeTree", () => {
15
+ let mergeTree;
16
+ const localClientId = 17;
17
+ let currentSequenceNumber;
18
+ beforeEach(() => {
19
+ mergeTree = new mergeTree_1.MergeTree();
20
+ (0, testUtils_1.insertSegments)({
21
+ mergeTree,
22
+ pos: 0,
23
+ segments: [textSegment_1.TextSegment.make("hello world!")],
24
+ refSeq: constants_1.UniversalSequenceNumber,
25
+ clientId: constants_1.LocalClientId,
26
+ seq: constants_1.UniversalSequenceNumber,
27
+ opArgs: undefined,
28
+ });
29
+ currentSequenceNumber = 0;
30
+ mergeTree.startCollaboration(localClientId,
31
+ /* minSeq: */ currentSequenceNumber,
32
+ /* currentSeq: */ currentSequenceNumber);
33
+ });
34
+ describe("markRangeRemoved", () => {
35
+ it("Event on Removal", () => {
36
+ const count = (0, testUtils_1.countOperations)(mergeTree);
37
+ (0, testUtils_1.markRangeRemoved)({
38
+ mergeTree,
39
+ start: 4,
40
+ end: 6,
41
+ refSeq: currentSequenceNumber,
42
+ clientId: localClientId,
43
+ seq: constants_1.UnassignedSequenceNumber,
44
+ overwrite: false,
45
+ opArgs: undefined,
46
+ });
47
+ assert_1.strict.deepStrictEqual(count, {
48
+ [ops_1.MergeTreeDeltaType.REMOVE]: 1,
49
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.SPLIT]: 2,
50
+ });
51
+ });
52
+ // Verify that zamboni unlinks a removed segment and raises the appropriate maintenance event.
53
+ it("Event on Unlink", () => {
54
+ const count = (0, testUtils_1.countOperations)(mergeTree);
55
+ const start = 4;
56
+ const end = 6;
57
+ (0, testUtils_1.markRangeRemoved)({
58
+ mergeTree,
59
+ start,
60
+ end,
61
+ refSeq: currentSequenceNumber,
62
+ clientId: localClientId,
63
+ seq: constants_1.UnassignedSequenceNumber,
64
+ overwrite: false,
65
+ opArgs: undefined,
66
+ });
67
+ // In order for the removed segment to unlinked by zamboni, we need to ACK the segment
68
+ // and advance the collaboration window's minSeq past the removedSeq.
69
+ mergeTree.ackPendingSegment({
70
+ op: {
71
+ pos1: start,
72
+ pos2: end,
73
+ type: ops_1.MergeTreeDeltaType.REMOVE,
74
+ },
75
+ sequencedMessage: {
76
+ sequenceNumber: ++currentSequenceNumber,
77
+ },
78
+ });
79
+ // Move currentSeq/minSeq past the seq# at which the removal was ACKed.
80
+ mergeTree.collabWindow.currentSeq = currentSequenceNumber;
81
+ mergeTree.setMinSeq(currentSequenceNumber);
82
+ assert_1.strict.deepStrictEqual(count, {
83
+ [ops_1.MergeTreeDeltaType.REMOVE]: 1,
84
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.SPLIT]: 2,
85
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.UNLINK]: 1,
86
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.ACKNOWLEDGED]: 1,
87
+ });
88
+ });
89
+ it("Remote Before Local", () => {
90
+ const remoteClientId = 35;
91
+ let remoteSequenceNumber = currentSequenceNumber;
92
+ (0, testUtils_1.markRangeRemoved)({
93
+ mergeTree,
94
+ start: 4,
95
+ end: 6,
96
+ refSeq: remoteSequenceNumber,
97
+ clientId: remoteClientId,
98
+ seq: ++remoteSequenceNumber,
99
+ overwrite: false,
100
+ opArgs: undefined,
101
+ });
102
+ const count = (0, testUtils_1.countOperations)(mergeTree);
103
+ (0, testUtils_1.markRangeRemoved)({
104
+ mergeTree,
105
+ start: 3,
106
+ end: 5,
107
+ refSeq: currentSequenceNumber,
108
+ clientId: localClientId,
109
+ seq: constants_1.UnassignedSequenceNumber,
110
+ overwrite: false,
111
+ opArgs: undefined,
112
+ });
113
+ assert_1.strict.deepStrictEqual(count, {
114
+ [ops_1.MergeTreeDeltaType.REMOVE]: 1,
115
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.SPLIT]: 2,
116
+ });
117
+ });
118
+ it("Local Before Remote", () => {
119
+ const remoteClientId = 35;
120
+ let remoteSequenceNumber = currentSequenceNumber;
121
+ (0, testUtils_1.markRangeRemoved)({
122
+ mergeTree,
123
+ start: 4,
124
+ end: 6,
125
+ refSeq: currentSequenceNumber,
126
+ clientId: localClientId,
127
+ seq: constants_1.UnassignedSequenceNumber,
128
+ overwrite: false,
129
+ opArgs: undefined,
130
+ });
131
+ const count = (0, testUtils_1.countOperations)(mergeTree);
132
+ (0, testUtils_1.markRangeRemoved)({
133
+ mergeTree,
134
+ start: 3,
135
+ end: 5,
136
+ refSeq: remoteSequenceNumber,
137
+ clientId: remoteClientId,
138
+ seq: ++remoteSequenceNumber,
139
+ overwrite: false,
140
+ opArgs: undefined,
141
+ });
142
+ assert_1.strict.deepStrictEqual(count, {
143
+ [ops_1.MergeTreeDeltaType.REMOVE]: 1,
144
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.SPLIT]: 2,
145
+ });
146
+ });
147
+ it("Local delete shadows remote", () => {
148
+ const remoteClientId = 35;
149
+ let remoteSequenceNumber = currentSequenceNumber;
150
+ (0, testUtils_1.markRangeRemoved)({
151
+ mergeTree,
152
+ start: 3,
153
+ end: 6,
154
+ refSeq: currentSequenceNumber,
155
+ clientId: localClientId,
156
+ seq: constants_1.UnassignedSequenceNumber,
157
+ overwrite: false,
158
+ opArgs: undefined,
159
+ });
160
+ const count = (0, testUtils_1.countOperations)(mergeTree);
161
+ (0, testUtils_1.markRangeRemoved)({
162
+ mergeTree,
163
+ start: 4,
164
+ end: 5,
165
+ refSeq: remoteSequenceNumber,
166
+ clientId: remoteClientId,
167
+ seq: ++remoteSequenceNumber,
168
+ overwrite: false,
169
+ opArgs: undefined,
170
+ });
171
+ assert_1.strict.deepStrictEqual(count, {
172
+ /* MergeTreeDeltaType.REMOVE is absent as it should not be fired. */
173
+ [mergeTreeDeltaCallback_1.MergeTreeMaintenanceType.SPLIT]: 2,
174
+ });
175
+ });
176
+ });
177
+ });
178
+ //# sourceMappingURL=mergeTree.markRangeRemoved.deltaCallback.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.markRangeRemoved.deltaCallback.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.markRangeRemoved.deltaCallback.spec.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 { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { LocalClientId, UnassignedSequenceNumber, UniversalSequenceNumber } from \"../constants\";\nimport { MergeTreeMaintenanceType } from \"../mergeTreeDeltaCallback\";\nimport { MergeTreeDeltaType } from \"../ops\";\nimport { TextSegment } from \"../textSegment\";\nimport { MergeTree } from \"../mergeTree\";\nimport { countOperations, insertSegments, markRangeRemoved } from \"./testUtils\";\n\ndescribe(\"MergeTree\", () => {\n\tlet mergeTree: MergeTree;\n\tconst localClientId = 17;\n\tlet currentSequenceNumber: number;\n\tbeforeEach(() => {\n\t\tmergeTree = new MergeTree();\n\t\tinsertSegments({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(\"hello world!\")],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: LocalClientId,\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\t\tcurrentSequenceNumber = 0;\n\t\tmergeTree.startCollaboration(\n\t\t\tlocalClientId,\n\t\t\t/* minSeq: */ currentSequenceNumber,\n\t\t\t/* currentSeq: */ currentSequenceNumber,\n\t\t);\n\t});\n\n\tdescribe(\"markRangeRemoved\", () => {\n\t\tit(\"Event on Removal\", () => {\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 4,\n\t\t\t\tend: 6,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.REMOVE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\t// Verify that zamboni unlinks a removed segment and raises the appropriate maintenance event.\n\t\tit(\"Event on Unlink\", () => {\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tconst start = 4;\n\t\t\tconst end = 6;\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\t// In order for the removed segment to unlinked by zamboni, we need to ACK the segment\n\t\t\t// and advance the collaboration window's minSeq past the removedSeq.\n\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\top: {\n\t\t\t\t\tpos1: start,\n\t\t\t\t\tpos2: end,\n\t\t\t\t\ttype: MergeTreeDeltaType.REMOVE,\n\t\t\t\t},\n\t\t\t\tsequencedMessage: {\n\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t} as any as ISequencedDocumentMessage,\n\t\t\t});\n\n\t\t\t// Move currentSeq/minSeq past the seq# at which the removal was ACKed.\n\t\t\tmergeTree.collabWindow.currentSeq = currentSequenceNumber;\n\t\t\tmergeTree.setMinSeq(currentSequenceNumber);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.REMOVE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t\t[MergeTreeMaintenanceType.UNLINK]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.ACKNOWLEDGED]: 1,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Remote Before Local\", () => {\n\t\t\tconst remoteClientId: number = 35;\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 4,\n\t\t\t\tend: 6,\n\t\t\t\trefSeq: remoteSequenceNumber,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: ++remoteSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 3,\n\t\t\t\tend: 5,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.REMOVE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Local Before Remote\", () => {\n\t\t\tconst remoteClientId: number = 35;\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 4,\n\t\t\t\tend: 6,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 3,\n\t\t\t\tend: 5,\n\t\t\t\trefSeq: remoteSequenceNumber,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: ++remoteSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.REMOVE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Local delete shadows remote\", () => {\n\t\t\tconst remoteClientId: number = 35;\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 3,\n\t\t\t\tend: 6,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 4,\n\t\t\t\tend: 5,\n\t\t\t\trefSeq: remoteSequenceNumber,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: ++remoteSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as any,\n\t\t\t});\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t/* MergeTreeDeltaType.REMOVE is absent as it should not be fired. */\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\t});\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=mergeTree.markRangeRemoved.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.markRangeRemoved.spec.d.ts","sourceRoot":"","sources":["../../src/test/mergeTree.markRangeRemoved.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const assert_1 = require("assert");
9
+ const constants_1 = require("../constants");
10
+ const opBuilder_1 = require("../opBuilder");
11
+ const textSegment_1 = require("../textSegment");
12
+ const testClient_1 = require("./testClient");
13
+ describe("MergeTree.markRangeRemoved", () => {
14
+ let client;
15
+ beforeEach(() => {
16
+ client = new testClient_1.TestClient();
17
+ client.startOrUpdateCollaboration("local");
18
+ for (const char of "hello world") {
19
+ client.applyMsg(client.makeOpMessage(client.insertTextLocal(client.getLength(), char), client.getCurrentSeq() + 1));
20
+ }
21
+ assert_1.strict.equal(client.getText(), "hello world");
22
+ });
23
+ it("local remove followed by local insert", () => {
24
+ client.removeRangeLocal(0, client.getLength());
25
+ assert_1.strict.equal(client.getText(), "");
26
+ client.insertTextLocal(0, "text");
27
+ assert_1.strict.equal(client.getText(), "text");
28
+ });
29
+ it("local insert followed by local remove", () => {
30
+ client.insertTextLocal(0, "text");
31
+ assert_1.strict.equal(client.getText(), "texthello world");
32
+ client.removeRangeLocal(0, client.getLength());
33
+ assert_1.strict.equal(client.getText(), "");
34
+ });
35
+ it("remote remove followed by local insert", () => {
36
+ client.applyMsg(client.makeOpMessage((0, opBuilder_1.createRemoveRangeOp)(0, client.getLength()), client.mergeTree.collabWindow.currentSeq + 1, client.mergeTree.collabWindow.currentSeq, "remote"));
37
+ assert_1.strict.equal(client.getText(), "");
38
+ client.insertTextLocal(0, "text");
39
+ assert_1.strict.equal(client.getText(), "text");
40
+ });
41
+ it("local remove followed by remote insert", () => {
42
+ client.removeRangeLocal(0, client.getLength());
43
+ assert_1.strict.equal(client.getText(), "");
44
+ client.applyMsg(client.makeOpMessage((0, opBuilder_1.createInsertSegmentOp)(0, textSegment_1.TextSegment.make("text")), client.mergeTree.collabWindow.currentSeq + 1, client.mergeTree.collabWindow.currentSeq, "remote"));
45
+ assert_1.strict.equal(client.getText(), "text");
46
+ });
47
+ it("local remove followed by remote overlapping remove", () => {
48
+ const originalSeq = client.getCurrentSeq();
49
+ let seq = originalSeq;
50
+ const remoteDeleteMessage = client.makeOpMessage((0, opBuilder_1.createRemoveRangeOp)(0, client.getLength()), ++seq, undefined, "remote");
51
+ const segmentExpectedRemovedSeq = seq;
52
+ const { segment } = client.getContainingSegment(0);
53
+ (0, assert_1.strict)(segment !== undefined, "expected to find segment");
54
+ const localDeleteMessage = client.makeOpMessage(client.removeRangeLocal(0, client.getLength()), ++seq, originalSeq /* refSeq */);
55
+ assert_1.strict.equal(client.getText(), "");
56
+ assert_1.strict.equal(segment.removedSeq, constants_1.UnassignedSequenceNumber);
57
+ (0, assert_1.strict)(segment.localRemovedSeq !== undefined);
58
+ const expectedLocalRemovedSeq = segment.localRemovedSeq;
59
+ client.applyMsg(remoteDeleteMessage);
60
+ assert_1.strict.equal(segment.removedSeq, segmentExpectedRemovedSeq);
61
+ assert_1.strict.equal(segment.localRemovedSeq, expectedLocalRemovedSeq);
62
+ assert_1.strict.equal(client.getText(), "");
63
+ // localRemovedSeq should remain on the segment until the local removal has been acked.
64
+ // This ensures there's enough information to determine segment length in the case of
65
+ // reconnect.
66
+ client.applyMsg(localDeleteMessage);
67
+ assert_1.strict.equal(segment.removedSeq, segmentExpectedRemovedSeq);
68
+ assert_1.strict.equal(segment.localRemovedSeq, undefined);
69
+ assert_1.strict.equal(client.getText(), "");
70
+ });
71
+ it("remote remove followed by remote insert", () => {
72
+ const removeMsg = client.makeOpMessage((0, opBuilder_1.createRemoveRangeOp)(0, client.getLength()), client.mergeTree.collabWindow.currentSeq + 1, client.mergeTree.collabWindow.currentSeq, "remote2");
73
+ const insertMsg = client.makeOpMessage((0, opBuilder_1.createInsertSegmentOp)(0, textSegment_1.TextSegment.make("text")), client.mergeTree.collabWindow.currentSeq + 2, client.mergeTree.collabWindow.currentSeq, "remote");
74
+ client.applyMsg(removeMsg);
75
+ client.applyMsg(insertMsg);
76
+ assert_1.strict.equal(client.getText(), "text");
77
+ });
78
+ it("remote insert followed by remote remove", () => {
79
+ const insertMsg = client.makeOpMessage((0, opBuilder_1.createInsertSegmentOp)(0, textSegment_1.TextSegment.make("text")), client.mergeTree.collabWindow.currentSeq + 1, client.mergeTree.collabWindow.currentSeq, "remote");
80
+ const removeMsg = client.makeOpMessage((0, opBuilder_1.createRemoveRangeOp)(0, client.getLength()), client.mergeTree.collabWindow.currentSeq + 2, client.mergeTree.collabWindow.currentSeq, "remote2");
81
+ client.applyMsg(insertMsg);
82
+ client.applyMsg(removeMsg);
83
+ assert_1.strict.equal(client.getText(), "text");
84
+ });
85
+ it("local and remote clients race to insert at position of removed segment", () => {
86
+ // Note: This test constructs its own TestClients to avoid being initialized with "hello world".
87
+ // First we run through the ops from the perspective of a passive observer (i.e., all operations are remote).
88
+ const expected = new testClient_1.TestClient();
89
+ expected.startOrUpdateCollaboration("3");
90
+ {
91
+ let seq = 0;
92
+ // Client 1 locally inserts and removes the letter "a".
93
+ expected.insertTextRemote(0, "a", undefined, ++seq,
94
+ /* refSeq: */ 0,
95
+ /* longClientId: */ "1");
96
+ expected.removeRangeRemote(0, 1, ++seq, /* refSeq: */ 0, /* longClientId: */ "1");
97
+ const refSeqAt2 = expected.getCurrentSeq();
98
+ // In parallel, Client 2 inserted "x" without knowledge of Client 1's insertion/removal.
99
+ expected.insertTextRemote(0, "X", undefined, ++seq,
100
+ /* refSeq: */ 0,
101
+ /* longClientId: */ "2");
102
+ // Client 1 inserts "c" having received acks for its own edits, but has not yet having
103
+ // observed the insertion of "X" from client 2.
104
+ expected.insertTextRemote(0, "c", undefined, ++seq, refSeqAt2, /* longClientId: */ "1");
105
+ }
106
+ // Next, we run through the same sequence from the perspective of client 1:
107
+ const actual = new testClient_1.TestClient();
108
+ actual.startOrUpdateCollaboration("1");
109
+ {
110
+ let seq = 0;
111
+ // Client 1 locally inserts and removes the letter "a".
112
+ const op1 = actual.insertTextLocal(0, "a");
113
+ const op2 = actual.removeRangeLocal(0, 1);
114
+ // Client 1 receives ACKs for op1 and op2.
115
+ actual.applyMsg(actual.makeOpMessage(op1, ++seq, /* refSeq: */ 0));
116
+ actual.applyMsg(actual.makeOpMessage(op2, ++seq, /* refSeq: */ 0));
117
+ const refSeqAt2 = actual.getCurrentSeq();
118
+ // Client 1 locally inserts "c".
119
+ const op4 = actual.insertTextLocal(0, "c");
120
+ // Client 1 then processes the parallel insertion of "X" from Client 2 at refSeq=0
121
+ actual.insertTextRemote(0, "X", undefined, ++seq,
122
+ /* refSeq: */ 0,
123
+ /* longClientId: */ "2");
124
+ // Finally, client 1 receives the ack for its insertion of "c".
125
+ actual.applyMsg(actual.makeOpMessage(op4, ++seq, refSeqAt2));
126
+ }
127
+ assert_1.strict.equal(actual.getText(), expected.getText());
128
+ });
129
+ });
130
+ //# sourceMappingURL=mergeTree.markRangeRemoved.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.markRangeRemoved.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.markRangeRemoved.spec.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/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"assert\";\nimport { UnassignedSequenceNumber } from \"../constants\";\nimport { createInsertSegmentOp, createRemoveRangeOp } from \"../opBuilder\";\nimport { TextSegment } from \"../textSegment\";\nimport { TestClient } from \"./testClient\";\n\ndescribe(\"MergeTree.markRangeRemoved\", () => {\n\tlet client: TestClient;\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.startOrUpdateCollaboration(\"local\");\n\t\tfor (const char of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), char),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tassert.equal(client.getText(), \"hello world\");\n\t});\n\n\tit(\"local remove followed by local insert\", () => {\n\t\tclient.removeRangeLocal(0, client.getLength());\n\t\tassert.equal(client.getText(), \"\");\n\n\t\tclient.insertTextLocal(0, \"text\");\n\t\tassert.equal(client.getText(), \"text\");\n\t});\n\n\tit(\"local insert followed by local remove\", () => {\n\t\tclient.insertTextLocal(0, \"text\");\n\t\tassert.equal(client.getText(), \"texthello world\");\n\n\t\tclient.removeRangeLocal(0, client.getLength());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\n\tit(\"remote remove followed by local insert\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(0, client.getLength()),\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t\t\"remote\",\n\t\t\t),\n\t\t);\n\n\t\tassert.equal(client.getText(), \"\");\n\n\t\tclient.insertTextLocal(0, \"text\");\n\t\tassert.equal(client.getText(), \"text\");\n\t});\n\n\tit(\"local remove followed by remote insert\", () => {\n\t\tclient.removeRangeLocal(0, client.getLength());\n\t\tassert.equal(client.getText(), \"\");\n\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(0, TextSegment.make(\"text\")),\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t\t\"remote\",\n\t\t\t),\n\t\t);\n\n\t\tassert.equal(client.getText(), \"text\");\n\t});\n\n\tit(\"local remove followed by remote overlapping remove\", () => {\n\t\tconst originalSeq = client.getCurrentSeq();\n\t\tlet seq = originalSeq;\n\t\tconst remoteDeleteMessage = client.makeOpMessage(\n\t\t\tcreateRemoveRangeOp(0, client.getLength()),\n\t\t\t++seq,\n\t\t\tundefined,\n\t\t\t\"remote\",\n\t\t);\n\t\tconst segmentExpectedRemovedSeq = seq;\n\t\tconst { segment } = client.getContainingSegment(0);\n\t\tassert(segment !== undefined, \"expected to find segment\");\n\t\tconst localDeleteMessage = client.makeOpMessage(\n\t\t\tclient.removeRangeLocal(0, client.getLength()),\n\t\t\t++seq,\n\t\t\toriginalSeq /* refSeq */,\n\t\t);\n\n\t\tassert.equal(client.getText(), \"\");\n\t\tassert.equal(segment.removedSeq, UnassignedSequenceNumber);\n\t\tassert(segment.localRemovedSeq !== undefined);\n\t\tconst expectedLocalRemovedSeq = segment.localRemovedSeq;\n\n\t\tclient.applyMsg(remoteDeleteMessage);\n\t\tassert.equal(segment.removedSeq, segmentExpectedRemovedSeq);\n\t\tassert.equal(segment.localRemovedSeq, expectedLocalRemovedSeq);\n\t\tassert.equal(client.getText(), \"\");\n\n\t\t// localRemovedSeq should remain on the segment until the local removal has been acked.\n\t\t// This ensures there's enough information to determine segment length in the case of\n\t\t// reconnect.\n\t\tclient.applyMsg(localDeleteMessage);\n\t\tassert.equal(segment.removedSeq, segmentExpectedRemovedSeq);\n\t\tassert.equal(segment.localRemovedSeq, undefined);\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\n\tit(\"remote remove followed by remote insert\", () => {\n\t\tconst removeMsg = client.makeOpMessage(\n\t\t\tcreateRemoveRangeOp(0, client.getLength()),\n\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t\"remote2\",\n\t\t);\n\n\t\tconst insertMsg = client.makeOpMessage(\n\t\t\tcreateInsertSegmentOp(0, TextSegment.make(\"text\")),\n\t\t\tclient.mergeTree.collabWindow.currentSeq + 2,\n\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t\"remote\",\n\t\t);\n\n\t\tclient.applyMsg(removeMsg);\n\t\tclient.applyMsg(insertMsg);\n\n\t\tassert.equal(client.getText(), \"text\");\n\t});\n\n\tit(\"remote insert followed by remote remove\", () => {\n\t\tconst insertMsg = client.makeOpMessage(\n\t\t\tcreateInsertSegmentOp(0, TextSegment.make(\"text\")),\n\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t\"remote\",\n\t\t);\n\n\t\tconst removeMsg = client.makeOpMessage(\n\t\t\tcreateRemoveRangeOp(0, client.getLength()),\n\t\t\tclient.mergeTree.collabWindow.currentSeq + 2,\n\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t\"remote2\",\n\t\t);\n\n\t\tclient.applyMsg(insertMsg);\n\t\tclient.applyMsg(removeMsg);\n\n\t\tassert.equal(client.getText(), \"text\");\n\t});\n\n\tit(\"local and remote clients race to insert at position of removed segment\", () => {\n\t\t// Note: This test constructs its own TestClients to avoid being initialized with \"hello world\".\n\n\t\t// First we run through the ops from the perspective of a passive observer (i.e., all operations are remote).\n\t\tconst expected = new TestClient();\n\t\texpected.startOrUpdateCollaboration(\"3\");\n\n\t\t{\n\t\t\tlet seq = 0;\n\n\t\t\t// Client 1 locally inserts and removes the letter \"a\".\n\t\t\texpected.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"a\",\n\t\t\t\tundefined,\n\t\t\t\t++seq,\n\t\t\t\t/* refSeq: */ 0,\n\t\t\t\t/* longClientId: */ \"1\",\n\t\t\t);\n\t\t\texpected.removeRangeRemote(0, 1, ++seq, /* refSeq: */ 0, /* longClientId: */ \"1\");\n\t\t\tconst refSeqAt2 = expected.getCurrentSeq();\n\n\t\t\t// In parallel, Client 2 inserted \"x\" without knowledge of Client 1's insertion/removal.\n\t\t\texpected.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"X\",\n\t\t\t\tundefined,\n\t\t\t\t++seq,\n\t\t\t\t/* refSeq: */ 0,\n\t\t\t\t/* longClientId: */ \"2\",\n\t\t\t);\n\n\t\t\t// Client 1 inserts \"c\" having received acks for its own edits, but has not yet having\n\t\t\t// observed the insertion of \"X\" from client 2.\n\t\t\texpected.insertTextRemote(0, \"c\", undefined, ++seq, refSeqAt2, /* longClientId: */ \"1\");\n\t\t}\n\n\t\t// Next, we run through the same sequence from the perspective of client 1:\n\t\tconst actual = new TestClient();\n\t\tactual.startOrUpdateCollaboration(\"1\");\n\n\t\t{\n\t\t\tlet seq = 0;\n\n\t\t\t// Client 1 locally inserts and removes the letter \"a\".\n\t\t\tconst op1 = actual.insertTextLocal(0, \"a\")!;\n\t\t\tconst op2 = actual.removeRangeLocal(0, 1);\n\n\t\t\t// Client 1 receives ACKs for op1 and op2.\n\t\t\tactual.applyMsg(actual.makeOpMessage(op1, ++seq, /* refSeq: */ 0));\n\t\t\tactual.applyMsg(actual.makeOpMessage(op2, ++seq, /* refSeq: */ 0));\n\t\t\tconst refSeqAt2 = actual.getCurrentSeq();\n\n\t\t\t// Client 1 locally inserts \"c\".\n\t\t\tconst op4 = actual.insertTextLocal(0, \"c\");\n\n\t\t\t// Client 1 then processes the parallel insertion of \"X\" from Client 2 at refSeq=0\n\t\t\tactual.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"X\",\n\t\t\t\tundefined,\n\t\t\t\t++seq,\n\t\t\t\t/* refSeq: */ 0,\n\t\t\t\t/* longClientId: */ \"2\",\n\t\t\t);\n\n\t\t\t// Finally, client 1 receives the ack for its insertion of \"c\".\n\t\t\tactual.applyMsg(actual.makeOpMessage(op4, ++seq, refSeqAt2));\n\t\t}\n\n\t\tassert.equal(actual.getText(), expected.getText());\n\t});\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=mergeTree.walk.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.walk.spec.d.ts","sourceRoot":"","sources":["../../src/test/mergeTree.walk.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const assert_1 = require("assert");
8
+ const mergeTreeNodes_1 = require("../mergeTreeNodes");
9
+ const textSegment_1 = require("../textSegment");
10
+ const constants_1 = require("../constants");
11
+ const mergeTree_1 = require("../mergeTree");
12
+ const mergeTreeNodeWalk_1 = require("../mergeTreeNodeWalk");
13
+ const testUtils_1 = require("./testUtils");
14
+ const localClientId = 17;
15
+ describe("MergeTree walks", () => {
16
+ let mergeTree;
17
+ beforeEach(() => {
18
+ let initialText = "0";
19
+ mergeTree = new mergeTree_1.MergeTree();
20
+ mergeTree.insertSegments(0, [textSegment_1.TextSegment.make(initialText)], constants_1.UniversalSequenceNumber, constants_1.LocalClientId, constants_1.UniversalSequenceNumber, undefined);
21
+ for (let i = 1; i < mergeTreeNodes_1.MaxNodesInBlock * mergeTreeNodes_1.MaxNodesInBlock; i++) {
22
+ const text = i.toString();
23
+ (0, testUtils_1.insertText)({
24
+ mergeTree,
25
+ pos: mergeTree.getLength(constants_1.UniversalSequenceNumber, localClientId),
26
+ refSeq: constants_1.UniversalSequenceNumber,
27
+ clientId: localClientId,
28
+ seq: constants_1.UniversalSequenceNumber,
29
+ text,
30
+ props: undefined,
31
+ opArgs: undefined,
32
+ });
33
+ initialText += text;
34
+ }
35
+ });
36
+ describe("walkAllChildSegments", () => {
37
+ function* getAllDescendantBlocks(block) {
38
+ yield block;
39
+ for (let i = 0; i < block.childCount; i++) {
40
+ const child = block.children[i];
41
+ if (!child.isLeaf()) {
42
+ yield* getAllDescendantBlocks(child);
43
+ }
44
+ }
45
+ }
46
+ it("visits only descendants", () => {
47
+ for (const block of getAllDescendantBlocks(mergeTree.root)) {
48
+ let walkedAnySegments = false;
49
+ (0, mergeTreeNodeWalk_1.walkAllChildSegments)(block, (seg) => {
50
+ walkedAnySegments = true;
51
+ let current = seg.parent;
52
+ while (current !== block && current !== undefined) {
53
+ current = current.parent;
54
+ }
55
+ (0, assert_1.strict)(current === block, "Expected all visited segments to be descendants");
56
+ return true;
57
+ });
58
+ (0, assert_1.strict)(walkedAnySegments, "Walk should have hit segments");
59
+ }
60
+ });
61
+ });
62
+ });
63
+ //# sourceMappingURL=mergeTree.walk.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.walk.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.walk.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,mCAA0C;AAC1C,sDAA6E;AAC7E,gDAA6C;AAC7C,4CAAsE;AACtE,4CAAyC;AACzC,4DAA4D;AAC5D,2CAAyC;AAEzC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,IAAI,SAAoB,CAAC;IACzB,UAAU,CAAC,GAAG,EAAE;QACf,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;QAC5B,SAAS,CAAC,cAAc,CACvB,CAAC,EACD,CAAC,yBAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAC/B,mCAAuB,EACvB,yBAAa,EACb,mCAAuB,EACvB,SAAS,CACT,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gCAAe,GAAG,gCAAe,EAAE,CAAC,EAAE,EAAE;YAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAA,sBAAU,EAAC;gBACV,SAAS;gBACT,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,mCAAuB,EAAE,aAAa,CAAC;gBAChE,MAAM,EAAE,mCAAuB;gBAC/B,QAAQ,EAAE,aAAa;gBACvB,GAAG,EAAE,mCAAuB;gBAC5B,IAAI;gBACJ,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,WAAW,IAAI,IAAI,CAAC;SACpB;IACF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACrC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,KAAkB;YAClD,MAAM,KAAK,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;gBAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACpB,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;iBACrC;aACD;QACF,CAAC;QAED,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YAClC,KAAK,MAAM,KAAK,IAAI,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBAC3D,IAAI,iBAAiB,GAAG,KAAK,CAAC;gBAC9B,IAAA,wCAAoB,EAAC,KAAK,EAAE,CAAC,GAAe,EAAE,EAAE;oBAC/C,iBAAiB,GAAG,IAAI,CAAC;oBACzB,IAAI,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;oBACzB,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,SAAS,EAAE;wBAClD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;qBACzB;oBACD,IAAA,eAAM,EAAC,OAAO,KAAK,KAAK,EAAE,iDAAiD,CAAC,CAAC;oBAC7E,OAAO,IAAI,CAAC;gBACb,CAAC,CAAC,CAAC;gBACH,IAAA,eAAM,EAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAC;aAC3D;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","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 { IMergeBlock, IMergeLeaf, MaxNodesInBlock } from \"../mergeTreeNodes\";\nimport { TextSegment } from \"../textSegment\";\nimport { LocalClientId, UniversalSequenceNumber } from \"../constants\";\nimport { MergeTree } from \"../mergeTree\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk\";\nimport { insertText } from \"./testUtils\";\n\nconst localClientId = 17;\n\ndescribe(\"MergeTree walks\", () => {\n\tlet mergeTree: MergeTree;\n\tbeforeEach(() => {\n\t\tlet initialText = \"0\";\n\t\tmergeTree = new MergeTree();\n\t\tmergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(initialText)],\n\t\t\tUniversalSequenceNumber,\n\t\t\tLocalClientId,\n\t\t\tUniversalSequenceNumber,\n\t\t\tundefined,\n\t\t);\n\t\tfor (let i = 1; i < MaxNodesInBlock * MaxNodesInBlock; i++) {\n\t\t\tconst text = i.toString();\n\t\t\tinsertText({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: mergeTree.getLength(UniversalSequenceNumber, localClientId),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\ttext,\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tinitialText += text;\n\t\t}\n\t});\n\n\tdescribe(\"walkAllChildSegments\", () => {\n\t\tfunction* getAllDescendantBlocks(block: IMergeBlock): Iterable<IMergeBlock> {\n\t\t\tyield block;\n\t\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\t\tconst child = block.children[i];\n\t\t\t\tif (!child.isLeaf()) {\n\t\t\t\t\tyield* getAllDescendantBlocks(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tit(\"visits only descendants\", () => {\n\t\t\tfor (const block of getAllDescendantBlocks(mergeTree.root)) {\n\t\t\t\tlet walkedAnySegments = false;\n\t\t\t\twalkAllChildSegments(block, (seg: IMergeLeaf) => {\n\t\t\t\t\twalkedAnySegments = true;\n\t\t\t\t\tlet current = seg.parent;\n\t\t\t\t\twhile (current !== block && current !== undefined) {\n\t\t\t\t\t\tcurrent = current.parent;\n\t\t\t\t\t}\n\t\t\t\t\tassert(current === block, \"Expected all visited segments to be descendants\");\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t\tassert(walkedAnySegments, \"Walk should have hit segments\");\n\t\t\t}\n\t\t});\n\t});\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=mergeTree.zamboni.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.zamboni.spec.d.ts","sourceRoot":"","sources":["../../src/test/mergeTree.zamboni.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const assert_1 = require("assert");
8
+ const zamboni_1 = require("../zamboni");
9
+ const testClient_1 = require("./testClient");
10
+ describe("Zamboni Logic", () => {
11
+ let client;
12
+ const localUserLongId = "localUser";
13
+ beforeEach(() => {
14
+ client = new testClient_1.TestClient();
15
+ for (const c of "hello world") {
16
+ client.insertTextLocal(client.getLength(), c);
17
+ }
18
+ client.startOrUpdateCollaboration(localUserLongId);
19
+ });
20
+ it("packParent with no children segments", () => {
21
+ client.applyMsg(client.makeOpMessage(client.removeRangeLocal(0, client.getLength() - 1), 1));
22
+ (0, zamboni_1.packParent)(client.mergeTree.root, client.mergeTree);
23
+ assert_1.strict.equal(client.mergeTree.root.cachedLength, 1);
24
+ client.applyMsg(client.makeOpMessage(client.removeRangeLocal(0, client.getLength()), client.getCurrentSeq(), client.getCurrentSeq(), undefined, client.getCurrentSeq()));
25
+ assert_1.strict.equal(client.mergeTree.root.cachedLength ?? 0, 0);
26
+ (0, zamboni_1.packParent)(client.mergeTree.root, client.mergeTree);
27
+ assert_1.strict.equal(client.mergeTree.root.childCount, 0);
28
+ });
29
+ it("zamboni with no segments to scour", () => {
30
+ const cachedLength = client.mergeTree.root.cachedLength;
31
+ const childCount = client.mergeTree.root.childCount;
32
+ (0, zamboni_1.zamboniSegments)(client.mergeTree);
33
+ assert_1.strict.equal(cachedLength, client.mergeTree.root.cachedLength);
34
+ assert_1.strict.equal(childCount, client.mergeTree.root.childCount);
35
+ });
36
+ it("zamboni with one segment to scour", () => {
37
+ const initialChildCount = client.mergeTree.root.children[0].childCount;
38
+ const initialCachedLength = client.mergeTree.root.cachedLength ?? 0;
39
+ client.removeRangeLocal(0, 1);
40
+ (0, zamboni_1.zamboniSegments)(client.mergeTree);
41
+ assert_1.strict.equal(client.mergeTree.root.cachedLength, initialCachedLength - 1);
42
+ assert_1.strict.equal(client.mergeTree.root.children[0].childCount, initialChildCount);
43
+ });
44
+ it("zamboni with many segments to scour", () => {
45
+ client.removeRangeLocal(0, 6);
46
+ assert_1.strict.equal(client.mergeTree.root.children[0].cachedLength, 0);
47
+ (0, zamboni_1.zamboniSegments)(client.mergeTree);
48
+ (0, zamboni_1.packParent)(client.mergeTree.root, client.mergeTree);
49
+ assert_1.strict.equal(client.mergeTree.root.childCount, 1);
50
+ });
51
+ });
52
+ //# sourceMappingURL=mergeTree.zamboni.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTree.zamboni.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.zamboni.spec.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 { IMergeBlock } from \"../mergeTreeNodes\";\nimport { zamboniSegments, packParent } from \"../zamboni\";\nimport { TestClient } from \"./testClient\";\n\ndescribe(\"Zamboni Logic\", () => {\n\tlet client: TestClient;\n\tconst localUserLongId = \"localUser\";\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\tit(\"packParent with no children segments\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(0, client.getLength() - 1), 1),\n\t\t);\n\t\tpackParent(client.mergeTree.root, client.mergeTree);\n\t\tassert.equal(client.mergeTree.root.cachedLength, 1);\n\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(0, client.getLength()),\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tassert.equal(client.mergeTree.root.cachedLength ?? 0, 0);\n\n\t\tpackParent(client.mergeTree.root, client.mergeTree);\n\n\t\tassert.equal(client.mergeTree.root.childCount, 0);\n\t});\n\tit(\"zamboni with no segments to scour\", () => {\n\t\tconst cachedLength = client.mergeTree.root.cachedLength;\n\t\tconst childCount = client.mergeTree.root.childCount;\n\n\t\tzamboniSegments(client.mergeTree);\n\n\t\tassert.equal(cachedLength, client.mergeTree.root.cachedLength);\n\t\tassert.equal(childCount, client.mergeTree.root.childCount);\n\t});\n\tit(\"zamboni with one segment to scour\", () => {\n\t\tconst initialChildCount = (client.mergeTree.root.children[0] as IMergeBlock).childCount;\n\t\tconst initialCachedLength = client.mergeTree.root.cachedLength ?? 0;\n\t\tclient.removeRangeLocal(0, 1);\n\t\tzamboniSegments(client.mergeTree);\n\n\t\tassert.equal(client.mergeTree.root.cachedLength, initialCachedLength - 1);\n\t\tassert.equal(\n\t\t\t(client.mergeTree.root.children[0] as IMergeBlock).childCount,\n\t\t\tinitialChildCount,\n\t\t);\n\t});\n\tit(\"zamboni with many segments to scour\", () => {\n\t\tclient.removeRangeLocal(0, 6);\n\n\t\tassert.equal(client.mergeTree.root.children[0].cachedLength, 0);\n\n\t\tzamboniSegments(client.mergeTree);\n\t\tpackParent(client.mergeTree.root, client.mergeTree);\n\n\t\tassert.equal(client.mergeTree.root.childCount, 1);\n\t});\n});\n"]}
@@ -0,0 +1,63 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
+ import { IRandom } from "@fluid-private/stochastic-test-utils";
7
+ import { IMergeTreeOp } from "../ops";
8
+ import { SegmentGroup } from "../mergeTreeNodes";
9
+ import { TestClient } from "./testClient";
10
+ import { TestClientLogger } from "./testClientLogger";
11
+ export type TestOperation = (client: TestClient, opStart: number, opEnd: number, random: IRandom) => IMergeTreeOp | undefined;
12
+ export declare const removeRange: TestOperation;
13
+ export declare const obliterateRange: TestOperation;
14
+ export declare const annotateRange: TestOperation;
15
+ export declare const insertAtRefPos: TestOperation;
16
+ export declare const insert: TestOperation;
17
+ export interface IConfigRange {
18
+ min: number;
19
+ max: number;
20
+ growthFunc?: (input: number) => number;
21
+ }
22
+ export declare function doOverRange(range: IConfigRange, defaultGrowthFunc: (input: number) => number, doAction: (current: number) => void): void;
23
+ export declare function resolveRange(range: IConfigRange, defaultGrowthFunc: (input: number) => number): number[];
24
+ export declare function resolveRanges<T extends object>(ranges: T, defaultGrowthFunc: (input: number) => number): ResolvedRanges<T>;
25
+ type ReplaceRangeWith<T, TReplace> = T extends {
26
+ min: number;
27
+ max: number;
28
+ } ? TReplace : never;
29
+ type RangePropertyNames<T> = {
30
+ [K in keyof T]-?: T[K] extends IConfigRange ? K : never;
31
+ }[keyof T];
32
+ type PickFromRanges<T> = {
33
+ [K in RangePropertyNames<T>]: ReplaceRangeWith<T[K], number>;
34
+ };
35
+ type ResolvedRanges<T> = {
36
+ [K in RangePropertyNames<T>]: ReplaceRangeWith<T[K], number[]>;
37
+ };
38
+ interface ProvidesGrowthFunc {
39
+ growthFunc: (input: number) => number;
40
+ }
41
+ export declare function doOverRanges<T extends ProvidesGrowthFunc>(ranges: T, doAction: (selection: PickFromRanges<T>, description: string) => void): void;
42
+ export interface IMergeTreeOperationRunnerConfig {
43
+ readonly rounds: number;
44
+ readonly opsPerRoundRange: IConfigRange;
45
+ readonly incrementalLog?: boolean;
46
+ readonly operations: readonly TestOperation[];
47
+ growthFunc(input: number): number;
48
+ resultsFilePostfix?: string;
49
+ }
50
+ export interface ReplayGroup {
51
+ msgs: ISequencedDocumentMessage[];
52
+ initialText: string;
53
+ resultText: string;
54
+ seq: number;
55
+ }
56
+ export declare const replayResultsPath: string;
57
+ export declare function runMergeTreeOperationRunner(random: IRandom, startingSeq: number, clients: readonly TestClient[], minLength: number, config: IMergeTreeOperationRunnerConfig, apply?: ApplyMessagesFn): number;
58
+ export declare function generateOperationMessagesForClients(random: IRandom, startingSeq: number, clients: readonly TestClient[], logger: TestClientLogger, opsPerRound: number, minLength: number, operations: readonly TestOperation[]): [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][];
59
+ export declare function generateClientNames(): string[];
60
+ type ApplyMessagesFn = (startingSeq: number, messageData: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][], clients: readonly TestClient[], logger: TestClientLogger, random: IRandom) => number;
61
+ export declare function applyMessages(startingSeq: number, messageData: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][], clients: readonly TestClient[], logger: TestClientLogger): number;
62
+ export {};
63
+ //# sourceMappingURL=mergeTreeOperationRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeTreeOperationRunner.d.ts","sourceRoot":"","sources":["../../src/test/mergeTreeOperationRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAqC,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAY,YAAY,EAAiB,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG,CAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,KACX,YAAY,GAAG,SAAS,CAAC;AAE9B,eAAO,MAAM,WAAW,EAAE,aACc,CAAC;AAEzC,eAAO,MAAM,eAAe,EAAE,aAIkB,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,aAC+C,CAAC;AAE5E,eAAO,MAAM,cAAc,EAAE,aAqC5B,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,aAWpB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAED,wBAAgB,WAAW,CAC1B,KAAK,EAAE,YAAY,EACnB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAC5C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,QAoBnC;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE,YAAY,EACnB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAC1C,MAAM,EAAE,CAMV;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC7C,MAAM,EAAE,CAAC,EACT,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAC1C,cAAc,CAAC,CAAC,CAAC,CAQnB;AAMD,KAAK,gBAAgB,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/F,KAAK,kBAAkB,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,YAAY,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAElG,KAAK,cAAc,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;CAC5D,CAAC;AAEF,KAAK,cAAc,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9D,CAAC;AAEF,UAAU,kBAAkB;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,kBAAkB,EACxD,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,QAyBrE;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,EAAE,YAAY,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,yBAAyB,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,eAAO,MAAM,iBAAiB,QAAwC,CAAC;AAEvE,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,+BAA+B,EACvC,KAAK,GAAE,eAA+B,UA6CtC;AAED,wBAAgB,mCAAmC,CAClD,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,aAAa,EAAE,gEA+CpC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAc9C;AAED,KAAK,eAAe,GAAG,CACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CAAC,yBAAyB,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC,EAAE,EACzE,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,OAAO,KACX,MAAM,CAAC;AAEZ,wBAAgB,aAAa,CAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CAAC,yBAAyB,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC,EAAE,EACzE,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,gBAAgB,UAexB"}