@fluid-experimental/tree 2.0.0-rc.2.0.1 → 2.0.0-rc.3.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 (571) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/experimental-tree.api.md +2 -2
  3. package/dist/ChangeCompression.d.ts +2 -2
  4. package/dist/ChangeCompression.d.ts.map +1 -1
  5. package/dist/ChangeCompression.js +1 -1
  6. package/dist/ChangeCompression.js.map +1 -1
  7. package/dist/ChangeTypes.d.ts +1 -1
  8. package/dist/ChangeTypes.d.ts.map +1 -1
  9. package/dist/ChangeTypes.js +4 -4
  10. package/dist/ChangeTypes.js.map +1 -1
  11. package/dist/Checkout.d.ts +3 -3
  12. package/dist/Checkout.d.ts.map +1 -1
  13. package/dist/Checkout.js +17 -17
  14. package/dist/Checkout.js.map +1 -1
  15. package/dist/EditLog.d.ts +1 -1
  16. package/dist/EditLog.d.ts.map +1 -1
  17. package/dist/EditLog.js +9 -9
  18. package/dist/EditLog.js.map +1 -1
  19. package/dist/EditUtilities.d.ts +3 -3
  20. package/dist/EditUtilities.d.ts.map +1 -1
  21. package/dist/EditUtilities.js +6 -6
  22. package/dist/EditUtilities.js.map +1 -1
  23. package/dist/Forest.d.ts.map +1 -1
  24. package/dist/Forest.js +23 -23
  25. package/dist/Forest.js.map +1 -1
  26. package/dist/HistoryEditFactory.d.ts +1 -1
  27. package/dist/HistoryEditFactory.d.ts.map +1 -1
  28. package/dist/HistoryEditFactory.js +7 -7
  29. package/dist/HistoryEditFactory.js.map +1 -1
  30. package/dist/IdConversion.d.ts.map +1 -1
  31. package/dist/IdConversion.js.map +1 -1
  32. package/dist/LogViewer.d.ts +2 -2
  33. package/dist/LogViewer.d.ts.map +1 -1
  34. package/dist/LogViewer.js +7 -7
  35. package/dist/LogViewer.js.map +1 -1
  36. package/dist/MergeHealth.d.ts.map +1 -1
  37. package/dist/MergeHealth.js +1 -1
  38. package/dist/MergeHealth.js.map +1 -1
  39. package/dist/NodeIdUtilities.d.ts +1 -1
  40. package/dist/NodeIdUtilities.d.ts.map +1 -1
  41. package/dist/NodeIdUtilities.js +1 -1
  42. package/dist/NodeIdUtilities.js.map +1 -1
  43. package/dist/PayloadUtilities.d.ts.map +1 -1
  44. package/dist/PayloadUtilities.js +2 -2
  45. package/dist/PayloadUtilities.js.map +1 -1
  46. package/dist/ReconciliationPath.d.ts +1 -1
  47. package/dist/ReconciliationPath.d.ts.map +1 -1
  48. package/dist/ReconciliationPath.js.map +1 -1
  49. package/dist/RevisionValueCache.d.ts.map +1 -1
  50. package/dist/RevisionValueCache.js +2 -2
  51. package/dist/RevisionValueCache.js.map +1 -1
  52. package/dist/RevisionView.d.ts +2 -2
  53. package/dist/RevisionView.d.ts.map +1 -1
  54. package/dist/RevisionView.js.map +1 -1
  55. package/dist/SerializationUtilities.d.ts +1 -1
  56. package/dist/SerializationUtilities.d.ts.map +1 -1
  57. package/dist/SerializationUtilities.js.map +1 -1
  58. package/dist/SharedTree.d.ts +8 -7
  59. package/dist/SharedTree.d.ts.map +1 -1
  60. package/dist/SharedTree.js +78 -78
  61. package/dist/SharedTree.js.map +1 -1
  62. package/dist/SharedTreeEncoder.d.ts +1 -1
  63. package/dist/SharedTreeEncoder.d.ts.map +1 -1
  64. package/dist/SharedTreeEncoder.js +31 -31
  65. package/dist/SharedTreeEncoder.js.map +1 -1
  66. package/dist/Summary.d.ts +2 -2
  67. package/dist/Summary.d.ts.map +1 -1
  68. package/dist/Summary.js +2 -2
  69. package/dist/Summary.js.map +1 -1
  70. package/dist/SummaryBackCompatibility.d.ts.map +1 -1
  71. package/dist/SummaryBackCompatibility.js.map +1 -1
  72. package/dist/SummaryTestUtilities.d.ts +1 -1
  73. package/dist/SummaryTestUtilities.d.ts.map +1 -1
  74. package/dist/SummaryTestUtilities.js.map +1 -1
  75. package/dist/Transaction.d.ts +3 -3
  76. package/dist/Transaction.d.ts.map +1 -1
  77. package/dist/Transaction.js +3 -3
  78. package/dist/Transaction.js.map +1 -1
  79. package/dist/TransactionInternal.d.ts +3 -3
  80. package/dist/TransactionInternal.d.ts.map +1 -1
  81. package/dist/TransactionInternal.js +6 -6
  82. package/dist/TransactionInternal.js.map +1 -1
  83. package/dist/TreeCompressor.d.ts +5 -1
  84. package/dist/TreeCompressor.d.ts.map +1 -1
  85. package/dist/TreeCompressor.js +5 -5
  86. package/dist/TreeCompressor.js.map +1 -1
  87. package/dist/TreeNodeHandle.d.ts +1 -1
  88. package/dist/TreeNodeHandle.d.ts.map +1 -1
  89. package/dist/TreeNodeHandle.js.map +1 -1
  90. package/dist/TreeView.d.ts +1 -1
  91. package/dist/TreeView.d.ts.map +1 -1
  92. package/dist/TreeView.js +2 -3
  93. package/dist/TreeView.js.map +1 -1
  94. package/dist/UuidUtilities.d.ts.map +1 -1
  95. package/dist/UuidUtilities.js.map +1 -1
  96. package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
  97. package/dist/id-compressor/AppendOnlySortedMap.js +3 -3
  98. package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
  99. package/dist/id-compressor/IdCompressor.d.ts +1 -1
  100. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  101. package/dist/id-compressor/IdCompressor.js +25 -26
  102. package/dist/id-compressor/IdCompressor.js.map +1 -1
  103. package/dist/id-compressor/IdRange.d.ts.map +1 -1
  104. package/dist/id-compressor/IdRange.js +2 -2
  105. package/dist/id-compressor/IdRange.js.map +1 -1
  106. package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
  107. package/dist/id-compressor/NumericUuid.js +2 -1
  108. package/dist/id-compressor/NumericUuid.js.map +1 -1
  109. package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  110. package/dist/id-compressor/SessionIdNormalizer.js +8 -9
  111. package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
  112. package/dist/migration-shim/migrationDeltaHandler.d.ts +1 -1
  113. package/dist/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
  114. package/dist/migration-shim/migrationDeltaHandler.js +11 -11
  115. package/dist/migration-shim/migrationDeltaHandler.js.map +1 -1
  116. package/dist/migration-shim/migrationShim.d.ts +8 -4
  117. package/dist/migration-shim/migrationShim.d.ts.map +1 -1
  118. package/dist/migration-shim/migrationShim.js +13 -13
  119. package/dist/migration-shim/migrationShim.js.map +1 -1
  120. package/dist/migration-shim/migrationShimFactory.d.ts +2 -2
  121. package/dist/migration-shim/migrationShimFactory.d.ts.map +1 -1
  122. package/dist/migration-shim/migrationShimFactory.js +2 -2
  123. package/dist/migration-shim/migrationShimFactory.js.map +1 -1
  124. package/dist/migration-shim/packageVersion.d.ts +0 -2
  125. package/dist/migration-shim/packageVersion.d.ts.map +1 -1
  126. package/dist/migration-shim/packageVersion.js +0 -2
  127. package/dist/migration-shim/packageVersion.js.map +1 -1
  128. package/dist/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
  129. package/dist/migration-shim/sharedTreeDeltaHandler.js +8 -8
  130. package/dist/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
  131. package/dist/migration-shim/sharedTreeShim.d.ts +2 -2
  132. package/dist/migration-shim/sharedTreeShim.d.ts.map +1 -1
  133. package/dist/migration-shim/sharedTreeShim.js +8 -4
  134. package/dist/migration-shim/sharedTreeShim.js.map +1 -1
  135. package/dist/migration-shim/sharedTreeShimFactory.d.ts +1 -1
  136. package/dist/migration-shim/sharedTreeShimFactory.d.ts.map +1 -1
  137. package/dist/migration-shim/sharedTreeShimFactory.js +2 -2
  138. package/dist/migration-shim/sharedTreeShimFactory.js.map +1 -1
  139. package/dist/migration-shim/shimChannelServices.d.ts +1 -1
  140. package/dist/migration-shim/shimChannelServices.d.ts.map +1 -1
  141. package/dist/migration-shim/shimChannelServices.js.map +1 -1
  142. package/dist/migration-shim/shimDeltaConnection.d.ts +1 -1
  143. package/dist/migration-shim/shimDeltaConnection.d.ts.map +1 -1
  144. package/dist/migration-shim/shimDeltaConnection.js +2 -2
  145. package/dist/migration-shim/shimDeltaConnection.js.map +1 -1
  146. package/dist/migration-shim/shimHandle.d.ts.map +1 -1
  147. package/dist/migration-shim/shimHandle.js.map +1 -1
  148. package/dist/migration-shim/types.d.ts +1 -1
  149. package/dist/migration-shim/types.d.ts.map +1 -1
  150. package/dist/migration-shim/types.js.map +1 -1
  151. package/dist/migration-shim/utils.d.ts +1 -1
  152. package/dist/migration-shim/utils.d.ts.map +1 -1
  153. package/dist/migration-shim/utils.js.map +1 -1
  154. package/dist/persisted-types/0.0.2.d.ts +1 -1
  155. package/dist/persisted-types/0.0.2.d.ts.map +1 -1
  156. package/dist/persisted-types/0.0.2.js.map +1 -1
  157. package/dist/persisted-types/0.1.1.d.ts +1 -1
  158. package/dist/persisted-types/0.1.1.d.ts.map +1 -1
  159. package/dist/persisted-types/0.1.1.js +3 -3
  160. package/dist/persisted-types/0.1.1.js.map +1 -1
  161. package/lib/ChangeCompression.d.ts +2 -2
  162. package/lib/ChangeCompression.d.ts.map +1 -1
  163. package/lib/ChangeCompression.js +1 -1
  164. package/lib/ChangeCompression.js.map +1 -1
  165. package/lib/ChangeTypes.d.ts +1 -1
  166. package/lib/ChangeTypes.d.ts.map +1 -1
  167. package/lib/ChangeTypes.js +2 -2
  168. package/lib/ChangeTypes.js.map +1 -1
  169. package/lib/Checkout.d.ts +3 -3
  170. package/lib/Checkout.d.ts.map +1 -1
  171. package/lib/Checkout.js +4 -4
  172. package/lib/Checkout.js.map +1 -1
  173. package/lib/EditLog.d.ts +1 -1
  174. package/lib/EditLog.d.ts.map +1 -1
  175. package/lib/EditLog.js +2 -2
  176. package/lib/EditLog.js.map +1 -1
  177. package/lib/EditUtilities.d.ts +3 -3
  178. package/lib/EditUtilities.d.ts.map +1 -1
  179. package/lib/EditUtilities.js +5 -5
  180. package/lib/EditUtilities.js.map +1 -1
  181. package/lib/Forest.d.ts.map +1 -1
  182. package/lib/Forest.js +2 -2
  183. package/lib/Forest.js.map +1 -1
  184. package/lib/HistoryEditFactory.d.ts +1 -1
  185. package/lib/HistoryEditFactory.d.ts.map +1 -1
  186. package/lib/HistoryEditFactory.js +5 -5
  187. package/lib/HistoryEditFactory.js.map +1 -1
  188. package/lib/IdConversion.d.ts.map +1 -1
  189. package/lib/IdConversion.js.map +1 -1
  190. package/lib/LogViewer.d.ts +2 -2
  191. package/lib/LogViewer.d.ts.map +1 -1
  192. package/lib/LogViewer.js +3 -3
  193. package/lib/LogViewer.js.map +1 -1
  194. package/lib/MergeHealth.d.ts.map +1 -1
  195. package/lib/MergeHealth.js +1 -1
  196. package/lib/MergeHealth.js.map +1 -1
  197. package/lib/NodeIdUtilities.d.ts +1 -1
  198. package/lib/NodeIdUtilities.d.ts.map +1 -1
  199. package/lib/NodeIdUtilities.js +1 -1
  200. package/lib/NodeIdUtilities.js.map +1 -1
  201. package/lib/PayloadUtilities.d.ts.map +1 -1
  202. package/lib/PayloadUtilities.js +1 -1
  203. package/lib/PayloadUtilities.js.map +1 -1
  204. package/lib/ReconciliationPath.d.ts +1 -1
  205. package/lib/ReconciliationPath.d.ts.map +1 -1
  206. package/lib/ReconciliationPath.js.map +1 -1
  207. package/lib/RevisionValueCache.d.ts.map +1 -1
  208. package/lib/RevisionValueCache.js +2 -2
  209. package/lib/RevisionValueCache.js.map +1 -1
  210. package/lib/RevisionView.d.ts +2 -2
  211. package/lib/RevisionView.d.ts.map +1 -1
  212. package/lib/RevisionView.js.map +1 -1
  213. package/lib/SerializationUtilities.d.ts +1 -1
  214. package/lib/SerializationUtilities.d.ts.map +1 -1
  215. package/lib/SerializationUtilities.js.map +1 -1
  216. package/lib/SharedTree.d.ts +8 -7
  217. package/lib/SharedTree.d.ts.map +1 -1
  218. package/lib/SharedTree.js +13 -13
  219. package/lib/SharedTree.js.map +1 -1
  220. package/lib/SharedTreeEncoder.d.ts +1 -1
  221. package/lib/SharedTreeEncoder.d.ts.map +1 -1
  222. package/lib/SharedTreeEncoder.js +5 -5
  223. package/lib/SharedTreeEncoder.js.map +1 -1
  224. package/lib/Summary.d.ts +2 -2
  225. package/lib/Summary.d.ts.map +1 -1
  226. package/lib/Summary.js +1 -1
  227. package/lib/Summary.js.map +1 -1
  228. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  229. package/lib/SummaryBackCompatibility.js.map +1 -1
  230. package/lib/SummaryTestUtilities.d.ts +1 -1
  231. package/lib/SummaryTestUtilities.d.ts.map +1 -1
  232. package/lib/SummaryTestUtilities.js.map +1 -1
  233. package/lib/Transaction.d.ts +3 -3
  234. package/lib/Transaction.d.ts.map +1 -1
  235. package/lib/Transaction.js +3 -3
  236. package/lib/Transaction.js.map +1 -1
  237. package/lib/TransactionInternal.d.ts +3 -3
  238. package/lib/TransactionInternal.d.ts.map +1 -1
  239. package/lib/TransactionInternal.js +3 -3
  240. package/lib/TransactionInternal.js.map +1 -1
  241. package/lib/TreeCompressor.d.ts +5 -1
  242. package/lib/TreeCompressor.d.ts.map +1 -1
  243. package/lib/TreeCompressor.js +2 -2
  244. package/lib/TreeCompressor.js.map +1 -1
  245. package/lib/TreeNodeHandle.d.ts +1 -1
  246. package/lib/TreeNodeHandle.d.ts.map +1 -1
  247. package/lib/TreeNodeHandle.js.map +1 -1
  248. package/lib/TreeView.d.ts +1 -1
  249. package/lib/TreeView.d.ts.map +1 -1
  250. package/lib/TreeView.js +1 -2
  251. package/lib/TreeView.js.map +1 -1
  252. package/lib/UuidUtilities.d.ts.map +1 -1
  253. package/lib/UuidUtilities.js +1 -1
  254. package/lib/UuidUtilities.js.map +1 -1
  255. package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
  256. package/lib/id-compressor/AppendOnlySortedMap.js +1 -1
  257. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
  258. package/lib/id-compressor/IdCompressor.d.ts +1 -1
  259. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  260. package/lib/id-compressor/IdCompressor.js +4 -5
  261. package/lib/id-compressor/IdCompressor.js.map +1 -1
  262. package/lib/id-compressor/IdRange.d.ts.map +1 -1
  263. package/lib/id-compressor/IdRange.js +1 -1
  264. package/lib/id-compressor/IdRange.js.map +1 -1
  265. package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
  266. package/lib/id-compressor/NumericUuid.js +2 -1
  267. package/lib/id-compressor/NumericUuid.js.map +1 -1
  268. package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  269. package/lib/id-compressor/SessionIdNormalizer.js +1 -2
  270. package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
  271. package/lib/migration-shim/migrationDeltaHandler.d.ts +1 -1
  272. package/lib/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
  273. package/lib/migration-shim/migrationDeltaHandler.js +1 -1
  274. package/lib/migration-shim/migrationDeltaHandler.js.map +1 -1
  275. package/lib/migration-shim/migrationShim.d.ts +8 -4
  276. package/lib/migration-shim/migrationShim.d.ts.map +1 -1
  277. package/lib/migration-shim/migrationShim.js +3 -3
  278. package/lib/migration-shim/migrationShim.js.map +1 -1
  279. package/lib/migration-shim/migrationShimFactory.d.ts +2 -2
  280. package/lib/migration-shim/migrationShimFactory.d.ts.map +1 -1
  281. package/lib/migration-shim/migrationShimFactory.js +1 -1
  282. package/lib/migration-shim/migrationShimFactory.js.map +1 -1
  283. package/lib/migration-shim/packageVersion.d.ts +0 -2
  284. package/lib/migration-shim/packageVersion.d.ts.map +1 -1
  285. package/lib/migration-shim/packageVersion.js +0 -2
  286. package/lib/migration-shim/packageVersion.js.map +1 -1
  287. package/lib/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
  288. package/lib/migration-shim/sharedTreeDeltaHandler.js +1 -1
  289. package/lib/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
  290. package/lib/migration-shim/sharedTreeShim.d.ts +2 -2
  291. package/lib/migration-shim/sharedTreeShim.d.ts.map +1 -1
  292. package/lib/migration-shim/sharedTreeShim.js +6 -2
  293. package/lib/migration-shim/sharedTreeShim.js.map +1 -1
  294. package/lib/migration-shim/sharedTreeShimFactory.d.ts +1 -1
  295. package/lib/migration-shim/sharedTreeShimFactory.d.ts.map +1 -1
  296. package/lib/migration-shim/sharedTreeShimFactory.js +1 -1
  297. package/lib/migration-shim/sharedTreeShimFactory.js.map +1 -1
  298. package/lib/migration-shim/shimChannelServices.d.ts +1 -1
  299. package/lib/migration-shim/shimChannelServices.d.ts.map +1 -1
  300. package/lib/migration-shim/shimChannelServices.js.map +1 -1
  301. package/lib/migration-shim/shimDeltaConnection.d.ts +1 -1
  302. package/lib/migration-shim/shimDeltaConnection.d.ts.map +1 -1
  303. package/lib/migration-shim/shimDeltaConnection.js +1 -1
  304. package/lib/migration-shim/shimDeltaConnection.js.map +1 -1
  305. package/lib/migration-shim/shimHandle.d.ts.map +1 -1
  306. package/lib/migration-shim/shimHandle.js.map +1 -1
  307. package/lib/migration-shim/types.d.ts +1 -1
  308. package/lib/migration-shim/types.d.ts.map +1 -1
  309. package/lib/migration-shim/types.js.map +1 -1
  310. package/lib/migration-shim/utils.d.ts +1 -1
  311. package/lib/migration-shim/utils.d.ts.map +1 -1
  312. package/lib/migration-shim/utils.js.map +1 -1
  313. package/lib/persisted-types/0.0.2.d.ts +1 -1
  314. package/lib/persisted-types/0.0.2.d.ts.map +1 -1
  315. package/lib/persisted-types/0.0.2.js.map +1 -1
  316. package/lib/persisted-types/0.1.1.d.ts +1 -1
  317. package/lib/persisted-types/0.1.1.d.ts.map +1 -1
  318. package/lib/persisted-types/0.1.1.js +1 -1
  319. package/lib/persisted-types/0.1.1.js.map +1 -1
  320. package/package.json +33 -32
  321. package/src/ChangeCompression.ts +8 -8
  322. package/src/ChangeTypes.ts +5 -4
  323. package/src/Checkout.ts +9 -7
  324. package/src/EditLog.ts +4 -3
  325. package/src/EditUtilities.ts +9 -8
  326. package/src/Forest.ts +3 -2
  327. package/src/HistoryEditFactory.ts +12 -11
  328. package/src/IdConversion.ts +2 -2
  329. package/src/LogViewer.ts +5 -4
  330. package/src/MergeHealth.ts +2 -1
  331. package/src/NodeIdUtilities.ts +2 -2
  332. package/src/PayloadUtilities.ts +2 -1
  333. package/src/ReconciliationPath.ts +1 -1
  334. package/src/RevisionValueCache.ts +3 -2
  335. package/src/RevisionView.ts +3 -3
  336. package/src/SerializationUtilities.ts +1 -1
  337. package/src/SharedTree.ts +46 -49
  338. package/src/SharedTreeEncoder.ts +30 -29
  339. package/src/Summary.ts +5 -3
  340. package/src/SummaryBackCompatibility.ts +1 -0
  341. package/src/SummaryTestUtilities.ts +2 -1
  342. package/src/Transaction.ts +7 -6
  343. package/src/TransactionInternal.ts +17 -16
  344. package/src/TreeCompressor.ts +6 -4
  345. package/src/TreeNodeHandle.ts +2 -2
  346. package/src/TreeView.ts +3 -3
  347. package/src/UuidUtilities.ts +2 -1
  348. package/src/id-compressor/AppendOnlySortedMap.ts +2 -1
  349. package/src/id-compressor/IdCompressor.ts +18 -17
  350. package/src/id-compressor/IdRange.ts +2 -1
  351. package/src/id-compressor/NumericUuid.ts +1 -1
  352. package/src/id-compressor/SessionIdNormalizer.ts +3 -3
  353. package/src/migration-shim/migrationDeltaHandler.ts +3 -2
  354. package/src/migration-shim/migrationShim.ts +14 -10
  355. package/src/migration-shim/migrationShimFactory.ts +6 -4
  356. package/src/migration-shim/packageVersion.ts +0 -2
  357. package/src/migration-shim/sharedTreeDeltaHandler.ts +3 -2
  358. package/src/migration-shim/sharedTreeShim.ts +7 -5
  359. package/src/migration-shim/sharedTreeShimFactory.ts +3 -3
  360. package/src/migration-shim/shimChannelServices.ts +1 -1
  361. package/src/migration-shim/shimDeltaConnection.ts +3 -2
  362. package/src/migration-shim/shimHandle.ts +1 -0
  363. package/src/migration-shim/types.ts +3 -1
  364. package/src/migration-shim/utils.ts +2 -1
  365. package/src/persisted-types/0.0.2.ts +2 -2
  366. package/src/persisted-types/0.1.1.ts +10 -8
  367. package/dist/tree-alpha.d.ts +0 -2901
  368. package/dist/tree-beta.d.ts +0 -348
  369. package/dist/tree-public.d.ts +0 -348
  370. package/dist/tree-untrimmed.d.ts +0 -3820
  371. package/lib/test/AppendOnlySortedMap.perf.tests.d.ts +0 -6
  372. package/lib/test/AppendOnlySortedMap.perf.tests.d.ts.map +0 -1
  373. package/lib/test/AppendOnlySortedMap.perf.tests.js +0 -49
  374. package/lib/test/AppendOnlySortedMap.perf.tests.js.map +0 -1
  375. package/lib/test/AppendOnlySortedMap.tests.d.ts +0 -6
  376. package/lib/test/AppendOnlySortedMap.tests.d.ts.map +0 -1
  377. package/lib/test/AppendOnlySortedMap.tests.js +0 -213
  378. package/lib/test/AppendOnlySortedMap.tests.js.map +0 -1
  379. package/lib/test/ChangeCompression.tests.d.ts +0 -6
  380. package/lib/test/ChangeCompression.tests.d.ts.map +0 -1
  381. package/lib/test/ChangeCompression.tests.js +0 -154
  382. package/lib/test/ChangeCompression.tests.js.map +0 -1
  383. package/lib/test/Checkout.tests.d.ts +0 -10
  384. package/lib/test/Checkout.tests.d.ts.map +0 -1
  385. package/lib/test/Checkout.tests.js +0 -460
  386. package/lib/test/Checkout.tests.js.map +0 -1
  387. package/lib/test/Common.tests.d.ts +0 -6
  388. package/lib/test/Common.tests.d.ts.map +0 -1
  389. package/lib/test/Common.tests.js +0 -102
  390. package/lib/test/Common.tests.js.map +0 -1
  391. package/lib/test/EagerCheckout.tests.d.ts +0 -6
  392. package/lib/test/EagerCheckout.tests.d.ts.map +0 -1
  393. package/lib/test/EagerCheckout.tests.js +0 -20
  394. package/lib/test/EagerCheckout.tests.js.map +0 -1
  395. package/lib/test/Edit.tests.d.ts +0 -6
  396. package/lib/test/Edit.tests.d.ts.map +0 -1
  397. package/lib/test/Edit.tests.js +0 -60
  398. package/lib/test/Edit.tests.js.map +0 -1
  399. package/lib/test/EditLog.perf.tests.d.ts +0 -6
  400. package/lib/test/EditLog.perf.tests.d.ts.map +0 -1
  401. package/lib/test/EditLog.perf.tests.js +0 -41
  402. package/lib/test/EditLog.perf.tests.js.map +0 -1
  403. package/lib/test/EditLog.tests.d.ts +0 -6
  404. package/lib/test/EditLog.tests.d.ts.map +0 -1
  405. package/lib/test/EditLog.tests.js +0 -355
  406. package/lib/test/EditLog.tests.js.map +0 -1
  407. package/lib/test/EditUtilities.tests.d.ts +0 -6
  408. package/lib/test/EditUtilities.tests.d.ts.map +0 -1
  409. package/lib/test/EditUtilities.tests.js +0 -512
  410. package/lib/test/EditUtilities.tests.js.map +0 -1
  411. package/lib/test/Forest.perf.tests.d.ts +0 -6
  412. package/lib/test/Forest.perf.tests.d.ts.map +0 -1
  413. package/lib/test/Forest.perf.tests.js +0 -135
  414. package/lib/test/Forest.perf.tests.js.map +0 -1
  415. package/lib/test/Forest.tests.d.ts +0 -6
  416. package/lib/test/Forest.tests.d.ts.map +0 -1
  417. package/lib/test/Forest.tests.js +0 -213
  418. package/lib/test/Forest.tests.js.map +0 -1
  419. package/lib/test/GenericTransaction.tests.d.ts +0 -6
  420. package/lib/test/GenericTransaction.tests.d.ts.map +0 -1
  421. package/lib/test/GenericTransaction.tests.js +0 -31
  422. package/lib/test/GenericTransaction.tests.js.map +0 -1
  423. package/lib/test/HistoryEditFactory.tests.d.ts +0 -6
  424. package/lib/test/HistoryEditFactory.tests.d.ts.map +0 -1
  425. package/lib/test/HistoryEditFactory.tests.js +0 -170
  426. package/lib/test/HistoryEditFactory.tests.js.map +0 -1
  427. package/lib/test/IdCompressor.perf.tests.d.ts +0 -6
  428. package/lib/test/IdCompressor.perf.tests.d.ts.map +0 -1
  429. package/lib/test/IdCompressor.perf.tests.js +0 -290
  430. package/lib/test/IdCompressor.perf.tests.js.map +0 -1
  431. package/lib/test/IdCompressor.tests.d.ts +0 -6
  432. package/lib/test/IdCompressor.tests.d.ts.map +0 -1
  433. package/lib/test/IdCompressor.tests.js +0 -1542
  434. package/lib/test/IdCompressor.tests.js.map +0 -1
  435. package/lib/test/IdConversion.tests.d.ts +0 -6
  436. package/lib/test/IdConversion.tests.d.ts.map +0 -1
  437. package/lib/test/IdConversion.tests.js +0 -36
  438. package/lib/test/IdConversion.tests.js.map +0 -1
  439. package/lib/test/LazyCheckout.tests.d.ts +0 -6
  440. package/lib/test/LazyCheckout.tests.d.ts.map +0 -1
  441. package/lib/test/LazyCheckout.tests.js +0 -22
  442. package/lib/test/LazyCheckout.tests.js.map +0 -1
  443. package/lib/test/LogViewer.tests.d.ts +0 -6
  444. package/lib/test/LogViewer.tests.d.ts.map +0 -1
  445. package/lib/test/LogViewer.tests.js +0 -588
  446. package/lib/test/LogViewer.tests.js.map +0 -1
  447. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts +0 -6
  448. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +0 -1
  449. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +0 -351
  450. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +0 -1
  451. package/lib/test/NumericUuid.perf.tests.d.ts +0 -6
  452. package/lib/test/NumericUuid.perf.tests.d.ts.map +0 -1
  453. package/lib/test/NumericUuid.perf.tests.js +0 -68
  454. package/lib/test/NumericUuid.perf.tests.js.map +0 -1
  455. package/lib/test/NumericUuid.tests.d.ts +0 -6
  456. package/lib/test/NumericUuid.tests.d.ts.map +0 -1
  457. package/lib/test/NumericUuid.tests.js +0 -192
  458. package/lib/test/NumericUuid.tests.js.map +0 -1
  459. package/lib/test/RevisionValueCache.tests.d.ts +0 -6
  460. package/lib/test/RevisionValueCache.tests.d.ts.map +0 -1
  461. package/lib/test/RevisionValueCache.tests.js +0 -106
  462. package/lib/test/RevisionValueCache.tests.js.map +0 -1
  463. package/lib/test/RevisionView.tests.d.ts +0 -6
  464. package/lib/test/RevisionView.tests.d.ts.map +0 -1
  465. package/lib/test/RevisionView.tests.js +0 -131
  466. package/lib/test/RevisionView.tests.js.map +0 -1
  467. package/lib/test/SessionIdNormalizer.tests.d.ts +0 -6
  468. package/lib/test/SessionIdNormalizer.tests.d.ts.map +0 -1
  469. package/lib/test/SessionIdNormalizer.tests.js +0 -377
  470. package/lib/test/SessionIdNormalizer.tests.js.map +0 -1
  471. package/lib/test/SharedTree.fuzz.tests.d.ts +0 -6
  472. package/lib/test/SharedTree.fuzz.tests.d.ts.map +0 -1
  473. package/lib/test/SharedTree.fuzz.tests.js +0 -9
  474. package/lib/test/SharedTree.fuzz.tests.js.map +0 -1
  475. package/lib/test/SharedTree.perf.tests.d.ts +0 -6
  476. package/lib/test/SharedTree.perf.tests.d.ts.map +0 -1
  477. package/lib/test/SharedTree.perf.tests.js +0 -39
  478. package/lib/test/SharedTree.perf.tests.js.map +0 -1
  479. package/lib/test/SharedTree.tests.d.ts +0 -6
  480. package/lib/test/SharedTree.tests.d.ts.map +0 -1
  481. package/lib/test/SharedTree.tests.js +0 -22
  482. package/lib/test/SharedTree.tests.js.map +0 -1
  483. package/lib/test/StringInterner.tests.d.ts +0 -6
  484. package/lib/test/StringInterner.tests.d.ts.map +0 -1
  485. package/lib/test/StringInterner.tests.js +0 -73
  486. package/lib/test/StringInterner.tests.js.map +0 -1
  487. package/lib/test/Summary.tests.d.ts +0 -7
  488. package/lib/test/Summary.tests.d.ts.map +0 -1
  489. package/lib/test/Summary.tests.js +0 -386
  490. package/lib/test/Summary.tests.js.map +0 -1
  491. package/lib/test/Transaction.tests.d.ts +0 -6
  492. package/lib/test/Transaction.tests.d.ts.map +0 -1
  493. package/lib/test/Transaction.tests.js +0 -124
  494. package/lib/test/Transaction.tests.js.map +0 -1
  495. package/lib/test/TransactionInternal.tests.d.ts +0 -6
  496. package/lib/test/TransactionInternal.tests.d.ts.map +0 -1
  497. package/lib/test/TransactionInternal.tests.js +0 -576
  498. package/lib/test/TransactionInternal.tests.js.map +0 -1
  499. package/lib/test/TreeCompression.tests.d.ts +0 -6
  500. package/lib/test/TreeCompression.tests.d.ts.map +0 -1
  501. package/lib/test/TreeCompression.tests.js +0 -291
  502. package/lib/test/TreeCompression.tests.js.map +0 -1
  503. package/lib/test/TreeView.tests.d.ts +0 -6
  504. package/lib/test/TreeView.tests.d.ts.map +0 -1
  505. package/lib/test/TreeView.tests.js +0 -178
  506. package/lib/test/TreeView.tests.js.map +0 -1
  507. package/lib/test/UndoRedoHandler.tests.d.ts +0 -6
  508. package/lib/test/UndoRedoHandler.tests.d.ts.map +0 -1
  509. package/lib/test/UndoRedoHandler.tests.js +0 -37
  510. package/lib/test/UndoRedoHandler.tests.js.map +0 -1
  511. package/lib/test/fuzz/Generators.d.ts +0 -8
  512. package/lib/test/fuzz/Generators.d.ts.map +0 -1
  513. package/lib/test/fuzz/Generators.js +0 -345
  514. package/lib/test/fuzz/Generators.js.map +0 -1
  515. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +0 -23
  516. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +0 -1
  517. package/lib/test/fuzz/SharedTreeFuzzTests.js +0 -241
  518. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +0 -1
  519. package/lib/test/fuzz/Types.d.ts +0 -136
  520. package/lib/test/fuzz/Types.d.ts.map +0 -1
  521. package/lib/test/fuzz/Types.js +0 -6
  522. package/lib/test/fuzz/Types.js.map +0 -1
  523. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +0 -246
  524. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +0 -1
  525. package/lib/test/utilities/IdCompressorTestUtilities.js +0 -608
  526. package/lib/test/utilities/IdCompressorTestUtilities.js.map +0 -1
  527. package/lib/test/utilities/MockTransaction.d.ts +0 -35
  528. package/lib/test/utilities/MockTransaction.d.ts.map +0 -1
  529. package/lib/test/utilities/MockTransaction.js +0 -51
  530. package/lib/test/utilities/MockTransaction.js.map +0 -1
  531. package/lib/test/utilities/PendingLocalStateTests.d.ts +0 -12
  532. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +0 -1
  533. package/lib/test/utilities/PendingLocalStateTests.js +0 -223
  534. package/lib/test/utilities/PendingLocalStateTests.js.map +0 -1
  535. package/lib/test/utilities/SharedTreeTests.d.ts +0 -12
  536. package/lib/test/utilities/SharedTreeTests.d.ts.map +0 -1
  537. package/lib/test/utilities/SharedTreeTests.js +0 -949
  538. package/lib/test/utilities/SharedTreeTests.js.map +0 -1
  539. package/lib/test/utilities/SharedTreeVersioningTests.d.ts +0 -11
  540. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +0 -1
  541. package/lib/test/utilities/SharedTreeVersioningTests.js +0 -439
  542. package/lib/test/utilities/SharedTreeVersioningTests.js.map +0 -1
  543. package/lib/test/utilities/SummaryLoadPerfTests.d.ts +0 -10
  544. package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +0 -1
  545. package/lib/test/utilities/SummaryLoadPerfTests.js +0 -105
  546. package/lib/test/utilities/SummaryLoadPerfTests.js.map +0 -1
  547. package/lib/test/utilities/SummarySizeTests.d.ts +0 -11
  548. package/lib/test/utilities/SummarySizeTests.d.ts.map +0 -1
  549. package/lib/test/utilities/SummarySizeTests.js +0 -160
  550. package/lib/test/utilities/SummarySizeTests.js.map +0 -1
  551. package/lib/test/utilities/TestCommon.d.ts +0 -13
  552. package/lib/test/utilities/TestCommon.d.ts.map +0 -1
  553. package/lib/test/utilities/TestCommon.js +0 -19
  554. package/lib/test/utilities/TestCommon.js.map +0 -1
  555. package/lib/test/utilities/TestNode.d.ts +0 -140
  556. package/lib/test/utilities/TestNode.d.ts.map +0 -1
  557. package/lib/test/utilities/TestNode.js +0 -282
  558. package/lib/test/utilities/TestNode.js.map +0 -1
  559. package/lib/test/utilities/TestSerializer.d.ts +0 -24
  560. package/lib/test/utilities/TestSerializer.d.ts.map +0 -1
  561. package/lib/test/utilities/TestSerializer.js +0 -40
  562. package/lib/test/utilities/TestSerializer.js.map +0 -1
  563. package/lib/test/utilities/TestUtilities.d.ts +0 -212
  564. package/lib/test/utilities/TestUtilities.d.ts.map +0 -1
  565. package/lib/test/utilities/TestUtilities.js +0 -413
  566. package/lib/test/utilities/TestUtilities.js.map +0 -1
  567. package/lib/test/utilities/UndoRedoTests.d.ts +0 -32
  568. package/lib/test/utilities/UndoRedoTests.d.ts.map +0 -1
  569. package/lib/test/utilities/UndoRedoTests.js +0 -317
  570. package/lib/test/utilities/UndoRedoTests.js.map +0 -1
  571. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1,439 +0,0 @@
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 { LoaderHeader } from '@fluidframework/container-definitions';
7
- import { MockFluidDataStoreRuntime, validateAssertionError } from '@fluidframework/test-runtime-utils';
8
- import { expect } from 'chai';
9
- import { StableRange, StablePlace, Change } from '../../ChangeTypes.js';
10
- import { areRevisionViewsSemanticallyEqual } from '../../EditUtilities.js';
11
- import { SharedTreeDiagnosticEvent } from '../../EventTypes.js';
12
- import { SharedTreeOpType, WriteFormat } from '../../persisted-types/index.js';
13
- import { SharedTree } from '../../SharedTree.js';
14
- import { TreeNodeHandle } from '../../TreeNodeHandle.js';
15
- import { nilUuid } from '../../UuidUtilities.js';
16
- import { applyTestEdits } from '../Summary.tests.js';
17
- import { buildLeaf } from './TestNode.js';
18
- import { applyNoop, setUpLocalServerTestSharedTree, setUpTestTree, spyOnSubmittedOps, testTrait, waitForSummary, } from './TestUtilities.js';
19
- function spyOnVersionChanges(tree) {
20
- const versions = [];
21
- tree.on(SharedTreeDiagnosticEvent.WriteVersionChanged, (version) => versions.push(version));
22
- return versions;
23
- }
24
- /**
25
- * Runs a test suite for operations on `SharedTree` that depend on correct versioning.
26
- * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.
27
- */
28
- export function runSharedTreeVersioningTests(title, setUpTestSharedTree) {
29
- describe(title, () => {
30
- const oldVersion = WriteFormat.v0_0_2;
31
- const newVersion = WriteFormat.v0_1_1;
32
- const treeOptions = { localMode: false, writeFormat: oldVersion };
33
- const secondTreeOptions = {
34
- id: 'secondTestSharedTree',
35
- localMode: false,
36
- writeFormat: newVersion,
37
- };
38
- it('defaults to latest version if no version is specified when creating factory', () => {
39
- const sharedTree = SharedTree.getFactory().create(new MockFluidDataStoreRuntime(), 'SharedTree');
40
- const writeFormats = Object.values(WriteFormat);
41
- expect(sharedTree.getWriteFormat()).to.equal(writeFormats[writeFormats.length - 1]);
42
- });
43
- it('only processes edit ops if they have the same version', () => {
44
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
45
- const { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });
46
- expect(tree.edits.length).to.equal(0);
47
- expect(newerTree.edits.length).to.equal(0);
48
- // Process an edit
49
- applyNoop(tree);
50
- containerRuntimeFactory.processAllMessages();
51
- // The newer tree should have ignored the first edit
52
- expect(tree.edits.length).to.equal(1);
53
- expect(newerTree.edits.length).to.equal(0);
54
- });
55
- it('resubmits ops concurrent to an update op using the new format', () => {
56
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
57
- const { tree: newerTree } = setUpTestSharedTree({
58
- ...treeOptions,
59
- containerRuntimeFactory,
60
- writeFormat: newVersion,
61
- });
62
- const testTree = setUpTestTree(tree);
63
- const rootStableId = testTree.stable.identifier;
64
- containerRuntimeFactory.processAllMessages();
65
- const summary = tree.saveSummary();
66
- const ops = spyOnSubmittedOps(containerRuntimeFactory);
67
- newerTree.loadSummary(summary);
68
- tree.applyEdit(...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right)));
69
- containerRuntimeFactory.processAllMessages();
70
- // Verify even though one edit was applied, 2 edit ops were sent due to the version upgrade.
71
- expect(ops.length).to.equal(3);
72
- expect(ops.map((op) => op.type)).to.eql([
73
- SharedTreeOpType.Update,
74
- SharedTreeOpType.Edit,
75
- SharedTreeOpType.Edit,
76
- ]);
77
- expect(ops[1].version).to.equal(oldVersion);
78
- expect(ops[2].version).to.equal(newVersion);
79
- // Verify both trees apply the updated op.
80
- const handle = new TreeNodeHandle(tree.currentView, tree.convertToNodeId(rootStableId));
81
- expect(handle.traits[testTree.left.traitLabel]).to.equal(undefined);
82
- expect(handle.traits[testTree.right.traitLabel].length).to.equal(2);
83
- const handle2 = new TreeNodeHandle(newerTree.currentView, newerTree.convertToNodeId(rootStableId));
84
- expect(handle2.traits[testTree.left.traitLabel]).to.equal(undefined);
85
- expect(handle2.traits[testTree.right.traitLabel].length).to.equal(2);
86
- });
87
- it('throws if an edit op with a newer version than the write version is received', () => {
88
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
89
- const { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });
90
- expect(tree.edits.length).to.equal(0);
91
- expect(newerTree.edits.length).to.equal(0);
92
- // Process an edit and expect it to throw
93
- applyNoop(newerTree);
94
- assert.throws(() => containerRuntimeFactory.processAllMessages(), (e) => validateAssertionError(e, 'Newer op version received by a client that has yet to be updated.'));
95
- });
96
- it('ignores duplicate update ops', () => {
97
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
98
- // Process an edit
99
- applyNoop(tree);
100
- containerRuntimeFactory.processAllMessages();
101
- const summary = tree.saveSummary();
102
- // Load the summary into multiple newer trees to trigger version update ops
103
- const { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } = setUpTestSharedTree(secondTreeOptions);
104
- const { tree: newerTree2 } = setUpTestSharedTree({
105
- containerRuntimeFactory: newerContainerRuntimeFactory,
106
- ...secondTreeOptions,
107
- });
108
- const { tree: newerTree3 } = setUpTestSharedTree({
109
- containerRuntimeFactory: newerContainerRuntimeFactory,
110
- ...secondTreeOptions,
111
- });
112
- const versions = spyOnVersionChanges(newerTree);
113
- const versions2 = spyOnVersionChanges(newerTree2);
114
- const versions3 = spyOnVersionChanges(newerTree3);
115
- newerTree.loadSummary(summary);
116
- newerTree2.loadSummary(summary);
117
- newerTree3.loadSummary(summary);
118
- newerContainerRuntimeFactory.processAllMessages();
119
- // Each tree should have processed a version update once
120
- expect(versions).to.deep.equal([oldVersion, newVersion]);
121
- expect(versions2).to.deep.equal([oldVersion, newVersion]);
122
- expect(versions3).to.deep.equal([oldVersion, newVersion]);
123
- });
124
- it('maintains custom EditLog and LogViewer callbacks when updating', () => {
125
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
126
- containerRuntimeFactory.processAllMessages();
127
- const summary = tree.saveSummary();
128
- let editAdded = 0;
129
- // Load the summary into multiple newer trees to trigger version update ops
130
- const { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } = setUpTestSharedTree(secondTreeOptions);
131
- const versions = spyOnVersionChanges(newerTree);
132
- newerTree.loadSummary(summary);
133
- newerTree.edits.registerEditAddedHandler(() => editAdded++);
134
- expect(versions).to.have.length(1);
135
- expect(versions[0]).to.equal(oldVersion);
136
- // Update occurs after the handler is added to the old edit log
137
- newerContainerRuntimeFactory.processAllMessages();
138
- expect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
139
- expect(versions).to.have.length(2);
140
- expect(versions[1]).to.equal(newVersion);
141
- const additionalEdits = 5;
142
- for (let i = 0; i < additionalEdits; i++) {
143
- applyNoop(newerTree);
144
- }
145
- newerContainerRuntimeFactory.processAllMessages();
146
- // The edit added handler should run twice for each additional edit (once when applying locally and once when applying the sequenced edit)
147
- expect(editAdded).to.equal(additionalEdits * 2);
148
- });
149
- it('begins writing the new version only after updating', () => {
150
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
151
- // Process an edit
152
- applyNoop(tree);
153
- containerRuntimeFactory.processAllMessages();
154
- const summary = tree.saveSummary();
155
- // Load the summary into a newer tree to trigger a version update op
156
- const { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } = setUpTestSharedTree(secondTreeOptions);
157
- const ops = spyOnSubmittedOps(newerContainerRuntimeFactory);
158
- newerTree.loadSummary(summary);
159
- applyNoop(newerTree);
160
- newerContainerRuntimeFactory.processAllMessages();
161
- expect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
162
- applyNoop(newerTree);
163
- expect(ops.length).to.equal(4);
164
- expect(ops.map((op) => op.type)).to.eql([
165
- SharedTreeOpType.Update,
166
- SharedTreeOpType.Edit,
167
- SharedTreeOpType.Edit,
168
- SharedTreeOpType.Edit,
169
- ]);
170
- // Because the first op was submitted before the Update message was sequenced, it should use
171
- // the same write format as the loaded summary.
172
- expect(ops[1].version).to.equal(oldVersion);
173
- expect(ops[2].version).to.equal(newVersion);
174
- expect(ops[3].version).to.equal(newVersion);
175
- });
176
- it('Existing client can update to a write version higher than the initialized write version', () => {
177
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);
178
- const versions = spyOnVersionChanges(tree);
179
- const ops = spyOnSubmittedOps(containerRuntimeFactory);
180
- // Process an edit
181
- applyNoop(tree);
182
- containerRuntimeFactory.processAllMessages();
183
- const summary = tree.saveSummary();
184
- // Load the summary into a newer tree to trigger a version update op
185
- const { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });
186
- newerTree.loadSummary(summary);
187
- containerRuntimeFactory.processAllMessages();
188
- expect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
189
- expect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
190
- // Apply another arbitrary edit to the initial tree, which should now be using the new write version.
191
- applyNoop(tree);
192
- expect(versions).to.eql([newVersion]);
193
- expect(ops.length).to.equal(3);
194
- expect(ops.map((op) => op.type)).to.eql([
195
- SharedTreeOpType.Edit,
196
- SharedTreeOpType.Update,
197
- SharedTreeOpType.Edit,
198
- ]);
199
- expect(ops[0].version).to.equal(oldVersion);
200
- expect(ops[2].version).to.equal(newVersion);
201
- });
202
- it('New client can update to a write version higher than the initialized version on summary load', () => {
203
- const { tree, containerRuntimeFactory } = setUpTestSharedTree({
204
- ...treeOptions,
205
- writeFormat: newVersion,
206
- });
207
- const ops = spyOnSubmittedOps(containerRuntimeFactory);
208
- applyNoop(tree);
209
- containerRuntimeFactory.processAllMessages();
210
- const summary = tree.saveSummary();
211
- // Load the summary into a tree with older write version; it should recognize the document is already using
212
- // the new write version and use that instead.
213
- const { tree: olderTree } = setUpTestSharedTree({
214
- ...treeOptions,
215
- containerRuntimeFactory,
216
- writeFormat: oldVersion,
217
- });
218
- olderTree.loadSummary(summary);
219
- applyNoop(olderTree);
220
- containerRuntimeFactory.processAllMessages();
221
- expect(ops.length).to.equal(2);
222
- expect(ops.map((op) => op.type)).to.eql([SharedTreeOpType.Edit, SharedTreeOpType.Edit]);
223
- expect(ops.map((op) => op.version)).to.eql([newVersion, newVersion]);
224
- });
225
- it('can load a 0.1.1 summary and access the current view', () => {
226
- // This is a regression test for the logic initializing SharedTree's EditLog from a summary.
227
- // The 0.1.1 format omits `currentTree`, but EditLog should still tolerate synchronous access
228
- // of the first edit in the session (which is a single insert containing that tree).
229
- const options = {
230
- writeFormat: WriteFormat.v0_1_1,
231
- summarizeHistory: false,
232
- localMode: false,
233
- };
234
- const { tree, containerRuntimeFactory } = setUpTestSharedTree(options);
235
- applyNoop(tree);
236
- containerRuntimeFactory.processAllMessages();
237
- const summary = tree.saveSummary();
238
- const { tree: newTree } = setUpTestSharedTree({ containerRuntimeFactory, ...options });
239
- newTree.loadSummary(summary);
240
- expect(newTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
241
- expect(() => newTree.currentView).to.not.throw();
242
- });
243
- it('upgrades properly when no edits are sent', async () => {
244
- // Starts in 0.0.2 (so no upgrade)
245
- const { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({
246
- writeFormat: WriteFormat.v0_0_2,
247
- });
248
- const { tree: tree2 } = await setUpLocalServerTestSharedTree({
249
- writeFormat: WriteFormat.v0_1_1,
250
- testObjectProvider,
251
- });
252
- expect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_0_2);
253
- expect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_0_2);
254
- await testObjectProvider.ensureSynchronized();
255
- expect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
256
- expect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
257
- expect(tree1.equals(tree2)).to.be.true;
258
- });
259
- it('generates unique IDs after upgrading from 0.0.2', async () => {
260
- const idCount = 100;
261
- const { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({
262
- writeFormat: WriteFormat.v0_0_2,
263
- });
264
- applyTestEdits(tree);
265
- const nodeIds = new Set();
266
- const stableIds = new Set();
267
- for (let i = 0; i < idCount; i++) {
268
- const id = tree.generateNodeId();
269
- nodeIds.add(id);
270
- stableIds.add(tree.convertToStableNodeId(id));
271
- }
272
- // New tree joins, causes an upgrade
273
- await setUpLocalServerTestSharedTree({
274
- writeFormat: WriteFormat.v0_1_1,
275
- testObjectProvider,
276
- });
277
- await testObjectProvider.ensureSynchronized();
278
- expect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
279
- for (let i = 0; i < idCount; i++) {
280
- // No IDs should be generated that were already generated before the update
281
- const id = tree.generateNodeId();
282
- expect(nodeIds.has(id)).to.be.false;
283
- expect(stableIds.has(tree.convertToStableNodeId(id))).to.be.false;
284
- }
285
- expect(tree.equals(tree)).to.be.true;
286
- });
287
- it('converts IDs correctly after upgrading from 0.0.2', async () => {
288
- const { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({
289
- writeFormat: WriteFormat.v0_0_2,
290
- });
291
- const idCount = 10;
292
- const ids = [];
293
- for (let i = 0; i < idCount; i++) {
294
- const id = tree1.generateNodeId();
295
- ids.push([id, tree1.convertToStableNodeId(id)]);
296
- }
297
- // Use some of the IDs in edits, but leave others unused.
298
- // They should all be valid and usable after upgrade.
299
- const builds = [];
300
- for (let i = 1; i < ids.length; i += 2) {
301
- builds.push(buildLeaf(ids[i][0], i));
302
- }
303
- tree1.applyEdit(...Change.insertTree(builds, StablePlace.atEndOf({ parent: tree1.currentView.root, label: 'foo' })));
304
- const { tree: tree2 } = await setUpLocalServerTestSharedTree({
305
- writeFormat: WriteFormat.v0_1_1,
306
- testObjectProvider,
307
- // To be removed ADO:5464
308
- featureGates: {
309
- 'Fluid.Container.ForceWriteConnection': true,
310
- },
311
- });
312
- await testObjectProvider.ensureSynchronized();
313
- expect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
314
- expect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
315
- const view = tree1.currentView;
316
- for (let i = 0; i < ids.length; i++) {
317
- const [nodeIdBefore, stableIdBefore] = ids[i];
318
- expect(tree1.convertToStableNodeId(nodeIdBefore)).to.equal(stableIdBefore);
319
- if (i % 2 === 0) {
320
- expect(view.hasNode(nodeIdBefore)).to.be.false;
321
- }
322
- else {
323
- expect(view.hasNode(nodeIdBefore)).to.be.true;
324
- const node = view.getViewNode(nodeIdBefore);
325
- expect(node.payload).to.equal(i);
326
- }
327
- }
328
- expect(tree1.equals(tree2)).to.be.true;
329
- // https://dev.azure.com/fluidframework/internal/_workitems/edit/3347
330
- const events = testObjectProvider.logger.reportAndClearTrackedEvents();
331
- expect(events.unexpectedErrors.length).to.equal(1);
332
- expect(events.unexpectedErrors[0].eventName).to.equal('fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch');
333
- });
334
- it('interns strings correctly after upgrading from 0.0.2', async () => {
335
- const { testObjectProvider, tree: tree1, container, } = await setUpLocalServerTestSharedTree({
336
- writeFormat: WriteFormat.v0_0_2,
337
- summarizeHistory: false,
338
- });
339
- const internedDefinition = 'internedDefinition';
340
- const id = tree1.generateNodeId();
341
- tree1.applyEdit(...Change.insertTree({ definition: internedDefinition, identifier: id }, StablePlace.atStartOf(testTrait(tree1.currentView))));
342
- tree1.applyEdit(Change.delete(StableRange.only(id)));
343
- await testObjectProvider.ensureSynchronized();
344
- const summaryVersion = await waitForSummary(container);
345
- const { tree: tree2 } = await setUpLocalServerTestSharedTree({
346
- writeFormat: WriteFormat.v0_1_1,
347
- testObjectProvider,
348
- headers: { [LoaderHeader.version]: summaryVersion },
349
- });
350
- await testObjectProvider.ensureSynchronized();
351
- expect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
352
- expect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
353
- tree1.applyEdit(...Change.insertTree({ definition: internedDefinition, identifier: tree1.generateNodeId() }, StablePlace.atStartOf(testTrait(tree1.currentView))));
354
- await testObjectProvider.ensureSynchronized();
355
- expect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;
356
- }).timeout(10000);
357
- it('attributes all pre-upgrade IDs to the nil UUID after upgrading from 0.0.2', async () => {
358
- const { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({
359
- writeFormat: WriteFormat.v0_0_2,
360
- });
361
- const attributionId = tree.attributionId;
362
- expect(attributionId).to.equal(nilUuid);
363
- const nodeId = tree.generateNodeId();
364
- const stableNodeId = tree.convertToStableNodeId(nodeId);
365
- tree.applyEdit(Change.insertTree(buildLeaf(nodeId), StablePlace.atStartOf(testTrait(tree.currentView))));
366
- // New tree joins, causes an upgrade
367
- const { tree: tree2 } = await setUpLocalServerTestSharedTree({
368
- writeFormat: WriteFormat.v0_1_1,
369
- testObjectProvider,
370
- // To be removed ADO:5464
371
- featureGates: {
372
- 'Fluid.Container.ForceWriteConnection': true,
373
- },
374
- });
375
- await testObjectProvider.ensureSynchronized();
376
- expect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
377
- expect(tree.attributeNodeId(nodeId)).to.equal(attributionId);
378
- expect(tree2.attributeNodeId(tree2.convertToNodeId(stableNodeId))).to.equal(attributionId);
379
- // https://dev.azure.com/fluidframework/internal/_workitems/edit/3347
380
- const events = testObjectProvider.logger.reportAndClearTrackedEvents();
381
- expect(events.unexpectedErrors.length).to.equal(1);
382
- expect(events.unexpectedErrors[0].eventName).to.equal('fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch');
383
- });
384
- describe('telemetry', () => {
385
- const events = [];
386
- const logger = { send: (event) => events.push(event) };
387
- beforeEach(() => {
388
- events.length = 0;
389
- });
390
- it('emits RequestVersionUpdate events', () => {
391
- const { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });
392
- const { tree: newerTree } = setUpTestSharedTree({
393
- containerRuntimeFactory,
394
- ...secondTreeOptions,
395
- logger,
396
- });
397
- newerTree.loadSummary(tree.saveSummary());
398
- expect(events.some((event) => event.eventName === 'SharedTree:RequestVersionUpdate' &&
399
- event.versionTo === newVersion &&
400
- event.versionFrom === oldVersion &&
401
- event.category === 'generic')).to.equal(true);
402
- });
403
- it('emits VersionUpdate events', () => {
404
- const { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });
405
- const { tree: newerTree } = setUpTestSharedTree({
406
- containerRuntimeFactory,
407
- ...secondTreeOptions,
408
- logger,
409
- });
410
- newerTree.loadSummary(tree.saveSummary());
411
- const matchesVersionUpdate = (event) => event.eventName === 'SharedTree:VersionUpdate_end' &&
412
- event.version === newVersion &&
413
- event.category === 'performance' &&
414
- typeof event.duration === 'number';
415
- expect(events.some(matchesVersionUpdate)).to.equal(false);
416
- containerRuntimeFactory.processAllMessages();
417
- expect(events.some(matchesVersionUpdate)).to.equal(true);
418
- });
419
- it('emits error events on VersionUpdate failure', () => {
420
- const { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });
421
- const op = {
422
- type: SharedTreeOpType.Update,
423
- version: newVersion,
424
- };
425
- containerRuntimeFactory.pushMessage({ contents: op });
426
- tree.edits.getLocalEdits = () => {
427
- throw new Error('Simulated issue in update');
428
- };
429
- const matchesFailedVersionUpdate = (event) => event.eventName === 'SharedTree:VersionUpdate_cancel' &&
430
- event.category === 'error' &&
431
- event.error === 'Simulated issue in update';
432
- expect(events.some(matchesFailedVersionUpdate)).to.equal(false);
433
- assert.throws(() => containerRuntimeFactory.processAllMessages(), (e) => validateAssertionError(e, /Simulated issue in update/));
434
- expect(events.some(matchesFailedVersionUpdate)).to.equal(true);
435
- });
436
- });
437
- });
438
- }
439
- //# sourceMappingURL=SharedTreeVersioningTests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SharedTreeVersioningTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAa,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAwC,WAAW,EAAE,MAAM,gCAAgC,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACN,SAAS,EACT,8BAA8B,EAC9B,aAAa,EAGb,iBAAiB,EACjB,SAAS,EACT,cAAc,GACd,MAAM,oBAAoB,CAAC;AAE5B,SAAS,mBAAmB,CAAC,IAAgB;IAC5C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5F,OAAO,QAAQ,CAAC;AACjB,CAAC;AACD;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC3C,KAAa,EACb,mBAAwF;IAExF,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;QACtC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;QACtC,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAClE,MAAM,iBAAiB,GAAG;YACzB,EAAE,EAAE,sBAAsB;YAC1B,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,UAAU;SACvB,CAAC;QAEF,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;YACtF,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,yBAAyB,EAAE,EAAE,YAAY,CAAC,CAAC;YACjG,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAChE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;YAEnG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3C,kBAAkB;YAClB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,oDAAoD;YACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACxE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;gBAC/C,GAAG,WAAW;gBACd,uBAAuB;gBACvB,WAAW,EAAE,UAAU;aACvB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;YAChD,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;YACvD,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnG,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,4FAA4F;YAC5F,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBACvC,gBAAgB,CAAC,MAAM;gBACvB,gBAAgB,CAAC,IAAI;gBACrB,gBAAgB,CAAC,IAAI;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAE5C,0CAA0C;YAC1C,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;YACnG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACrE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACvF,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;YAEnG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3C,yCAAyC;YACzC,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,MAAM,CAAC,MAAM,CACZ,GAAG,EAAE,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,EAClD,CAAC,CAAQ,EAAE,EAAE,CACZ,sBAAsB,CAAC,CAAC,EAAE,mEAAmE,CAAC,CAC/F,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACvC,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,kBAAkB;YAClB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnC,2EAA2E;YAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,GAC/E,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC;gBAChD,uBAAuB,EAAE,4BAA4B;gBACrD,GAAG,iBAAiB;aACpB,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC;gBAChD,uBAAuB,EAAE,4BAA4B;gBACrD,GAAG,iBAAiB;aACpB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAElD,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/B,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAChC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAChC,4BAA4B,CAAC,kBAAkB,EAAE,CAAC;YAElD,wDAAwD;YACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACzE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnC,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,2EAA2E;YAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,GAC/E,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;YAExC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAEhD,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9B,SAAS,CAAC,KAAiB,CAAC,wBAAwB,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;YAEzE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAEzC,+DAA+D;YAC/D,4BAA4B,CAAC,kBAAkB,EAAE,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAEzC,MAAM,eAAe,GAAG,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;gBACzC,SAAS,CAAC,SAAS,CAAC,CAAC;aACrB;YACD,4BAA4B,CAAC,kBAAkB,EAAE,CAAC;YAElD,0IAA0I;YAC1I,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC7D,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,kBAAkB;YAClB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnC,oEAAoE;YACpE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,GAC/E,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;YAExC,MAAM,GAAG,GAAG,iBAAiB,CAAC,4BAA4B,CAAC,CAAC;YAE5D,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/B,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,4BAA4B,CAAC,kBAAkB,EAAE,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChE,SAAS,CAAC,SAAS,CAAC,CAAC;YAErB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBACvC,gBAAgB,CAAC,MAAM;gBACvB,gBAAgB,CAAC,IAAI;gBACrB,gBAAgB,CAAC,IAAI;gBACrB,gBAAgB,CAAC,IAAI;aACrB,CAAC,CAAC;YACH,4FAA4F;YAC5F,+CAA+C;YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;YAClG,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;YAEvD,kBAAkB;YAClB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnC,oEAAoE;YACpE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;YACnG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/B,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAEhE,qGAAqG;YACrG,SAAS,CAAC,IAAI,CAAC,CAAC;YAEhB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBACvC,gBAAgB,CAAC,IAAI;gBACrB,gBAAgB,CAAC,MAAM;gBACvB,gBAAgB,CAAC,IAAI;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;YACvG,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC;gBAC7D,GAAG,WAAW;gBACd,WAAW,EAAE,UAAU;aACvB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;YAEvD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnC,2GAA2G;YAC3G,8CAA8C;YAC9C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;gBAC/C,GAAG,WAAW;gBACd,uBAAuB;gBACvB,WAAW,EAAE,UAAU;aACvB,CAAC,CAAC;YAEH,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/B,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC/D,4FAA4F;YAC5F,6FAA6F;YAC7F,oFAAoF;YACpF,MAAM,OAAO,GAA6B;gBACzC,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,gBAAgB,EAAE,KAAK;gBACvB,SAAS,EAAE,KAAK;aAChB,CAAC;YACF,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACvE,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;YACvF,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACzD,kCAAkC;YAClC,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAChF,WAAW,EAAE,WAAW,CAAC,MAAM;aAC/B,CAAC,CAAC;YAEH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAC5D,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,kBAAkB;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5D,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAE9C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,OAAO,GAAG,GAAG,CAAC;YAEpB,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAC/E,WAAW,EAAE,WAAW,CAAC,MAAM;aAC/B,CAAC,CAAC;YAEH,cAAc,CAAC,IAAI,CAAC,CAAC;YAErB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgB,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBACjC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9C;YAED,oCAAoC;YACpC,MAAM,8BAA8B,CAAC;gBACpC,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,kBAAkB;aAClB,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBACjC,2EAA2E;gBAC3E,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACjC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;gBACpC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;aAClE;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAChF,WAAW,EAAE,WAAW,CAAC,MAAM;aAC/B,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,MAAM,GAAG,GAA6B,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBACjC,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;gBAClC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChD;YAED,yDAAyD;YACzD,qDAAqD;YACrD,MAAM,MAAM,GAAyC,EAAE,CAAC;YACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;gBACvC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACrC;YACD,KAAK,CAAC,SAAS,CACd,GAAG,MAAM,CAAC,UAAU,CACnB,MAAM,EACN,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAmB,EAAE,CAAC,CACnF,CACD,CAAC;YAEF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAC5D,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,kBAAkB;gBAClB,yBAAyB;gBACzB,YAAY,EAAE;oBACb,sCAAsC,EAAE,IAAI;iBAC5C;aACD,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5D,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9C,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC3E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAChB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;iBAC/C;qBAAM;oBACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;oBAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACjC;aACD;YACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAEvC,qEAAqE;YACrE,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CACpD,yEAAyE,CACzE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,EACL,kBAAkB,EAClB,IAAI,EAAE,KAAK,EACX,SAAS,GACT,GAAG,MAAM,8BAA8B,CAAC;gBACxC,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,gBAAgB,EAAE,KAAK;aACvB,CAAC,CAAC;YAEH,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;YAEhD,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;YAClC,KAAK,CAAC,SAAS,CACd,GAAG,MAAM,CAAC,UAAU,CACnB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,EAAE,EAClD,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CACnD,CACD,CAAC;YACF,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAErD,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAEvD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAC5D,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,kBAAkB;gBAClB,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE;aACnD,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5D,KAAK,CAAC,SAAS,CACd,GAAG,MAAM,CAAC,UAAU,CACnB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,EACtE,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CACnD,CACD,CAAC;YAEF,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,CAAC,iCAAiC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1G,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAElB,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAC/E,WAAW,EAAE,WAAW,CAAC,MAAM;aAC/B,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAExD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzG,oCAAoC;YACpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,8BAA8B,CAAC;gBAC5D,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,kBAAkB;gBAClB,yBAAyB;gBACzB,YAAY,EAAE;oBACb,sCAAsC,EAAE,IAAI;iBAC5C;aACD,CAAC,CAAC;YAEH,MAAM,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE3F,qEAAqE;YACrE,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CACpD,yEAAyE,CACzE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;YAC1B,MAAM,MAAM,GAA0B,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,UAAU,CAAC,GAAG,EAAE;gBACf,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;gBAC5C,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1F,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;oBAC/C,uBAAuB;oBACvB,GAAG,iBAAiB;oBACpB,MAAM;iBACN,CAAC,CAAC;gBAEH,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1C,MAAM,CACL,MAAM,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE,CACT,KAAK,CAAC,SAAS,KAAK,iCAAiC;oBACrD,KAAK,CAAC,SAAS,KAAK,UAAU;oBAC9B,KAAK,CAAC,WAAW,KAAK,UAAU;oBAChC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAC7B,CACD,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;gBACrC,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1F,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;oBAC/C,uBAAuB;oBACvB,GAAG,iBAAiB;oBACpB,MAAM;iBACN,CAAC,CAAC;gBAEH,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1C,MAAM,oBAAoB,GAAG,CAAC,KAA0B,EAAE,EAAE,CAC3D,KAAK,CAAC,SAAS,KAAK,8BAA8B;oBAClD,KAAK,CAAC,OAAO,KAAK,UAAU;oBAC5B,KAAK,CAAC,QAAQ,KAAK,aAAa;oBAChC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;gBAEpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1D,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;gBACtD,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,CAAC,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1F,MAAM,EAAE,GAAuB;oBAC9B,IAAI,EAAE,gBAAgB,CAAC,MAAM;oBAC7B,OAAO,EAAE,UAAU;iBACnB,CAAC;gBACF,uBAAuB,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAiB,CAAC,aAAa,GAAG,GAAG,EAAE;oBAC5C,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC9C,CAAC,CAAC;gBACF,MAAM,0BAA0B,GAAG,CAAC,KAA0B,EAAE,EAAE,CACjE,KAAK,CAAC,SAAS,KAAK,iCAAiC;oBACrD,KAAK,CAAC,QAAQ,KAAK,OAAO;oBAC1B,KAAK,CAAC,KAAK,KAAK,2BAA2B,CAAC;gBAE7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChE,MAAM,CAAC,MAAM,CACZ,GAAG,EAAE,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,EAClD,CAAC,CAAQ,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,2BAA2B,CAAC,CACpE,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,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 { ITelemetryBaseEvent } from '@fluidframework/core-interfaces';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { MockFluidDataStoreRuntime, validateAssertionError } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { StableRange, StablePlace, BuildNode, Change } from '../../ChangeTypes.js';\nimport { Mutable } from '../../Common.js';\nimport { EditLog } from '../../EditLog.js';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities.js';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes.js';\nimport { NodeId, StableNodeId, TraitLabel } from '../../Identifiers.js';\nimport { SharedTreeOpType, SharedTreeUpdateOp, TreeNodeSequence, WriteFormat } from '../../persisted-types/index.js';\nimport { SharedTree } from '../../SharedTree.js';\nimport { TreeNodeHandle } from '../../TreeNodeHandle.js';\nimport { nilUuid } from '../../UuidUtilities.js';\nimport { applyTestEdits } from '../Summary.tests.js';\nimport { buildLeaf } from './TestNode.js';\nimport {\n\tapplyNoop,\n\tsetUpLocalServerTestSharedTree,\n\tsetUpTestTree,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tspyOnSubmittedOps,\n\ttestTrait,\n\twaitForSummary,\n} from './TestUtilities.js';\n\nfunction spyOnVersionChanges(tree: SharedTree): WriteFormat[] {\n\tconst versions: WriteFormat[] = [];\n\ttree.on(SharedTreeDiagnosticEvent.WriteVersionChanged, (version) => versions.push(version));\n\treturn versions;\n}\n/**\n * Runs a test suite for operations on `SharedTree` that depend on correct versioning.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeVersioningTests(\n\ttitle: string,\n\tsetUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tdescribe(title, () => {\n\t\tconst oldVersion = WriteFormat.v0_0_2;\n\t\tconst newVersion = WriteFormat.v0_1_1;\n\t\tconst treeOptions = { localMode: false, writeFormat: oldVersion };\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\twriteFormat: newVersion,\n\t\t};\n\n\t\tit('defaults to latest version if no version is specified when creating factory', () => {\n\t\t\tconst sharedTree = SharedTree.getFactory().create(new MockFluidDataStoreRuntime(), 'SharedTree');\n\t\t\tconst writeFormats = Object.values(WriteFormat);\n\t\t\texpect(sharedTree.getWriteFormat()).to.equal(writeFormats[writeFormats.length - 1]);\n\t\t});\n\n\t\tit('only processes edit ops if they have the same version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The newer tree should have ignored the first edit\n\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\t\t});\n\n\t\tit('resubmits ops concurrent to an update op using the new format', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst rootStableId = testTree.stable.identifier;\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\ttree.applyEdit(...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify even though one edit was applied, 2 edit ops were sent due to the version upgrade.\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\n\t\t\t// Verify both trees apply the updated op.\n\t\t\tconst handle = new TreeNodeHandle(tree.currentView, tree.convertToNodeId(rootStableId));\n\t\t\texpect(handle.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t\tconst handle2 = new TreeNodeHandle(newerTree.currentView, newerTree.convertToNodeId(rootStableId));\n\t\t\texpect(handle2.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle2.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t});\n\n\t\tit('throws if an edit op with a newer version than the write version is received', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit and expect it to throw\n\t\t\tapplyNoop(newerTree);\n\t\t\tassert.throws(\n\t\t\t\t() => containerRuntimeFactory.processAllMessages(),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(e, 'Newer op version received by a client that has yet to be updated.')\n\t\t\t);\n\t\t});\n\n\t\tit('ignores duplicate update ops', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\t\t\tconst { tree: newerTree2 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\t\t\tconst { tree: newerTree3 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\t\t\tconst versions2 = spyOnVersionChanges(newerTree2);\n\t\t\tconst versions3 = spyOnVersionChanges(newerTree3);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tnewerTree2.loadSummary(summary);\n\t\t\tnewerTree3.loadSummary(summary);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Each tree should have processed a version update once\n\t\t\texpect(versions).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions2).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions3).to.deep.equal([oldVersion, newVersion]);\n\t\t});\n\n\t\tit('maintains custom EditLog and LogViewer callbacks when updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\tlet editAdded = 0;\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\t(newerTree.edits as EditLog).registerEditAddedHandler(() => editAdded++);\n\n\t\t\texpect(versions).to.have.length(1);\n\t\t\texpect(versions[0]).to.equal(oldVersion);\n\n\t\t\t// Update occurs after the handler is added to the old edit log\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(versions).to.have.length(2);\n\t\t\texpect(versions[1]).to.equal(newVersion);\n\n\t\t\tconst additionalEdits = 5;\n\t\t\tfor (let i = 0; i < additionalEdits; i++) {\n\t\t\t\tapplyNoop(newerTree);\n\t\t\t}\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The edit added handler should run twice for each additional edit (once when applying locally and once when applying the sequenced edit)\n\t\t\texpect(editAdded).to.equal(additionalEdits * 2);\n\t\t});\n\n\t\tit('begins writing the new version only after updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst ops = spyOnSubmittedOps(newerContainerRuntimeFactory);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tapplyNoop(newerTree);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\tapplyNoop(newerTree);\n\n\t\t\texpect(ops.length).to.equal(4);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\t\t\t// Because the first op was submitted before the Update message was sequenced, it should use\n\t\t\t// the same write format as the loaded summary.\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t\texpect(ops[3].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('Existing client can update to a write version higher than the initialized write version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst versions = spyOnVersionChanges(tree);\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\t// Apply another arbitrary edit to the initial tree, which should now be using the new write version.\n\t\t\tapplyNoop(tree);\n\n\t\t\texpect(versions).to.eql([newVersion]);\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[0].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('New client can update to a write version higher than the initialized version on summary load', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a tree with older write version; it should recognize the document is already using\n\t\t\t// the new write version and use that instead.\n\t\t\tconst { tree: olderTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: oldVersion,\n\t\t\t});\n\n\t\t\tolderTree.loadSummary(summary);\n\t\t\tapplyNoop(olderTree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(ops.length).to.equal(2);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([SharedTreeOpType.Edit, SharedTreeOpType.Edit]);\n\t\t\texpect(ops.map((op) => op.version)).to.eql([newVersion, newVersion]);\n\t\t});\n\n\t\tit('can load a 0.1.1 summary and access the current view', () => {\n\t\t\t// This is a regression test for the logic initializing SharedTree's EditLog from a summary.\n\t\t\t// The 0.1.1 format omits `currentTree`, but EditLog should still tolerate synchronous access\n\t\t\t// of the first edit in the session (which is a single insert containing that tree).\n\t\t\tconst options: SharedTreeTestingOptions = {\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t\tlocalMode: false,\n\t\t\t};\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst { tree: newTree } = setUpTestSharedTree({ containerRuntimeFactory, ...options });\n\t\t\tnewTree.loadSummary(summary);\n\t\t\texpect(newTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(() => newTree.currentView).to.not.throw();\n\t\t});\n\n\t\tit('upgrades properly when no edits are sent', async () => {\n\t\t\t// Starts in 0.0.2 (so no upgrade)\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('generates unique IDs after upgrading from 0.0.2', async () => {\n\t\t\tconst idCount = 100;\n\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tapplyTestEdits(tree);\n\n\t\t\tconst nodeIds = new Set<NodeId>();\n\t\t\tconst stableIds = new Set<StableNodeId>();\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\tnodeIds.add(id);\n\t\t\t\tstableIds.add(tree.convertToStableNodeId(id));\n\t\t\t}\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\t// No IDs should be generated that were already generated before the update\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\texpect(nodeIds.has(id)).to.be.false;\n\t\t\t\texpect(stableIds.has(tree.convertToStableNodeId(id))).to.be.false;\n\t\t\t}\n\t\t\texpect(tree.equals(tree)).to.be.true;\n\t\t});\n\n\t\tit('converts IDs correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst idCount = 10;\n\t\t\tconst ids: [NodeId, StableNodeId][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree1.generateNodeId();\n\t\t\t\tids.push([id, tree1.convertToStableNodeId(id)]);\n\t\t\t}\n\n\t\t\t// Use some of the IDs in edits, but leave others unused.\n\t\t\t// They should all be valid and usable after upgrade.\n\t\t\tconst builds: Mutable<TreeNodeSequence<BuildNode>> = [];\n\t\t\tfor (let i = 1; i < ids.length; i += 2) {\n\t\t\t\tbuilds.push(buildLeaf(ids[i][0], i));\n\t\t\t}\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\tbuilds,\n\t\t\t\t\tStablePlace.atEndOf({ parent: tree1.currentView.root, label: 'foo' as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\t// To be removed ADO:5464\n\t\t\t\tfeatureGates: {\n\t\t\t\t\t'Fluid.Container.ForceWriteConnection': true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tconst view = tree1.currentView;\n\t\t\tfor (let i = 0; i < ids.length; i++) {\n\t\t\t\tconst [nodeIdBefore, stableIdBefore] = ids[i];\n\t\t\t\texpect(tree1.convertToStableNodeId(nodeIdBefore)).to.equal(stableIdBefore);\n\t\t\t\tif (i % 2 === 0) {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.false;\n\t\t\t\t} else {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.true;\n\t\t\t\t\tconst node = view.getViewNode(nodeIdBefore);\n\t\t\t\t\texpect(node.payload).to.equal(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\n\t\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/3347\n\t\t\tconst events = testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.unexpectedErrors.length).to.equal(1);\n\t\t\texpect(events.unexpectedErrors[0].eventName).to.equal(\n\t\t\t\t'fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch'\n\t\t\t);\n\t\t});\n\n\t\tit('interns strings correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst {\n\t\t\t\ttestObjectProvider,\n\t\t\t\ttree: tree1,\n\t\t\t\tcontainer,\n\t\t\t} = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\n\t\t\tconst internedDefinition = 'internedDefinition';\n\n\t\t\tconst id = tree1.generateNodeId();\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: id },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\t\t\ttree1.applyEdit(Change.delete(StableRange.only(id)));\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst summaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\theaders: { [LoaderHeader.version]: summaryVersion },\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: tree1.generateNodeId() },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;\n\t\t}).timeout(10000);\n\n\t\tit('attributes all pre-upgrade IDs to the nil UUID after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst attributionId = tree.attributionId;\n\t\t\texpect(attributionId).to.equal(nilUuid);\n\t\t\tconst nodeId = tree.generateNodeId();\n\t\t\tconst stableNodeId = tree.convertToStableNodeId(nodeId);\n\n\t\t\ttree.applyEdit(Change.insertTree(buildLeaf(nodeId), StablePlace.atStartOf(testTrait(tree.currentView))));\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\t// To be removed ADO:5464\n\t\t\t\tfeatureGates: {\n\t\t\t\t\t'Fluid.Container.ForceWriteConnection': true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree.attributeNodeId(nodeId)).to.equal(attributionId);\n\t\t\texpect(tree2.attributeNodeId(tree2.convertToNodeId(stableNodeId))).to.equal(attributionId);\n\n\t\t\t// https://dev.azure.com/fluidframework/internal/_workitems/edit/3347\n\t\t\tconst events = testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.unexpectedErrors.length).to.equal(1);\n\t\t\texpect(events.unexpectedErrors[0].eventName).to.equal(\n\t\t\t\t'fluid:telemetry:ContainerRuntime:Outbox:ReferenceSequenceNumberMismatch'\n\t\t\t);\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\tconst logger = { send: (event) => events.push(event) };\n\t\t\tbeforeEach(() => {\n\t\t\t\tevents.length = 0;\n\t\t\t});\n\n\t\t\tit('emits RequestVersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\texpect(\n\t\t\t\t\tevents.some(\n\t\t\t\t\t\t(event) =>\n\t\t\t\t\t\t\tevent.eventName === 'SharedTree:RequestVersionUpdate' &&\n\t\t\t\t\t\t\tevent.versionTo === newVersion &&\n\t\t\t\t\t\t\tevent.versionFrom === oldVersion &&\n\t\t\t\t\t\t\tevent.category === 'generic'\n\t\t\t\t\t)\n\t\t\t\t).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits VersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\tconst matchesVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_end' &&\n\t\t\t\t\tevent.version === newVersion &&\n\t\t\t\t\tevent.category === 'performance' &&\n\t\t\t\t\ttypeof event.duration === 'number';\n\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(false);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits error events on VersionUpdate failure', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst op: SharedTreeUpdateOp = {\n\t\t\t\t\ttype: SharedTreeOpType.Update,\n\t\t\t\t\tversion: newVersion,\n\t\t\t\t};\n\t\t\t\tcontainerRuntimeFactory.pushMessage({ contents: op });\n\t\t\t\t(tree.edits as EditLog).getLocalEdits = () => {\n\t\t\t\t\tthrow new Error('Simulated issue in update');\n\t\t\t\t};\n\t\t\t\tconst matchesFailedVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_cancel' &&\n\t\t\t\t\tevent.category === 'error' &&\n\t\t\t\t\tevent.error === 'Simulated issue in update';\n\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(false);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => containerRuntimeFactory.processAllMessages(),\n\t\t\t\t\t(e: Error) => validateAssertionError(e, /Simulated issue in update/)\n\t\t\t\t);\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(true);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
@@ -1,10 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- /**
6
- * Runs a test suite for summary load perf on `SharedTree`.
7
- * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.
8
- */
9
- export declare function runSummaryLoadPerfTests(title: string): void;
10
- //# sourceMappingURL=SummaryLoadPerfTests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SummaryLoadPerfTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiC3D"}