@fluid-experimental/tree 0.58.2000 → 0.58.3000-61081

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 (815) hide show
  1. package/README.md +9 -9
  2. package/dist/ChangeCompression.d.ts +39 -0
  3. package/dist/ChangeCompression.d.ts.map +1 -0
  4. package/dist/ChangeCompression.js +117 -0
  5. package/dist/ChangeCompression.js.map +1 -0
  6. package/{lib/default-edits/PersistedTypes.d.ts → dist/ChangeTypes.d.ts} +58 -100
  7. package/dist/ChangeTypes.d.ts.map +1 -0
  8. package/dist/{default-edits/PersistedTypes.js → ChangeTypes.js} +21 -76
  9. package/dist/ChangeTypes.js.map +1 -0
  10. package/dist/Checkout.d.ts +39 -27
  11. package/dist/Checkout.d.ts.map +1 -1
  12. package/dist/Checkout.js +59 -31
  13. package/dist/Checkout.js.map +1 -1
  14. package/dist/Common.d.ts +175 -38
  15. package/dist/Common.d.ts.map +1 -1
  16. package/dist/Common.js +240 -103
  17. package/dist/Common.js.map +1 -1
  18. package/dist/EagerCheckout.d.ts +24 -0
  19. package/dist/EagerCheckout.d.ts.map +1 -0
  20. package/dist/{BasicCheckout.js → EagerCheckout.js} +9 -6
  21. package/dist/EagerCheckout.js.map +1 -0
  22. package/dist/EditLog.d.ts +77 -63
  23. package/dist/EditLog.d.ts.map +1 -1
  24. package/dist/EditLog.js +85 -48
  25. package/dist/EditLog.js.map +1 -1
  26. package/dist/EditUtilities.d.ts +168 -0
  27. package/dist/EditUtilities.d.ts.map +1 -0
  28. package/dist/EditUtilities.js +373 -0
  29. package/dist/EditUtilities.js.map +1 -0
  30. package/dist/EventTypes.d.ts +73 -0
  31. package/dist/EventTypes.d.ts.map +1 -0
  32. package/dist/EventTypes.js +78 -0
  33. package/dist/EventTypes.js.map +1 -0
  34. package/dist/Forest.d.ts +29 -7
  35. package/dist/Forest.d.ts.map +1 -1
  36. package/dist/Forest.js +60 -36
  37. package/dist/Forest.js.map +1 -1
  38. package/dist/HistoryEditFactory.d.ts +20 -0
  39. package/dist/HistoryEditFactory.d.ts.map +1 -0
  40. package/dist/HistoryEditFactory.js +226 -0
  41. package/dist/HistoryEditFactory.js.map +1 -0
  42. package/dist/IdConversion.d.ts +12 -0
  43. package/dist/IdConversion.d.ts.map +1 -0
  44. package/dist/IdConversion.js +98 -0
  45. package/dist/IdConversion.js.map +1 -0
  46. package/dist/Identifiers.d.ts +89 -2
  47. package/dist/Identifiers.d.ts.map +1 -1
  48. package/dist/Identifiers.js +10 -0
  49. package/dist/Identifiers.js.map +1 -1
  50. package/dist/InitialTree.d.ts +2 -2
  51. package/dist/InitialTree.d.ts.map +1 -1
  52. package/dist/InitialTree.js +2 -1
  53. package/dist/InitialTree.js.map +1 -1
  54. package/dist/LazyCheckout.d.ts +28 -0
  55. package/dist/LazyCheckout.d.ts.map +1 -0
  56. package/dist/LazyCheckout.js +44 -0
  57. package/dist/LazyCheckout.js.map +1 -0
  58. package/dist/LogViewer.d.ts +130 -85
  59. package/dist/LogViewer.d.ts.map +1 -1
  60. package/dist/LogViewer.js +110 -85
  61. package/dist/LogViewer.js.map +1 -1
  62. package/dist/MergeHealth.d.ts +221 -0
  63. package/dist/MergeHealth.d.ts.map +1 -0
  64. package/dist/MergeHealth.js +263 -0
  65. package/dist/MergeHealth.js.map +1 -0
  66. package/dist/NodeIdUtilities.d.ts +90 -0
  67. package/dist/NodeIdUtilities.d.ts.map +1 -0
  68. package/dist/NodeIdUtilities.js +60 -0
  69. package/dist/NodeIdUtilities.js.map +1 -0
  70. package/dist/PayloadUtilities.d.ts +42 -0
  71. package/dist/PayloadUtilities.d.ts.map +1 -0
  72. package/dist/PayloadUtilities.js +114 -0
  73. package/dist/PayloadUtilities.js.map +1 -0
  74. package/dist/ReconciliationPath.d.ts +18 -13
  75. package/dist/ReconciliationPath.d.ts.map +1 -1
  76. package/dist/ReconciliationPath.js.map +1 -1
  77. package/dist/RevisionValueCache.d.ts +11 -2
  78. package/dist/RevisionValueCache.d.ts.map +1 -1
  79. package/dist/RevisionValueCache.js +2 -3
  80. package/dist/RevisionValueCache.js.map +1 -1
  81. package/dist/RevisionView.d.ts +83 -0
  82. package/dist/RevisionView.d.ts.map +1 -0
  83. package/dist/RevisionView.js +182 -0
  84. package/dist/RevisionView.js.map +1 -0
  85. package/dist/SerializationUtilities.d.ts +36 -0
  86. package/dist/SerializationUtilities.d.ts.map +1 -0
  87. package/dist/SerializationUtilities.js +102 -0
  88. package/dist/SerializationUtilities.js.map +1 -0
  89. package/dist/SharedTree.d.ts +400 -0
  90. package/dist/SharedTree.d.ts.map +1 -0
  91. package/dist/SharedTree.js +1064 -0
  92. package/dist/SharedTree.js.map +1 -0
  93. package/dist/SharedTreeEncoder.d.ts +102 -0
  94. package/dist/SharedTreeEncoder.d.ts.map +1 -0
  95. package/dist/SharedTreeEncoder.js +313 -0
  96. package/dist/SharedTreeEncoder.js.map +1 -0
  97. package/dist/StringInterner.d.ts +46 -0
  98. package/dist/StringInterner.d.ts.map +1 -0
  99. package/dist/StringInterner.js +61 -0
  100. package/dist/StringInterner.js.map +1 -0
  101. package/dist/Summary.d.ts +40 -0
  102. package/dist/Summary.d.ts.map +1 -0
  103. package/dist/Summary.js +23 -0
  104. package/dist/Summary.js.map +1 -0
  105. package/dist/SummaryBackCompatibility.d.ts +22 -22
  106. package/dist/SummaryBackCompatibility.d.ts.map +1 -1
  107. package/dist/SummaryBackCompatibility.js +30 -33
  108. package/dist/SummaryBackCompatibility.js.map +1 -1
  109. package/dist/SummaryTestUtilities.d.ts +31 -0
  110. package/dist/SummaryTestUtilities.d.ts.map +1 -0
  111. package/dist/SummaryTestUtilities.js +37 -0
  112. package/dist/SummaryTestUtilities.js.map +1 -0
  113. package/dist/Transaction.d.ts +53 -0
  114. package/dist/Transaction.d.ts.map +1 -0
  115. package/dist/Transaction.js +76 -0
  116. package/dist/Transaction.js.map +1 -0
  117. package/dist/TransactionInternal.d.ts +543 -0
  118. package/dist/TransactionInternal.d.ts.map +1 -0
  119. package/dist/TransactionInternal.js +622 -0
  120. package/dist/TransactionInternal.js.map +1 -0
  121. package/dist/TreeCompressor.d.ts +37 -0
  122. package/dist/TreeCompressor.d.ts.map +1 -0
  123. package/dist/TreeCompressor.js +132 -0
  124. package/dist/TreeCompressor.js.map +1 -0
  125. package/dist/TreeNodeHandle.d.ts +12 -18
  126. package/dist/TreeNodeHandle.d.ts.map +1 -1
  127. package/dist/TreeNodeHandle.js +13 -23
  128. package/dist/TreeNodeHandle.js.map +1 -1
  129. package/dist/TreeView.d.ts +166 -0
  130. package/dist/TreeView.d.ts.map +1 -0
  131. package/dist/TreeView.js +217 -0
  132. package/dist/TreeView.js.map +1 -0
  133. package/dist/TreeViewUtilities.d.ts +21 -0
  134. package/dist/TreeViewUtilities.d.ts.map +1 -0
  135. package/dist/TreeViewUtilities.js +77 -0
  136. package/dist/TreeViewUtilities.js.map +1 -0
  137. package/dist/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
  138. package/dist/UndoRedoHandler.d.ts.map +1 -0
  139. package/dist/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +5 -9
  140. package/dist/UndoRedoHandler.js.map +1 -0
  141. package/dist/id-compressor/AppendOnlySortedMap.d.ts +127 -0
  142. package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
  143. package/dist/id-compressor/AppendOnlySortedMap.js +283 -0
  144. package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -0
  145. package/dist/id-compressor/IdCompressor.d.ts +389 -0
  146. package/dist/id-compressor/IdCompressor.d.ts.map +1 -0
  147. package/dist/id-compressor/IdCompressor.js +1353 -0
  148. package/dist/id-compressor/IdCompressor.js.map +1 -0
  149. package/dist/id-compressor/IdRange.d.ts +11 -0
  150. package/dist/id-compressor/IdRange.d.ts.map +1 -0
  151. package/dist/id-compressor/IdRange.js +29 -0
  152. package/dist/id-compressor/IdRange.js.map +1 -0
  153. package/dist/id-compressor/NumericUuid.d.ts +63 -0
  154. package/dist/id-compressor/NumericUuid.d.ts.map +1 -0
  155. package/dist/id-compressor/NumericUuid.js +377 -0
  156. package/dist/id-compressor/NumericUuid.js.map +1 -0
  157. package/dist/id-compressor/index.d.ts +12 -0
  158. package/dist/id-compressor/index.d.ts.map +1 -0
  159. package/dist/id-compressor/index.js +26 -0
  160. package/dist/id-compressor/index.js.map +1 -0
  161. package/dist/id-compressor/persisted-types/0.0.1.d.ts +156 -0
  162. package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
  163. package/dist/id-compressor/persisted-types/0.0.1.js +7 -0
  164. package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -0
  165. package/dist/id-compressor/persisted-types/index.d.ts +6 -0
  166. package/dist/id-compressor/persisted-types/index.d.ts.map +1 -0
  167. package/dist/id-compressor/persisted-types/index.js +18 -0
  168. package/dist/id-compressor/persisted-types/index.js.map +1 -0
  169. package/dist/index.d.ts +29 -9
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +50 -35
  172. package/dist/index.js.map +1 -1
  173. package/dist/persisted-types/0.0.2.d.ts +385 -0
  174. package/dist/persisted-types/0.0.2.d.ts.map +1 -0
  175. package/dist/persisted-types/0.0.2.js +113 -0
  176. package/dist/persisted-types/0.0.2.js.map +1 -0
  177. package/dist/persisted-types/0.1.1.d.ts +314 -0
  178. package/dist/persisted-types/0.1.1.d.ts.map +1 -0
  179. package/dist/persisted-types/0.1.1.js +153 -0
  180. package/dist/persisted-types/0.1.1.js.map +1 -0
  181. package/dist/persisted-types/index.d.ts +7 -0
  182. package/dist/persisted-types/index.d.ts.map +1 -0
  183. package/dist/persisted-types/index.js +20 -0
  184. package/dist/persisted-types/index.js.map +1 -0
  185. package/docs/0-1-1-Compression.md +228 -0
  186. package/docs/Breaking-Change-Migration.md +52 -0
  187. package/docs/Compression.md +2 -2
  188. package/docs/Telemetry.md +43 -0
  189. package/lib/ChangeCompression.d.ts +39 -0
  190. package/lib/ChangeCompression.d.ts.map +1 -0
  191. package/lib/ChangeCompression.js +111 -0
  192. package/lib/ChangeCompression.js.map +1 -0
  193. package/{dist/default-edits/PersistedTypes.d.ts → lib/ChangeTypes.d.ts} +58 -100
  194. package/lib/ChangeTypes.d.ts.map +1 -0
  195. package/lib/{default-edits/PersistedTypes.js → ChangeTypes.js} +15 -68
  196. package/lib/ChangeTypes.js.map +1 -0
  197. package/lib/Checkout.d.ts +39 -27
  198. package/lib/Checkout.d.ts.map +1 -1
  199. package/lib/Checkout.js +51 -23
  200. package/lib/Checkout.js.map +1 -1
  201. package/lib/Common.d.ts +175 -38
  202. package/lib/Common.d.ts.map +1 -1
  203. package/lib/Common.js +226 -101
  204. package/lib/Common.js.map +1 -1
  205. package/lib/EagerCheckout.d.ts +24 -0
  206. package/lib/EagerCheckout.d.ts.map +1 -0
  207. package/lib/{BasicCheckout.js → EagerCheckout.js} +7 -4
  208. package/lib/EagerCheckout.js.map +1 -0
  209. package/lib/EditLog.d.ts +77 -63
  210. package/lib/EditLog.d.ts.map +1 -1
  211. package/lib/EditLog.js +83 -47
  212. package/lib/EditLog.js.map +1 -1
  213. package/lib/EditUtilities.d.ts +168 -0
  214. package/lib/EditUtilities.d.ts.map +1 -0
  215. package/lib/EditUtilities.js +353 -0
  216. package/lib/EditUtilities.js.map +1 -0
  217. package/lib/EventTypes.d.ts +73 -0
  218. package/lib/EventTypes.d.ts.map +1 -0
  219. package/lib/EventTypes.js +75 -0
  220. package/lib/EventTypes.js.map +1 -0
  221. package/lib/Forest.d.ts +29 -7
  222. package/lib/Forest.d.ts.map +1 -1
  223. package/lib/Forest.js +58 -35
  224. package/lib/Forest.js.map +1 -1
  225. package/lib/HistoryEditFactory.d.ts +20 -0
  226. package/lib/HistoryEditFactory.d.ts.map +1 -0
  227. package/lib/{default-edits/HistoryEditFactory.js → HistoryEditFactory.js} +78 -39
  228. package/lib/HistoryEditFactory.js.map +1 -0
  229. package/lib/IdConversion.d.ts +12 -0
  230. package/lib/IdConversion.d.ts.map +1 -0
  231. package/lib/IdConversion.js +91 -0
  232. package/lib/IdConversion.js.map +1 -0
  233. package/lib/Identifiers.d.ts +89 -2
  234. package/lib/Identifiers.d.ts.map +1 -1
  235. package/lib/Identifiers.js +8 -1
  236. package/lib/Identifiers.js.map +1 -1
  237. package/lib/InitialTree.d.ts +2 -2
  238. package/lib/InitialTree.d.ts.map +1 -1
  239. package/lib/InitialTree.js +2 -1
  240. package/lib/InitialTree.js.map +1 -1
  241. package/lib/LazyCheckout.d.ts +28 -0
  242. package/lib/LazyCheckout.d.ts.map +1 -0
  243. package/lib/LazyCheckout.js +40 -0
  244. package/lib/LazyCheckout.js.map +1 -0
  245. package/lib/LogViewer.d.ts +130 -85
  246. package/lib/LogViewer.d.ts.map +1 -1
  247. package/lib/LogViewer.js +102 -77
  248. package/lib/LogViewer.js.map +1 -1
  249. package/lib/MergeHealth.d.ts +221 -0
  250. package/lib/MergeHealth.d.ts.map +1 -0
  251. package/lib/MergeHealth.js +258 -0
  252. package/lib/MergeHealth.js.map +1 -0
  253. package/lib/NodeIdUtilities.d.ts +90 -0
  254. package/lib/NodeIdUtilities.d.ts.map +1 -0
  255. package/lib/NodeIdUtilities.js +53 -0
  256. package/lib/NodeIdUtilities.js.map +1 -0
  257. package/lib/PayloadUtilities.d.ts +42 -0
  258. package/lib/PayloadUtilities.d.ts.map +1 -0
  259. package/lib/PayloadUtilities.js +110 -0
  260. package/lib/PayloadUtilities.js.map +1 -0
  261. package/lib/ReconciliationPath.d.ts +18 -13
  262. package/lib/ReconciliationPath.d.ts.map +1 -1
  263. package/lib/ReconciliationPath.js.map +1 -1
  264. package/lib/RevisionValueCache.d.ts +11 -2
  265. package/lib/RevisionValueCache.d.ts.map +1 -1
  266. package/lib/RevisionValueCache.js +2 -3
  267. package/lib/RevisionValueCache.js.map +1 -1
  268. package/lib/RevisionView.d.ts +83 -0
  269. package/lib/RevisionView.d.ts.map +1 -0
  270. package/lib/RevisionView.js +175 -0
  271. package/lib/RevisionView.js.map +1 -0
  272. package/lib/SerializationUtilities.d.ts +36 -0
  273. package/lib/SerializationUtilities.d.ts.map +1 -0
  274. package/lib/SerializationUtilities.js +95 -0
  275. package/lib/SerializationUtilities.js.map +1 -0
  276. package/lib/SharedTree.d.ts +400 -0
  277. package/lib/SharedTree.d.ts.map +1 -0
  278. package/lib/SharedTree.js +1059 -0
  279. package/lib/SharedTree.js.map +1 -0
  280. package/lib/SharedTreeEncoder.d.ts +102 -0
  281. package/lib/SharedTreeEncoder.d.ts.map +1 -0
  282. package/lib/SharedTreeEncoder.js +308 -0
  283. package/lib/SharedTreeEncoder.js.map +1 -0
  284. package/lib/StringInterner.d.ts +46 -0
  285. package/lib/StringInterner.d.ts.map +1 -0
  286. package/lib/StringInterner.js +57 -0
  287. package/lib/StringInterner.js.map +1 -0
  288. package/lib/Summary.d.ts +40 -0
  289. package/lib/Summary.d.ts.map +1 -0
  290. package/lib/Summary.js +19 -0
  291. package/lib/Summary.js.map +1 -0
  292. package/lib/SummaryBackCompatibility.d.ts +22 -22
  293. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  294. package/lib/SummaryBackCompatibility.js +29 -32
  295. package/lib/SummaryBackCompatibility.js.map +1 -1
  296. package/lib/SummaryTestUtilities.d.ts +31 -0
  297. package/lib/SummaryTestUtilities.d.ts.map +1 -0
  298. package/lib/SummaryTestUtilities.js +32 -0
  299. package/lib/SummaryTestUtilities.js.map +1 -0
  300. package/lib/Transaction.d.ts +53 -0
  301. package/lib/Transaction.d.ts.map +1 -0
  302. package/lib/Transaction.js +72 -0
  303. package/lib/Transaction.js.map +1 -0
  304. package/lib/TransactionInternal.d.ts +543 -0
  305. package/lib/TransactionInternal.d.ts.map +1 -0
  306. package/lib/TransactionInternal.js +618 -0
  307. package/lib/TransactionInternal.js.map +1 -0
  308. package/lib/TreeCompressor.d.ts +37 -0
  309. package/lib/TreeCompressor.d.ts.map +1 -0
  310. package/lib/TreeCompressor.js +128 -0
  311. package/lib/TreeCompressor.js.map +1 -0
  312. package/lib/TreeNodeHandle.d.ts +12 -18
  313. package/lib/TreeNodeHandle.d.ts.map +1 -1
  314. package/lib/TreeNodeHandle.js +14 -24
  315. package/lib/TreeNodeHandle.js.map +1 -1
  316. package/lib/TreeView.d.ts +166 -0
  317. package/lib/TreeView.d.ts.map +1 -0
  318. package/lib/TreeView.js +213 -0
  319. package/lib/TreeView.js.map +1 -0
  320. package/lib/TreeViewUtilities.d.ts +21 -0
  321. package/lib/TreeViewUtilities.d.ts.map +1 -0
  322. package/lib/TreeViewUtilities.js +71 -0
  323. package/lib/TreeViewUtilities.js.map +1 -0
  324. package/lib/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
  325. package/lib/UndoRedoHandler.d.ts.map +1 -0
  326. package/lib/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +3 -7
  327. package/lib/UndoRedoHandler.js.map +1 -0
  328. package/lib/id-compressor/AppendOnlySortedMap.d.ts +127 -0
  329. package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
  330. package/lib/id-compressor/AppendOnlySortedMap.js +278 -0
  331. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -0
  332. package/lib/id-compressor/IdCompressor.d.ts +389 -0
  333. package/lib/id-compressor/IdCompressor.d.ts.map +1 -0
  334. package/lib/id-compressor/IdCompressor.js +1343 -0
  335. package/lib/id-compressor/IdCompressor.js.map +1 -0
  336. package/lib/id-compressor/IdRange.d.ts +11 -0
  337. package/lib/id-compressor/IdRange.d.ts.map +1 -0
  338. package/lib/id-compressor/IdRange.js +25 -0
  339. package/lib/id-compressor/IdRange.js.map +1 -0
  340. package/lib/id-compressor/NumericUuid.d.ts +63 -0
  341. package/lib/id-compressor/NumericUuid.d.ts.map +1 -0
  342. package/lib/id-compressor/NumericUuid.js +365 -0
  343. package/lib/id-compressor/NumericUuid.js.map +1 -0
  344. package/lib/id-compressor/index.d.ts +12 -0
  345. package/lib/id-compressor/index.d.ts.map +1 -0
  346. package/lib/id-compressor/index.js +12 -0
  347. package/lib/id-compressor/index.js.map +1 -0
  348. package/lib/id-compressor/persisted-types/0.0.1.d.ts +156 -0
  349. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
  350. package/lib/{test/Snapshot.tests.d.ts → id-compressor/persisted-types/0.0.1.js} +1 -1
  351. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -0
  352. package/lib/id-compressor/persisted-types/index.d.ts +6 -0
  353. package/lib/id-compressor/persisted-types/index.d.ts.map +1 -0
  354. package/lib/id-compressor/persisted-types/index.js +6 -0
  355. package/lib/id-compressor/persisted-types/index.js.map +1 -0
  356. package/lib/index.d.ts +29 -9
  357. package/lib/index.d.ts.map +1 -1
  358. package/lib/index.js +23 -6
  359. package/lib/index.js.map +1 -1
  360. package/lib/persisted-types/0.0.2.d.ts +385 -0
  361. package/lib/persisted-types/0.0.2.d.ts.map +1 -0
  362. package/lib/persisted-types/0.0.2.js +110 -0
  363. package/lib/persisted-types/0.0.2.js.map +1 -0
  364. package/lib/persisted-types/0.1.1.d.ts +314 -0
  365. package/lib/persisted-types/0.1.1.d.ts.map +1 -0
  366. package/lib/persisted-types/0.1.1.js +150 -0
  367. package/lib/persisted-types/0.1.1.js.map +1 -0
  368. package/lib/persisted-types/index.d.ts +7 -0
  369. package/lib/persisted-types/index.d.ts.map +1 -0
  370. package/lib/persisted-types/index.js +8 -0
  371. package/lib/persisted-types/index.js.map +1 -0
  372. package/lib/test/AppendOnlySortedMap.tests.d.ts +6 -0
  373. package/lib/test/AppendOnlySortedMap.tests.d.ts.map +1 -0
  374. package/lib/test/AppendOnlySortedMap.tests.js +169 -0
  375. package/lib/test/AppendOnlySortedMap.tests.js.map +1 -0
  376. package/lib/test/{SnapshotUtilities.tests.d.ts → ChangeCompression.tests.d.ts} +1 -1
  377. package/lib/test/ChangeCompression.tests.d.ts.map +1 -0
  378. package/lib/test/ChangeCompression.tests.js +145 -0
  379. package/lib/test/ChangeCompression.tests.js.map +1 -0
  380. package/lib/test/Checkout.tests.d.ts +2 -3
  381. package/lib/test/Checkout.tests.d.ts.map +1 -1
  382. package/lib/test/Checkout.tests.js +126 -69
  383. package/lib/test/Checkout.tests.js.map +1 -1
  384. package/lib/test/Common.tests.js +60 -2
  385. package/lib/test/Common.tests.js.map +1 -1
  386. package/lib/test/{BasicCheckout.tests.d.ts → EagerCheckout.tests.d.ts} +1 -1
  387. package/lib/test/EagerCheckout.tests.d.ts.map +1 -0
  388. package/lib/test/EagerCheckout.tests.js +20 -0
  389. package/lib/test/EagerCheckout.tests.js.map +1 -0
  390. package/lib/test/Edit.tests.js +22 -14
  391. package/lib/test/Edit.tests.js.map +1 -1
  392. package/lib/test/{Anchors.glassBox.tests.d.ts → EditLog.perf.tests.d.ts} +1 -1
  393. package/lib/test/EditLog.perf.tests.d.ts.map +1 -0
  394. package/lib/test/EditLog.perf.tests.js +30 -0
  395. package/lib/test/EditLog.perf.tests.js.map +1 -0
  396. package/lib/test/EditLog.tests.js +10 -6
  397. package/lib/test/EditLog.tests.js.map +1 -1
  398. package/lib/test/EditUtilities.tests.d.ts +6 -0
  399. package/lib/test/EditUtilities.tests.d.ts.map +1 -0
  400. package/lib/test/EditUtilities.tests.js +503 -0
  401. package/lib/test/EditUtilities.tests.js.map +1 -0
  402. package/lib/test/Forest.perf.tests.d.ts +6 -0
  403. package/lib/test/Forest.perf.tests.d.ts.map +1 -0
  404. package/lib/test/Forest.perf.tests.js +133 -0
  405. package/lib/test/Forest.perf.tests.js.map +1 -0
  406. package/lib/test/Forest.tests.js +54 -27
  407. package/lib/test/Forest.tests.js.map +1 -1
  408. package/lib/test/GenericTransaction.tests.js +12 -3
  409. package/lib/test/GenericTransaction.tests.js.map +1 -1
  410. package/lib/test/HistoryEditFactory.tests.d.ts +6 -0
  411. package/lib/test/HistoryEditFactory.tests.d.ts.map +1 -0
  412. package/lib/test/HistoryEditFactory.tests.js +90 -0
  413. package/lib/test/HistoryEditFactory.tests.js.map +1 -0
  414. package/lib/test/IdCompressor.perf.tests.d.ts +6 -0
  415. package/lib/test/IdCompressor.perf.tests.d.ts.map +1 -0
  416. package/lib/test/IdCompressor.perf.tests.js +304 -0
  417. package/lib/test/IdCompressor.perf.tests.js.map +1 -0
  418. package/lib/test/IdCompressor.tests.d.ts +6 -0
  419. package/lib/test/IdCompressor.tests.d.ts.map +1 -0
  420. package/lib/test/IdCompressor.tests.js +1075 -0
  421. package/lib/test/IdCompressor.tests.js.map +1 -0
  422. package/lib/test/IdConversion.tests.d.ts +6 -0
  423. package/lib/test/IdConversion.tests.d.ts.map +1 -0
  424. package/lib/test/IdConversion.tests.js +36 -0
  425. package/lib/test/IdConversion.tests.js.map +1 -0
  426. package/lib/test/LazyCheckout.tests.d.ts +6 -0
  427. package/lib/test/LazyCheckout.tests.d.ts.map +1 -0
  428. package/lib/test/LazyCheckout.tests.js +22 -0
  429. package/lib/test/LazyCheckout.tests.js.map +1 -0
  430. package/lib/test/LogViewer.tests.js +269 -187
  431. package/lib/test/LogViewer.tests.js.map +1 -1
  432. package/lib/test/{SharedTreeWithAnchors.tests.d.ts → MergeHealthTelemetryHeartbeat.tests.d.ts} +1 -1
  433. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +1 -0
  434. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +342 -0
  435. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -0
  436. package/lib/test/NumericUuid.perf.tests.d.ts +6 -0
  437. package/lib/test/NumericUuid.perf.tests.d.ts.map +1 -0
  438. package/lib/test/NumericUuid.perf.tests.js +68 -0
  439. package/lib/test/NumericUuid.perf.tests.js.map +1 -0
  440. package/lib/test/NumericUuid.tests.d.ts +6 -0
  441. package/lib/test/NumericUuid.tests.d.ts.map +1 -0
  442. package/lib/test/NumericUuid.tests.js +191 -0
  443. package/lib/test/NumericUuid.tests.js.map +1 -0
  444. package/lib/test/RevisionView.tests.d.ts +6 -0
  445. package/lib/test/RevisionView.tests.d.ts.map +1 -0
  446. package/lib/test/RevisionView.tests.js +133 -0
  447. package/lib/test/RevisionView.tests.js.map +1 -0
  448. package/lib/test/SharedTree.perf.tests.d.ts +6 -0
  449. package/lib/test/SharedTree.perf.tests.d.ts.map +1 -0
  450. package/lib/test/SharedTree.perf.tests.js +39 -0
  451. package/lib/test/SharedTree.perf.tests.js.map +1 -0
  452. package/lib/test/SharedTree.tests.js +15 -3
  453. package/lib/test/SharedTree.tests.js.map +1 -1
  454. package/lib/test/StringInterner.tests.d.ts +6 -0
  455. package/lib/test/StringInterner.tests.d.ts.map +1 -0
  456. package/lib/test/StringInterner.tests.js +71 -0
  457. package/lib/test/StringInterner.tests.js.map +1 -0
  458. package/lib/test/Summary.tests.d.ts +8 -0
  459. package/lib/test/Summary.tests.d.ts.map +1 -0
  460. package/lib/test/Summary.tests.js +407 -0
  461. package/lib/test/Summary.tests.js.map +1 -0
  462. package/lib/test/Transaction.tests.js +76 -330
  463. package/lib/test/Transaction.tests.js.map +1 -1
  464. package/lib/test/TransactionInternal.tests.d.ts +6 -0
  465. package/lib/test/TransactionInternal.tests.d.ts.map +1 -0
  466. package/lib/test/TransactionInternal.tests.js +568 -0
  467. package/lib/test/TransactionInternal.tests.js.map +1 -0
  468. package/lib/test/TreeCompression.tests.d.ts +6 -0
  469. package/lib/test/TreeCompression.tests.d.ts.map +1 -0
  470. package/lib/test/TreeCompression.tests.js +292 -0
  471. package/lib/test/TreeCompression.tests.js.map +1 -0
  472. package/lib/test/TreeView.tests.d.ts +6 -0
  473. package/lib/test/TreeView.tests.d.ts.map +1 -0
  474. package/lib/test/TreeView.tests.js +147 -0
  475. package/lib/test/TreeView.tests.js.map +1 -0
  476. package/lib/test/UndoRedoHandler.tests.js +2 -2
  477. package/lib/test/UndoRedoHandler.tests.js.map +1 -1
  478. package/lib/test/Virtualization.tests.js +147 -62
  479. package/lib/test/Virtualization.tests.js.map +1 -1
  480. package/lib/test/fuzz/Generators.d.ts +19 -0
  481. package/lib/test/fuzz/Generators.d.ts.map +1 -0
  482. package/lib/test/fuzz/Generators.js +420 -0
  483. package/lib/test/fuzz/Generators.js.map +1 -0
  484. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +20 -0
  485. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -0
  486. package/lib/test/fuzz/SharedTreeFuzzTests.js +200 -0
  487. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -0
  488. package/lib/test/fuzz/Types.d.ts +133 -0
  489. package/lib/test/fuzz/Types.d.ts.map +1 -0
  490. package/lib/test/{GenericTransactionWithAnchors.tests.d.ts → fuzz/Types.js} +2 -2
  491. package/lib/test/fuzz/Types.js.map +1 -0
  492. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +180 -0
  493. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -0
  494. package/lib/test/utilities/IdCompressorTestUtilities.js +528 -0
  495. package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -0
  496. package/lib/test/utilities/MockTransaction.d.ts +26 -7
  497. package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
  498. package/lib/test/utilities/MockTransaction.js +40 -11
  499. package/lib/test/utilities/MockTransaction.js.map +1 -1
  500. package/lib/test/utilities/PendingLocalStateTests.d.ts +12 -0
  501. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -0
  502. package/lib/test/utilities/PendingLocalStateTests.js +105 -0
  503. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -0
  504. package/lib/test/utilities/SharedTreeTests.d.ts +3 -4
  505. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  506. package/lib/test/utilities/SharedTreeTests.js +696 -439
  507. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  508. package/lib/test/utilities/SharedTreeVersioningTests.d.ts +11 -0
  509. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -0
  510. package/lib/test/utilities/SharedTreeVersioningTests.js +345 -0
  511. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -0
  512. package/lib/test/utilities/SummaryLoadPerfTests.d.ts +10 -0
  513. package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -0
  514. package/lib/test/utilities/SummaryLoadPerfTests.js +102 -0
  515. package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -0
  516. package/lib/test/utilities/SummarySizeTests.d.ts +11 -0
  517. package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -0
  518. package/lib/test/utilities/SummarySizeTests.js +158 -0
  519. package/lib/test/utilities/SummarySizeTests.js.map +1 -0
  520. package/lib/test/utilities/TestCommon.d.ts +9 -0
  521. package/lib/test/utilities/TestCommon.d.ts.map +1 -0
  522. package/lib/test/utilities/TestCommon.js +13 -0
  523. package/lib/test/utilities/TestCommon.js.map +1 -0
  524. package/lib/test/utilities/TestNode.d.ts +140 -0
  525. package/lib/test/utilities/TestNode.d.ts.map +1 -0
  526. package/lib/test/utilities/TestNode.js +292 -0
  527. package/lib/test/utilities/TestNode.js.map +1 -0
  528. package/lib/test/utilities/TestUtilities.d.ts +84 -70
  529. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  530. package/lib/test/utilities/TestUtilities.js +218 -143
  531. package/lib/test/utilities/TestUtilities.js.map +1 -1
  532. package/lib/test/utilities/UndoRedoTests.d.ts +4 -5
  533. package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
  534. package/lib/test/utilities/UndoRedoTests.js +138 -149
  535. package/lib/test/utilities/UndoRedoTests.js.map +1 -1
  536. package/package.json +19 -14
  537. package/src/ChangeCompression.ts +159 -0
  538. package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -120
  539. package/src/Checkout.ts +81 -52
  540. package/src/Common.ts +317 -117
  541. package/src/EagerCheckout.ts +38 -0
  542. package/src/EditLog.ts +153 -100
  543. package/src/EditUtilities.ts +559 -0
  544. package/src/EventTypes.ts +74 -0
  545. package/src/Forest.ts +81 -73
  546. package/src/{default-edits/HistoryEditFactory.ts → HistoryEditFactory.ts} +103 -53
  547. package/src/IdConversion.ts +125 -0
  548. package/src/Identifiers.ts +101 -1
  549. package/src/InitialTree.ts +5 -4
  550. package/src/LazyCheckout.ts +51 -0
  551. package/src/LogViewer.ts +242 -166
  552. package/src/MergeHealth.ts +447 -0
  553. package/src/NodeIdUtilities.ts +141 -0
  554. package/src/PayloadUtilities.ts +124 -0
  555. package/src/ReconciliationPath.ts +18 -13
  556. package/src/RevisionValueCache.ts +14 -5
  557. package/src/RevisionView.ts +252 -0
  558. package/src/SerializationUtilities.ts +130 -0
  559. package/src/SharedTree.ts +1448 -0
  560. package/src/SharedTreeEncoder.ts +493 -0
  561. package/src/StringInterner.ts +72 -0
  562. package/src/Summary.ts +48 -0
  563. package/src/SummaryBackCompatibility.ts +47 -57
  564. package/src/SummaryTestUtilities.ts +54 -0
  565. package/src/Transaction.ts +94 -0
  566. package/src/TransactionInternal.ts +1088 -0
  567. package/src/TreeCompressor.ts +222 -0
  568. package/src/TreeNodeHandle.ts +19 -32
  569. package/src/TreeView.ts +321 -0
  570. package/src/TreeViewUtilities.ts +77 -0
  571. package/src/{default-edits/UndoRedoHandler.ts → UndoRedoHandler.ts} +8 -13
  572. package/src/id-compressor/AppendOnlySortedMap.ts +325 -0
  573. package/src/id-compressor/IdCompressor.md +3 -0
  574. package/src/id-compressor/IdCompressor.ts +1848 -0
  575. package/src/id-compressor/IdRange.ts +33 -0
  576. package/src/id-compressor/NumericUuid.ts +414 -0
  577. package/src/id-compressor/index.ts +13 -0
  578. package/src/id-compressor/persisted-types/0.0.1.ts +179 -0
  579. package/src/id-compressor/persisted-types/README.md +3 -0
  580. package/src/id-compressor/persisted-types/index.ts +6 -0
  581. package/src/index.ts +119 -59
  582. package/src/persisted-types/0.0.2.ts +442 -0
  583. package/src/persisted-types/0.1.1.ts +476 -0
  584. package/src/persisted-types/README.md +22 -0
  585. package/src/persisted-types/index.ts +9 -0
  586. package/.mocharc.js +0 -41
  587. package/api/tree.api.md +0 -729
  588. package/dist/BasicCheckout.d.ts +0 -23
  589. package/dist/BasicCheckout.d.ts.map +0 -1
  590. package/dist/BasicCheckout.js.map +0 -1
  591. package/dist/Snapshot.d.ts +0 -198
  592. package/dist/Snapshot.d.ts.map +0 -1
  593. package/dist/Snapshot.js +0 -267
  594. package/dist/Snapshot.js.map +0 -1
  595. package/dist/SnapshotUtilities.d.ts +0 -29
  596. package/dist/SnapshotUtilities.d.ts.map +0 -1
  597. package/dist/SnapshotUtilities.js +0 -73
  598. package/dist/SnapshotUtilities.js.map +0 -1
  599. package/dist/anchored-edits/AnchorResolution.d.ts +0 -144
  600. package/dist/anchored-edits/AnchorResolution.d.ts.map +0 -1
  601. package/dist/anchored-edits/AnchorResolution.js +0 -162
  602. package/dist/anchored-edits/AnchorResolution.js.map +0 -1
  603. package/dist/anchored-edits/Factory.d.ts +0 -56
  604. package/dist/anchored-edits/Factory.d.ts.map +0 -1
  605. package/dist/anchored-edits/Factory.js +0 -79
  606. package/dist/anchored-edits/Factory.js.map +0 -1
  607. package/dist/anchored-edits/PersistedTypes.d.ts +0 -245
  608. package/dist/anchored-edits/PersistedTypes.d.ts.map +0 -1
  609. package/dist/anchored-edits/PersistedTypes.js +0 -131
  610. package/dist/anchored-edits/PersistedTypes.js.map +0 -1
  611. package/dist/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
  612. package/dist/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
  613. package/dist/anchored-edits/SharedTreeWithAnchors.js +0 -115
  614. package/dist/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
  615. package/dist/anchored-edits/TransactionWithAnchors.d.ts +0 -28
  616. package/dist/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
  617. package/dist/anchored-edits/TransactionWithAnchors.js +0 -36
  618. package/dist/anchored-edits/TransactionWithAnchors.js.map +0 -1
  619. package/dist/anchored-edits/index.d.ts +0 -10
  620. package/dist/anchored-edits/index.d.ts.map +0 -1
  621. package/dist/anchored-edits/index.js +0 -34
  622. package/dist/anchored-edits/index.js.map +0 -1
  623. package/dist/default-edits/EditUtilities.d.ts +0 -57
  624. package/dist/default-edits/EditUtilities.d.ts.map +0 -1
  625. package/dist/default-edits/EditUtilities.js +0 -192
  626. package/dist/default-edits/EditUtilities.js.map +0 -1
  627. package/dist/default-edits/Factory.d.ts +0 -56
  628. package/dist/default-edits/Factory.d.ts.map +0 -1
  629. package/dist/default-edits/Factory.js +0 -79
  630. package/dist/default-edits/Factory.js.map +0 -1
  631. package/dist/default-edits/HistoryEditFactory.d.ts +0 -19
  632. package/dist/default-edits/HistoryEditFactory.d.ts.map +0 -1
  633. package/dist/default-edits/HistoryEditFactory.js +0 -187
  634. package/dist/default-edits/HistoryEditFactory.js.map +0 -1
  635. package/dist/default-edits/PersistedTypes.d.ts.map +0 -1
  636. package/dist/default-edits/PersistedTypes.js.map +0 -1
  637. package/dist/default-edits/SharedTree.d.ts +0 -111
  638. package/dist/default-edits/SharedTree.d.ts.map +0 -1
  639. package/dist/default-edits/SharedTree.js +0 -124
  640. package/dist/default-edits/SharedTree.js.map +0 -1
  641. package/dist/default-edits/Summary.d.ts +0 -15
  642. package/dist/default-edits/Summary.d.ts.map +0 -1
  643. package/dist/default-edits/Summary.js +0 -35
  644. package/dist/default-edits/Summary.js.map +0 -1
  645. package/dist/default-edits/Transaction.d.ts +0 -41
  646. package/dist/default-edits/Transaction.d.ts.map +0 -1
  647. package/dist/default-edits/Transaction.js +0 -225
  648. package/dist/default-edits/Transaction.js.map +0 -1
  649. package/dist/default-edits/UndoRedoHandler.d.ts.map +0 -1
  650. package/dist/default-edits/UndoRedoHandler.js.map +0 -1
  651. package/dist/default-edits/index.d.ts +0 -13
  652. package/dist/default-edits/index.d.ts.map +0 -1
  653. package/dist/default-edits/index.js +0 -41
  654. package/dist/default-edits/index.js.map +0 -1
  655. package/dist/generic/GenericEditUtilities.d.ts +0 -26
  656. package/dist/generic/GenericEditUtilities.d.ts.map +0 -1
  657. package/dist/generic/GenericEditUtilities.js +0 -45
  658. package/dist/generic/GenericEditUtilities.js.map +0 -1
  659. package/dist/generic/GenericSharedTree.d.ts +0 -221
  660. package/dist/generic/GenericSharedTree.d.ts.map +0 -1
  661. package/dist/generic/GenericSharedTree.js +0 -447
  662. package/dist/generic/GenericSharedTree.js.map +0 -1
  663. package/dist/generic/GenericTransaction.d.ts +0 -87
  664. package/dist/generic/GenericTransaction.d.ts.map +0 -1
  665. package/dist/generic/GenericTransaction.js +0 -144
  666. package/dist/generic/GenericTransaction.js.map +0 -1
  667. package/dist/generic/PersistedTypes.d.ts +0 -194
  668. package/dist/generic/PersistedTypes.d.ts.map +0 -1
  669. package/dist/generic/PersistedTypes.js +0 -42
  670. package/dist/generic/PersistedTypes.js.map +0 -1
  671. package/dist/generic/Summary.d.ts +0 -63
  672. package/dist/generic/Summary.d.ts.map +0 -1
  673. package/dist/generic/Summary.js +0 -64
  674. package/dist/generic/Summary.js.map +0 -1
  675. package/dist/generic/index.d.ts +0 -10
  676. package/dist/generic/index.d.ts.map +0 -1
  677. package/dist/generic/index.js +0 -26
  678. package/dist/generic/index.js.map +0 -1
  679. package/lib/BasicCheckout.d.ts +0 -23
  680. package/lib/BasicCheckout.d.ts.map +0 -1
  681. package/lib/BasicCheckout.js.map +0 -1
  682. package/lib/Snapshot.d.ts +0 -198
  683. package/lib/Snapshot.d.ts.map +0 -1
  684. package/lib/Snapshot.js +0 -263
  685. package/lib/Snapshot.js.map +0 -1
  686. package/lib/SnapshotUtilities.d.ts +0 -29
  687. package/lib/SnapshotUtilities.d.ts.map +0 -1
  688. package/lib/SnapshotUtilities.js +0 -67
  689. package/lib/SnapshotUtilities.js.map +0 -1
  690. package/lib/anchored-edits/AnchorResolution.d.ts +0 -144
  691. package/lib/anchored-edits/AnchorResolution.d.ts.map +0 -1
  692. package/lib/anchored-edits/AnchorResolution.js +0 -152
  693. package/lib/anchored-edits/AnchorResolution.js.map +0 -1
  694. package/lib/anchored-edits/Factory.d.ts +0 -56
  695. package/lib/anchored-edits/Factory.d.ts.map +0 -1
  696. package/lib/anchored-edits/Factory.js +0 -74
  697. package/lib/anchored-edits/Factory.js.map +0 -1
  698. package/lib/anchored-edits/PersistedTypes.d.ts +0 -245
  699. package/lib/anchored-edits/PersistedTypes.d.ts.map +0 -1
  700. package/lib/anchored-edits/PersistedTypes.js +0 -128
  701. package/lib/anchored-edits/PersistedTypes.js.map +0 -1
  702. package/lib/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
  703. package/lib/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
  704. package/lib/anchored-edits/SharedTreeWithAnchors.js +0 -110
  705. package/lib/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
  706. package/lib/anchored-edits/TransactionWithAnchors.d.ts +0 -28
  707. package/lib/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
  708. package/lib/anchored-edits/TransactionWithAnchors.js +0 -32
  709. package/lib/anchored-edits/TransactionWithAnchors.js.map +0 -1
  710. package/lib/anchored-edits/index.d.ts +0 -10
  711. package/lib/anchored-edits/index.d.ts.map +0 -1
  712. package/lib/anchored-edits/index.js +0 -11
  713. package/lib/anchored-edits/index.js.map +0 -1
  714. package/lib/default-edits/EditUtilities.d.ts +0 -57
  715. package/lib/default-edits/EditUtilities.d.ts.map +0 -1
  716. package/lib/default-edits/EditUtilities.js +0 -181
  717. package/lib/default-edits/EditUtilities.js.map +0 -1
  718. package/lib/default-edits/Factory.d.ts +0 -56
  719. package/lib/default-edits/Factory.d.ts.map +0 -1
  720. package/lib/default-edits/Factory.js +0 -74
  721. package/lib/default-edits/Factory.js.map +0 -1
  722. package/lib/default-edits/HistoryEditFactory.d.ts +0 -19
  723. package/lib/default-edits/HistoryEditFactory.d.ts.map +0 -1
  724. package/lib/default-edits/HistoryEditFactory.js.map +0 -1
  725. package/lib/default-edits/PersistedTypes.d.ts.map +0 -1
  726. package/lib/default-edits/PersistedTypes.js.map +0 -1
  727. package/lib/default-edits/SharedTree.d.ts +0 -111
  728. package/lib/default-edits/SharedTree.d.ts.map +0 -1
  729. package/lib/default-edits/SharedTree.js +0 -100
  730. package/lib/default-edits/SharedTree.js.map +0 -1
  731. package/lib/default-edits/Summary.d.ts +0 -15
  732. package/lib/default-edits/Summary.d.ts.map +0 -1
  733. package/lib/default-edits/Summary.js +0 -31
  734. package/lib/default-edits/Summary.js.map +0 -1
  735. package/lib/default-edits/Transaction.d.ts +0 -41
  736. package/lib/default-edits/Transaction.d.ts.map +0 -1
  737. package/lib/default-edits/Transaction.js +0 -221
  738. package/lib/default-edits/Transaction.js.map +0 -1
  739. package/lib/default-edits/UndoRedoHandler.d.ts.map +0 -1
  740. package/lib/default-edits/UndoRedoHandler.js.map +0 -1
  741. package/lib/default-edits/index.d.ts +0 -13
  742. package/lib/default-edits/index.d.ts.map +0 -1
  743. package/lib/default-edits/index.js +0 -14
  744. package/lib/default-edits/index.js.map +0 -1
  745. package/lib/generic/GenericEditUtilities.d.ts +0 -26
  746. package/lib/generic/GenericEditUtilities.d.ts.map +0 -1
  747. package/lib/generic/GenericEditUtilities.js +0 -38
  748. package/lib/generic/GenericEditUtilities.js.map +0 -1
  749. package/lib/generic/GenericSharedTree.d.ts +0 -221
  750. package/lib/generic/GenericSharedTree.d.ts.map +0 -1
  751. package/lib/generic/GenericSharedTree.js +0 -443
  752. package/lib/generic/GenericSharedTree.js.map +0 -1
  753. package/lib/generic/GenericTransaction.d.ts +0 -87
  754. package/lib/generic/GenericTransaction.d.ts.map +0 -1
  755. package/lib/generic/GenericTransaction.js +0 -140
  756. package/lib/generic/GenericTransaction.js.map +0 -1
  757. package/lib/generic/PersistedTypes.d.ts +0 -194
  758. package/lib/generic/PersistedTypes.d.ts.map +0 -1
  759. package/lib/generic/PersistedTypes.js +0 -39
  760. package/lib/generic/PersistedTypes.js.map +0 -1
  761. package/lib/generic/Summary.d.ts +0 -63
  762. package/lib/generic/Summary.d.ts.map +0 -1
  763. package/lib/generic/Summary.js +0 -58
  764. package/lib/generic/Summary.js.map +0 -1
  765. package/lib/generic/index.d.ts +0 -10
  766. package/lib/generic/index.d.ts.map +0 -1
  767. package/lib/generic/index.js +0 -11
  768. package/lib/generic/index.js.map +0 -1
  769. package/lib/test/Anchors.glassBox.tests.d.ts.map +0 -1
  770. package/lib/test/Anchors.glassBox.tests.js +0 -410
  771. package/lib/test/Anchors.glassBox.tests.js.map +0 -1
  772. package/lib/test/BasicCheckout.tests.d.ts.map +0 -1
  773. package/lib/test/BasicCheckout.tests.js +0 -8
  774. package/lib/test/BasicCheckout.tests.js.map +0 -1
  775. package/lib/test/GenericTransactionWithAnchors.tests.d.ts.map +0 -1
  776. package/lib/test/GenericTransactionWithAnchors.tests.js +0 -25
  777. package/lib/test/GenericTransactionWithAnchors.tests.js.map +0 -1
  778. package/lib/test/SharedTreeWithAnchors.tests.d.ts.map +0 -1
  779. package/lib/test/SharedTreeWithAnchors.tests.js +0 -420
  780. package/lib/test/SharedTreeWithAnchors.tests.js.map +0 -1
  781. package/lib/test/Snapshot.tests.d.ts.map +0 -1
  782. package/lib/test/Snapshot.tests.js +0 -96
  783. package/lib/test/Snapshot.tests.js.map +0 -1
  784. package/lib/test/SnapshotUtilities.tests.d.ts.map +0 -1
  785. package/lib/test/SnapshotUtilities.tests.js +0 -168
  786. package/lib/test/SnapshotUtilities.tests.js.map +0 -1
  787. package/lib/test/undoRedoStackManager.d.ts +0 -26
  788. package/lib/test/undoRedoStackManager.d.ts.map +0 -1
  789. package/lib/test/undoRedoStackManager.js +0 -176
  790. package/lib/test/undoRedoStackManager.js.map +0 -1
  791. package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts +0 -13
  792. package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts.map +0 -1
  793. package/lib/test/utilities/SummaryFormatCompatibilityTests.js +0 -154
  794. package/lib/test/utilities/SummaryFormatCompatibilityTests.js.map +0 -1
  795. package/src/BasicCheckout.ts +0 -34
  796. package/src/Snapshot.ts +0 -363
  797. package/src/SnapshotUtilities.ts +0 -88
  798. package/src/anchored-edits/AnchorResolution.ts +0 -442
  799. package/src/anchored-edits/Factory.ts +0 -94
  800. package/src/anchored-edits/PersistedTypes.ts +0 -310
  801. package/src/anchored-edits/SharedTreeWithAnchors.ts +0 -200
  802. package/src/anchored-edits/TransactionWithAnchors.ts +0 -39
  803. package/src/anchored-edits/index.ts +0 -21
  804. package/src/default-edits/EditUtilities.ts +0 -220
  805. package/src/default-edits/Factory.ts +0 -94
  806. package/src/default-edits/SharedTree.ts +0 -174
  807. package/src/default-edits/Summary.ts +0 -44
  808. package/src/default-edits/Transaction.ts +0 -262
  809. package/src/default-edits/index.ts +0 -29
  810. package/src/generic/GenericEditUtilities.ts +0 -46
  811. package/src/generic/GenericSharedTree.ts +0 -593
  812. package/src/generic/GenericTransaction.ts +0 -194
  813. package/src/generic/PersistedTypes.ts +0 -221
  814. package/src/generic/Summary.ts +0 -113
  815. package/src/generic/index.ts +0 -41
@@ -1 +1 @@
1
- {"version":3,"file":"EditLog.tests.js","sourceRoot":"","sources":["../../src/test/EditLog.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { EditHandle, EditLog, separateEditAndId } from '../EditLog';\nimport { Change } from '../default-edits';\nimport { EditId } from '../Identifiers';\nimport { assertNotUndefined } from '../Common';\nimport { newEdit, Edit, EditWithoutId } from '../generic';\n\n/**\n * Creates an edit log with the specified number of chunks, stored as handles instead of edits.\n * @param numberOfChunks - The number of chunks to add to the edit log.\n * @param editsPerChunk - The number of edits per chunk that gets added to the edit log.\n * @param editsPerChunkOnEditLog - The number of edits per chunk that gets set for future edits to the edit log.\n * @returns The edit log created with handles.\n */\nfunction createEditLogWithHandles(\n\tnumberOfChunks = 2,\n\teditsPerChunk = 5,\n\teditsPerChunkOnEditLog = 100\n): EditLog<Change> {\n\tconst editIds: EditId[] = [];\n\tconst editChunks: EditWithoutId<Change>[][] = [];\n\n\tlet inProgessChunk: EditWithoutId<Change>[] = [];\n\tfor (let i = 0; i < numberOfChunks * editsPerChunk; i++) {\n\t\tconst { id, editWithoutId } = separateEditAndId(newEdit([]));\n\t\teditIds.push(id);\n\n\t\tinProgessChunk.push(editWithoutId);\n\n\t\tif (inProgessChunk.length === editsPerChunk) {\n\t\t\teditChunks.push(inProgessChunk.slice());\n\t\t\tinProgessChunk = [];\n\t\t}\n\t}\n\n\tconst handles: EditHandle[] = editChunks.map((chunk) => {\n\t\treturn {\n\t\t\tget: async () => {\n\t\t\t\treturn IsoBuffer.from(JSON.stringify({ edits: chunk }));\n\t\t\t},\n\t\t};\n\t});\n\n\tlet startRevision = 0;\n\tconst handlesWithKeys = handles.map((chunk) => {\n\t\tconst handle = {\n\t\t\tstartRevision,\n\t\t\tchunk,\n\t\t};\n\t\tstartRevision = startRevision + 5;\n\t\treturn handle;\n\t});\n\n\tconst editLog = new EditLog<Change>({ editChunks: handlesWithKeys, editIds }, undefined, editsPerChunkOnEditLog);\n\n\treturn editLog;\n}\n\ndescribe('EditLog', () => {\n\tconst edit0 = newEdit([]);\n\tconst edit1 = newEdit([]);\n\tconst { id: id0, editWithoutId: editWithoutId0 } = separateEditAndId(edit0);\n\tconst { id: id1, editWithoutId: editWithoutId1 } = separateEditAndId(edit1);\n\n\tit('can be constructed from sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Newly initialized log should not have local edits.');\n\t\texpect(log.numberOfSequencedEdits).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t'Log should have as many sequenced edits as it was initialized with.'\n\t\t);\n\t\texpect(log.length).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t\"Log's total length should match its sequenced edits on construction\"\n\t\t);\n\n\t\texpect(log.getIdAtIndex(0)).to.equal(id0, 'Log should have edits in order of construction.');\n\t\texpect(log.getIdAtIndex(1)).to.equal(id1, 'Log should have edits in order of construction.');\n\t});\n\n\tit('can get the index from an edit id of sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tit('can get the index from an edit id of a local edit', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\tconst editIds = [id0];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\tlog.addLocalEdit(edit1);\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tdescribe('tryGetIndexOfId', () => {\n\t\tit('can get the index from an existing edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = [id0];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId(id0)).to.equal(0);\n\t\t});\n\n\t\tit('returns undefined when queried with a nonexistent edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = ['f9379af1-6f1a-4f71-8f8c-859359621404' as EditId];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId('aa203fc3-bc28-437d-b01c-f9398dc859ef' as EditId)).to.equal(undefined);\n\t\t});\n\t});\n\n\tit('can get an edit from an index', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect((await log.getEditAtIndex(0)).id).to.equal(id0);\n\t\texpect((await log.getEditAtIndex(1)).id).to.equal(id1);\n\t});\n\n\tit('can get an edit from an edit id', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\tconst editFromId0 = await log.tryGetEdit(id0);\n\t\tconst editFromId1 = await log.tryGetEdit(id1);\n\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(editFromId1).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).to.equal(edit0.id);\n\t\texpect(assertNotUndefined(editFromId1).id).to.equal(edit1.id);\n\t});\n\n\tit('can be iterated', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit1);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\n\t\t// Sequenced edits should be iterated before local edits\n\t\tconst expectedEditIdStack = [id1, id0];\n\n\t\tlog.editIds.forEach((editId) => {\n\t\t\texpect(editId).to.equal(expectedEditIdStack.pop());\n\t\t});\n\n\t\texpect(expectedEditIdStack.length).to.equal(0);\n\t});\n\n\tit('can add sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 2, referenceSequenceNumber: 1 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(2);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('can add local edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\n\t\tlog.addLocalEdit(edit1);\n\t\texpect(log.numberOfLocalEdits).to.equal(2);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('tracks the min sequence number of sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 43, referenceSequenceNumber: 42, minimumSequenceNumber: 42 });\n\t\texpect(log.minSequenceNumber).equals(42);\n\t\texpect(() =>\n\t\t\tlog.addSequencedEdit('fake-edit' as unknown as Edit<unknown>, {\n\t\t\t\tsequenceNumber: 44,\n\t\t\t\treferenceSequenceNumber: 43,\n\t\t\t})\n\t\t).throws('min number');\n\t});\n\n\tit('detects causal ordering violations', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\tlog.addLocalEdit(edit1);\n\t\texpect(() => log.addSequencedEdit(edit1, { sequenceNumber: 1, referenceSequenceNumber: 0 })).throws('ordering');\n\t});\n\n\tit('can sequence a local edit', async () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\tlet editFromId0 = await log.tryGetEdit(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain local edit.');\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.length).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\teditFromId0 = await log.tryGetEdit(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain sequenced edit.');\n\t});\n\n\tit('Throws on duplicate sequenced edits', async () => {\n\t\tconst log = new EditLog();\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(() => log.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 }))\n\t\t\t.to.throw(Error)\n\t\t\t.that.has.property('message')\n\t\t\t.which.matches(/Duplicate/);\n\t});\n\n\tit('can sequence multiple local edits', async () => {\n\t\tconst log = new EditLog();\n\t\tconst ids: EditId[] = [];\n\n\t\tconst numEdits = 10;\n\t\tfor (let i = 0; i < numEdits; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addLocalEdit(edit);\n\t\t\tids.push(edit.id);\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i, 'Local edits should be appended to the end of the log.');\n\t\t}\n\t\texpect(log.length).equals(log.numberOfLocalEdits).and.equals(numEdits, 'Only local edits should be present.');\n\n\t\tlog.sequenceLocalEdits();\n\n\t\texpect(log.editIds).to.deep.equal(ids, 'Sequencing a local edit should not change its index.');\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(numEdits, 'Only sequenced edits should be present.');\n\t});\n\n\tit('can correctly compare equality to other edit logs', () => {\n\t\tconst edit0Copy: Edit<Change> = { ...edit0 };\n\t\tconst edit1Copy: Edit<Change> = { ...edit1 };\n\t\tconst { editWithoutId: editWithoutId0Copy } = separateEditAndId(edit0Copy);\n\t\tconst { editWithoutId: editWithoutId1Copy } = separateEditAndId(edit1Copy);\n\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editChunksCopy = [{ startRevision: 0, chunk: [editWithoutId0Copy, editWithoutId1Copy] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log0 = new EditLog({ editChunks, editIds });\n\t\tconst log1 = new EditLog({ editChunks: editChunksCopy, editIds });\n\n\t\texpect(log0.equals(log1)).to.be.true;\n\n\t\tconst log2 = new EditLog<Change>({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\t\tlog2.addLocalEdit(edit1Copy);\n\n\t\texpect(log0.equals(log2)).to.be.true;\n\n\t\tconst differentLog = new EditLog({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\n\t\texpect(log0.equals(differentLog)).to.be.false;\n\t});\n\n\tit('creates a new edit chunk once the previous one has been filled', () => {\n\t\tconst log = new EditLog();\n\n\t\tfor (let i = 0; i < log.editsPerChunk; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, { sequenceNumber: i + 1, referenceSequenceNumber: i });\n\t\t\texpect(log.getEditLogSummary().editChunks.length).to.be.equal(1);\n\t\t}\n\n\t\tconst edit = newEdit([]);\n\t\tlog.addSequencedEdit(edit, {\n\t\t\tsequenceNumber: log.editsPerChunk,\n\t\t\treferenceSequenceNumber: log.editsPerChunk - 1,\n\t\t});\n\t\texpect(log.getEditLogSummary().editChunks.length).to.be.equal(2);\n\t});\n\n\tit('can load edits from a handle', async () => {\n\t\tconst log = createEditLogWithHandles();\n\n\t\t// Check that each edit can be retrieved correctly\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\texpect((await log.getEditAtIndex(i)).id).to.equal(log.editIds[i]);\n\t\t}\n\t});\n\n\tit('can add edits to logs with varying edit chunk sizes', async () => {\n\t\tconst numberOfChunks = 2;\n\t\tconst editsPerChunk = 5;\n\t\tconst log = createEditLogWithHandles(numberOfChunks, editsPerChunk, 100);\n\n\t\t// Load the edits for the last edit chunk\n\t\tawait log.getEditAtIndex(numberOfChunks * editsPerChunk - 1);\n\n\t\t// Add a sequenced edit and check it's been added\n\t\tconst edit = newEdit([]);\n\t\tlog.addSequencedEdit(edit, {\n\t\t\tsequenceNumber: log.editsPerChunk,\n\t\t\treferenceSequenceNumber: log.editsPerChunk - 1,\n\t\t});\n\n\t\texpect(log.getIdAtIndex(numberOfChunks * editsPerChunk)).to.equal(edit.id);\n\t});\n});\n"]}
1
+ {"version":3,"file":"EditLog.tests.js","sourceRoot":"","sources":["../../src/test/EditLog.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { EditLog, separateEditAndId } from '../EditLog';\nimport { EditId } from '../Identifiers';\nimport { assertNotUndefined } from '../Common';\nimport { Edit, EditChunkContents, EditWithoutId, FluidEditHandle } from '../persisted-types';\nimport { newEdit } from '../EditUtilities';\n\ntype DummyChange = never;\n\n/**\n * Creates an edit log with the specified number of chunks, stored as handles instead of edits.\n * @param numberOfChunks - The number of chunks to add to the edit log.\n * @param editsPerChunk - The number of edits per chunk that gets added to the edit log.\n * @param editsPerChunkOnEditLog - The number of edits per chunk that gets set for future edits to the edit log.\n * @returns The edit log created with handles.\n */\nfunction createEditLogWithHandles(numberOfChunks = 2, editsPerChunk = 5): EditLog<DummyChange> {\n\tconst editIds: EditId[] = [];\n\tconst editChunks: EditWithoutId<DummyChange>[][] = [];\n\n\tlet inProgessChunk: EditWithoutId<DummyChange>[] = [];\n\tfor (let i = 0; i < numberOfChunks * editsPerChunk; i++) {\n\t\tconst { id, editWithoutId } = separateEditAndId(newEdit([]));\n\t\teditIds.push(id);\n\n\t\tinProgessChunk.push(editWithoutId);\n\n\t\tif (inProgessChunk.length === editsPerChunk) {\n\t\t\teditChunks.push(inProgessChunk.slice());\n\t\t\tinProgessChunk = [];\n\t\t}\n\t}\n\n\tconst handles: FluidEditHandle[] = editChunks.map((chunk) => {\n\t\treturn {\n\t\t\tabsolutePath: 'test blob',\n\t\t\tget: async () => {\n\t\t\t\treturn IsoBuffer.from(JSON.stringify({ edits: chunk }));\n\t\t\t},\n\t\t};\n\t});\n\n\tlet startRevision = 0;\n\tconst handlesWithKeys = handles.map((baseHandle) => {\n\t\tconst handle = {\n\t\t\tstartRevision,\n\t\t\tchunk: {\n\t\t\t\tget: async () =>\n\t\t\t\t\t(\n\t\t\t\t\t\tJSON.parse(IsoBuffer.from(await baseHandle.get()).toString()) as Omit<\n\t\t\t\t\t\t\tEditChunkContents,\n\t\t\t\t\t\t\t'edits'\n\t\t\t\t\t\t> & { edits: EditWithoutId<DummyChange>[] }\n\t\t\t\t\t).edits,\n\t\t\t\tbaseHandle,\n\t\t\t},\n\t\t};\n\t\tstartRevision = startRevision + 5;\n\t\treturn handle;\n\t});\n\n\tconst editLog = new EditLog({ editChunks: handlesWithKeys, editIds });\n\n\treturn editLog;\n}\n\ndescribe('EditLog', () => {\n\tconst edit0 = newEdit([]);\n\tconst edit1 = newEdit([]);\n\tconst { id: id0, editWithoutId: editWithoutId0 } = separateEditAndId(edit0);\n\tconst { id: id1, editWithoutId: editWithoutId1 } = separateEditAndId(edit1);\n\n\tit('can be constructed from sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Newly initialized log should not have local edits.');\n\t\texpect(log.numberOfSequencedEdits).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t'Log should have as many sequenced edits as it was initialized with.'\n\t\t);\n\t\texpect(log.length).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t\"Log's total length should match its sequenced edits on construction\"\n\t\t);\n\n\t\texpect(log.getIdAtIndex(0)).to.equal(id0, 'Log should have edits in order of construction.');\n\t\texpect(log.getIdAtIndex(1)).to.equal(id1, 'Log should have edits in order of construction.');\n\t});\n\n\tit('can get the index from an edit id of sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tit('can get the index from an edit id of a local edit', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\tconst editIds = [id0];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\tlog.addLocalEdit(edit1);\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tdescribe('tryGetIndexOfId', () => {\n\t\tit('can get the index from an existing edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = [id0];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId(id0)).to.equal(0);\n\t\t});\n\n\t\tit('returns undefined when queried with a nonexistent edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = ['f9379af1-6f1a-4f71-8f8c-859359621404' as EditId];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId('aa203fc3-bc28-437d-b01c-f9398dc859ef' as EditId)).to.equal(undefined);\n\t\t});\n\t});\n\n\tit('can get an edit from an index', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect((await log.getEditAtIndex(0)).id).to.equal(id0);\n\t\texpect((await log.getEditAtIndex(1)).id).to.equal(id1);\n\t});\n\n\tit('can get an edit from an edit id', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\tconst editFromId0 = await log.tryGetEdit(id0);\n\t\tconst editFromId1 = await log.tryGetEdit(id1);\n\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(editFromId1).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).to.equal(edit0.id);\n\t\texpect(assertNotUndefined(editFromId1).id).to.equal(edit1.id);\n\t});\n\n\tit('can be iterated', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit1);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\n\t\t// Sequenced edits should be iterated before local edits\n\t\tconst expectedEditIdStack = [id1, id0];\n\n\t\tlog.editIds.forEach((editId) => {\n\t\t\texpect(editId).to.equal(expectedEditIdStack.pop());\n\t\t});\n\n\t\texpect(expectedEditIdStack.length).to.equal(0);\n\t});\n\n\tit('can add sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 2, referenceSequenceNumber: 1 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(2);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('can add local edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\n\t\tlog.addLocalEdit(edit1);\n\t\texpect(log.numberOfLocalEdits).to.equal(2);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('tracks the min sequence number of sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 43, referenceSequenceNumber: 42, minimumSequenceNumber: 42 });\n\t\texpect(log.minSequenceNumber).equals(42);\n\t\texpect(() =>\n\t\t\tlog.addSequencedEdit('fake-edit' as unknown as Edit<unknown>, {\n\t\t\t\tsequenceNumber: 44,\n\t\t\t\treferenceSequenceNumber: 43,\n\t\t\t})\n\t\t).throws('min number');\n\t});\n\n\tit('detects causal ordering violations', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\tlog.addLocalEdit(edit1);\n\t\texpect(() => log.addSequencedEdit(edit1, { sequenceNumber: 1, referenceSequenceNumber: 0 })).throws('ordering');\n\t});\n\n\tit('can sequence a local edit', async () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\tlet editFromId0 = await log.tryGetEdit(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain local edit.');\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.length).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\teditFromId0 = await log.tryGetEdit(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain sequenced edit.');\n\t});\n\n\tit('Throws on duplicate sequenced edits', async () => {\n\t\tconst log = new EditLog();\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(() => log.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 }))\n\t\t\t.to.throw(Error)\n\t\t\t.that.has.property('message')\n\t\t\t.which.matches(/Duplicate/);\n\t});\n\n\tit('can sequence multiple local edits', async () => {\n\t\tconst log = new EditLog();\n\t\tconst ids: EditId[] = [];\n\n\t\tconst numEdits = 10;\n\t\tfor (let i = 0; i < numEdits; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addLocalEdit(edit);\n\t\t\tids.push(edit.id);\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i, 'Local edits should be appended to the end of the log.');\n\t\t}\n\t\texpect(log.length).equals(log.numberOfLocalEdits).and.equals(numEdits, 'Only local edits should be present.');\n\n\t\tlog.sequenceLocalEdits();\n\n\t\texpect(log.editIds).to.deep.equal(ids, 'Sequencing a local edit should not change its index.');\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(numEdits, 'Only sequenced edits should be present.');\n\t});\n\n\tit('can correctly compare equality to other edit logs', () => {\n\t\tconst edit0Copy: Edit<DummyChange> = { ...edit0 };\n\t\tconst edit1Copy: Edit<DummyChange> = { ...edit1 };\n\t\tconst { editWithoutId: editWithoutId0Copy } = separateEditAndId(edit0Copy);\n\t\tconst { editWithoutId: editWithoutId1Copy } = separateEditAndId(edit1Copy);\n\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editChunksCopy = [{ startRevision: 0, chunk: [editWithoutId0Copy, editWithoutId1Copy] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log0 = new EditLog({ editChunks, editIds });\n\t\tconst log1 = new EditLog({ editChunks: editChunksCopy, editIds });\n\n\t\texpect(log0.equals(log1)).to.be.true;\n\n\t\tconst log2 = new EditLog<DummyChange>({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\t\tlog2.addLocalEdit(edit1Copy);\n\n\t\texpect(log0.equals(log2)).to.be.true;\n\n\t\tconst differentLog = new EditLog({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\n\t\texpect(log0.equals(differentLog)).to.be.false;\n\t});\n\n\tit('creates a new edit chunk once the previous one has been filled', () => {\n\t\tconst log = new EditLog();\n\n\t\tfor (let i = 0; i < log.editsPerChunk; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, { sequenceNumber: i + 1, referenceSequenceNumber: i });\n\t\t\texpect(log.getEditLogSummary().editChunks.length).to.be.equal(1);\n\t\t}\n\n\t\tconst edit = newEdit([]);\n\t\tlog.addSequencedEdit(edit, {\n\t\t\tsequenceNumber: log.editsPerChunk,\n\t\t\treferenceSequenceNumber: log.editsPerChunk - 1,\n\t\t});\n\t\texpect(log.getEditLogSummary().editChunks.length).to.be.equal(2);\n\t});\n\n\tit('can load edits from a handle', async () => {\n\t\tconst log = createEditLogWithHandles();\n\n\t\t// Check that each edit can be retrieved correctly\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\texpect((await log.getEditAtIndex(i)).id).to.equal(log.editIds[i]);\n\t\t}\n\t});\n\n\tit('can add edits to logs with varying edit chunk sizes', async () => {\n\t\tconst numberOfChunks = 2;\n\t\tconst editsPerChunk = 5;\n\t\tconst log = createEditLogWithHandles(numberOfChunks, editsPerChunk);\n\n\t\t// Load the edits for the last edit chunk\n\t\tawait log.getEditAtIndex(numberOfChunks * editsPerChunk - 1);\n\n\t\t// Add a sequenced edit and check it's been added\n\t\tconst edit = newEdit([]);\n\t\tlog.addSequencedEdit(edit, {\n\t\t\tsequenceNumber: log.editsPerChunk,\n\t\t\treferenceSequenceNumber: log.editsPerChunk - 1,\n\t\t});\n\n\t\texpect(log.getIdAtIndex(numberOfChunks * editsPerChunk)).to.equal(edit.id);\n\t});\n});\n"]}
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=EditUtilities.tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditUtilities.tests.d.ts","sourceRoot":"","sources":["../../src/test/EditUtilities.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,503 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { expect } from 'chai';
6
+ import { assert } from '@fluidframework/common-utils';
7
+ import { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';
8
+ import { FluidSerializer } from '@fluidframework/shared-object-base';
9
+ import { getChangeNodeFromView } from '../SerializationUtilities';
10
+ import { noop } from '../Common';
11
+ import { convertTreeNodes, deepCompareNodes, internalizeBuildNode, PlaceValidationResult, RangeValidationResultKind, validateStablePlace, validateStableRange, walkTree, } from '../EditUtilities';
12
+ import { Side } from '../persisted-types';
13
+ import { comparePayloads } from '../PayloadUtilities';
14
+ import { refreshTestTree } from './utilities/TestUtilities';
15
+ describe('EditUtilities', () => {
16
+ const testTree = refreshTestTree(undefined, undefined, /* expensiveValidation: */ true);
17
+ describe('validateStablePlace', () => {
18
+ it('accepts valid places', () => {
19
+ expect(validateStablePlace(testTree.view, {
20
+ referenceSibling: testTree.left.identifier,
21
+ side: Side.Before,
22
+ })).deep.equals({
23
+ result: PlaceValidationResult.Valid,
24
+ referenceSibling: testTree.left.identifier,
25
+ side: Side.Before,
26
+ });
27
+ });
28
+ it('detects malformed places', () => {
29
+ expect(validateStablePlace(testTree.view, {
30
+ referenceTrait: testTree.left.traitLocation,
31
+ referenceSibling: testTree.left.identifier,
32
+ side: Side.Before,
33
+ })).deep.equals({ result: PlaceValidationResult.Malformed });
34
+ });
35
+ it('detects missing siblings', () => {
36
+ expect(validateStablePlace(testTree.view, {
37
+ referenceSibling: testTree.generateNodeId(),
38
+ side: Side.Before,
39
+ })).deep.equals({ result: PlaceValidationResult.MissingSibling });
40
+ });
41
+ it('detects missing parents', () => {
42
+ expect(validateStablePlace(testTree.view, {
43
+ referenceTrait: {
44
+ parent: testTree.generateNodeId(),
45
+ label: testTree.left.traitLabel,
46
+ },
47
+ side: Side.Before,
48
+ })).deep.equals({ result: PlaceValidationResult.MissingParent });
49
+ });
50
+ it('detects root places', () => {
51
+ expect(validateStablePlace(testTree.view, {
52
+ referenceSibling: testTree.identifier,
53
+ side: Side.Before,
54
+ })).deep.equals({ result: PlaceValidationResult.SiblingIsRootOrDetached });
55
+ });
56
+ });
57
+ describe('validateStableRange', () => {
58
+ it('accepts valid ranges', () => {
59
+ const validatedRange = validateStableRange(testTree.view, {
60
+ start: { referenceSibling: testTree.left.identifier, side: Side.Before },
61
+ end: { referenceSibling: testTree.left.identifier, side: Side.After },
62
+ });
63
+ expect(validatedRange.result).to.equal(RangeValidationResultKind.Valid);
64
+ if (validatedRange.result === RangeValidationResultKind.Valid) {
65
+ expect(validatedRange.start.referenceSibling).to.equal(testTree.left.identifier);
66
+ expect(validatedRange.start.referenceTrait).to.be.undefined;
67
+ expect(validatedRange.start.side).to.equal(Side.Before);
68
+ expect(validatedRange.end.referenceSibling).to.equal(testTree.left.identifier);
69
+ expect(validatedRange.end.referenceTrait).to.be.undefined;
70
+ expect(validatedRange.end.side).to.equal(Side.After);
71
+ }
72
+ else {
73
+ expect.fail();
74
+ }
75
+ });
76
+ it('detects inverted ranges', () => {
77
+ expect(validateStableRange(testTree.view, {
78
+ start: { referenceSibling: testTree.left.identifier, side: Side.After },
79
+ end: { referenceSibling: testTree.left.identifier, side: Side.Before },
80
+ })).deep.equals({ result: RangeValidationResultKind.Inverted });
81
+ });
82
+ it('detects when place are in different traits', () => {
83
+ expect(validateStableRange(testTree.view, {
84
+ start: { referenceSibling: testTree.left.identifier, side: Side.Before },
85
+ end: { referenceSibling: testTree.right.identifier, side: Side.After },
86
+ })).deep.equals({ result: RangeValidationResultKind.PlacesInDifferentTraits });
87
+ });
88
+ it('detects malformed places', () => {
89
+ const start = {
90
+ referenceTrait: testTree.left.traitLocation,
91
+ referenceSibling: testTree.left.identifier,
92
+ side: Side.Before,
93
+ };
94
+ expect(validateStableRange(testTree.view, {
95
+ // trait and sibling should be mutually exclusive
96
+ start,
97
+ end: { referenceSibling: testTree.left.identifier, side: Side.After },
98
+ })).deep.equals({
99
+ result: {
100
+ kind: RangeValidationResultKind.BadPlace,
101
+ place: start,
102
+ placeFailure: PlaceValidationResult.Malformed,
103
+ },
104
+ });
105
+ });
106
+ it('detects invalid places', () => {
107
+ const start = {
108
+ referenceSibling: testTree.generateNodeId(),
109
+ side: Side.Before,
110
+ };
111
+ expect(validateStableRange(testTree.view, {
112
+ start,
113
+ end: { referenceSibling: testTree.right.identifier, side: Side.After },
114
+ })).deep.equals({
115
+ result: {
116
+ kind: RangeValidationResultKind.BadPlace,
117
+ place: start,
118
+ placeFailure: PlaceValidationResult.MissingSibling,
119
+ },
120
+ });
121
+ });
122
+ });
123
+ describe('Tree node conversion', () => {
124
+ it('can clone a tree', () => {
125
+ const clone = convertTreeNodes(getChangeNodeFromView(testTree.view), (node) => (Object.assign({}, node)));
126
+ expect(testTree).to.not.equal(clone);
127
+ expect(deepCompareNodes(testTree, clone)).to.be.true;
128
+ });
129
+ it('can clone a leaf', () => {
130
+ let converted = false;
131
+ expect(convertTreeNodes(42, (n) => {
132
+ converted = true;
133
+ return n;
134
+ }, isNumber)).to.equal(42);
135
+ expect(converted).to.be.false;
136
+ });
137
+ it('can clone a tree with a leaf', () => {
138
+ const leafTrait = 'main';
139
+ const leafId = testTree.generateNodeId();
140
+ const tree = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { payload: 'payload', traits: { [leafTrait]: [testTree.buildLeaf(leafId)] } });
141
+ const clone = convertTreeNodes(tree, (node) => (Object.assign({}, node)));
142
+ assert(typeof clone !== 'number', '');
143
+ expect(clone.definition).to.equal(tree.definition);
144
+ expect(clone.identifier).to.equal(tree.identifier);
145
+ expect(clone.payload).to.equal(tree.payload);
146
+ expect(clone.traits[leafTrait][0].identifier).to.equal(leafId);
147
+ });
148
+ it('correctly invokes the convert function', () => {
149
+ const node = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { payload: 'payload' });
150
+ let converted = false;
151
+ convertTreeNodes(node, (n) => {
152
+ converted = true;
153
+ expect(node.definition).to.equal(node.definition);
154
+ expect(node.identifier).to.equal(node.identifier);
155
+ expect(node.payload).to.equal(node.payload);
156
+ return n;
157
+ }, isNumber);
158
+ expect(converted).to.be.true;
159
+ });
160
+ it('can convert a node', () => {
161
+ const node = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { payload: 'payload' });
162
+ const id = testTree.generateNodeId();
163
+ const converted = convertTreeNodes(node, (_) => ({ definition: '_def', identifier: id, payload: 'payload2' }), isNumber);
164
+ expect(converted).to.deep.equal({ definition: '_def', identifier: id, payload: 'payload2', traits: {} });
165
+ });
166
+ it('creates empty trait objects for the root', () => {
167
+ const node = Object.assign({}, testTree.buildLeaf(testTree.generateNodeId()));
168
+ const converted = convertTreeNodes(node, (n) => internalizeBuildNode(n, testTree), isNumber);
169
+ assert(typeof converted !== 'number', 'unexpected detached ID');
170
+ expect(converted.traits).to.not.be.undefined;
171
+ });
172
+ it('creates empty trait objects for children', () => {
173
+ const node = Object.assign(Object.assign({}, testTree.buildLeaf()), { traits: { main: Object.assign({}, testTree.buildLeaf()) } });
174
+ const converted = convertTreeNodes(node, (n) => internalizeBuildNode(n, testTree), isNumber);
175
+ assert(typeof converted !== 'number', 'unexpected detached ID');
176
+ expect(converted.traits).to.not.be.undefined;
177
+ });
178
+ it('can convert a tree with children', () => {
179
+ const childA = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { payload: 'a' });
180
+ const childB = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { payload: 'b' });
181
+ const node = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { traits: { main: [childA, childB] } });
182
+ const converted = convertTreeNodes(node, (node) => {
183
+ if (node.identifier === childB.identifier) {
184
+ return { definition: node.definition, identifier: node.identifier, payload: 'c' };
185
+ }
186
+ return node;
187
+ });
188
+ expect(converted).to.deep.equal({
189
+ definition: node.definition,
190
+ identifier: node.identifier,
191
+ traits: {
192
+ main: [
193
+ { definition: childA.definition, identifier: childA.identifier, payload: 'a', traits: {} },
194
+ { definition: childB.definition, identifier: childB.identifier, payload: 'c', traits: {} },
195
+ ],
196
+ },
197
+ });
198
+ });
199
+ it('can convert a tree with a grandchild', () => {
200
+ const grandchild = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { payload: 'g' });
201
+ const child = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { traits: { main: [grandchild] } });
202
+ const parent = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { traits: { main: [child] } });
203
+ const converted = convertTreeNodes(parent, (node) => {
204
+ if (node.identifier === grandchild.identifier) {
205
+ return { definition: node.definition, identifier: node.identifier, payload: 'h' };
206
+ }
207
+ return node;
208
+ });
209
+ expect(converted).to.deep.equal({
210
+ definition: parent.definition,
211
+ identifier: parent.identifier,
212
+ traits: {
213
+ main: [
214
+ {
215
+ definition: child.definition,
216
+ identifier: child.identifier,
217
+ traits: {
218
+ main: [
219
+ {
220
+ definition: grandchild.definition,
221
+ identifier: grandchild.identifier,
222
+ payload: 'h',
223
+ traits: {},
224
+ },
225
+ ],
226
+ },
227
+ },
228
+ ],
229
+ },
230
+ });
231
+ });
232
+ it('walks trees in a consistent order', () => {
233
+ // Construct two trees that are the same but have their traits defined in different orders
234
+ const buildTreeA = {
235
+ definition: 'parent',
236
+ traits: {
237
+ left: {
238
+ definition: 'left child',
239
+ traits: {
240
+ left: {
241
+ definition: 'left grandchild under left',
242
+ },
243
+ right: {
244
+ definition: 'right grandchild under left',
245
+ },
246
+ main: [
247
+ { definition: 'grandchild A under left main' },
248
+ { definition: 'grandchild B under left main' },
249
+ { definition: 'grandchild C under left main' },
250
+ ],
251
+ },
252
+ },
253
+ right: {
254
+ definition: 'right child',
255
+ traits: {
256
+ left: {
257
+ definition: 'left grandchild under right',
258
+ },
259
+ right: {
260
+ definition: 'right grandchild under right',
261
+ },
262
+ main: [
263
+ { definition: 'grandchild A under right main' },
264
+ { definition: 'grandchild B under right main' },
265
+ { definition: 'grandchild C under right main' },
266
+ ],
267
+ },
268
+ },
269
+ main: [
270
+ { definition: 'child A under main' },
271
+ { definition: 'child B under main' },
272
+ { definition: 'child C under main' },
273
+ ],
274
+ },
275
+ };
276
+ const buildTreeB = {
277
+ definition: 'parent',
278
+ traits: {
279
+ right: {
280
+ definition: 'right child',
281
+ traits: {
282
+ left: {
283
+ definition: 'left grandchild under right',
284
+ },
285
+ main: [
286
+ { definition: 'grandchild A under right main' },
287
+ { definition: 'grandchild B under right main' },
288
+ { definition: 'grandchild C under right main' },
289
+ ],
290
+ right: {
291
+ definition: 'right grandchild under right',
292
+ },
293
+ },
294
+ },
295
+ main: [
296
+ { definition: 'child A under main' },
297
+ { definition: 'child B under main' },
298
+ { definition: 'child C under main' },
299
+ ],
300
+ left: {
301
+ definition: 'left child',
302
+ traits: {
303
+ main: [
304
+ { definition: 'grandchild A under left main' },
305
+ { definition: 'grandchild B under left main' },
306
+ { definition: 'grandchild C under left main' },
307
+ ],
308
+ right: {
309
+ definition: 'right grandchild under left',
310
+ },
311
+ left: {
312
+ definition: 'left grandchild under left',
313
+ },
314
+ },
315
+ },
316
+ },
317
+ };
318
+ // Record the order in which the tree walk visits each node in each tree
319
+ const definitionsA = [];
320
+ walkTree(buildTreeA, (n) => definitionsA.push(n.definition), (x) => typeof x === 'number');
321
+ const definitionsB = [];
322
+ walkTree(buildTreeB, (n) => definitionsB.push(n.definition), (x) => typeof x === 'number');
323
+ // The orders should be the same, even though the trees had their traits defined in different orders
324
+ expect(definitionsA).to.deep.equal(definitionsB);
325
+ });
326
+ });
327
+ describe('Build tree internalization', () => {
328
+ it('does not copy extraneous properties from input tree', () => {
329
+ const node = Object.assign(Object.assign({}, testTree.buildLeaf(testTree.generateNodeId())), { traits: { main: [testTree.buildLeaf(testTree.generateNodeId())] } });
330
+ node.extra = 'This is extra data that should not be copied';
331
+ const converted = convertTreeNodes(node, (node) => internalizeBuildNode(node, testTree), isNumber);
332
+ expect(converted).to.deep.equal({
333
+ definition: node.definition,
334
+ identifier: node.identifier,
335
+ traits: node.traits,
336
+ });
337
+ });
338
+ it('does not copy extraneous properties from converter', () => {
339
+ const node = testTree.buildLeaf(testTree.generateNodeId());
340
+ expect(Object.prototype.hasOwnProperty.call(node, 'payload')).to.be.false;
341
+ const converted = convertTreeNodes(node, (node) => internalizeBuildNode(node, testTree), isNumber);
342
+ expect(Object.prototype.hasOwnProperty.call(converted, 'payload')).to.be.false;
343
+ });
344
+ });
345
+ function isNumber(node) {
346
+ return typeof node === 'number';
347
+ }
348
+ describe('comparePayloads', () => {
349
+ const serializer = new FluidSerializer(new MockFluidDataStoreRuntime().IFluidHandleContext, () => { });
350
+ const binder = { bind: noop };
351
+ let Equality;
352
+ (function (Equality) {
353
+ Equality[Equality["Equal"] = 0] = "Equal";
354
+ Equality[Equality["Unequal"] = 1] = "Unequal";
355
+ Equality[Equality["Unspecified"] = 2] = "Unspecified";
356
+ })(Equality || (Equality = {}));
357
+ function checkEquality(equal, equality) {
358
+ if (equality !== Equality.Unspecified) {
359
+ expect(equal).equals(equality === Equality.Equal);
360
+ }
361
+ }
362
+ function check(a, b, flags) {
363
+ // Check reflexive
364
+ expect(comparePayloads(a, a)).equal(true);
365
+ expect(comparePayloads(b, b)).equal(true);
366
+ checkEquality(comparePayloads(a, b), flags.initial);
367
+ // Check commutative
368
+ checkEquality(comparePayloads(b, a), flags.initial);
369
+ const [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);
370
+ const [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);
371
+ checkEquality(aString === bString, flags.serialized);
372
+ checkEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);
373
+ // Check commutative
374
+ checkEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);
375
+ }
376
+ function checkSerialization(a, roundtrip) {
377
+ const aString = serializer.stringify(a, binder);
378
+ const a2 = serializer.parse(aString);
379
+ const aString2 = serializer.stringify(a2, binder);
380
+ expect(aString2).equal(aString);
381
+ checkEquality(comparePayloads(a, a2), roundtrip);
382
+ // Check second round trip, should always be equal
383
+ const a3 = serializer.parse(aString2);
384
+ expect(comparePayloads(a3, a2)).true;
385
+ return [aString, a2];
386
+ }
387
+ const allEqual = {
388
+ initial: Equality.Equal,
389
+ serialized: Equality.Equal,
390
+ deserialized: Equality.Equal,
391
+ roundtrip: Equality.Equal,
392
+ };
393
+ // For when the inputs are logically equal, but may serialize differently due to field ordering.
394
+ const allEqualUnstable = {
395
+ initial: Equality.Equal,
396
+ serialized: Equality.Unspecified,
397
+ deserialized: Equality.Equal,
398
+ roundtrip: Equality.Equal,
399
+ };
400
+ const allUnequal = {
401
+ initial: Equality.Unequal,
402
+ serialized: Equality.Unequal,
403
+ deserialized: Equality.Unequal,
404
+ roundtrip: Equality.Equal,
405
+ };
406
+ it('compares numbers correctly', () => {
407
+ check(0, 0, allEqual);
408
+ check(1, 1, allEqual);
409
+ check(0, 1, allUnequal);
410
+ check(-1, 1, allUnequal);
411
+ check(5.2, 5.200000001, allUnequal);
412
+ });
413
+ it('compares strings', () => {
414
+ check('', '', allEqual);
415
+ check(' ', '', allUnequal);
416
+ check('1', '+1', allUnequal);
417
+ // This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work
418
+ // Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.
419
+ check('𤭢', '𤭢', allEqual);
420
+ check('𤭢', '', allUnequal);
421
+ check('several characters', 'several characters', allEqual);
422
+ check('several characters', 'several_characters', allUnequal);
423
+ });
424
+ it('compares arrays', () => {
425
+ check([], [], allEqual);
426
+ check([1], [1], allEqual);
427
+ check([[1]], [[1]], allEqual);
428
+ check([[1]], [[2]], allUnequal);
429
+ check([], [1], allUnequal);
430
+ check([1, 2], [2, 1], allUnequal);
431
+ });
432
+ it('compares objects', () => {
433
+ check({ 1: 'x' }, { 1: 'x' }, allEqual);
434
+ check({ x: 'x' }, { y: 'x' }, allUnequal);
435
+ check({ x: 'x' }, { x: {} }, allUnequal);
436
+ check({ x: {} }, { x: {} }, allEqual);
437
+ check({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);
438
+ check({ 1: 'x' }, {}, allUnequal);
439
+ check({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);
440
+ check({ field: 'a' }, { field: 'b' }, allUnequal);
441
+ // Fluid Serialization arbitrarily orders fields.
442
+ // Thus any object with more than one field may have non-deterministic serialization.
443
+ // However objects have field order, and we need to check comparePayloads is not impacted by it.
444
+ check({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);
445
+ });
446
+ it('compares mixed types', () => {
447
+ check({ 0: 1 }, [1], allUnequal);
448
+ // Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)
449
+ check(null, 'null', allUnequal);
450
+ check(null, 'null', allUnequal);
451
+ check(1, '1', allUnequal);
452
+ check(null, 0, allUnequal);
453
+ check('', 0, allUnequal);
454
+ });
455
+ const sameAfter = {
456
+ initial: Equality.Unspecified,
457
+ serialized: Equality.Unspecified,
458
+ deserialized: Equality.Equal,
459
+ roundtrip: Equality.Unspecified,
460
+ };
461
+ const differentAfter = {
462
+ initial: Equality.Unequal,
463
+ serialized: Equality.Unequal,
464
+ deserialized: Equality.Unequal,
465
+ roundtrip: Equality.Unspecified,
466
+ };
467
+ it('lossy cases', () => {
468
+ // Undefined fields are omitted in json, and thus lost on the round trip.
469
+ check({ x: undefined }, { y: undefined }, sameAfter);
470
+ check({ x: undefined }, {}, sameAfter);
471
+ // NaN and Infinity become null
472
+ check(NaN, NaN, sameAfter);
473
+ check(NaN, 7, differentAfter);
474
+ check(Infinity, Infinity, sameAfter);
475
+ check(-Infinity, Infinity, sameAfter);
476
+ check(NaN, 'NaN', differentAfter);
477
+ // json loses -0 on round trip
478
+ check(-0, -0, sameAfter);
479
+ });
480
+ it('compares handles', () => {
481
+ // This is used instead of MockHandle so equal handles compare deeply equal.
482
+ function makeMockHandle(data) {
483
+ // `/` prefix is needed to prevent serializing from modifying handle.
484
+ const handleObject = { absolutePath: `/${data}`, IFluidHandle: undefined };
485
+ handleObject.IFluidHandle = handleObject;
486
+ return handleObject;
487
+ }
488
+ // Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic
489
+ // so use allEqualUnstable not allEqual.
490
+ check(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);
491
+ check(makeMockHandle('x'), makeMockHandle('y'), allUnequal);
492
+ check({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);
493
+ });
494
+ // These are cases that are allowed by the type system and produce unexpected results due to Json serialization.
495
+ // Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.
496
+ it.skip('strange cases', () => {
497
+ // Top level undefined fails in JSON.parse.
498
+ // Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)
499
+ check(undefined, null, sameAfter);
500
+ });
501
+ });
502
+ });
503
+ //# sourceMappingURL=EditUtilities.tests.js.map