@fluidframework/merge-tree 2.53.0 → 2.60.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 (378) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/{merge-tree.legacy.alpha.api.md → merge-tree.legacy.beta.api.md} +62 -62
  3. package/dist/attributionCollection.d.ts +7 -12
  4. package/dist/attributionCollection.d.ts.map +1 -1
  5. package/dist/attributionCollection.js.map +1 -1
  6. package/dist/attributionPolicy.d.ts +1 -1
  7. package/dist/attributionPolicy.d.ts.map +1 -1
  8. package/dist/attributionPolicy.js.map +1 -1
  9. package/dist/client.d.ts +11 -11
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js.map +1 -1
  12. package/dist/collections/index.d.ts +1 -1
  13. package/dist/collections/index.d.ts.map +1 -1
  14. package/dist/collections/index.js.map +1 -1
  15. package/dist/endOfTreeSegment.d.ts +4 -4
  16. package/dist/endOfTreeSegment.d.ts.map +1 -1
  17. package/dist/endOfTreeSegment.js.map +1 -1
  18. package/dist/index.d.ts +16 -16
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/localReference.d.ts +6 -9
  22. package/dist/localReference.d.ts.map +1 -1
  23. package/dist/localReference.js +1 -2
  24. package/dist/localReference.js.map +1 -1
  25. package/dist/mergeTree.d.ts +9 -10
  26. package/dist/mergeTree.d.ts.map +1 -1
  27. package/dist/mergeTree.js.map +1 -1
  28. package/dist/mergeTreeDeltaCallback.d.ts +12 -20
  29. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  30. package/dist/mergeTreeDeltaCallback.js +1 -2
  31. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  32. package/dist/mergeTreeNodeWalk.d.ts +1 -1
  33. package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
  34. package/dist/mergeTreeNodeWalk.js.map +1 -1
  35. package/dist/mergeTreeNodes.d.ts +14 -21
  36. package/dist/mergeTreeNodes.d.ts.map +1 -1
  37. package/dist/mergeTreeNodes.js +4 -8
  38. package/dist/mergeTreeNodes.js.map +1 -1
  39. package/dist/mergeTreeTracking.d.ts +6 -10
  40. package/dist/mergeTreeTracking.d.ts.map +1 -1
  41. package/dist/mergeTreeTracking.js +2 -4
  42. package/dist/mergeTreeTracking.js.map +1 -1
  43. package/dist/opBuilder.d.ts +3 -3
  44. package/dist/opBuilder.d.ts.map +1 -1
  45. package/dist/opBuilder.js.map +1 -1
  46. package/dist/ops.d.ts +17 -34
  47. package/dist/ops.d.ts.map +1 -1
  48. package/dist/ops.js +2 -4
  49. package/dist/ops.js.map +1 -1
  50. package/dist/partialLengths.d.ts +2 -2
  51. package/dist/partialLengths.d.ts.map +1 -1
  52. package/dist/partialLengths.js.map +1 -1
  53. package/dist/properties.d.ts +2 -4
  54. package/dist/properties.d.ts.map +1 -1
  55. package/dist/properties.js.map +1 -1
  56. package/dist/referencePositions.d.ts +6 -9
  57. package/dist/referencePositions.d.ts.map +1 -1
  58. package/dist/referencePositions.js +2 -4
  59. package/dist/referencePositions.js.map +1 -1
  60. package/dist/revertibles.d.ts +11 -16
  61. package/dist/revertibles.d.ts.map +1 -1
  62. package/dist/revertibles.js +3 -6
  63. package/dist/revertibles.js.map +1 -1
  64. package/dist/segmentGroupCollection.d.ts +1 -1
  65. package/dist/segmentGroupCollection.d.ts.map +1 -1
  66. package/dist/segmentGroupCollection.js.map +1 -1
  67. package/dist/segmentInfos.d.ts +1 -1
  68. package/dist/segmentInfos.d.ts.map +1 -1
  69. package/dist/segmentInfos.js.map +1 -1
  70. package/dist/segmentPropertiesManager.d.ts +1 -1
  71. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  72. package/dist/segmentPropertiesManager.js.map +1 -1
  73. package/dist/sequencePlace.d.ts +4 -8
  74. package/dist/sequencePlace.d.ts.map +1 -1
  75. package/dist/sequencePlace.js +2 -4
  76. package/dist/sequencePlace.js.map +1 -1
  77. package/dist/snapshotChunks.d.ts +6 -6
  78. package/dist/snapshotChunks.d.ts.map +1 -1
  79. package/dist/snapshotChunks.js.map +1 -1
  80. package/dist/snapshotLoader.d.ts +6 -6
  81. package/dist/snapshotLoader.d.ts.map +1 -1
  82. package/dist/snapshotLoader.js.map +1 -1
  83. package/dist/snapshotV1.d.ts +8 -8
  84. package/dist/snapshotV1.d.ts.map +1 -1
  85. package/dist/snapshotV1.js.map +1 -1
  86. package/dist/snapshotlegacy.d.ts +6 -6
  87. package/dist/snapshotlegacy.d.ts.map +1 -1
  88. package/dist/snapshotlegacy.js.map +1 -1
  89. package/dist/sortedSegmentSet.d.ts +2 -2
  90. package/dist/sortedSegmentSet.d.ts.map +1 -1
  91. package/dist/sortedSegmentSet.js.map +1 -1
  92. package/dist/test/Removal.perf.spec.js.map +1 -1
  93. package/dist/test/attributionCollection.perf.spec.js.map +1 -1
  94. package/dist/test/attributionCollection.spec.js.map +1 -1
  95. package/dist/test/attributionPolicy.spec.js.map +1 -1
  96. package/dist/test/beastTest.spec.d.ts +1 -1
  97. package/dist/test/beastTest.spec.d.ts.map +1 -1
  98. package/dist/test/beastTest.spec.js.map +1 -1
  99. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  100. package/dist/test/client.apis.spec.js.map +1 -1
  101. package/dist/test/client.applyMsg.spec.js.map +1 -1
  102. package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  103. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  104. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  105. package/dist/test/client.attributionFarm.spec.d.ts +1 -1
  106. package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
  107. package/dist/test/client.attributionFarm.spec.js.map +1 -1
  108. package/dist/test/client.conflictFarm.spec.d.ts +1 -1
  109. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  110. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  111. package/dist/test/client.localReference.spec.js.map +1 -1
  112. package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
  113. package/dist/test/client.obliterateFarm.spec.d.ts +1 -1
  114. package/dist/test/client.obliterateFarm.spec.d.ts.map +1 -1
  115. package/dist/test/client.obliterateFarm.spec.js.map +1 -1
  116. package/dist/test/client.rebasePosition.spec.js.map +1 -1
  117. package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
  118. package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
  119. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  120. package/dist/test/client.replay.spec.js.map +1 -1
  121. package/dist/test/client.rollback.spec.js.map +1 -1
  122. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  123. package/dist/test/clientTestHelper.d.ts +1 -1
  124. package/dist/test/clientTestHelper.d.ts.map +1 -1
  125. package/dist/test/clientTestHelper.js.map +1 -1
  126. package/dist/test/index.d.ts +4 -4
  127. package/dist/test/index.d.ts.map +1 -1
  128. package/dist/test/index.js.map +1 -1
  129. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  130. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  131. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  132. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  133. package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
  134. package/dist/test/mergeTreeOperationRunner.d.ts +5 -5
  135. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  136. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  137. package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
  138. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
  139. package/dist/test/obliterateOperations.js.map +1 -1
  140. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  141. package/dist/test/revertibleFarm.spec.js.map +1 -1
  142. package/dist/test/revertibles.spec.js.map +1 -1
  143. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  144. package/dist/test/snapshot.spec.js.map +1 -1
  145. package/dist/test/snapshot.utils.d.ts +4 -4
  146. package/dist/test/snapshot.utils.d.ts.map +1 -1
  147. package/dist/test/snapshot.utils.js.map +1 -1
  148. package/dist/test/snapshotlegacy.spec.js.map +1 -1
  149. package/dist/test/sortedSegmentSet.spec.js.map +1 -1
  150. package/dist/test/testClient.d.ts +9 -9
  151. package/dist/test/testClient.d.ts.map +1 -1
  152. package/dist/test/testClient.js.map +1 -1
  153. package/dist/test/testClientLogger.d.ts +2 -2
  154. package/dist/test/testClientLogger.d.ts.map +1 -1
  155. package/dist/test/testClientLogger.js.map +1 -1
  156. package/dist/test/testSerializer.d.ts +2 -2
  157. package/dist/test/testSerializer.d.ts.map +1 -1
  158. package/dist/test/testSerializer.js.map +1 -1
  159. package/dist/test/testServer.d.ts +2 -2
  160. package/dist/test/testServer.d.ts.map +1 -1
  161. package/dist/test/testServer.js.map +1 -1
  162. package/dist/test/testUtils.d.ts +3 -3
  163. package/dist/test/testUtils.d.ts.map +1 -1
  164. package/dist/test/testUtils.js.map +1 -1
  165. package/dist/test/text.d.ts +1 -1
  166. package/dist/test/text.d.ts.map +1 -1
  167. package/dist/test/text.js.map +1 -1
  168. package/dist/test/wordUnitTests.spec.js.map +1 -1
  169. package/dist/textSegment.d.ts +4 -6
  170. package/dist/textSegment.d.ts.map +1 -1
  171. package/dist/textSegment.js +1 -2
  172. package/dist/textSegment.js.map +1 -1
  173. package/dist/zamboni.d.ts +1 -1
  174. package/dist/zamboni.d.ts.map +1 -1
  175. package/dist/zamboni.js.map +1 -1
  176. package/lib/attributionCollection.d.ts +7 -12
  177. package/lib/attributionCollection.d.ts.map +1 -1
  178. package/lib/attributionCollection.js.map +1 -1
  179. package/lib/attributionPolicy.d.ts +1 -1
  180. package/lib/attributionPolicy.d.ts.map +1 -1
  181. package/lib/attributionPolicy.js.map +1 -1
  182. package/lib/client.d.ts +11 -11
  183. package/lib/client.d.ts.map +1 -1
  184. package/lib/client.js.map +1 -1
  185. package/lib/collections/index.d.ts +1 -1
  186. package/lib/collections/index.d.ts.map +1 -1
  187. package/lib/collections/index.js.map +1 -1
  188. package/lib/endOfTreeSegment.d.ts +4 -4
  189. package/lib/endOfTreeSegment.d.ts.map +1 -1
  190. package/lib/endOfTreeSegment.js.map +1 -1
  191. package/lib/index.d.ts +16 -16
  192. package/lib/index.d.ts.map +1 -1
  193. package/lib/index.js.map +1 -1
  194. package/lib/localReference.d.ts +6 -9
  195. package/lib/localReference.d.ts.map +1 -1
  196. package/lib/localReference.js +1 -2
  197. package/lib/localReference.js.map +1 -1
  198. package/lib/mergeTree.d.ts +9 -10
  199. package/lib/mergeTree.d.ts.map +1 -1
  200. package/lib/mergeTree.js.map +1 -1
  201. package/lib/mergeTreeDeltaCallback.d.ts +12 -20
  202. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  203. package/lib/mergeTreeDeltaCallback.js +1 -2
  204. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  205. package/lib/mergeTreeNodeWalk.d.ts +1 -1
  206. package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
  207. package/lib/mergeTreeNodeWalk.js.map +1 -1
  208. package/lib/mergeTreeNodes.d.ts +14 -21
  209. package/lib/mergeTreeNodes.d.ts.map +1 -1
  210. package/lib/mergeTreeNodes.js +4 -8
  211. package/lib/mergeTreeNodes.js.map +1 -1
  212. package/lib/mergeTreeTracking.d.ts +6 -10
  213. package/lib/mergeTreeTracking.d.ts.map +1 -1
  214. package/lib/mergeTreeTracking.js +2 -4
  215. package/lib/mergeTreeTracking.js.map +1 -1
  216. package/lib/opBuilder.d.ts +3 -3
  217. package/lib/opBuilder.d.ts.map +1 -1
  218. package/lib/opBuilder.js.map +1 -1
  219. package/lib/ops.d.ts +17 -34
  220. package/lib/ops.d.ts.map +1 -1
  221. package/lib/ops.js +2 -4
  222. package/lib/ops.js.map +1 -1
  223. package/lib/partialLengths.d.ts +2 -2
  224. package/lib/partialLengths.d.ts.map +1 -1
  225. package/lib/partialLengths.js.map +1 -1
  226. package/lib/properties.d.ts +2 -4
  227. package/lib/properties.d.ts.map +1 -1
  228. package/lib/properties.js.map +1 -1
  229. package/lib/referencePositions.d.ts +6 -9
  230. package/lib/referencePositions.d.ts.map +1 -1
  231. package/lib/referencePositions.js +2 -4
  232. package/lib/referencePositions.js.map +1 -1
  233. package/lib/revertibles.d.ts +11 -16
  234. package/lib/revertibles.d.ts.map +1 -1
  235. package/lib/revertibles.js +4 -7
  236. package/lib/revertibles.js.map +1 -1
  237. package/lib/segmentGroupCollection.d.ts +1 -1
  238. package/lib/segmentGroupCollection.d.ts.map +1 -1
  239. package/lib/segmentGroupCollection.js.map +1 -1
  240. package/lib/segmentInfos.d.ts +1 -1
  241. package/lib/segmentInfos.d.ts.map +1 -1
  242. package/lib/segmentInfos.js.map +1 -1
  243. package/lib/segmentPropertiesManager.d.ts +1 -1
  244. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  245. package/lib/segmentPropertiesManager.js.map +1 -1
  246. package/lib/sequencePlace.d.ts +4 -8
  247. package/lib/sequencePlace.d.ts.map +1 -1
  248. package/lib/sequencePlace.js +2 -4
  249. package/lib/sequencePlace.js.map +1 -1
  250. package/lib/snapshotChunks.d.ts +6 -6
  251. package/lib/snapshotChunks.d.ts.map +1 -1
  252. package/lib/snapshotChunks.js.map +1 -1
  253. package/lib/snapshotLoader.d.ts +6 -6
  254. package/lib/snapshotLoader.d.ts.map +1 -1
  255. package/lib/snapshotLoader.js.map +1 -1
  256. package/lib/snapshotV1.d.ts +8 -8
  257. package/lib/snapshotV1.d.ts.map +1 -1
  258. package/lib/snapshotV1.js.map +1 -1
  259. package/lib/snapshotlegacy.d.ts +6 -6
  260. package/lib/snapshotlegacy.d.ts.map +1 -1
  261. package/lib/snapshotlegacy.js.map +1 -1
  262. package/lib/sortedSegmentSet.d.ts +2 -2
  263. package/lib/sortedSegmentSet.d.ts.map +1 -1
  264. package/lib/sortedSegmentSet.js.map +1 -1
  265. package/lib/test/Removal.perf.spec.js.map +1 -1
  266. package/lib/test/attributionCollection.perf.spec.js.map +1 -1
  267. package/lib/test/attributionCollection.spec.js.map +1 -1
  268. package/lib/test/attributionPolicy.spec.js.map +1 -1
  269. package/lib/test/beastTest.spec.d.ts +1 -1
  270. package/lib/test/beastTest.spec.d.ts.map +1 -1
  271. package/lib/test/beastTest.spec.js.map +1 -1
  272. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  273. package/lib/test/client.apis.spec.js.map +1 -1
  274. package/lib/test/client.applyMsg.spec.js.map +1 -1
  275. package/lib/test/client.applyStashedOpFarm.spec.d.ts +1 -1
  276. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  277. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  278. package/lib/test/client.attributionFarm.spec.d.ts +1 -1
  279. package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
  280. package/lib/test/client.attributionFarm.spec.js.map +1 -1
  281. package/lib/test/client.conflictFarm.spec.d.ts +1 -1
  282. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
  283. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  284. package/lib/test/client.localReference.spec.js.map +1 -1
  285. package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
  286. package/lib/test/client.obliterateFarm.spec.d.ts +1 -1
  287. package/lib/test/client.obliterateFarm.spec.d.ts.map +1 -1
  288. package/lib/test/client.obliterateFarm.spec.js.map +1 -1
  289. package/lib/test/client.rebasePosition.spec.js.map +1 -1
  290. package/lib/test/client.reconnectFarm.spec.d.ts +1 -1
  291. package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -1
  292. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  293. package/lib/test/client.replay.spec.js.map +1 -1
  294. package/lib/test/client.rollback.spec.js.map +1 -1
  295. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  296. package/lib/test/clientTestHelper.d.ts +1 -1
  297. package/lib/test/clientTestHelper.d.ts.map +1 -1
  298. package/lib/test/clientTestHelper.js.map +1 -1
  299. package/lib/test/index.d.ts +4 -4
  300. package/lib/test/index.d.ts.map +1 -1
  301. package/lib/test/index.js.map +1 -1
  302. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  303. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  304. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  305. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  306. package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
  307. package/lib/test/mergeTreeOperationRunner.d.ts +5 -5
  308. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  309. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  310. package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
  311. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
  312. package/lib/test/obliterateOperations.js.map +1 -1
  313. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  314. package/lib/test/revertibleFarm.spec.js.map +1 -1
  315. package/lib/test/revertibles.spec.js.map +1 -1
  316. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  317. package/lib/test/snapshot.spec.js.map +1 -1
  318. package/lib/test/snapshot.utils.d.ts +4 -4
  319. package/lib/test/snapshot.utils.d.ts.map +1 -1
  320. package/lib/test/snapshot.utils.js.map +1 -1
  321. package/lib/test/snapshotlegacy.spec.js.map +1 -1
  322. package/lib/test/sortedSegmentSet.spec.js.map +1 -1
  323. package/lib/test/testClient.d.ts +9 -9
  324. package/lib/test/testClient.d.ts.map +1 -1
  325. package/lib/test/testClient.js.map +1 -1
  326. package/lib/test/testClientLogger.d.ts +2 -2
  327. package/lib/test/testClientLogger.d.ts.map +1 -1
  328. package/lib/test/testClientLogger.js.map +1 -1
  329. package/lib/test/testSerializer.d.ts +2 -2
  330. package/lib/test/testSerializer.d.ts.map +1 -1
  331. package/lib/test/testSerializer.js.map +1 -1
  332. package/lib/test/testServer.d.ts +2 -2
  333. package/lib/test/testServer.d.ts.map +1 -1
  334. package/lib/test/testServer.js.map +1 -1
  335. package/lib/test/testUtils.d.ts +3 -3
  336. package/lib/test/testUtils.d.ts.map +1 -1
  337. package/lib/test/testUtils.js.map +1 -1
  338. package/lib/test/text.d.ts +1 -1
  339. package/lib/test/text.d.ts.map +1 -1
  340. package/lib/test/text.js.map +1 -1
  341. package/lib/test/wordUnitTests.spec.js.map +1 -1
  342. package/lib/textSegment.d.ts +4 -6
  343. package/lib/textSegment.d.ts.map +1 -1
  344. package/lib/textSegment.js +1 -2
  345. package/lib/textSegment.js.map +1 -1
  346. package/lib/zamboni.d.ts +1 -1
  347. package/lib/zamboni.d.ts.map +1 -1
  348. package/lib/zamboni.js.map +1 -1
  349. package/package.json +17 -17
  350. package/src/attributionCollection.ts +7 -12
  351. package/src/attributionPolicy.ts +8 -8
  352. package/src/client.ts +24 -24
  353. package/src/collections/index.ts +11 -11
  354. package/src/endOfTreeSegment.ts +4 -8
  355. package/src/index.ts +54 -54
  356. package/src/localReference.ts +8 -11
  357. package/src/mergeTree.ts +19 -20
  358. package/src/mergeTreeDeltaCallback.ts +12 -20
  359. package/src/mergeTreeNodeWalk.ts +1 -1
  360. package/src/mergeTreeNodes.ts +15 -22
  361. package/src/mergeTreeTracking.ts +6 -10
  362. package/src/opBuilder.ts +8 -8
  363. package/src/ops.ts +17 -34
  364. package/src/partialLengths.ts +4 -4
  365. package/src/properties.ts +2 -4
  366. package/src/referencePositions.ts +6 -9
  367. package/src/revertibles.ts +15 -16
  368. package/src/segmentGroupCollection.ts +1 -1
  369. package/src/segmentInfos.ts +2 -2
  370. package/src/segmentPropertiesManager.ts +1 -1
  371. package/src/sequencePlace.ts +4 -8
  372. package/src/snapshotChunks.ts +6 -6
  373. package/src/snapshotLoader.ts +11 -11
  374. package/src/snapshotV1.ts +13 -13
  375. package/src/snapshotlegacy.ts +8 -8
  376. package/src/sortedSegmentSet.ts +2 -2
  377. package/src/textSegment.ts +4 -6
  378. package/src/zamboni.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/test/text.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { NonCollabClient, UniversalSequenceNumber } from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { Marker } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport {\n\toverwriteInfo,\n\ttype IHasInsertionInfo,\n\ttype SegmentWithInfo,\n} from \"../segmentInfos.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nconst defaultInsertionInfo: IHasInsertionInfo = {\n\tinsert: {\n\t\ttype: \"insert\",\n\t\tclientId: NonCollabClient,\n\t\tseq: UniversalSequenceNumber,\n\t},\n};\n\nexport function loadSegments(\n\tcontent: string,\n\tsegLimit: number,\n\tmarkers: boolean = false,\n\twithProps: boolean = true,\n): SegmentWithInfo<IHasInsertionInfo>[] {\n\tconst BOMFreeContent = content.replace(/^\\uFEFF/, \"\");\n\n\tconst paragraphs = BOMFreeContent.split(/\\r?\\n/);\n\tfor (let i = 0, len = paragraphs.length; i < len; i++) {\n\t\tparagraphs[i] = paragraphs[i]\n\t\t\t.replace(/\\r?\\n/g, \" \")\n\t\t\t.replace(/\\u201C|\\u201D/g, '\"')\n\t\t\t.replace(/\\u2019/g, \"'\");\n\t\tif (!markers && i !== paragraphs.length - 1) {\n\t\t\tparagraphs[i] += \"\\n\";\n\t\t}\n\t}\n\n\tconst segments: SegmentWithInfo<IHasInsertionInfo>[] = [];\n\tfor (const paragraph of paragraphs) {\n\t\tlet pgMarker: Marker | undefined;\n\t\tif (markers) {\n\t\t\tpgMarker = Marker.make(ReferenceType.Tile, { [reservedTileLabelsKey]: [\"pg\"] });\n\t\t}\n\t\tif (withProps) {\n\t\t\tif (paragraph.includes(\"Chapter\") || paragraph.includes(\"PRIDE AND PREJ\")) {\n\t\t\t\tif (pgMarker) {\n\t\t\t\t\tpgMarker.properties = { header: 2 };\n\t\t\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(\n\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\tTextSegment.make(paragraph, { fontSize: \"140%\", lineHeight: \"150%\" }),\n\t\t\t\t\t\t\tdefaultInsertionInfo,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst emphStrings = paragraph.split(\"_\");\n\t\t\t\tfor (let i = 0, len = emphStrings.length; i < len; i++) {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (i & 1) {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\t\t\tTextSegment.make(emphStrings[i], { fontStyle: \"italic\" }),\n\t\t\t\t\t\t\t\t\tdefaultInsertionInfo,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(new TextSegment(emphStrings[i]), defaultInsertionInfo),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t}\n\t\tif (pgMarker) {\n\t\t\tsegments.push(overwriteInfo(pgMarker, defaultInsertionInfo));\n\t\t}\n\t}\n\n\tif (segLimit > 0) {\n\t\tsegments.length = segLimit;\n\t}\n\n\treturn segments;\n}\n\nexport function loadText(\n\tcontent: string,\n\tmergeTree: MergeTree,\n\tsegLimit: number,\n\tmarkers = false,\n): MergeTree {\n\tconst segments = loadSegments(content, segLimit, markers);\n\tmergeTree.reloadFromSegments(segments);\n\treturn mergeTree;\n}\n"]}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/test/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACN,aAAa,GAGb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,oBAAoB,GAAsB;IAC/C,MAAM,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,eAAe;QACzB,GAAG,EAAE,uBAAuB;KAC5B;CACD,CAAC;AAEF,MAAM,UAAU,YAAY,CAC3B,OAAe,EACf,QAAgB,EAChB,UAAmB,KAAK,EACxB,YAAqB,IAAI;IAEzB,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;aAC9B,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACvB,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAC1D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,QAA4B,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACb,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3E,IAAI,QAAQ,EAAE,CAAC;oBACd,QAAQ,CAAC,UAAU,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;oBACpC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAChF,CAAC;qBAAM,CAAC;oBACP,QAAQ,CAAC,IAAI,CACZ,aAAa,CACZ,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EACrE,oBAAoB,CACpB,CACD,CAAC;gBACH,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxD,sCAAsC;oBACtC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBACX,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC/B,QAAQ,CAAC,IAAI,CACZ,aAAa,CACZ,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EACzD,oBAAoB,CACpB,CACD,CAAC;wBACH,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC/B,QAAQ,CAAC,IAAI,CACZ,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CACpE,CAAC;wBACH,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClB,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,OAAe,EACf,SAAoB,EACpB,QAAgB,EAChB,OAAO,GAAG,KAAK;IAEf,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { NonCollabClient, UniversalSequenceNumber } from \"../constants.js\";\nimport type { MergeTree } from \"../mergeTree.js\";\nimport { Marker } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport {\n\toverwriteInfo,\n\ttype IHasInsertionInfo,\n\ttype SegmentWithInfo,\n} from \"../segmentInfos.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nconst defaultInsertionInfo: IHasInsertionInfo = {\n\tinsert: {\n\t\ttype: \"insert\",\n\t\tclientId: NonCollabClient,\n\t\tseq: UniversalSequenceNumber,\n\t},\n};\n\nexport function loadSegments(\n\tcontent: string,\n\tsegLimit: number,\n\tmarkers: boolean = false,\n\twithProps: boolean = true,\n): SegmentWithInfo<IHasInsertionInfo>[] {\n\tconst BOMFreeContent = content.replace(/^\\uFEFF/, \"\");\n\n\tconst paragraphs = BOMFreeContent.split(/\\r?\\n/);\n\tfor (let i = 0, len = paragraphs.length; i < len; i++) {\n\t\tparagraphs[i] = paragraphs[i]\n\t\t\t.replace(/\\r?\\n/g, \" \")\n\t\t\t.replace(/\\u201C|\\u201D/g, '\"')\n\t\t\t.replace(/\\u2019/g, \"'\");\n\t\tif (!markers && i !== paragraphs.length - 1) {\n\t\t\tparagraphs[i] += \"\\n\";\n\t\t}\n\t}\n\n\tconst segments: SegmentWithInfo<IHasInsertionInfo>[] = [];\n\tfor (const paragraph of paragraphs) {\n\t\tlet pgMarker: Marker | undefined;\n\t\tif (markers) {\n\t\t\tpgMarker = Marker.make(ReferenceType.Tile, { [reservedTileLabelsKey]: [\"pg\"] });\n\t\t}\n\t\tif (withProps) {\n\t\t\tif (paragraph.includes(\"Chapter\") || paragraph.includes(\"PRIDE AND PREJ\")) {\n\t\t\t\tif (pgMarker) {\n\t\t\t\t\tpgMarker.properties = { header: 2 };\n\t\t\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(\n\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\tTextSegment.make(paragraph, { fontSize: \"140%\", lineHeight: \"150%\" }),\n\t\t\t\t\t\t\tdefaultInsertionInfo,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst emphStrings = paragraph.split(\"_\");\n\t\t\t\tfor (let i = 0, len = emphStrings.length; i < len; i++) {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (i & 1) {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\t\t\tTextSegment.make(emphStrings[i], { fontStyle: \"italic\" }),\n\t\t\t\t\t\t\t\t\tdefaultInsertionInfo,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(new TextSegment(emphStrings[i]), defaultInsertionInfo),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t}\n\t\tif (pgMarker) {\n\t\t\tsegments.push(overwriteInfo(pgMarker, defaultInsertionInfo));\n\t\t}\n\t}\n\n\tif (segLimit > 0) {\n\t\tsegments.length = segLimit;\n\t}\n\n\treturn segments;\n}\n\nexport function loadText(\n\tcontent: string,\n\tmergeTree: MergeTree,\n\tsegLimit: number,\n\tmarkers = false,\n): MergeTree {\n\tconst segments = loadSegments(content, segLimit, markers);\n\tmergeTree.reloadFromSegments(segments);\n\treturn mergeTree;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"wordUnitTests.spec.js","sourceRoot":"","sources":["../../src/test/wordUnitTests.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\n/* eslint-disable no-bitwise */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport path from \"node:path\";\n\nimport { Trace } from \"@fluid-internal/client-utils\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\n\nimport type { ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { MapLike, createMap, extend } from \"../properties.js\";\nimport { ReferencePosition } from \"../referencePositions.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\nimport { TestClient } from \"./testClient.js\";\nimport { loadTextFromFileWithMarkers } from \"./testUtils.js\";\n\nconst clock = (): Trace => Trace.start();\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\nexport function propertyCopy(): void {\n\tconst propCount = 2000;\n\tconst iterCount = 1000;\n\tconst map = new Map<string, number>();\n\tconst a: string[] = [];\n\tconst v: number[] = [];\n\tfor (let i = 0; i < propCount; i++) {\n\t\ta[i] = `prop${i}`;\n\t\tv[i] = i;\n\t\tmap.set(a[i], v[i]);\n\t}\n\tlet clockStart = clock();\n\tlet obj: MapLike<number> = {};\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tobj = createMap<number>();\n\t\tfor (let i = 0; i < propCount; i++) {\n\t\t\tobj[a[i]] = v[i];\n\t\t}\n\t}\n\tlet et = elapsedMicroseconds(clockStart);\n\tlet perIter = (et / iterCount).toFixed(3);\n\tlet perProp = (et / (iterCount * propCount)).toFixed(3);\n\tconsole.log(\n\t\t`arr prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bObj = createMap<number>();\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const key in obj) {\n\t\t\tif (key in obj) {\n\t\t\t\tbObj[key] = obj[key];\n\t\t\t}\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(3);\n\tconsole.log(\n\t\t`obj prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bObj = createMap<number>();\n\t\tfor (const [key, value] of map) {\n\t\t\tbObj[key] = value;\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`map prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bObj = createMap<number>();\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tbObj[key] = value;\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`map foreach prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bmap = new Map<string, number>();\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tbmap.set(key, value);\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`map to map foreach prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tconst diffMap = new Map<string, number>();\n\tfor (const [key, value] of map.entries()) {\n\t\tif (Math.random() < 0.5) {\n\t\t\tdiffMap.set(key, value);\n\t\t} else {\n\t\t\tdiffMap.set(key, value * 3);\n\t\t}\n\t}\n\tclockStart = clock();\n\tconst grayMap = new Map<string, number>();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tif (diffMap.get(key) !== value) {\n\t\t\t\tgrayMap.set(key, 1);\n\t\t\t}\n\t\t}\n\t}\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`diff time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n}\n\nfunction makeBookmarks(client: TestClient, bookmarkCount: number): ReferencePosition[] {\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst bookmarks: ReferencePosition[] = [];\n\tconst len = client.getLength();\n\tfor (let i = 0; i < bookmarkCount; i++) {\n\t\tconst pos = random.integer(0, len - 1);\n\t\tconst segoff = client.getContainingSegment<ISegmentPrivate>(pos);\n\t\tlet refType = ReferenceType.Simple;\n\t\tif (i & 1) {\n\t\t\trefType = ReferenceType.SlideOnRemove;\n\t\t}\n\t\tconst lref = client.mergeTree.createLocalReferencePosition(\n\t\t\tsegoff!.segment,\n\t\t\tsegoff!.offset,\n\t\t\trefType,\n\t\t\tundefined,\n\t\t);\n\t\tbookmarks.push(lref);\n\t}\n\treturn bookmarks;\n}\n\nfunction measureFetch(startFile: string, withBookmarks = false): void {\n\tconst bookmarkCount = 20000;\n\tconst client = new TestClient();\n\tloadTextFromFileWithMarkers(startFile, client.mergeTree);\n\tif (withBookmarks) {\n\t\tmakeBookmarks(client, bookmarkCount);\n\t\tconsole.log(`inserting ${bookmarkCount} refs into text`);\n\t}\n\tconst reps = 20;\n\tconst clockStart = clock();\n\tlet count = 0;\n\tfor (let i = 0; i < reps; i++) {\n\t\tfor (let pos = 0; pos < client.getLength(); ) {\n\t\t\t// curPG.pos is ca end\n\t\t\tconst curPG = client.searchForMarker(pos, \"pg\", true)!;\n\t\t\tconst properties = curPG.properties!;\n\t\t\tconst curSegOff = client.getContainingSegment<ISegmentPrivate>(pos)!;\n\t\t\tconst curSeg = curSegOff.segment;\n\t\t\t// Combine paragraph and direct properties\n\t\t\textend(properties, curSeg.properties);\n\t\t\tpos += curSeg.cachedLength - curSegOff.offset;\n\t\t\tcount++;\n\t\t}\n\t}\n\tconst et = elapsedMicroseconds(clockStart);\n\tconsole.log(\n\t\t`fetch of ${count / reps} runs over ${client.getLength()} total chars took ${(et / count).toFixed(1)} microseconds per run`,\n\t);\n}\n\nconst baseDir = \"../../src/test/literature\";\nconst filename = path.join(_dirname, baseDir, \"pp.txt\");\nconst testTimeout = 30000;\n\ndescribe(\"Routerlicious\", () => {\n\tdescribe(\"merge-tree\", () => {\n\t\tit(\"wordUnitTest\", () => {\n\t\t\tpropertyCopy();\n\t\t\tmeasureFetch(filename);\n\t\t\tmeasureFetch(filename, true);\n\t\t\tmeasureFetch(filename);\n\t\t\tmeasureFetch(filename, true);\n\t\t}).timeout(testTimeout);\n\t});\n});\n"]}
1
+ {"version":3,"file":"wordUnitTests.spec.js","sourceRoot":"","sources":["../../src/test/wordUnitTests.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\n/* eslint-disable no-bitwise */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport path from \"node:path\";\n\nimport { Trace } from \"@fluid-internal/client-utils\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\n\nimport type { ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { type MapLike, createMap, extend } from \"../properties.js\";\nimport type { ReferencePosition } from \"../referencePositions.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\nimport { TestClient } from \"./testClient.js\";\nimport { loadTextFromFileWithMarkers } from \"./testUtils.js\";\n\nconst clock = (): Trace => Trace.start();\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\nexport function propertyCopy(): void {\n\tconst propCount = 2000;\n\tconst iterCount = 1000;\n\tconst map = new Map<string, number>();\n\tconst a: string[] = [];\n\tconst v: number[] = [];\n\tfor (let i = 0; i < propCount; i++) {\n\t\ta[i] = `prop${i}`;\n\t\tv[i] = i;\n\t\tmap.set(a[i], v[i]);\n\t}\n\tlet clockStart = clock();\n\tlet obj: MapLike<number> = {};\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tobj = createMap<number>();\n\t\tfor (let i = 0; i < propCount; i++) {\n\t\t\tobj[a[i]] = v[i];\n\t\t}\n\t}\n\tlet et = elapsedMicroseconds(clockStart);\n\tlet perIter = (et / iterCount).toFixed(3);\n\tlet perProp = (et / (iterCount * propCount)).toFixed(3);\n\tconsole.log(\n\t\t`arr prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bObj = createMap<number>();\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const key in obj) {\n\t\t\tif (key in obj) {\n\t\t\t\tbObj[key] = obj[key];\n\t\t\t}\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(3);\n\tconsole.log(\n\t\t`obj prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bObj = createMap<number>();\n\t\tfor (const [key, value] of map) {\n\t\t\tbObj[key] = value;\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`map prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bObj = createMap<number>();\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tbObj[key] = value;\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`map foreach prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tclockStart = clock();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tconst bmap = new Map<string, number>();\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tbmap.set(key, value);\n\t\t}\n\t}\n\tet = elapsedMicroseconds(clockStart);\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`map to map foreach prop init time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n\tconst diffMap = new Map<string, number>();\n\tfor (const [key, value] of map.entries()) {\n\t\tif (Math.random() < 0.5) {\n\t\t\tdiffMap.set(key, value);\n\t\t} else {\n\t\t\tdiffMap.set(key, value * 3);\n\t\t}\n\t}\n\tclockStart = clock();\n\tconst grayMap = new Map<string, number>();\n\tfor (let j = 0; j < iterCount; j++) {\n\t\tfor (const [key, value] of map.entries()) {\n\t\t\tif (diffMap.get(key) !== value) {\n\t\t\t\tgrayMap.set(key, 1);\n\t\t\t}\n\t\t}\n\t}\n\tperIter = (et / iterCount).toFixed(3);\n\tperProp = (et / (iterCount * propCount)).toFixed(2);\n\tconsole.log(\n\t\t`diff time ${perIter} us per ${propCount} properties; ${perProp} us per property`,\n\t);\n}\n\nfunction makeBookmarks(client: TestClient, bookmarkCount: number): ReferencePosition[] {\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst bookmarks: ReferencePosition[] = [];\n\tconst len = client.getLength();\n\tfor (let i = 0; i < bookmarkCount; i++) {\n\t\tconst pos = random.integer(0, len - 1);\n\t\tconst segoff = client.getContainingSegment<ISegmentPrivate>(pos);\n\t\tlet refType = ReferenceType.Simple;\n\t\tif (i & 1) {\n\t\t\trefType = ReferenceType.SlideOnRemove;\n\t\t}\n\t\tconst lref = client.mergeTree.createLocalReferencePosition(\n\t\t\tsegoff!.segment,\n\t\t\tsegoff!.offset,\n\t\t\trefType,\n\t\t\tundefined,\n\t\t);\n\t\tbookmarks.push(lref);\n\t}\n\treturn bookmarks;\n}\n\nfunction measureFetch(startFile: string, withBookmarks = false): void {\n\tconst bookmarkCount = 20000;\n\tconst client = new TestClient();\n\tloadTextFromFileWithMarkers(startFile, client.mergeTree);\n\tif (withBookmarks) {\n\t\tmakeBookmarks(client, bookmarkCount);\n\t\tconsole.log(`inserting ${bookmarkCount} refs into text`);\n\t}\n\tconst reps = 20;\n\tconst clockStart = clock();\n\tlet count = 0;\n\tfor (let i = 0; i < reps; i++) {\n\t\tfor (let pos = 0; pos < client.getLength(); ) {\n\t\t\t// curPG.pos is ca end\n\t\t\tconst curPG = client.searchForMarker(pos, \"pg\", true)!;\n\t\t\tconst properties = curPG.properties!;\n\t\t\tconst curSegOff = client.getContainingSegment<ISegmentPrivate>(pos)!;\n\t\t\tconst curSeg = curSegOff.segment;\n\t\t\t// Combine paragraph and direct properties\n\t\t\textend(properties, curSeg.properties);\n\t\t\tpos += curSeg.cachedLength - curSegOff.offset;\n\t\t\tcount++;\n\t\t}\n\t}\n\tconst et = elapsedMicroseconds(clockStart);\n\tconsole.log(\n\t\t`fetch of ${count / reps} runs over ${client.getLength()} total chars took ${(et / count).toFixed(1)} microseconds per run`,\n\t);\n}\n\nconst baseDir = \"../../src/test/literature\";\nconst filename = path.join(_dirname, baseDir, \"pp.txt\");\nconst testTimeout = 30000;\n\ndescribe(\"Routerlicious\", () => {\n\tdescribe(\"merge-tree\", () => {\n\t\tit(\"wordUnitTest\", () => {\n\t\t\tpropertyCopy();\n\t\t\tmeasureFetch(filename);\n\t\t\tmeasureFetch(filename, true);\n\t\t\tmeasureFetch(filename);\n\t\t\tmeasureFetch(filename, true);\n\t\t}).timeout(testTimeout);\n\t});\n});\n"]}
@@ -2,20 +2,18 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { BaseSegment, ISegment } from "./mergeTreeNodes.js";
6
- import { IJSONSegment } from "./ops.js";
5
+ import { BaseSegment, type ISegment } from "./mergeTreeNodes.js";
6
+ import type { IJSONSegment } from "./ops.js";
7
7
  import type { PropertySet } from "./properties.js";
8
8
  export declare const TextSegmentGranularity = 256;
9
9
  /**
10
- * @legacy
11
- * @alpha
10
+ * @legacy @beta
12
11
  */
13
12
  export interface IJSONTextSegment extends IJSONSegment {
14
13
  text: string;
15
14
  }
16
15
  /**
17
- * @legacy
18
- * @alpha
16
+ * @legacy @beta
19
17
  */
20
18
  export declare class TextSegment extends BaseSegment {
21
19
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"textSegment.d.ts","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAWnD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACrD,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAuBnC,IAAI,EAAE,MAAM;IAtBpB,gBAAuB,IAAI,iBAAiB;IAC5C,SAAgB,IAAI,iBAAoB;WAE1B,EAAE,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW;WAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW;WAIpD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS;gBAW1E,IAAI,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW;IAMb,YAAY,IAAI,gBAAgB,GAAG,MAAM;IAMzC,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW;IAO3C,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IASrC,QAAQ,IAAI,MAAM;IAIlB,MAAM,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAMtC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;CASpE"}
1
+ {"version":3,"file":"textSegment.d.ts","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAWnD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACrD,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAuBnC,IAAI,EAAE,MAAM;IAtBpB,gBAAuB,IAAI,iBAAiB;IAC5C,SAAgB,IAAI,iBAAoB;WAE1B,EAAE,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,IAAI,WAAW;WAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW;WAIpD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS;gBAW1E,IAAI,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW;IAMb,YAAY,IAAI,gBAAgB,GAAG,MAAM;IAMzC,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW;IAO3C,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IASrC,QAAQ,IAAI,MAAM;IAIlB,MAAM,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAMtC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;CASpE"}
@@ -15,8 +15,7 @@ import { BaseSegment } from "./mergeTreeNodes.js";
15
15
  // Exported for test use only.
16
16
  export const TextSegmentGranularity = 256;
17
17
  /**
18
- * @legacy
19
- * @alpha
18
+ * @legacy @beta
20
19
  */
21
20
  export class TextSegment extends BaseSegment {
22
21
  static is(segment) {
@@ -1 +1 @@
1
- {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { BaseSegment, ISegment } from \"./mergeTreeNodes.js\";\nimport { IJSONSegment } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number.\n// Exported for test use only.\nexport const TextSegmentGranularity = 256;\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IJSONTextSegment extends IJSONSegment {\n\ttext: string;\n}\n\n/**\n * @legacy\n * @alpha\n */\nexport class TextSegment extends BaseSegment {\n\tpublic static readonly type = \"TextSegment\";\n\tpublic readonly type = TextSegment.type;\n\n\tpublic static is(segment: ISegment): segment is TextSegment {\n\t\treturn segment.type === TextSegment.type;\n\t}\n\n\tpublic static make(text: string, props?: PropertySet): TextSegment {\n\t\treturn new TextSegment(text, props);\n\t}\n\n\tpublic static fromJSONObject(spec: string | IJSONSegment): TextSegment | undefined {\n\t\tif (typeof spec === \"string\") {\n\t\t\treturn new TextSegment(spec);\n\t\t} else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n\t\t\tconst textSpec = spec as IJSONTextSegment;\n\t\t\treturn TextSegment.make(textSpec.text, textSpec.props);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconstructor(\n\t\tpublic text: string,\n\t\tprops?: PropertySet,\n\t) {\n\t\tsuper(props);\n\t\tthis.cachedLength = text.length;\n\t}\n\n\tpublic toJSONObject(): IJSONTextSegment | string {\n\t\t// To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n\t\t// not annotated.\n\t\treturn this.properties ? { text: this.text, props: { ...this.properties } } : this.text;\n\t}\n\n\tpublic clone(start = 0, end?: number): TextSegment {\n\t\tconst text = this.text.slice(start, end);\n\t\tconst b = TextSegment.make(text, this.properties);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment): boolean {\n\t\treturn (\n\t\t\t!this.text.endsWith(\"\\n\") &&\n\t\t\tTextSegment.is(segment) &&\n\t\t\t(this.cachedLength <= TextSegmentGranularity ||\n\t\t\t\tsegment.cachedLength <= TextSegmentGranularity)\n\t\t);\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.text;\n\t}\n\n\tpublic append(segment: ISegment): void {\n\t\tassert(TextSegment.is(segment), 0x447 /* can only append text segment */);\n\t\tsuper.append(segment);\n\t\tthis.text += segment.text;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number): TextSegment | undefined {\n\t\tif (pos > 0) {\n\t\t\tconst remainingText = this.text.slice(Math.max(0, pos));\n\t\t\tthis.text = this.text.slice(0, Math.max(0, pos));\n\t\t\tthis.cachedLength = this.text.length;\n\t\t\tconst leafSegment = new TextSegment(remainingText);\n\t\t\treturn leafSegment;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { BaseSegment, type ISegment } from \"./mergeTreeNodes.js\";\nimport type { IJSONSegment } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number.\n// Exported for test use only.\nexport const TextSegmentGranularity = 256;\n\n/**\n * @legacy @beta\n */\nexport interface IJSONTextSegment extends IJSONSegment {\n\ttext: string;\n}\n\n/**\n * @legacy @beta\n */\nexport class TextSegment extends BaseSegment {\n\tpublic static readonly type = \"TextSegment\";\n\tpublic readonly type = TextSegment.type;\n\n\tpublic static is(segment: ISegment): segment is TextSegment {\n\t\treturn segment.type === TextSegment.type;\n\t}\n\n\tpublic static make(text: string, props?: PropertySet): TextSegment {\n\t\treturn new TextSegment(text, props);\n\t}\n\n\tpublic static fromJSONObject(spec: string | IJSONSegment): TextSegment | undefined {\n\t\tif (typeof spec === \"string\") {\n\t\t\treturn new TextSegment(spec);\n\t\t} else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n\t\t\tconst textSpec = spec as IJSONTextSegment;\n\t\t\treturn TextSegment.make(textSpec.text, textSpec.props);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconstructor(\n\t\tpublic text: string,\n\t\tprops?: PropertySet,\n\t) {\n\t\tsuper(props);\n\t\tthis.cachedLength = text.length;\n\t}\n\n\tpublic toJSONObject(): IJSONTextSegment | string {\n\t\t// To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n\t\t// not annotated.\n\t\treturn this.properties ? { text: this.text, props: { ...this.properties } } : this.text;\n\t}\n\n\tpublic clone(start = 0, end?: number): TextSegment {\n\t\tconst text = this.text.slice(start, end);\n\t\tconst b = TextSegment.make(text, this.properties);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment): boolean {\n\t\treturn (\n\t\t\t!this.text.endsWith(\"\\n\") &&\n\t\t\tTextSegment.is(segment) &&\n\t\t\t(this.cachedLength <= TextSegmentGranularity ||\n\t\t\t\tsegment.cachedLength <= TextSegmentGranularity)\n\t\t);\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.text;\n\t}\n\n\tpublic append(segment: ISegment): void {\n\t\tassert(TextSegment.is(segment), 0x447 /* can only append text segment */);\n\t\tsuper.append(segment);\n\t\tthis.text += segment.text;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number): TextSegment | undefined {\n\t\tif (pos > 0) {\n\t\t\tconst remainingText = this.text.slice(Math.max(0, pos));\n\t\t\tthis.text = this.text.slice(0, Math.max(0, pos));\n\t\t\tthis.cachedLength = this.text.length;\n\t\t\tconst leafSegment = new TextSegment(remainingText);\n\t\t\treturn leafSegment;\n\t\t}\n\t}\n}\n"]}
package/lib/zamboni.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { MergeTree } from "./mergeTree.js";
5
+ import type { MergeTree } from "./mergeTree.js";
6
6
  import { type MergeBlock } from "./mergeTreeNodes.js";
7
7
  export declare const zamboniSegmentsMax = 2;
8
8
  export declare function zamboniSegments(mergeTree: MergeTree, zamboniSegmentsMaxCount?: number): void;
@@ -1 +1 @@
1
- {"version":3,"file":"zamboni.d.ts","sourceRoot":"","sources":["../src/zamboni.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EACN,KAAK,UAAU,EAOf,MAAM,qBAAqB,CAAC;AAM7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAQpC,wBAAgB,eAAe,CAC9B,SAAS,EAAE,SAAS,EACpB,uBAAuB,SAAqB,GAC1C,IAAI,CA4CN;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAwDzE"}
1
+ {"version":3,"file":"zamboni.d.ts","sourceRoot":"","sources":["../src/zamboni.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EACN,KAAK,UAAU,EAOf,MAAM,qBAAqB,CAAC;AAM7B,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAQpC,wBAAgB,eAAe,CAC9B,SAAS,EAAE,SAAS,EACpB,uBAAuB,SAAqB,GAC1C,IAAI,CA4CN;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAwDzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"zamboni.js","sourceRoot":"","sources":["../src/zamboni.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6DAA6D;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAEN,WAAW,EACX,cAAc,EAGd,MAAM,EACN,eAAe,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,YAAY,MAAM,aAAa,CAAC;AAG5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,SAAS,SAAS,CAAC,IAAgB;IAClC,OAAO,IAAI,CAAC,UAAU,GAAG,eAAe,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,GAAmB,EAAE,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;AAEnF,MAAM,UAAU,eAAe,CAC9B,SAAoB,EACpB,uBAAuB,GAAG,kBAAkB;IAE5C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;QAC3C,OAAO;IACR,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,IAAI,cAAc,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;QAE7D,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAEnF,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC9E,MAAM;QACP,CAAC;QACD,cAAc,GAAG,SAAS,CAAC,eAAe,CAAC,GAAG,EAAG,CAAC;QAClD,+EAA+E;QAC/E,IACC,cAAc,EAAE,OAAO,EAAE,MAAM;YAC/B,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,EACjD,CAAC;YACF,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C,MAAM,YAAY,GAAiB,EAAE,CAAC;YACtC,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;YAC1C,gDAAgD;YAChD,kCAAkC;YAClC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;YAEzB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC;YAE1C,IAAI,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;gBACjC,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC;gBAED,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACtC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACP,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBACpC,SAAS,CAAC,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC3D,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,SAAoB;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAsB,CAAC;IAC3B,MAAM,SAAS,GAAiB,EAAE,CAAC;IACnC,KAAK,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;QACnE,4BAA4B;QAC5B,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAe,CAAC;QAChD,SAAS,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5C,8CAA8C;QAC9C,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;QACxC,MAAM,kBAAkB,GAAG,eAAe,GAAG,CAAC,CAAC;QAC/C,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CACxB,eAAe,GAAG,CAAC,EACnB,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAC/C,CAAC;QACF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACpB,UAAU,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC;QACtE,IAAI,cAAc,GAAG,cAAc,GAAG,UAAU,CAAC;QACjD,MAAM,YAAY,GAAiB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAC3E,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC;YAC7D,IAAI,SAAS,GAAG,qBAAqB,CAAC;YACtC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACxB,SAAS,EAAE,CAAC;gBACZ,cAAc,EAAE,CAAC;YAClB,CAAC;YACD,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnD,KAAK,IAAI,eAAe,GAAG,CAAC,EAAE,eAAe,GAAG,SAAS,EAAE,eAAe,EAAE,EAAE,CAAC;gBAC9E,MAAM,UAAU,GAAG,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;gBACpD,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;YACD,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAC5B,YAAY,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;YACtC,SAAS,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAChC,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACxC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACP,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrC,SAAS,CAAC,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB,EAAE,SAAuB,EAAE,SAAoB;IACjF,+FAA+F;IAC/F,iBAAiB;IACjB,IAAI,WAAwC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,iDAAiD;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,aAAa,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;YACrE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,WAAW,GAAG,SAAS,CAAC;YACxB,SAAS;QACV,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;gBACnD,MAAM,wBAAwB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1E,MAAM,SAAS,GACd,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC;oBAC/B,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;oBAC3D,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAClE,wBAAwB,CAAC;gBAE1B,IAAI,SAAS,EAAE,CAAC;oBACf,WAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC7B,SAAS,CAAC,4BAA4B,EAAE,CACvC;wBACC,SAAS,EAAE,wBAAwB,CAAC,MAAM;wBAC1C,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,WAAY,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;qBACvD,EACD,SAAS,CACT,CAAC;oBAEF,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,kBAAkB,CAAC,cAAc;wBAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC/E,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACP,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxB,WAAW,GAAG,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9D,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,WAAW,GAAG,SAAS,CAAC;YACzB,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3C,8FAA8F;YAC9F,wDAAwD;YACxD,IACC,CAAC,CAAC,WAAW;gBACb,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC;gBAC1C,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAC/B,CAAC;gBACF,SAAS,CAAC,4BAA4B,EAAE,CACvC;oBACC,SAAS,EAAE,wBAAwB,CAAC,MAAM;oBAC1C,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;iBAC5B,EACD,SAAS,CACT,CAAC;gBACF,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;gBACD,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACP,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAED,WAAW,GAAG,SAAS,CAAC;QACzB,CAAC;IACF,CAAC;AACF,CAAC","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 { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { MergeTreeMaintenanceType } from \"./mergeTreeDeltaCallback.js\";\nimport {\n\ttype MergeBlock,\n\tassignChild,\n\tgetMinSeqStamp,\n\tIMergeNode,\n\tISegmentPrivate,\n\tMarker,\n\tMaxNodesInBlock,\n} from \"./mergeTreeNodes.js\";\nimport { matchProperties } from \"./properties.js\";\nimport { toRemovalInfo, removeMergeNodeInfo } from \"./segmentInfos.js\";\nimport * as opstampUtils from \"./stamps.js\";\nimport type { OperationStamp } from \"./stamps.js\";\n\nexport const zamboniSegmentsMax = 2;\nfunction underflow(node: MergeBlock): boolean {\n\treturn node.childCount < MaxNodesInBlock / 2;\n}\n\n// blockUpdatePathLengths requires an OperationStamp but it is unused when passing `newStructure: true`.\nconst dummyStamp: OperationStamp = { seq: UnassignedSequenceNumber, clientId: -1 };\n\nexport function zamboniSegments(\n\tmergeTree: MergeTree,\n\tzamboniSegmentsMaxCount = zamboniSegmentsMax,\n): void {\n\tif (!mergeTree.collabWindow.collaborating) {\n\t\treturn;\n\t}\n\n\tfor (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n\t\tlet segmentToScour = mergeTree.segmentsToScour.peek()?.value;\n\n\t\tsegmentToScour?.segment?.propertyManager?.updateMsn(mergeTree.collabWindow.minSeq);\n\n\t\tif (!segmentToScour || segmentToScour.maxSeq > mergeTree.collabWindow.minSeq) {\n\t\t\tbreak;\n\t\t}\n\t\tsegmentToScour = mergeTree.segmentsToScour.get()!;\n\t\t// Only skip scouring if needs scour is explicitly false, not true or undefined\n\t\tif (\n\t\t\tsegmentToScour?.segment?.parent &&\n\t\t\tsegmentToScour.segment.parent.needsScour !== false\n\t\t) {\n\t\t\tconst block = segmentToScour.segment.parent;\n\t\t\tconst childrenCopy: IMergeNode[] = [];\n\t\t\tscourNode(block, childrenCopy, mergeTree);\n\t\t\t// This will avoid the cost of re-scouring nodes\n\t\t\t// that have recently been scoured\n\t\t\tblock.needsScour = false;\n\n\t\t\tconst newChildCount = childrenCopy.length;\n\n\t\t\tif (newChildCount < block.childCount) {\n\t\t\t\tblock.childCount = newChildCount;\n\t\t\t\tblock.children = childrenCopy;\n\t\t\t\tfor (let j = 0; j < newChildCount; j++) {\n\t\t\t\t\tassignChild(block, childrenCopy[j], j, false);\n\t\t\t\t}\n\n\t\t\t\tif (underflow(block) && block.parent) {\n\t\t\t\t\tpackParent(block.parent, mergeTree);\n\t\t\t\t} else {\n\t\t\t\t\tmergeTree.nodeUpdateOrdinals(block);\n\t\t\t\t\tmergeTree.blockUpdatePathLengths(block, dummyStamp, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Interior node with all node children\nexport function packParent(parent: MergeBlock, mergeTree: MergeTree): void {\n\tconst children = parent.children;\n\tlet childIndex: number;\n\tlet childBlock: MergeBlock;\n\tconst holdNodes: IMergeNode[] = [];\n\tfor (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n\t\t// Debug assert not isLeaf()\n\t\tchildBlock = children[childIndex] as MergeBlock;\n\t\tscourNode(childBlock, holdNodes, mergeTree);\n\t\t// Will replace this block with a packed block\n\t\tchildBlock.parent = undefined;\n\t}\n\tif (holdNodes.length > 0) {\n\t\tconst totalNodeCount = holdNodes.length;\n\t\tconst halfOfMaxNodeCount = MaxNodesInBlock / 2;\n\t\tlet childCount = Math.min(\n\t\t\tMaxNodesInBlock - 1,\n\t\t\tMath.floor(totalNodeCount / halfOfMaxNodeCount),\n\t\t);\n\t\tif (childCount < 1) {\n\t\t\tchildCount = 1;\n\t\t}\n\t\tconst baseNodesInBlockCount = Math.floor(totalNodeCount / childCount);\n\t\tlet remainderCount = totalNodeCount % childCount;\n\t\tconst packedBlocks: IMergeNode[] = Array.from({ length: MaxNodesInBlock });\n\t\tlet childrenPackedCount = 0;\n\t\tfor (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n\t\t\tlet nodeCount = baseNodesInBlockCount;\n\t\t\tif (remainderCount > 0) {\n\t\t\t\tnodeCount++;\n\t\t\t\tremainderCount--;\n\t\t\t}\n\t\t\tconst packedBlock = mergeTree.makeBlock(nodeCount);\n\t\t\tfor (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n\t\t\t\tconst nodeToPack = holdNodes[childrenPackedCount++];\n\t\t\t\tassignChild(packedBlock, nodeToPack, packedNodeIndex, false);\n\t\t\t}\n\t\t\tpackedBlock.parent = parent;\n\t\t\tpackedBlocks[nodeIndex] = packedBlock;\n\t\t\tmergeTree.nodeUpdateLengthNewStructure(packedBlock);\n\t\t}\n\t\tparent.children = packedBlocks;\n\t\tfor (let j = 0; j < childCount; j++) {\n\t\t\tassignChild(parent, packedBlocks[j], j, false);\n\t\t}\n\t\tparent.childCount = childCount;\n\t} else {\n\t\tparent.children = [];\n\t\tparent.childCount = 0;\n\t}\n\tif (underflow(parent) && parent.parent) {\n\t\tpackParent(parent.parent, mergeTree);\n\t} else {\n\t\tmergeTree.nodeUpdateOrdinals(parent);\n\t\tmergeTree.blockUpdatePathLengths(parent, dummyStamp, true);\n\t}\n}\n\nfunction scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTree): void {\n\t// The previous segment is tracked while scouring for the purposes of merging adjacent segments\n\t// when possible.\n\tlet prevSegment: ISegmentPrivate | undefined;\n\tfor (let k = 0; k < node.childCount; k++) {\n\t\t// TODO Non null asserting, why is this not null?\n\t\tconst childNode = node.children[k]!;\n\t\tif (!childNode.isLeaf() || childNode.segmentGroups?.empty === false) {\n\t\t\tholdNodes.push(childNode);\n\t\t\tprevSegment = undefined;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = childNode;\n\t\tconst removalInfo = toRemovalInfo(segment);\n\t\tconst minSeqStamp = getMinSeqStamp(mergeTree.collabWindow);\n\t\tif (removalInfo === undefined) {\n\t\t\tif (opstampUtils.lte(segment.insert, minSeqStamp)) {\n\t\t\t\tconst segmentHasPositiveLength = (mergeTree.leafLength(segment) ?? 0) > 0;\n\t\t\t\tconst canAppend =\n\t\t\t\t\tprevSegment?.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prevSegment.properties, segment.properties) &&\n\t\t\t\t\tprevSegment.trackingCollection.matches(segment.trackingCollection) &&\n\t\t\t\t\tsegmentHasPositiveLength;\n\n\t\t\t\tif (canAppend) {\n\t\t\t\t\tprevSegment!.append(segment);\n\t\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toperation: MergeTreeMaintenanceType.APPEND,\n\t\t\t\t\t\t\tdeltaSegments: [{ segment: prevSegment! }, { segment }],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const tg of segment.trackingCollection.trackingGroups) tg.unlink(segment);\n\t\t\t\t\tremoveMergeNodeInfo(segment);\n\t\t\t\t} else {\n\t\t\t\t\tholdNodes.push(segment);\n\t\t\t\t\tprevSegment = segmentHasPositiveLength ? segment : undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t\tprevSegment = undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tconst firstRemove = removalInfo.removes[0];\n\t\t\t// If the segment's removal is below the MSN and it's not being held onto by a tracking group,\n\t\t\t// it can be unlinked (i.e. removed from the merge-tree)\n\t\t\tif (\n\t\t\t\t!!firstRemove &&\n\t\t\t\topstampUtils.lte(firstRemove, minSeqStamp) &&\n\t\t\t\tsegment.trackingCollection.empty\n\t\t\t) {\n\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t{\n\t\t\t\t\t\toperation: MergeTreeMaintenanceType.UNLINK,\n\t\t\t\t\t\tdeltaSegments: [{ segment }],\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tif (Marker.is(segment)) {\n\t\t\t\t\tmergeTree.unlinkMarker(segment);\n\t\t\t\t}\n\t\t\t\tremoveMergeNodeInfo(segment);\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t}\n\n\t\t\tprevSegment = undefined;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"zamboni.js","sourceRoot":"","sources":["../src/zamboni.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 { UnassignedSequenceNumber } from \"./constants.js\";\nimport type { MergeTree } from \"./mergeTree.js\";\nimport { MergeTreeMaintenanceType } from \"./mergeTreeDeltaCallback.js\";\nimport {\n\ttype MergeBlock,\n\tassignChild,\n\tgetMinSeqStamp,\n\ttype IMergeNode,\n\ttype ISegmentPrivate,\n\tMarker,\n\tMaxNodesInBlock,\n} from \"./mergeTreeNodes.js\";\nimport { matchProperties } from \"./properties.js\";\nimport { toRemovalInfo, removeMergeNodeInfo } from \"./segmentInfos.js\";\nimport * as opstampUtils from \"./stamps.js\";\nimport type { OperationStamp } from \"./stamps.js\";\n\nexport const zamboniSegmentsMax = 2;\nfunction underflow(node: MergeBlock): boolean {\n\treturn node.childCount < MaxNodesInBlock / 2;\n}\n\n// blockUpdatePathLengths requires an OperationStamp but it is unused when passing `newStructure: true`.\nconst dummyStamp: OperationStamp = { seq: UnassignedSequenceNumber, clientId: -1 };\n\nexport function zamboniSegments(\n\tmergeTree: MergeTree,\n\tzamboniSegmentsMaxCount = zamboniSegmentsMax,\n): void {\n\tif (!mergeTree.collabWindow.collaborating) {\n\t\treturn;\n\t}\n\n\tfor (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n\t\tlet segmentToScour = mergeTree.segmentsToScour.peek()?.value;\n\n\t\tsegmentToScour?.segment?.propertyManager?.updateMsn(mergeTree.collabWindow.minSeq);\n\n\t\tif (!segmentToScour || segmentToScour.maxSeq > mergeTree.collabWindow.minSeq) {\n\t\t\tbreak;\n\t\t}\n\t\tsegmentToScour = mergeTree.segmentsToScour.get()!;\n\t\t// Only skip scouring if needs scour is explicitly false, not true or undefined\n\t\tif (\n\t\t\tsegmentToScour?.segment?.parent &&\n\t\t\tsegmentToScour.segment.parent.needsScour !== false\n\t\t) {\n\t\t\tconst block = segmentToScour.segment.parent;\n\t\t\tconst childrenCopy: IMergeNode[] = [];\n\t\t\tscourNode(block, childrenCopy, mergeTree);\n\t\t\t// This will avoid the cost of re-scouring nodes\n\t\t\t// that have recently been scoured\n\t\t\tblock.needsScour = false;\n\n\t\t\tconst newChildCount = childrenCopy.length;\n\n\t\t\tif (newChildCount < block.childCount) {\n\t\t\t\tblock.childCount = newChildCount;\n\t\t\t\tblock.children = childrenCopy;\n\t\t\t\tfor (let j = 0; j < newChildCount; j++) {\n\t\t\t\t\tassignChild(block, childrenCopy[j], j, false);\n\t\t\t\t}\n\n\t\t\t\tif (underflow(block) && block.parent) {\n\t\t\t\t\tpackParent(block.parent, mergeTree);\n\t\t\t\t} else {\n\t\t\t\t\tmergeTree.nodeUpdateOrdinals(block);\n\t\t\t\t\tmergeTree.blockUpdatePathLengths(block, dummyStamp, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Interior node with all node children\nexport function packParent(parent: MergeBlock, mergeTree: MergeTree): void {\n\tconst children = parent.children;\n\tlet childIndex: number;\n\tlet childBlock: MergeBlock;\n\tconst holdNodes: IMergeNode[] = [];\n\tfor (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n\t\t// Debug assert not isLeaf()\n\t\tchildBlock = children[childIndex] as MergeBlock;\n\t\tscourNode(childBlock, holdNodes, mergeTree);\n\t\t// Will replace this block with a packed block\n\t\tchildBlock.parent = undefined;\n\t}\n\tif (holdNodes.length > 0) {\n\t\tconst totalNodeCount = holdNodes.length;\n\t\tconst halfOfMaxNodeCount = MaxNodesInBlock / 2;\n\t\tlet childCount = Math.min(\n\t\t\tMaxNodesInBlock - 1,\n\t\t\tMath.floor(totalNodeCount / halfOfMaxNodeCount),\n\t\t);\n\t\tif (childCount < 1) {\n\t\t\tchildCount = 1;\n\t\t}\n\t\tconst baseNodesInBlockCount = Math.floor(totalNodeCount / childCount);\n\t\tlet remainderCount = totalNodeCount % childCount;\n\t\tconst packedBlocks: IMergeNode[] = Array.from({ length: MaxNodesInBlock });\n\t\tlet childrenPackedCount = 0;\n\t\tfor (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n\t\t\tlet nodeCount = baseNodesInBlockCount;\n\t\t\tif (remainderCount > 0) {\n\t\t\t\tnodeCount++;\n\t\t\t\tremainderCount--;\n\t\t\t}\n\t\t\tconst packedBlock = mergeTree.makeBlock(nodeCount);\n\t\t\tfor (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n\t\t\t\tconst nodeToPack = holdNodes[childrenPackedCount++];\n\t\t\t\tassignChild(packedBlock, nodeToPack, packedNodeIndex, false);\n\t\t\t}\n\t\t\tpackedBlock.parent = parent;\n\t\t\tpackedBlocks[nodeIndex] = packedBlock;\n\t\t\tmergeTree.nodeUpdateLengthNewStructure(packedBlock);\n\t\t}\n\t\tparent.children = packedBlocks;\n\t\tfor (let j = 0; j < childCount; j++) {\n\t\t\tassignChild(parent, packedBlocks[j], j, false);\n\t\t}\n\t\tparent.childCount = childCount;\n\t} else {\n\t\tparent.children = [];\n\t\tparent.childCount = 0;\n\t}\n\tif (underflow(parent) && parent.parent) {\n\t\tpackParent(parent.parent, mergeTree);\n\t} else {\n\t\tmergeTree.nodeUpdateOrdinals(parent);\n\t\tmergeTree.blockUpdatePathLengths(parent, dummyStamp, true);\n\t}\n}\n\nfunction scourNode(node: MergeBlock, holdNodes: IMergeNode[], mergeTree: MergeTree): void {\n\t// The previous segment is tracked while scouring for the purposes of merging adjacent segments\n\t// when possible.\n\tlet prevSegment: ISegmentPrivate | undefined;\n\tfor (let k = 0; k < node.childCount; k++) {\n\t\t// TODO Non null asserting, why is this not null?\n\t\tconst childNode = node.children[k]!;\n\t\tif (!childNode.isLeaf() || childNode.segmentGroups?.empty === false) {\n\t\t\tholdNodes.push(childNode);\n\t\t\tprevSegment = undefined;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst segment = childNode;\n\t\tconst removalInfo = toRemovalInfo(segment);\n\t\tconst minSeqStamp = getMinSeqStamp(mergeTree.collabWindow);\n\t\tif (removalInfo === undefined) {\n\t\t\tif (opstampUtils.lte(segment.insert, minSeqStamp)) {\n\t\t\t\tconst segmentHasPositiveLength = (mergeTree.leafLength(segment) ?? 0) > 0;\n\t\t\t\tconst canAppend =\n\t\t\t\t\tprevSegment?.canAppend(segment) &&\n\t\t\t\t\tmatchProperties(prevSegment.properties, segment.properties) &&\n\t\t\t\t\tprevSegment.trackingCollection.matches(segment.trackingCollection) &&\n\t\t\t\t\tsegmentHasPositiveLength;\n\n\t\t\t\tif (canAppend) {\n\t\t\t\t\tprevSegment!.append(segment);\n\t\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toperation: MergeTreeMaintenanceType.APPEND,\n\t\t\t\t\t\t\tdeltaSegments: [{ segment: prevSegment! }, { segment }],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\n\t\t\t\t\tfor (const tg of segment.trackingCollection.trackingGroups) tg.unlink(segment);\n\t\t\t\t\tremoveMergeNodeInfo(segment);\n\t\t\t\t} else {\n\t\t\t\t\tholdNodes.push(segment);\n\t\t\t\t\tprevSegment = segmentHasPositiveLength ? segment : undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t\tprevSegment = undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tconst firstRemove = removalInfo.removes[0];\n\t\t\t// If the segment's removal is below the MSN and it's not being held onto by a tracking group,\n\t\t\t// it can be unlinked (i.e. removed from the merge-tree)\n\t\t\tif (\n\t\t\t\t!!firstRemove &&\n\t\t\t\topstampUtils.lte(firstRemove, minSeqStamp) &&\n\t\t\t\tsegment.trackingCollection.empty\n\t\t\t) {\n\t\t\t\tmergeTree.mergeTreeMaintenanceCallback?.(\n\t\t\t\t\t{\n\t\t\t\t\t\toperation: MergeTreeMaintenanceType.UNLINK,\n\t\t\t\t\t\tdeltaSegments: [{ segment }],\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tif (Marker.is(segment)) {\n\t\t\t\t\tmergeTree.unlinkMarker(segment);\n\t\t\t\t}\n\t\t\t\tremoveMergeNodeInfo(segment);\n\t\t\t} else {\n\t\t\t\tholdNodes.push(segment);\n\t\t\t}\n\n\t\t\tprevSegment = undefined;\n\t\t}\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/merge-tree",
3
- "version": "2.53.0",
3
+ "version": "2.60.0",
4
4
  "description": "Merge tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -81,30 +81,30 @@
81
81
  "temp-directory": "nyc/.nyc_output"
82
82
  },
83
83
  "dependencies": {
84
- "@fluid-internal/client-utils": "~2.53.0",
85
- "@fluidframework/container-definitions": "~2.53.0",
86
- "@fluidframework/core-interfaces": "~2.53.0",
87
- "@fluidframework/core-utils": "~2.53.0",
88
- "@fluidframework/datastore-definitions": "~2.53.0",
89
- "@fluidframework/driver-definitions": "~2.53.0",
90
- "@fluidframework/runtime-definitions": "~2.53.0",
91
- "@fluidframework/runtime-utils": "~2.53.0",
92
- "@fluidframework/shared-object-base": "~2.53.0",
93
- "@fluidframework/telemetry-utils": "~2.53.0"
84
+ "@fluid-internal/client-utils": "~2.60.0",
85
+ "@fluidframework/container-definitions": "~2.60.0",
86
+ "@fluidframework/core-interfaces": "~2.60.0",
87
+ "@fluidframework/core-utils": "~2.60.0",
88
+ "@fluidframework/datastore-definitions": "~2.60.0",
89
+ "@fluidframework/driver-definitions": "~2.60.0",
90
+ "@fluidframework/runtime-definitions": "~2.60.0",
91
+ "@fluidframework/runtime-utils": "~2.60.0",
92
+ "@fluidframework/shared-object-base": "~2.60.0",
93
+ "@fluidframework/telemetry-utils": "~2.60.0"
94
94
  },
95
95
  "devDependencies": {
96
96
  "@arethetypeswrong/cli": "^0.17.1",
97
97
  "@biomejs/biome": "~1.9.3",
98
- "@fluid-internal/mocha-test-setup": "~2.53.0",
99
- "@fluid-private/stochastic-test-utils": "~2.53.0",
100
- "@fluid-private/test-pairwise-generator": "~2.53.0",
98
+ "@fluid-internal/mocha-test-setup": "~2.60.0",
99
+ "@fluid-private/stochastic-test-utils": "~2.60.0",
100
+ "@fluid-private/test-pairwise-generator": "~2.60.0",
101
101
  "@fluid-tools/benchmark": "^0.51.0",
102
102
  "@fluid-tools/build-cli": "^0.57.0",
103
103
  "@fluidframework/build-common": "^2.0.3",
104
104
  "@fluidframework/build-tools": "^0.57.0",
105
- "@fluidframework/eslint-config-fluid": "^5.7.4",
106
- "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@2.52.0",
107
- "@fluidframework/test-runtime-utils": "~2.53.0",
105
+ "@fluidframework/eslint-config-fluid": "^6.0.0",
106
+ "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@2.53.0",
107
+ "@fluidframework/test-runtime-utils": "~2.60.0",
108
108
  "@microsoft/api-extractor": "7.52.8",
109
109
  "@types/diff": "^3.5.1",
110
110
  "@types/mocha": "^10.0.10",
@@ -4,18 +4,17 @@
4
4
  */
5
5
 
6
6
  import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
7
- import {
7
+ import type {
8
8
  AttributionKey,
9
9
  DetachedAttributionKey,
10
10
  OpAttributionKey,
11
11
  } from "@fluidframework/runtime-definitions/internal";
12
12
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
13
13
 
14
- import { ISegment } from "./mergeTreeNodes.js";
14
+ import type { ISegment } from "./mergeTreeNodes.js";
15
15
 
16
16
  /**
17
- * @legacy
18
- * @alpha
17
+ * @legacy @beta
19
18
  */
20
19
  export interface SequenceOffsets {
21
20
  /**
@@ -36,8 +35,7 @@ export interface SequenceOffsets {
36
35
  }
37
36
 
38
37
  /**
39
- * @legacy
40
- * @alpha
38
+ * @legacy @beta
41
39
  */
42
40
  export interface SerializedAttributionCollection extends SequenceOffsets {
43
41
  channels?: { [name: string]: SequenceOffsets };
@@ -46,8 +44,7 @@ export interface SerializedAttributionCollection extends SequenceOffsets {
46
44
  }
47
45
 
48
46
  /**
49
- * @legacy
50
- * @alpha
47
+ * @legacy @beta
51
48
  */
52
49
  export interface IAttributionCollectionSpec<T> {
53
50
  // eslint-disable-next-line @rushstack/no-new-null
@@ -58,8 +55,7 @@ export interface IAttributionCollectionSpec<T> {
58
55
  }
59
56
 
60
57
  /**
61
- * @legacy
62
- * @alpha
58
+ * @legacy @beta
63
59
  * @sealed
64
60
  */
65
61
  export interface IAttributionCollectionSerializer {
@@ -81,8 +77,7 @@ export interface IAttributionCollectionSerializer {
81
77
  }
82
78
 
83
79
  /**
84
- * @legacy
85
- * @alpha
80
+ * @legacy @beta
86
81
  */
87
82
  export interface IAttributionCollection<T> {
88
83
  /**
@@ -4,17 +4,17 @@
4
4
  */
5
5
 
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
- import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
8
- import { AttributionKey } from "@fluidframework/runtime-definitions/internal";
7
+ import type { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
8
+ import type { AttributionKey } from "@fluidframework/runtime-definitions/internal";
9
9
 
10
10
  import { AttributionCollection } from "./attributionCollection.js";
11
- import { Client } from "./client.js";
12
- import { AttributionPolicy } from "./mergeTree.js";
11
+ import type { Client } from "./client.js";
12
+ import type { AttributionPolicy } from "./mergeTree.js";
13
13
  import {
14
- IMergeTreeDeltaCallbackArgs,
15
- IMergeTreeDeltaOpArgs,
16
- IMergeTreeMaintenanceCallbackArgs,
17
- IMergeTreeSegmentDelta,
14
+ type IMergeTreeDeltaCallbackArgs,
15
+ type IMergeTreeDeltaOpArgs,
16
+ type IMergeTreeMaintenanceCallbackArgs,
17
+ type IMergeTreeSegmentDelta,
18
18
  MergeTreeMaintenanceType,
19
19
  } from "./mergeTreeDeltaCallback.js";
20
20
  import { MergeTreeDeltaType } from "./ops.js";
package/src/client.ts CHANGED
@@ -6,26 +6,26 @@
6
6
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
7
7
 
8
8
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
9
- import { type IEventThisPlaceHolder, IFluidHandle } from "@fluidframework/core-interfaces";
9
+ import type { IEventThisPlaceHolder, IFluidHandle } from "@fluidframework/core-interfaces";
10
10
  import {
11
11
  assert,
12
12
  unreachableCase,
13
13
  isObject,
14
14
  type DoublyLinkedList,
15
15
  } from "@fluidframework/core-utils/internal";
16
- import {
16
+ import type {
17
17
  IFluidDataStoreRuntime,
18
18
  IChannelStorageService,
19
19
  } from "@fluidframework/datastore-definitions/internal";
20
20
  import {
21
21
  MessageType,
22
- ISequencedDocumentMessage,
22
+ type ISequencedDocumentMessage,
23
23
  } from "@fluidframework/driver-definitions/internal";
24
- import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions/internal";
24
+ import type { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions/internal";
25
25
  import { toDeltaManagerInternal } from "@fluidframework/runtime-utils/internal";
26
- import { IFluidSerializer } from "@fluidframework/shared-object-base/internal";
26
+ import type { IFluidSerializer } from "@fluidframework/shared-object-base/internal";
27
27
  import {
28
- ITelemetryLoggerExt,
28
+ type ITelemetryLoggerExt,
29
29
  LoggingError,
30
30
  UsageError,
31
31
  } from "@fluidframework/telemetry-utils/internal";
@@ -33,7 +33,7 @@ import {
33
33
  import { MergeTreeTextHelper, type IMergeTreeTextHelper } from "./MergeTreeTextHelper.js";
34
34
  import { RedBlackTree } from "./collections/index.js";
35
35
  import { NonCollabClient, SquashClient, UniversalSequenceNumber } from "./constants.js";
36
- import { LocalReferencePosition, SlidingPreference } from "./localReference.js";
36
+ import { type LocalReferencePosition, SlidingPreference } from "./localReference.js";
37
37
  import {
38
38
  MergeTree,
39
39
  errorIfOptionNotTrue,
@@ -48,12 +48,12 @@ import type {
48
48
  } from "./mergeTreeDeltaCallback.js";
49
49
  import { walkAllChildSegments } from "./mergeTreeNodeWalk.js";
50
50
  import {
51
- CollaborationWindow,
52
- ISegment,
53
- ISegmentAction,
54
- ISegmentPrivate,
55
- Marker,
56
- SegmentGroup,
51
+ type CollaborationWindow,
52
+ type ISegment,
53
+ type ISegmentAction,
54
+ type ISegmentPrivate,
55
+ type Marker,
56
+ type SegmentGroup,
57
57
  compareStrings,
58
58
  isSegmentLeaf,
59
59
  type ISegmentInternal,
@@ -71,17 +71,17 @@ import {
71
71
  createRemoveRangeOp,
72
72
  } from "./opBuilder.js";
73
73
  import {
74
- IJSONSegment,
75
- IMergeTreeAnnotateMsg,
76
- IMergeTreeDeltaOp,
74
+ type IJSONSegment,
75
+ type IMergeTreeAnnotateMsg,
76
+ type IMergeTreeDeltaOp,
77
77
  // eslint-disable-next-line import/no-deprecated
78
- IMergeTreeGroupMsg,
79
- IMergeTreeInsertMsg,
78
+ type IMergeTreeGroupMsg,
79
+ type IMergeTreeInsertMsg,
80
80
  // eslint-disable-next-line import/no-deprecated
81
- IMergeTreeObliterateMsg,
82
- IMergeTreeOp,
83
- IMergeTreeRemoveMsg,
84
- IRelativePosition,
81
+ type IMergeTreeObliterateMsg,
82
+ type IMergeTreeOp,
83
+ type IMergeTreeRemoveMsg,
84
+ type IRelativePosition,
85
85
  MergeTreeDeltaType,
86
86
  ReferenceType,
87
87
  type AdjustParams,
@@ -94,8 +94,8 @@ import {
94
94
  PriorPerspective,
95
95
  type Perspective,
96
96
  } from "./perspective.js";
97
- import { PropertySet, type MapLike } from "./properties.js";
98
- import { DetachedReferencePosition, ReferencePosition } from "./referencePositions.js";
97
+ import type { PropertySet, MapLike } from "./properties.js";
98
+ import { DetachedReferencePosition, type ReferencePosition } from "./referencePositions.js";
99
99
  import {
100
100
  isInserted,
101
101
  isRemoved,
@@ -4,17 +4,17 @@
4
4
  */
5
5
 
6
6
  export {
7
- ConflictAction,
8
- Dictionary,
9
- IRBAugmentation,
10
- IRBMatcher,
11
- KeyComparer,
12
- Property,
13
- PropertyAction,
14
- QProperty,
7
+ type ConflictAction,
8
+ type Dictionary,
9
+ type IRBAugmentation,
10
+ type IRBMatcher,
11
+ type KeyComparer,
12
+ type Property,
13
+ type PropertyAction,
14
+ type QProperty,
15
15
  RBColor,
16
- RBNode,
17
- RBNodeActions,
16
+ type RBNode,
17
+ type RBNodeActions,
18
18
  RedBlackTree,
19
- SortedDictionary,
19
+ type SortedDictionary,
20
20
  } from "./rbTree.js";
@@ -6,15 +6,11 @@
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import { LocalClientId } from "./constants.js";
9
- import { LocalReferenceCollection } from "./localReference.js";
10
- import { MergeTree } from "./mergeTree.js";
9
+ import type { LocalReferenceCollection } from "./localReference.js";
10
+ import type { MergeTree } from "./mergeTree.js";
11
11
  import { NodeAction, depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
12
- import { ISegment, type ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
13
- import {
14
- type IHasInsertionInfo,
15
- type IHasRemovalInfo,
16
- type IMergeNodeInfo,
17
- } from "./segmentInfos.js";
12
+ import type { ISegment, ISegmentLeaf, MergeBlock } from "./mergeTreeNodes.js";
13
+ import type { IHasInsertionInfo, IHasRemovalInfo, IMergeNodeInfo } from "./segmentInfos.js";
18
14
 
19
15
  /**
20
16
  * This is a special segment that is not bound or known by the merge tree itself,