@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,176 @@
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 { SnapshotV1 } from "../snapshotV1.js";
7
+ import { createInsertOnlyAttributionPolicy, createPropertyTrackingAttributionPolicyFactory, } from "../attributionPolicy.js";
8
+ import { loadSnapshot, TestString } from "./snapshot.utils.js";
9
+ function makeSnapshotSuite(options) {
10
+ describe("from an empty initial state", () => {
11
+ let str;
12
+ beforeEach(() => {
13
+ str = new TestString("fakeId", options);
14
+ });
15
+ afterEach(async () => {
16
+ // Paranoid check that ensures `str` roundtrips through snapshot/load. This helps to catch
17
+ // bugs that might be missed if the test case forgets to call/await `str.expect()`.
18
+ await str.checkSnapshot({
19
+ attribution: { policyFactory: createInsertOnlyAttributionPolicy },
20
+ });
21
+ });
22
+ it("excludes un-acked segments", async () => {
23
+ str.append("0", /* increaseMsn: */ false);
24
+ // Invoke `load/getSnapshot()` directly instead of `str.expect()` to avoid ACKing the
25
+ // pending insert op.
26
+ const client2 = await loadSnapshot(str.getSummary(), options);
27
+ // Original client has inserted text, but the one loaded from the snapshot should be empty.
28
+ // This is because un-ACKed ops are not included in snapshots. Instead, these ops are
29
+ // retransmitted and applied after the snapshot has loaded.
30
+ assert.equal(str.getText(), "0");
31
+ assert.equal(client2.getText(), "");
32
+ });
33
+ it("includes segments below MSN", async () => {
34
+ str.append("0", /* increaseMsn: */ true);
35
+ await str.expect("0");
36
+ });
37
+ it("includes ACKed segments above the MSN", async () => {
38
+ str.append("0", /* increaseMsn: */ false);
39
+ await str.expect("0");
40
+ });
41
+ it("includes removals of segments above the MSN", async () => {
42
+ str.append("0x", /* increaseMsn: */ false);
43
+ str.removeRange(1, 2, /* increaseMsn: */ false);
44
+ await str.expect("0");
45
+ });
46
+ it("includes removals above the MSN of segments below the MSN", async () => {
47
+ str.append("0x", /* increaseMsn: */ true);
48
+ str.removeRange(1, 2, /* increaseMsn: */ false);
49
+ await str.expect("0");
50
+ });
51
+ it("can insert segments after loading removed segment", async () => {
52
+ str.append("0x", /* increaseMsn: */ true);
53
+ str.removeRange(1, 2, /* increaseMsn: */ false);
54
+ await str.expect("0");
55
+ str.append("1", /* increaseMsn: */ false);
56
+ await str.expect("01");
57
+ });
58
+ it("can insert segments relative to removed segment", async () => {
59
+ str.append("0x", /* increaseMsn: */ false);
60
+ str.append("2", /* increaseMsn: */ false);
61
+ str.removeRange(1, 2, /* increaseMsn: */ false);
62
+ str.insert(1, "1", /* increaseMsn: */ false);
63
+ str.append("3", /* increaseMsn: */ false);
64
+ await str.expect("0123");
65
+ });
66
+ it("can insert segments relative to removed segment loaded from snapshot", async () => {
67
+ str.append("0x", /* increaseMsn: */ false);
68
+ str.append("2", /* increaseMsn: */ false);
69
+ str.removeRange(1, 2, /* increaseMsn: */ false);
70
+ // Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.
71
+ await str.expect("02");
72
+ str.insert(1, "1", /* increaseMsn: */ false);
73
+ str.append("3", /* increaseMsn: */ false);
74
+ await str.expect("0123");
75
+ });
76
+ it("includes obliterates above the MSN of segments below the MSN", async () => {
77
+ str.append("0x", /* increaseMsn: */ true);
78
+ str.obliterateRange(1, 2, /* increaseMsn: */ false);
79
+ await str.expect("0");
80
+ });
81
+ it("can insert segments after loading obliterated segment", async () => {
82
+ str.append("0x", /* increaseMsn: */ true);
83
+ str.obliterateRange(1, 2, /* increaseMsn: */ false);
84
+ await str.expect("0");
85
+ str.append("1", /* increaseMsn: */ false);
86
+ await str.expect("01");
87
+ });
88
+ it("can insert segments relative to obliterated segment", async () => {
89
+ str.append("0x", /* increaseMsn: */ false);
90
+ str.append("2", /* increaseMsn: */ false);
91
+ str.obliterateRange(1, 2, /* increaseMsn: */ false);
92
+ str.insert(1, "1", /* increaseMsn: */ false);
93
+ str.append("3", /* increaseMsn: */ false);
94
+ await str.expect("0123");
95
+ });
96
+ it("can insert segments relative to obliterated segment loaded from snapshot", async () => {
97
+ str.append("0x", /* increaseMsn: */ false);
98
+ str.append("2", /* increaseMsn: */ false);
99
+ str.obliterateRange(1, 2, /* increaseMsn: */ false);
100
+ // Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.
101
+ await str.expect("02");
102
+ str.insert(1, "1", /* increaseMsn: */ false);
103
+ str.append("3", /* increaseMsn: */ false);
104
+ await str.expect("0123");
105
+ });
106
+ it("includes ACKed segments below MSN in body", async () => {
107
+ for (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {
108
+ str.append(`${i % 10}`, /* increaseMsn: */ true);
109
+ }
110
+ await str.checkSnapshot();
111
+ });
112
+ it("includes ACKed segments above MSN in body", async () => {
113
+ for (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {
114
+ str.append(`${i % 10}`, /* increaseMsn: */ false);
115
+ }
116
+ await str.checkSnapshot();
117
+ });
118
+ it("recovers annotated segments", async () => {
119
+ str.append("123", false);
120
+ str.annotate(1, 2, { foo: 1 }, false);
121
+ await str.checkSnapshot();
122
+ });
123
+ });
124
+ describe("from a non-empty initial state", () => {
125
+ it("includes segments submitted while detached", async () => {
126
+ const str = new TestString("A", options, "starting text");
127
+ await str.expect("starting text");
128
+ });
129
+ });
130
+ }
131
+ describe("snapshot", () => {
132
+ describe("with attribution", () => {
133
+ makeSnapshotSuite({
134
+ attribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },
135
+ mergeTreeEnableObliterate: true,
136
+ });
137
+ });
138
+ describe("with attribution and custom channels", () => {
139
+ makeSnapshotSuite({
140
+ attribution: {
141
+ track: true,
142
+ policyFactory: createPropertyTrackingAttributionPolicyFactory("foo"),
143
+ },
144
+ mergeTreeEnableObliterate: true,
145
+ });
146
+ });
147
+ describe("without attribution", () => {
148
+ makeSnapshotSuite({
149
+ attribution: { track: false },
150
+ mergeTreeEnableObliterate: true,
151
+ });
152
+ });
153
+ it("presence of attribution overrides merge-tree initialization value", async () => {
154
+ const str = new TestString("id", {
155
+ attribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },
156
+ });
157
+ str.append("hello world", /* increaseMsn: */ true);
158
+ await str.checkSnapshot({
159
+ attribution: { track: false, policyFactory: createInsertOnlyAttributionPolicy },
160
+ });
161
+ str.insert(0, "should have attribution", false);
162
+ str.applyPendingOps();
163
+ assert(str.getSegment(0).attribution !== undefined, "Attribution should be created on new segments");
164
+ });
165
+ it("lack of attribution overrides merge-tree initialization", async () => {
166
+ const str = new TestString("id", { attribution: { track: false } });
167
+ str.append("hello world", /* increaseMsn: */ true);
168
+ await str.checkSnapshot({
169
+ attribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },
170
+ });
171
+ str.insert(0, "should not have attribution", false);
172
+ str.applyPendingOps();
173
+ assert(str.getSegment(0).attribution === undefined, "No attribution should be created on new segments");
174
+ });
175
+ });
176
+ //# sourceMappingURL=snapshot.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.spec.js","sourceRoot":"","sources":["../../src/test/snapshot.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACN,iCAAiC,EACjC,8CAA8C,GAC9C,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,SAAS,iBAAiB,CAAC,OAA2B;IACrD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC5C,IAAI,GAAe,CAAC;QACpB,UAAU,CAAC,GAAG,EAAE;YACf,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACpB,2FAA2F;YAC3F,mFAAmF;YACnF,MAAM,GAAG,CAAC,aAAa,CAAC;gBACvB,WAAW,EAAE,EAAE,aAAa,EAAE,iCAAiC,EAAE;aACjE,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAE1C,qFAAqF;YACrF,qBAAqB;YACrB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;YAE9D,2FAA2F;YAC3F,sFAAsF;YACtF,2DAA2D;YAC3D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACtD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC5D,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YAC1E,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC1C,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAClE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC1C,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAChE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACrF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAEhD,qGAAqG;YACrG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEvB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC7E,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC1C,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACtE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC1C,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACpE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACzF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAEpD,qGAAqG;YACrG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEvB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;aACjD;YAED,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;aAClD;YAED,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC5C,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACzB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAEtC,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;YAC1D,MAAM,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACzB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACjC,iBAAiB,CAAC;YACjB,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,iCAAiC,EAAE;YAC9E,yBAAyB,EAAE,IAAI;SAC/B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACrD,iBAAiB,CAAC;YACjB,WAAW,EAAE;gBACZ,KAAK,EAAE,IAAI;gBACX,aAAa,EAAE,8CAA8C,CAAC,KAAK,CAAC;aACpE;YACD,yBAAyB,EAAE,IAAI;SAC/B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,iBAAiB,CAAC;YACjB,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,yBAAyB,EAAE,IAAI;SAC/B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE;YAChC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,iCAAiC,EAAE;SAC9E,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,GAAG,CAAC,aAAa,CAAC;YACvB,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,iCAAiC,EAAE;SAC/E,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,GAAG,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,CACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,EAC3C,+CAA+C,CAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,GAAG,CAAC,aAAa,CAAC;YACvB,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,iCAAiC,EAAE;SAC9E,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,GAAG,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,CACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,EAC3C,kDAAkD,CAClD,CAAC;IACH,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 { SnapshotV1 } from \"../snapshotV1.js\";\nimport { IMergeTreeOptions } from \"../mergeTree.js\";\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\nimport { loadSnapshot, TestString } from \"./snapshot.utils.js\";\n\nfunction makeSnapshotSuite(options?: IMergeTreeOptions): void {\n\tdescribe(\"from an empty initial state\", () => {\n\t\tlet str: TestString;\n\t\tbeforeEach(() => {\n\t\t\tstr = new TestString(\"fakeId\", options);\n\t\t});\n\n\t\tafterEach(async () => {\n\t\t\t// Paranoid check that ensures `str` roundtrips through snapshot/load. This helps to catch\n\t\t\t// bugs that might be missed if the test case forgets to call/await `str.expect()`.\n\t\t\tawait str.checkSnapshot({\n\t\t\t\tattribution: { policyFactory: createInsertOnlyAttributionPolicy },\n\t\t\t});\n\t\t});\n\n\t\tit(\"excludes un-acked segments\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ false);\n\n\t\t\t// Invoke `load/getSnapshot()` directly instead of `str.expect()` to avoid ACKing the\n\t\t\t// pending insert op.\n\t\t\tconst client2 = await loadSnapshot(str.getSummary(), options);\n\n\t\t\t// Original client has inserted text, but the one loaded from the snapshot should be empty.\n\t\t\t// This is because un-ACKed ops are not included in snapshots. Instead, these ops are\n\t\t\t// retransmitted and applied after the snapshot has loaded.\n\t\t\tassert.equal(str.getText(), \"0\");\n\t\t\tassert.equal(client2.getText(), \"\");\n\t\t});\n\n\t\tit(\"includes segments below MSN\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ true);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes ACKed segments above the MSN\", async () => {\n\t\t\tstr.append(\"0\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes removals of segments above the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"includes removals above the MSN of segments below the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"can insert segments after loading removed segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t\tstr.append(\"1\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"01\");\n\t\t});\n\n\t\tit(\"can insert segments relative to removed segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"can insert segments relative to removed segment loaded from snapshot\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.removeRange(1, 2, /* increaseMsn: */ false);\n\n\t\t\t// Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.\n\t\t\tawait str.expect(\"02\");\n\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"includes obliterates above the MSN of segments below the MSN\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t});\n\n\t\tit(\"can insert segments after loading obliterated segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ true);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0\");\n\t\t\tstr.append(\"1\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"01\");\n\t\t});\n\n\t\tit(\"can insert segments relative to obliterated segment\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"can insert segments relative to obliterated segment loaded from snapshot\", async () => {\n\t\t\tstr.append(\"0x\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"2\", /* increaseMsn: */ false);\n\t\t\tstr.obliterateRange(1, 2, /* increaseMsn: */ false);\n\n\t\t\t// Note that calling str.expect() switches the underlying client to the one loaded from the snapshot.\n\t\t\tawait str.expect(\"02\");\n\n\t\t\tstr.insert(1, \"1\", /* increaseMsn: */ false);\n\t\t\tstr.append(\"3\", /* increaseMsn: */ false);\n\t\t\tawait str.expect(\"0123\");\n\t\t});\n\n\t\tit(\"includes ACKed segments below MSN in body\", async () => {\n\t\t\tfor (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {\n\t\t\t\tstr.append(`${i % 10}`, /* increaseMsn: */ true);\n\t\t\t}\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\n\t\tit(\"includes ACKed segments above MSN in body\", async () => {\n\t\t\tfor (let i = 0; i < SnapshotV1.chunkSize + 10; i++) {\n\t\t\t\tstr.append(`${i % 10}`, /* increaseMsn: */ false);\n\t\t\t}\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\n\t\tit(\"recovers annotated segments\", async () => {\n\t\t\tstr.append(\"123\", false);\n\t\t\tstr.annotate(1, 2, { foo: 1 }, false);\n\n\t\t\tawait str.checkSnapshot();\n\t\t});\n\t});\n\n\tdescribe(\"from a non-empty initial state\", () => {\n\t\tit(\"includes segments submitted while detached\", async () => {\n\t\t\tconst str = new TestString(\"A\", options, \"starting text\");\n\t\t\tawait str.expect(\"starting text\");\n\t\t});\n\t});\n}\n\ndescribe(\"snapshot\", () => {\n\tdescribe(\"with attribution\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tdescribe(\"with attribution and custom channels\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: {\n\t\t\t\ttrack: true,\n\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t},\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tdescribe(\"without attribution\", () => {\n\t\tmakeSnapshotSuite({\n\t\t\tattribution: { track: false },\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t});\n\n\tit(\"presence of attribution overrides merge-tree initialization value\", async () => {\n\t\tconst str = new TestString(\"id\", {\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.append(\"hello world\", /* increaseMsn: */ true);\n\t\tawait str.checkSnapshot({\n\t\t\tattribution: { track: false, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.insert(0, \"should have attribution\", false);\n\t\tstr.applyPendingOps();\n\t\tassert(\n\t\t\tstr.getSegment(0).attribution !== undefined,\n\t\t\t\"Attribution should be created on new segments\",\n\t\t);\n\t});\n\n\tit(\"lack of attribution overrides merge-tree initialization\", async () => {\n\t\tconst str = new TestString(\"id\", { attribution: { track: false } });\n\t\tstr.append(\"hello world\", /* increaseMsn: */ true);\n\t\tawait str.checkSnapshot({\n\t\t\tattribution: { track: true, policyFactory: createInsertOnlyAttributionPolicy },\n\t\t});\n\t\tstr.insert(0, \"should not have attribution\", false);\n\t\tstr.applyPendingOps();\n\t\tassert(\n\t\t\tstr.getSegment(0).attribution === undefined,\n\t\t\t\"No attribution should be created on new segments\",\n\t\t);\n\t});\n});\n"]}
@@ -0,0 +1,33 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { ISummaryTree } from "@fluidframework/protocol-definitions";
6
+ import { IMergeTreeOptions } from "../mergeTree.js";
7
+ import { PropertySet } from "../properties.js";
8
+ import { ISegment } from "../mergeTreeNodes.js";
9
+ import { TestClient } from "./testClient.js";
10
+ export declare function loadSnapshot(summary: ISummaryTree, options?: IMergeTreeOptions): Promise<TestClient>;
11
+ export declare class TestString {
12
+ private readonly options?;
13
+ private client;
14
+ private readonly pending;
15
+ private seq;
16
+ private minSeq;
17
+ constructor(id: string, options?: IMergeTreeOptions | undefined, initialState?: string);
18
+ insert(pos: number, text: string, increaseMsn: boolean): void;
19
+ annotate(start: number, end: number, props: PropertySet, increaseMsn: boolean): void;
20
+ append(text: string, increaseMsn: boolean): void;
21
+ insertMarker(pos: number, increaseMsn: boolean): void;
22
+ appendMarker(increaseMsn: boolean): void;
23
+ removeRange(start: number, end: number, increaseMsn: boolean): void;
24
+ obliterateRange(start: number, end: number, increaseMsn: boolean): void;
25
+ expect(expected: string): Promise<void>;
26
+ checkSnapshot(options?: IMergeTreeOptions): Promise<void>;
27
+ getSummary(): ISummaryTree;
28
+ getText(): string;
29
+ applyPendingOps(): void;
30
+ private queue;
31
+ getSegment(pos: number): ISegment;
32
+ }
33
+ //# sourceMappingURL=snapshot.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.utils.d.ts","sourceRoot":"","sources":["../../src/test/snapshot.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAA6B,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAK/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,iBAAiB,uBAepF;AAGD,qBAAa,UAAU;IAQrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAK;gBAGlB,EAAE,EAAE,MAAM,EACO,OAAO,CAAC,+BAAmB,EAC5C,YAAY,GAAE,MAAW;IAMnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAOtD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO;IAI7E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAIzC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAS9C,YAAY,CAAC,WAAW,EAAE,OAAO;IAIjC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAI5D,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IAO1D,MAAM,CAAC,QAAQ,EAAE,MAAM;IAWvB,aAAa,CAAC,OAAO,CAAC,EAAE,iBAAiB;IA8B/C,UAAU,IAAI,YAAY;IAS1B,OAAO;IAIP,eAAe;IAOtB,OAAO,CAAC,KAAK;IAeN,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;CAKxC"}
@@ -0,0 +1,104 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
6
+ import { strict as assert } from "assert";
7
+ import { MockStorage } from "@fluidframework/test-runtime-utils";
8
+ import { ReferenceType } from "../ops.js";
9
+ import { SnapshotV1 } from "../snapshotV1.js";
10
+ import { createClientsAtInitialState } from "./testClientLogger.js";
11
+ import { TestSerializer } from "./testSerializer.js";
12
+ import { TestClient } from "./testClient.js";
13
+ // Reconstitutes a MergeTree client from a summary
14
+ export async function loadSnapshot(summary, options) {
15
+ const services = MockStorage.createFromSummary(summary);
16
+ const client2 = new TestClient(options);
17
+ const runtime = {
18
+ logger: client2.logger,
19
+ clientId: "1",
20
+ };
21
+ const { catchupOpsP } = await client2.load(runtime, services, new TestSerializer());
22
+ await catchupOpsP;
23
+ return client2;
24
+ }
25
+ // Wrapper around MergeTree client that provides a convenient SharedString-like API for tests.
26
+ export class TestString {
27
+ constructor(id, options, initialState = "") {
28
+ this.options = options;
29
+ this.pending = [];
30
+ this.seq = 0;
31
+ this.minSeq = 0;
32
+ this.client = createClientsAtInitialState({ initialState, options }, id)[id];
33
+ this.client.startOrUpdateCollaboration(id);
34
+ }
35
+ insert(pos, text, increaseMsn) {
36
+ this.queue(this.client.insertTextLocal(pos, text, { segment: this.pending.length }), increaseMsn);
37
+ }
38
+ annotate(start, end, props, increaseMsn) {
39
+ this.queue(this.client.annotateRangeLocal(start, end, props), increaseMsn);
40
+ }
41
+ append(text, increaseMsn) {
42
+ this.insert(this.client.getLength(), text, increaseMsn);
43
+ }
44
+ insertMarker(pos, increaseMsn) {
45
+ this.queue(this.client.insertMarkerLocal(pos, ReferenceType.Simple, {
46
+ segment: this.pending.length,
47
+ }), increaseMsn);
48
+ }
49
+ appendMarker(increaseMsn) {
50
+ this.insertMarker(this.client.getLength(), increaseMsn);
51
+ }
52
+ removeRange(start, end, increaseMsn) {
53
+ this.queue(this.client.removeRangeLocal(start, end), increaseMsn);
54
+ }
55
+ obliterateRange(start, end, increaseMsn) {
56
+ this.queue(this.client.obliterateRangeLocal(start, end), increaseMsn);
57
+ }
58
+ // Ensures the client's text matches the `expected` string and round-trips through a snapshot
59
+ // into a new client. The current client is then replaced with the loaded client in the hope
60
+ // that it will help detect corruption bugs as further ops are applied.
61
+ async expect(expected) {
62
+ assert.equal(this.client.getText(), expected, "MergeTree must contain the expected text prior to applying ops.");
63
+ await this.checkSnapshot(this.options);
64
+ }
65
+ // Ensures the MergeTree client's contents successfully roundtrip through a snapshot.
66
+ async checkSnapshot(options) {
67
+ this.applyPendingOps();
68
+ const expectedAttributionKeys = this.client.getAllAttributionSeqs();
69
+ const summary = this.getSummary();
70
+ const client2 = await loadSnapshot(summary, options ?? this.options);
71
+ assert.equal(this.client.getText(), client2.getText(), "Snapshot must produce a MergeTree with the same text as the original");
72
+ // Also check the length as weak test for non-TextSegments.
73
+ assert.equal(this.client.getLength(), client2.getLength(), "Snapshot must produce a MergeTree with the same length as the original");
74
+ const actualAttributionKeys = client2.getAllAttributionSeqs();
75
+ assert.deepEqual(actualAttributionKeys, expectedAttributionKeys, "Snapshot must produce a MergeTree with identical attribution as the original");
76
+ // Replace our client with the one loaded by the snapshot.
77
+ this.client = client2;
78
+ }
79
+ getSummary() {
80
+ const snapshot = new SnapshotV1(this.client.mergeTree, this.client.logger, (id) => this.client.getLongClientId(id));
81
+ snapshot.extractSync();
82
+ return snapshot.emit(TestClient.serializer, undefined).summary;
83
+ }
84
+ getText() {
85
+ return this.client.getText();
86
+ }
87
+ applyPendingOps() {
88
+ for (const msg of this.pending) {
89
+ this.client.applyMsg(msg);
90
+ }
91
+ this.pending.splice(0, this.pending.length);
92
+ }
93
+ queue(op, increaseMsn) {
94
+ const refSeq = this.seq;
95
+ const seq = ++this.seq;
96
+ this.pending.push(this.client.makeOpMessage(op, seq, refSeq, this.client.longClientId, (this.minSeq = increaseMsn ? seq : this.minSeq)));
97
+ }
98
+ getSegment(pos) {
99
+ const { segment } = this.client.getContainingSegment(pos);
100
+ assert(segment !== undefined);
101
+ return segment;
102
+ }
103
+ }
104
+ //# sourceMappingURL=snapshot.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.utils.js","sourceRoot":"","sources":["../../src/test/snapshot.utils.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"assert\";\nimport { ISequencedDocumentMessage, ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { SnapshotV1 } from \"../snapshotV1.js\";\nimport { IMergeTreeOptions } from \"../mergeTree.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { ISegment } from \"../mergeTreeNodes.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\nimport { TestClient } from \"./testClient.js\";\n\n// Reconstitutes a MergeTree client from a summary\nexport async function loadSnapshot(summary: ISummaryTree, options?: IMergeTreeOptions) {\n\tconst services = MockStorage.createFromSummary(summary);\n\tconst client2 = new TestClient(options);\n\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\tlogger: client2.logger,\n\t\tclientId: \"1\",\n\t};\n\n\tconst { catchupOpsP } = await client2.load(\n\t\truntime as IFluidDataStoreRuntime,\n\t\tservices,\n\t\tnew TestSerializer(),\n\t);\n\tawait catchupOpsP;\n\treturn client2;\n}\n\n// Wrapper around MergeTree client that provides a convenient SharedString-like API for tests.\nexport class TestString {\n\tprivate client: TestClient;\n\tprivate readonly pending: ISequencedDocumentMessage[] = [];\n\tprivate seq = 0;\n\tprivate minSeq = 0;\n\n\tconstructor(\n\t\tid: string,\n\t\tprivate readonly options?: IMergeTreeOptions,\n\t\tinitialState: string = \"\",\n\t) {\n\t\tthis.client = createClientsAtInitialState({ initialState, options }, id)[id];\n\t\tthis.client.startOrUpdateCollaboration(id);\n\t}\n\n\tpublic insert(pos: number, text: string, increaseMsn: boolean) {\n\t\tthis.queue(\n\t\t\tthis.client.insertTextLocal(pos, text, { segment: this.pending.length })!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic annotate(start: number, end: number, props: PropertySet, increaseMsn: boolean) {\n\t\tthis.queue(this.client.annotateRangeLocal(start, end, props)!, increaseMsn);\n\t}\n\n\tpublic append(text: string, increaseMsn: boolean) {\n\t\tthis.insert(this.client.getLength(), text, increaseMsn);\n\t}\n\n\tpublic insertMarker(pos: number, increaseMsn: boolean) {\n\t\tthis.queue(\n\t\t\tthis.client.insertMarkerLocal(pos, ReferenceType.Simple, {\n\t\t\t\tsegment: this.pending.length,\n\t\t\t})!,\n\t\t\tincreaseMsn,\n\t\t);\n\t}\n\n\tpublic appendMarker(increaseMsn: boolean) {\n\t\tthis.insertMarker(this.client.getLength(), increaseMsn);\n\t}\n\n\tpublic removeRange(start: number, end: number, increaseMsn: boolean) {\n\t\tthis.queue(this.client.removeRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\tpublic obliterateRange(start: number, end: number, increaseMsn: boolean) {\n\t\tthis.queue(this.client.obliterateRangeLocal(start, end)!, increaseMsn);\n\t}\n\n\t// Ensures the client's text matches the `expected` string and round-trips through a snapshot\n\t// into a new client. The current client is then replaced with the loaded client in the hope\n\t// that it will help detect corruption bugs as further ops are applied.\n\tpublic async expect(expected: string) {\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\texpected,\n\t\t\t\"MergeTree must contain the expected text prior to applying ops.\",\n\t\t);\n\n\t\tawait this.checkSnapshot(this.options);\n\t}\n\n\t// Ensures the MergeTree client's contents successfully roundtrip through a snapshot.\n\tpublic async checkSnapshot(options?: IMergeTreeOptions) {\n\t\tthis.applyPendingOps();\n\t\tconst expectedAttributionKeys = this.client.getAllAttributionSeqs();\n\t\tconst summary = this.getSummary();\n\t\tconst client2 = await loadSnapshot(summary, options ?? this.options);\n\n\t\tassert.equal(\n\t\t\tthis.client.getText(),\n\t\t\tclient2.getText(),\n\t\t\t\"Snapshot must produce a MergeTree with the same text as the original\",\n\t\t);\n\n\t\t// Also check the length as weak test for non-TextSegments.\n\t\tassert.equal(\n\t\t\tthis.client.getLength(),\n\t\t\tclient2.getLength(),\n\t\t\t\"Snapshot must produce a MergeTree with the same length as the original\",\n\t\t);\n\n\t\tconst actualAttributionKeys = client2.getAllAttributionSeqs();\n\t\tassert.deepEqual(\n\t\t\tactualAttributionKeys,\n\t\t\texpectedAttributionKeys,\n\t\t\t\"Snapshot must produce a MergeTree with identical attribution as the original\",\n\t\t);\n\n\t\t// Replace our client with the one loaded by the snapshot.\n\t\tthis.client = client2;\n\t}\n\n\tpublic getSummary(): ISummaryTree {\n\t\tconst snapshot = new SnapshotV1(this.client.mergeTree, this.client.logger, (id) =>\n\t\t\tthis.client.getLongClientId(id),\n\t\t);\n\n\t\tsnapshot.extractSync();\n\t\treturn snapshot.emit(TestClient.serializer, undefined!).summary;\n\t}\n\n\tpublic getText() {\n\t\treturn this.client.getText();\n\t}\n\n\tpublic applyPendingOps() {\n\t\tfor (const msg of this.pending) {\n\t\t\tthis.client.applyMsg(msg);\n\t\t}\n\t\tthis.pending.splice(0, this.pending.length);\n\t}\n\n\tprivate queue(op: IMergeTreeOp, increaseMsn: boolean) {\n\t\tconst refSeq = this.seq;\n\t\tconst seq = ++this.seq;\n\n\t\tthis.pending.push(\n\t\t\tthis.client.makeOpMessage(\n\t\t\t\top,\n\t\t\t\tseq,\n\t\t\t\trefSeq,\n\t\t\t\tthis.client.longClientId,\n\t\t\t\t(this.minSeq = increaseMsn ? seq : this.minSeq),\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic getSegment(pos: number): ISegment {\n\t\tconst { segment } = this.client.getContainingSegment(pos);\n\t\tassert(segment !== undefined);\n\t\treturn segment;\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=snapshotlegacy.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotlegacy.spec.d.ts","sourceRoot":"","sources":["../../src/test/snapshotlegacy.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,137 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
6
+ import { strict as assert } from "assert";
7
+ import { MockStorage } from "@fluidframework/test-runtime-utils";
8
+ import { SnapshotLegacy } from "../snapshotlegacy.js";
9
+ import { createInsertOnlyAttributionPolicy, createPropertyTrackingAndInsertionAttributionPolicyFactory, } from "../attributionPolicy.js";
10
+ import { TestSerializer } from "./testSerializer.js";
11
+ import { createClientsAtInitialState } from "./testClientLogger.js";
12
+ import { TestClient } from "./testClient.js";
13
+ describe("snapshot", () => {
14
+ it("header only", async () => {
15
+ const client1 = new TestClient();
16
+ client1.startOrUpdateCollaboration("0");
17
+ for (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk; i++) {
18
+ const op = client1.insertTextLocal(client1.getLength(), `${i % 10}`, { segment: i });
19
+ const msg = client1.makeOpMessage(op, i + 1);
20
+ msg.minimumSequenceNumber = i + 1;
21
+ client1.applyMsg(msg);
22
+ }
23
+ const serializer = new TestSerializer();
24
+ const snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);
25
+ snapshot.extractSync();
26
+ const summaryTree = snapshot.emit([], serializer, undefined);
27
+ const services = MockStorage.createFromSummary(summaryTree.summary);
28
+ const client2 = new TestClient(undefined);
29
+ const runtime = {
30
+ logger: client2.logger,
31
+ clientId: "1",
32
+ };
33
+ await client2.load(runtime, services, serializer);
34
+ assert.equal(client2.getLength(), client1.getLength());
35
+ assert.equal(client2.getText(), client1.getText());
36
+ }).timeout(5000);
37
+ it("header and body", async () => {
38
+ const clients = [new TestClient(), new TestClient(), new TestClient()];
39
+ clients[0].startOrUpdateCollaboration("0");
40
+ for (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk + 10; i++) {
41
+ const op = clients[0].insertTextLocal(clients[0].getLength(), `${i % 10}`, {
42
+ segment: i,
43
+ });
44
+ const msg = clients[0].makeOpMessage(op, i + 1);
45
+ msg.minimumSequenceNumber = i + 1;
46
+ clients[0].applyMsg(msg);
47
+ }
48
+ const serializer = new TestSerializer();
49
+ for (let i = 0; i < clients.length - 1; i++) {
50
+ const client1 = clients[i];
51
+ const client2 = clients[i + 1];
52
+ const snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);
53
+ snapshot.extractSync();
54
+ const summaryTree = snapshot.emit([], serializer, undefined);
55
+ const services = MockStorage.createFromSummary(summaryTree.summary);
56
+ const runtime = {
57
+ logger: client2.logger,
58
+ clientId: (i + 1).toString(),
59
+ };
60
+ await client2.load(runtime, services, serializer);
61
+ const client2Len = client2.getLength();
62
+ assert.equal(client2Len, client1.getLength(), `client${client2.longClientId} and client${client1.longClientId} lengths don't match`);
63
+ assert.equal(client2.getText(SnapshotLegacy.sizeOfFirstChunk - 1), client1.getText(SnapshotLegacy.sizeOfFirstChunk - 1));
64
+ }
65
+ }).timeout(5000);
66
+ async function assertAttributionKeysMatch(client, expected) {
67
+ assert.deepEqual(client.getAllAttributionSeqs(), expected.root, "Keys don't match before round-tripping");
68
+ for (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {
69
+ assert.deepEqual(client.getAllAttributionSeqs(channel), channelExpectation, `Keys for channel ${channel} don't match before round-trip.`);
70
+ }
71
+ const serializer = new TestSerializer();
72
+ // This avoids necessitating handling catchup ops.
73
+ client.mergeTree.setMinSeq(client.mergeTree.collabWindow.currentSeq);
74
+ const snapshot = new SnapshotLegacy(client.mergeTree, client.logger);
75
+ snapshot.extractSync();
76
+ const summaryTree = snapshot.emit([], serializer, undefined);
77
+ const services = MockStorage.createFromSummary(summaryTree.summary);
78
+ const roundTripClient = new TestClient({
79
+ attribution: {
80
+ track: true,
81
+ policyFactory: createInsertOnlyAttributionPolicy,
82
+ },
83
+ });
84
+ const runtime = {
85
+ logger: roundTripClient.logger,
86
+ clientId: "round-trips summary",
87
+ };
88
+ await roundTripClient.load(runtime, services, serializer);
89
+ assert.deepEqual(roundTripClient.getAllAttributionSeqs(), expected.root, "Keys don't match after round-tripping");
90
+ for (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {
91
+ assert.deepEqual(roundTripClient.getAllAttributionSeqs(channel), channelExpectation, `Keys for channel ${channel} don't match after round-trip.`);
92
+ }
93
+ }
94
+ it("preserves attribution information", async () => {
95
+ const clients = createClientsAtInitialState({
96
+ initialState: "",
97
+ options: {
98
+ attribution: {
99
+ track: true,
100
+ policyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory("foo"),
101
+ },
102
+ },
103
+ }, "A", "B");
104
+ const ops = [];
105
+ const applyAllOps = () => ops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));
106
+ ops.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, "hello world"), /* seq */ 1));
107
+ applyAllOps();
108
+ ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(6, "new "),
109
+ /* seq */ 2,
110
+ /* refSeq */ 1));
111
+ ops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 14, { foo: "bar" }),
112
+ /* seq */ 3,
113
+ /* refSeq */ 2));
114
+ applyAllOps();
115
+ await assertAttributionKeysMatch(clients.A, {
116
+ // "hello " has key 1 (i.e. seq 1), "new " has key 2 (i.e. seq 2), "world" has key 1.
117
+ root: [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1],
118
+ channels: {
119
+ foo: Array.from({ length: "hello new world".length }, (_, i) => i < 14 ? 3 : undefined),
120
+ },
121
+ });
122
+ });
123
+ it("doesn't include attribution information when attribution tracking is false on doc creation", async () => {
124
+ const clients = createClientsAtInitialState({
125
+ initialState: "",
126
+ options: { attribution: { track: false } },
127
+ }, "A");
128
+ const ops = [];
129
+ const applyAllOps = () => ops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));
130
+ ops.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, "hello world"), /* seq */ 1));
131
+ applyAllOps();
132
+ await assertAttributionKeysMatch(clients.A, {
133
+ root: Array.from({ length: "hello world".length }, () => undefined),
134
+ });
135
+ });
136
+ });
137
+ //# sourceMappingURL=snapshotlegacy.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotlegacy.spec.js","sourceRoot":"","sources":["../../src/test/snapshotlegacy.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 { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\nimport { TestSerializer } from \"./testSerializer.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\nimport { TestClient } from \"./testClient.js\";\n\ndescribe(\"snapshot\", () => {\n\tit(\"header only\", async () => {\n\t\tconst client1 = new TestClient();\n\t\tclient1.startOrUpdateCollaboration(\"0\");\n\t\tfor (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk; i++) {\n\t\t\tconst op = client1.insertTextLocal(client1.getLength(), `${i % 10}`, { segment: i });\n\t\t\tconst msg = client1.makeOpMessage(op, i + 1);\n\t\t\tmsg.minimumSequenceNumber = i + 1;\n\t\t\tclient1.applyMsg(msg);\n\t\t}\n\n\t\tconst serializer = new TestSerializer();\n\n\t\tconst snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);\n\t\tsnapshot.extractSync();\n\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\n\t\tconst client2 = new TestClient(undefined);\n\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\tlogger: client2.logger,\n\t\t\tclientId: \"1\",\n\t\t};\n\t\tawait client2.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\n\t\tassert.equal(client2.getLength(), client1.getLength());\n\t\tassert.equal(client2.getText(), client1.getText());\n\t}).timeout(5000);\n\n\tit(\"header and body\", async () => {\n\t\tconst clients = [new TestClient(), new TestClient(), new TestClient()];\n\t\tclients[0].startOrUpdateCollaboration(\"0\");\n\t\tfor (let i = 0; i < SnapshotLegacy.sizeOfFirstChunk + 10; i++) {\n\t\t\tconst op = clients[0].insertTextLocal(clients[0].getLength(), `${i % 10}`, {\n\t\t\t\tsegment: i,\n\t\t\t})!;\n\t\t\tconst msg = clients[0].makeOpMessage(op, i + 1);\n\t\t\tmsg.minimumSequenceNumber = i + 1;\n\t\t\tclients[0].applyMsg(msg);\n\t\t}\n\n\t\tconst serializer = new TestSerializer();\n\t\tfor (let i = 0; i < clients.length - 1; i++) {\n\t\t\tconst client1 = clients[i];\n\t\t\tconst client2 = clients[i + 1];\n\t\t\tconst snapshot = new SnapshotLegacy(client1.mergeTree, client1.logger);\n\t\t\tsnapshot.extractSync();\n\t\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\t\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: (i + 1).toString(),\n\t\t\t};\n\t\t\tawait client2.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\n\t\t\tconst client2Len = client2.getLength();\n\t\t\tassert.equal(\n\t\t\t\tclient2Len,\n\t\t\t\tclient1.getLength(),\n\t\t\t\t`client${client2.longClientId} and client${client1.longClientId} lengths don't match`,\n\t\t\t);\n\n\t\t\tassert.equal(\n\t\t\t\tclient2.getText(SnapshotLegacy.sizeOfFirstChunk - 1),\n\t\t\t\tclient1.getText(SnapshotLegacy.sizeOfFirstChunk - 1),\n\t\t\t);\n\t\t}\n\t}).timeout(5000);\n\n\tasync function assertAttributionKeysMatch(\n\t\tclient: TestClient,\n\t\texpected: {\n\t\t\troot: (number | undefined)[];\n\t\t\tchannels?: { [name: string]: (number | undefined)[] };\n\t\t},\n\t): Promise<void> {\n\t\tassert.deepEqual(\n\t\t\tclient.getAllAttributionSeqs(),\n\t\t\texpected.root,\n\t\t\t\"Keys don't match before round-tripping\",\n\t\t);\n\t\tfor (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(channel),\n\t\t\t\tchannelExpectation,\n\t\t\t\t`Keys for channel ${channel} don't match before round-trip.`,\n\t\t\t);\n\t\t}\n\t\tconst serializer = new TestSerializer();\n\t\t// This avoids necessitating handling catchup ops.\n\t\tclient.mergeTree.setMinSeq(client.mergeTree.collabWindow.currentSeq);\n\t\tconst snapshot = new SnapshotLegacy(client.mergeTree, client.logger);\n\t\tsnapshot.extractSync();\n\t\tconst summaryTree = snapshot.emit([], serializer, undefined!);\n\t\tconst services = MockStorage.createFromSummary(summaryTree.summary);\n\n\t\tconst roundTripClient = new TestClient({\n\t\t\tattribution: {\n\t\t\t\ttrack: true,\n\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t},\n\t\t});\n\t\tconst runtime: Partial<IFluidDataStoreRuntime> = {\n\t\t\tlogger: roundTripClient.logger,\n\t\t\tclientId: \"round-trips summary\",\n\t\t};\n\t\tawait roundTripClient.load(runtime as IFluidDataStoreRuntime, services, serializer);\n\t\tassert.deepEqual(\n\t\t\troundTripClient.getAllAttributionSeqs(),\n\t\t\texpected.root,\n\t\t\t\"Keys don't match after round-tripping\",\n\t\t);\n\t\tfor (const [channel, channelExpectation] of Object.entries(expected.channels ?? {})) {\n\t\t\tassert.deepEqual(\n\t\t\t\troundTripClient.getAllAttributionSeqs(channel),\n\t\t\t\tchannelExpectation,\n\t\t\t\t`Keys for channel ${channel} don't match after round-trip.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tit(\"preserves attribution information\", async () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tattribution: {\n\t\t\t\t\t\ttrack: true,\n\t\t\t\t\t\tpolicyFactory:\n\t\t\t\t\t\t\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst applyAllOps = () =>\n\t\t\tops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));\n\n\t\tops.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, \"hello world\"), /* seq */ 1));\n\n\t\tapplyAllOps();\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(\n\t\t\t\tclients.B.insertTextLocal(6, \"new \"),\n\t\t\t\t/* seq */ 2,\n\t\t\t\t/* refSeq */ 1,\n\t\t\t),\n\t\t);\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(\n\t\t\t\tclients.B.annotateRangeLocal(0, 14, { foo: \"bar\" }),\n\t\t\t\t/* seq */ 3,\n\t\t\t\t/* refSeq */ 2,\n\t\t\t),\n\t\t);\n\n\t\tapplyAllOps();\n\n\t\tawait assertAttributionKeysMatch(clients.A, {\n\t\t\t// \"hello \" has key 1 (i.e. seq 1), \"new \" has key 2 (i.e. seq 2), \"world\" has key 1.\n\t\t\troot: [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1],\n\t\t\tchannels: {\n\t\t\t\tfoo: Array.from({ length: \"hello new world\".length }, (_, i) =>\n\t\t\t\t\ti < 14 ? 3 : undefined,\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"doesn't include attribution information when attribution tracking is false on doc creation\", async () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: { attribution: { track: false } },\n\t\t\t},\n\t\t\t\"A\",\n\t\t);\n\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst applyAllOps = () =>\n\t\t\tops.splice(0).forEach((op) => clients.all.map((client) => client.applyMsg(op)));\n\n\t\tops.push(clients.A.makeOpMessage(clients.A.insertTextLocal(0, \"hello world\"), /* seq */ 1));\n\n\t\tapplyAllOps();\n\n\t\tawait assertAttributionKeysMatch(clients.A, {\n\t\t\troot: Array.from({ length: \"hello world\".length }, () => undefined),\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=sortedSegmentSet.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortedSegmentSet.spec.d.ts","sourceRoot":"","sources":["../../src/test/sortedSegmentSet.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}