@fluid-experimental/tree 0.58.2002 → 0.59.1000

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 (817) hide show
  1. package/README.md +159 -46
  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 -105
  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 +61 -32
  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 +129 -85
  59. package/dist/LogViewer.d.ts.map +1 -1
  60. package/dist/LogViewer.js +111 -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 +105 -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 +439 -0
  90. package/dist/SharedTree.d.ts.map +1 -0
  91. package/dist/SharedTree.js +1109 -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 +52 -0
  114. package/dist/Transaction.d.ts.map +1 -0
  115. package/dist/Transaction.js +72 -0
  116. package/dist/Transaction.js.map +1 -0
  117. package/dist/TransactionInternal.d.ts +540 -0
  118. package/dist/TransactionInternal.d.ts.map +1 -0
  119. package/dist/TransactionInternal.js +626 -0
  120. package/dist/TransactionInternal.js.map +1 -0
  121. package/dist/TreeCompressor.d.ts +36 -0
  122. package/dist/TreeCompressor.d.ts.map +1 -0
  123. package/dist/TreeCompressor.js +137 -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 +218 -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/docs/Write-Format.md +19 -0
  190. package/lib/ChangeCompression.d.ts +39 -0
  191. package/lib/ChangeCompression.d.ts.map +1 -0
  192. package/lib/ChangeCompression.js +111 -0
  193. package/lib/ChangeCompression.js.map +1 -0
  194. package/{dist/default-edits/PersistedTypes.d.ts → lib/ChangeTypes.d.ts} +58 -105
  195. package/lib/ChangeTypes.d.ts.map +1 -0
  196. package/lib/{default-edits/PersistedTypes.js → ChangeTypes.js} +15 -68
  197. package/lib/ChangeTypes.js.map +1 -0
  198. package/lib/Checkout.d.ts +39 -27
  199. package/lib/Checkout.d.ts.map +1 -1
  200. package/lib/Checkout.js +53 -24
  201. package/lib/Checkout.js.map +1 -1
  202. package/lib/Common.d.ts +175 -38
  203. package/lib/Common.d.ts.map +1 -1
  204. package/lib/Common.js +226 -101
  205. package/lib/Common.js.map +1 -1
  206. package/lib/EagerCheckout.d.ts +24 -0
  207. package/lib/EagerCheckout.d.ts.map +1 -0
  208. package/lib/{BasicCheckout.js → EagerCheckout.js} +7 -4
  209. package/lib/EagerCheckout.js.map +1 -0
  210. package/lib/EditLog.d.ts +77 -63
  211. package/lib/EditLog.d.ts.map +1 -1
  212. package/lib/EditLog.js +83 -47
  213. package/lib/EditLog.js.map +1 -1
  214. package/lib/EditUtilities.d.ts +168 -0
  215. package/lib/EditUtilities.d.ts.map +1 -0
  216. package/lib/EditUtilities.js +353 -0
  217. package/lib/EditUtilities.js.map +1 -0
  218. package/lib/EventTypes.d.ts +73 -0
  219. package/lib/EventTypes.d.ts.map +1 -0
  220. package/lib/EventTypes.js +75 -0
  221. package/lib/EventTypes.js.map +1 -0
  222. package/lib/Forest.d.ts +29 -7
  223. package/lib/Forest.d.ts.map +1 -1
  224. package/lib/Forest.js +58 -35
  225. package/lib/Forest.js.map +1 -1
  226. package/lib/HistoryEditFactory.d.ts +20 -0
  227. package/lib/HistoryEditFactory.d.ts.map +1 -0
  228. package/lib/{default-edits/HistoryEditFactory.js → HistoryEditFactory.js} +78 -39
  229. package/lib/HistoryEditFactory.js.map +1 -0
  230. package/lib/IdConversion.d.ts +12 -0
  231. package/lib/IdConversion.d.ts.map +1 -0
  232. package/lib/IdConversion.js +91 -0
  233. package/lib/IdConversion.js.map +1 -0
  234. package/lib/Identifiers.d.ts +89 -2
  235. package/lib/Identifiers.d.ts.map +1 -1
  236. package/lib/Identifiers.js +8 -1
  237. package/lib/Identifiers.js.map +1 -1
  238. package/lib/InitialTree.d.ts +2 -2
  239. package/lib/InitialTree.d.ts.map +1 -1
  240. package/lib/InitialTree.js +2 -1
  241. package/lib/InitialTree.js.map +1 -1
  242. package/lib/LazyCheckout.d.ts +28 -0
  243. package/lib/LazyCheckout.d.ts.map +1 -0
  244. package/lib/LazyCheckout.js +40 -0
  245. package/lib/LazyCheckout.js.map +1 -0
  246. package/lib/LogViewer.d.ts +129 -85
  247. package/lib/LogViewer.d.ts.map +1 -1
  248. package/lib/LogViewer.js +103 -77
  249. package/lib/LogViewer.js.map +1 -1
  250. package/lib/MergeHealth.d.ts +221 -0
  251. package/lib/MergeHealth.d.ts.map +1 -0
  252. package/lib/MergeHealth.js +258 -0
  253. package/lib/MergeHealth.js.map +1 -0
  254. package/lib/NodeIdUtilities.d.ts +105 -0
  255. package/lib/NodeIdUtilities.d.ts.map +1 -0
  256. package/lib/NodeIdUtilities.js +53 -0
  257. package/lib/NodeIdUtilities.js.map +1 -0
  258. package/lib/PayloadUtilities.d.ts +42 -0
  259. package/lib/PayloadUtilities.d.ts.map +1 -0
  260. package/lib/PayloadUtilities.js +110 -0
  261. package/lib/PayloadUtilities.js.map +1 -0
  262. package/lib/ReconciliationPath.d.ts +18 -13
  263. package/lib/ReconciliationPath.d.ts.map +1 -1
  264. package/lib/ReconciliationPath.js.map +1 -1
  265. package/lib/RevisionValueCache.d.ts +11 -2
  266. package/lib/RevisionValueCache.d.ts.map +1 -1
  267. package/lib/RevisionValueCache.js +2 -3
  268. package/lib/RevisionValueCache.js.map +1 -1
  269. package/lib/RevisionView.d.ts +83 -0
  270. package/lib/RevisionView.d.ts.map +1 -0
  271. package/lib/RevisionView.js +175 -0
  272. package/lib/RevisionView.js.map +1 -0
  273. package/lib/SerializationUtilities.d.ts +36 -0
  274. package/lib/SerializationUtilities.d.ts.map +1 -0
  275. package/lib/SerializationUtilities.js +95 -0
  276. package/lib/SerializationUtilities.js.map +1 -0
  277. package/lib/SharedTree.d.ts +439 -0
  278. package/lib/SharedTree.d.ts.map +1 -0
  279. package/lib/SharedTree.js +1104 -0
  280. package/lib/SharedTree.js.map +1 -0
  281. package/lib/SharedTreeEncoder.d.ts +102 -0
  282. package/lib/SharedTreeEncoder.d.ts.map +1 -0
  283. package/lib/SharedTreeEncoder.js +308 -0
  284. package/lib/SharedTreeEncoder.js.map +1 -0
  285. package/lib/StringInterner.d.ts +46 -0
  286. package/lib/StringInterner.d.ts.map +1 -0
  287. package/lib/StringInterner.js +57 -0
  288. package/lib/StringInterner.js.map +1 -0
  289. package/lib/Summary.d.ts +40 -0
  290. package/lib/Summary.d.ts.map +1 -0
  291. package/lib/Summary.js +19 -0
  292. package/lib/Summary.js.map +1 -0
  293. package/lib/SummaryBackCompatibility.d.ts +22 -22
  294. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  295. package/lib/SummaryBackCompatibility.js +29 -32
  296. package/lib/SummaryBackCompatibility.js.map +1 -1
  297. package/lib/SummaryTestUtilities.d.ts +31 -0
  298. package/lib/SummaryTestUtilities.d.ts.map +1 -0
  299. package/lib/SummaryTestUtilities.js +32 -0
  300. package/lib/SummaryTestUtilities.js.map +1 -0
  301. package/lib/Transaction.d.ts +52 -0
  302. package/lib/Transaction.d.ts.map +1 -0
  303. package/lib/Transaction.js +68 -0
  304. package/lib/Transaction.js.map +1 -0
  305. package/lib/TransactionInternal.d.ts +540 -0
  306. package/lib/TransactionInternal.d.ts.map +1 -0
  307. package/lib/TransactionInternal.js +622 -0
  308. package/lib/TransactionInternal.js.map +1 -0
  309. package/lib/TreeCompressor.d.ts +36 -0
  310. package/lib/TreeCompressor.d.ts.map +1 -0
  311. package/lib/TreeCompressor.js +133 -0
  312. package/lib/TreeCompressor.js.map +1 -0
  313. package/lib/TreeNodeHandle.d.ts +12 -18
  314. package/lib/TreeNodeHandle.d.ts.map +1 -1
  315. package/lib/TreeNodeHandle.js +14 -24
  316. package/lib/TreeNodeHandle.js.map +1 -1
  317. package/lib/TreeView.d.ts +166 -0
  318. package/lib/TreeView.d.ts.map +1 -0
  319. package/lib/TreeView.js +214 -0
  320. package/lib/TreeView.js.map +1 -0
  321. package/lib/TreeViewUtilities.d.ts +21 -0
  322. package/lib/TreeViewUtilities.d.ts.map +1 -0
  323. package/lib/TreeViewUtilities.js +71 -0
  324. package/lib/TreeViewUtilities.js.map +1 -0
  325. package/lib/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
  326. package/lib/UndoRedoHandler.d.ts.map +1 -0
  327. package/lib/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +3 -7
  328. package/lib/UndoRedoHandler.js.map +1 -0
  329. package/lib/id-compressor/AppendOnlySortedMap.d.ts +127 -0
  330. package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
  331. package/lib/id-compressor/AppendOnlySortedMap.js +278 -0
  332. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -0
  333. package/lib/id-compressor/IdCompressor.d.ts +389 -0
  334. package/lib/id-compressor/IdCompressor.d.ts.map +1 -0
  335. package/lib/id-compressor/IdCompressor.js +1343 -0
  336. package/lib/id-compressor/IdCompressor.js.map +1 -0
  337. package/lib/id-compressor/IdRange.d.ts +11 -0
  338. package/lib/id-compressor/IdRange.d.ts.map +1 -0
  339. package/lib/id-compressor/IdRange.js +25 -0
  340. package/lib/id-compressor/IdRange.js.map +1 -0
  341. package/lib/id-compressor/NumericUuid.d.ts +63 -0
  342. package/lib/id-compressor/NumericUuid.d.ts.map +1 -0
  343. package/lib/id-compressor/NumericUuid.js +365 -0
  344. package/lib/id-compressor/NumericUuid.js.map +1 -0
  345. package/lib/id-compressor/index.d.ts +12 -0
  346. package/lib/id-compressor/index.d.ts.map +1 -0
  347. package/lib/id-compressor/index.js +12 -0
  348. package/lib/id-compressor/index.js.map +1 -0
  349. package/lib/id-compressor/persisted-types/0.0.1.d.ts +156 -0
  350. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
  351. package/lib/{test/Snapshot.tests.d.ts → id-compressor/persisted-types/0.0.1.js} +1 -1
  352. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -0
  353. package/lib/id-compressor/persisted-types/index.d.ts +6 -0
  354. package/lib/id-compressor/persisted-types/index.d.ts.map +1 -0
  355. package/lib/id-compressor/persisted-types/index.js +6 -0
  356. package/lib/id-compressor/persisted-types/index.js.map +1 -0
  357. package/lib/index.d.ts +29 -9
  358. package/lib/index.d.ts.map +1 -1
  359. package/lib/index.js +23 -6
  360. package/lib/index.js.map +1 -1
  361. package/lib/persisted-types/0.0.2.d.ts +385 -0
  362. package/lib/persisted-types/0.0.2.d.ts.map +1 -0
  363. package/lib/persisted-types/0.0.2.js +110 -0
  364. package/lib/persisted-types/0.0.2.js.map +1 -0
  365. package/lib/persisted-types/0.1.1.d.ts +314 -0
  366. package/lib/persisted-types/0.1.1.d.ts.map +1 -0
  367. package/lib/persisted-types/0.1.1.js +150 -0
  368. package/lib/persisted-types/0.1.1.js.map +1 -0
  369. package/lib/persisted-types/index.d.ts +7 -0
  370. package/lib/persisted-types/index.d.ts.map +1 -0
  371. package/lib/persisted-types/index.js +8 -0
  372. package/lib/persisted-types/index.js.map +1 -0
  373. package/lib/test/AppendOnlySortedMap.tests.d.ts +6 -0
  374. package/lib/test/AppendOnlySortedMap.tests.d.ts.map +1 -0
  375. package/lib/test/AppendOnlySortedMap.tests.js +169 -0
  376. package/lib/test/AppendOnlySortedMap.tests.js.map +1 -0
  377. package/lib/test/{SnapshotUtilities.tests.d.ts → ChangeCompression.tests.d.ts} +1 -1
  378. package/lib/test/ChangeCompression.tests.d.ts.map +1 -0
  379. package/lib/test/ChangeCompression.tests.js +145 -0
  380. package/lib/test/ChangeCompression.tests.js.map +1 -0
  381. package/lib/test/Checkout.tests.d.ts +2 -3
  382. package/lib/test/Checkout.tests.d.ts.map +1 -1
  383. package/lib/test/Checkout.tests.js +126 -69
  384. package/lib/test/Checkout.tests.js.map +1 -1
  385. package/lib/test/Common.tests.js +60 -2
  386. package/lib/test/Common.tests.js.map +1 -1
  387. package/lib/test/{BasicCheckout.tests.d.ts → EagerCheckout.tests.d.ts} +1 -1
  388. package/lib/test/EagerCheckout.tests.d.ts.map +1 -0
  389. package/lib/test/EagerCheckout.tests.js +20 -0
  390. package/lib/test/EagerCheckout.tests.js.map +1 -0
  391. package/lib/test/Edit.tests.js +22 -14
  392. package/lib/test/Edit.tests.js.map +1 -1
  393. package/lib/test/{Anchors.glassBox.tests.d.ts → EditLog.perf.tests.d.ts} +1 -1
  394. package/lib/test/EditLog.perf.tests.d.ts.map +1 -0
  395. package/lib/test/EditLog.perf.tests.js +30 -0
  396. package/lib/test/EditLog.perf.tests.js.map +1 -0
  397. package/lib/test/EditLog.tests.js +10 -6
  398. package/lib/test/EditLog.tests.js.map +1 -1
  399. package/lib/test/EditUtilities.tests.d.ts +6 -0
  400. package/lib/test/EditUtilities.tests.d.ts.map +1 -0
  401. package/lib/test/EditUtilities.tests.js +503 -0
  402. package/lib/test/EditUtilities.tests.js.map +1 -0
  403. package/lib/test/Forest.perf.tests.d.ts +6 -0
  404. package/lib/test/Forest.perf.tests.d.ts.map +1 -0
  405. package/lib/test/Forest.perf.tests.js +133 -0
  406. package/lib/test/Forest.perf.tests.js.map +1 -0
  407. package/lib/test/Forest.tests.js +54 -27
  408. package/lib/test/Forest.tests.js.map +1 -1
  409. package/lib/test/GenericTransaction.tests.js +12 -3
  410. package/lib/test/GenericTransaction.tests.js.map +1 -1
  411. package/lib/test/HistoryEditFactory.tests.d.ts +6 -0
  412. package/lib/test/HistoryEditFactory.tests.d.ts.map +1 -0
  413. package/lib/test/HistoryEditFactory.tests.js +90 -0
  414. package/lib/test/HistoryEditFactory.tests.js.map +1 -0
  415. package/lib/test/IdCompressor.perf.tests.d.ts +6 -0
  416. package/lib/test/IdCompressor.perf.tests.d.ts.map +1 -0
  417. package/lib/test/IdCompressor.perf.tests.js +304 -0
  418. package/lib/test/IdCompressor.perf.tests.js.map +1 -0
  419. package/lib/test/IdCompressor.tests.d.ts +6 -0
  420. package/lib/test/IdCompressor.tests.d.ts.map +1 -0
  421. package/lib/test/IdCompressor.tests.js +1075 -0
  422. package/lib/test/IdCompressor.tests.js.map +1 -0
  423. package/lib/test/IdConversion.tests.d.ts +6 -0
  424. package/lib/test/IdConversion.tests.d.ts.map +1 -0
  425. package/lib/test/IdConversion.tests.js +36 -0
  426. package/lib/test/IdConversion.tests.js.map +1 -0
  427. package/lib/test/LazyCheckout.tests.d.ts +6 -0
  428. package/lib/test/LazyCheckout.tests.d.ts.map +1 -0
  429. package/lib/test/LazyCheckout.tests.js +22 -0
  430. package/lib/test/LazyCheckout.tests.js.map +1 -0
  431. package/lib/test/LogViewer.tests.js +276 -191
  432. package/lib/test/LogViewer.tests.js.map +1 -1
  433. package/lib/test/{SharedTreeWithAnchors.tests.d.ts → MergeHealthTelemetryHeartbeat.tests.d.ts} +1 -1
  434. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +1 -0
  435. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +342 -0
  436. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -0
  437. package/lib/test/NumericUuid.perf.tests.d.ts +6 -0
  438. package/lib/test/NumericUuid.perf.tests.d.ts.map +1 -0
  439. package/lib/test/NumericUuid.perf.tests.js +68 -0
  440. package/lib/test/NumericUuid.perf.tests.js.map +1 -0
  441. package/lib/test/NumericUuid.tests.d.ts +6 -0
  442. package/lib/test/NumericUuid.tests.d.ts.map +1 -0
  443. package/lib/test/NumericUuid.tests.js +191 -0
  444. package/lib/test/NumericUuid.tests.js.map +1 -0
  445. package/lib/test/RevisionView.tests.d.ts +6 -0
  446. package/lib/test/RevisionView.tests.d.ts.map +1 -0
  447. package/lib/test/RevisionView.tests.js +133 -0
  448. package/lib/test/RevisionView.tests.js.map +1 -0
  449. package/lib/test/SharedTree.perf.tests.d.ts +6 -0
  450. package/lib/test/SharedTree.perf.tests.d.ts.map +1 -0
  451. package/lib/test/SharedTree.perf.tests.js +39 -0
  452. package/lib/test/SharedTree.perf.tests.js.map +1 -0
  453. package/lib/test/SharedTree.tests.js +15 -3
  454. package/lib/test/SharedTree.tests.js.map +1 -1
  455. package/lib/test/StringInterner.tests.d.ts +6 -0
  456. package/lib/test/StringInterner.tests.d.ts.map +1 -0
  457. package/lib/test/StringInterner.tests.js +71 -0
  458. package/lib/test/StringInterner.tests.js.map +1 -0
  459. package/lib/test/Summary.tests.d.ts +8 -0
  460. package/lib/test/Summary.tests.d.ts.map +1 -0
  461. package/lib/test/Summary.tests.js +407 -0
  462. package/lib/test/Summary.tests.js.map +1 -0
  463. package/lib/test/Transaction.tests.js +76 -330
  464. package/lib/test/Transaction.tests.js.map +1 -1
  465. package/lib/test/TransactionInternal.tests.d.ts +6 -0
  466. package/lib/test/TransactionInternal.tests.d.ts.map +1 -0
  467. package/lib/test/TransactionInternal.tests.js +568 -0
  468. package/lib/test/TransactionInternal.tests.js.map +1 -0
  469. package/lib/test/TreeCompression.tests.d.ts +6 -0
  470. package/lib/test/TreeCompression.tests.d.ts.map +1 -0
  471. package/lib/test/TreeCompression.tests.js +292 -0
  472. package/lib/test/TreeCompression.tests.js.map +1 -0
  473. package/lib/test/TreeView.tests.d.ts +6 -0
  474. package/lib/test/TreeView.tests.d.ts.map +1 -0
  475. package/lib/test/TreeView.tests.js +176 -0
  476. package/lib/test/TreeView.tests.js.map +1 -0
  477. package/lib/test/UndoRedoHandler.tests.js +2 -2
  478. package/lib/test/UndoRedoHandler.tests.js.map +1 -1
  479. package/lib/test/Virtualization.tests.js +146 -62
  480. package/lib/test/Virtualization.tests.js.map +1 -1
  481. package/lib/test/fuzz/Generators.d.ts +19 -0
  482. package/lib/test/fuzz/Generators.d.ts.map +1 -0
  483. package/lib/test/fuzz/Generators.js +420 -0
  484. package/lib/test/fuzz/Generators.js.map +1 -0
  485. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +20 -0
  486. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -0
  487. package/lib/test/fuzz/SharedTreeFuzzTests.js +217 -0
  488. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -0
  489. package/lib/test/fuzz/Types.d.ts +133 -0
  490. package/lib/test/fuzz/Types.d.ts.map +1 -0
  491. package/lib/test/{GenericTransactionWithAnchors.tests.d.ts → fuzz/Types.js} +2 -2
  492. package/lib/test/fuzz/Types.js.map +1 -0
  493. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +180 -0
  494. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -0
  495. package/lib/test/utilities/IdCompressorTestUtilities.js +528 -0
  496. package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -0
  497. package/lib/test/utilities/MockTransaction.d.ts +26 -7
  498. package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
  499. package/lib/test/utilities/MockTransaction.js +40 -11
  500. package/lib/test/utilities/MockTransaction.js.map +1 -1
  501. package/lib/test/utilities/PendingLocalStateTests.d.ts +12 -0
  502. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -0
  503. package/lib/test/utilities/PendingLocalStateTests.js +105 -0
  504. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -0
  505. package/lib/test/utilities/SharedTreeTests.d.ts +3 -4
  506. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  507. package/lib/test/utilities/SharedTreeTests.js +696 -439
  508. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  509. package/lib/test/utilities/SharedTreeVersioningTests.d.ts +11 -0
  510. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -0
  511. package/lib/test/utilities/SharedTreeVersioningTests.js +370 -0
  512. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -0
  513. package/lib/test/utilities/SummaryLoadPerfTests.d.ts +10 -0
  514. package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -0
  515. package/lib/test/utilities/SummaryLoadPerfTests.js +102 -0
  516. package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -0
  517. package/lib/test/utilities/SummarySizeTests.d.ts +11 -0
  518. package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -0
  519. package/lib/test/utilities/SummarySizeTests.js +158 -0
  520. package/lib/test/utilities/SummarySizeTests.js.map +1 -0
  521. package/lib/test/utilities/TestCommon.d.ts +9 -0
  522. package/lib/test/utilities/TestCommon.d.ts.map +1 -0
  523. package/lib/test/utilities/TestCommon.js +13 -0
  524. package/lib/test/utilities/TestCommon.js.map +1 -0
  525. package/lib/test/utilities/TestNode.d.ts +140 -0
  526. package/lib/test/utilities/TestNode.d.ts.map +1 -0
  527. package/lib/test/utilities/TestNode.js +292 -0
  528. package/lib/test/utilities/TestNode.js.map +1 -0
  529. package/lib/test/utilities/TestUtilities.d.ts +84 -70
  530. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  531. package/lib/test/utilities/TestUtilities.js +218 -143
  532. package/lib/test/utilities/TestUtilities.js.map +1 -1
  533. package/lib/test/utilities/UndoRedoTests.d.ts +4 -5
  534. package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
  535. package/lib/test/utilities/UndoRedoTests.js +138 -149
  536. package/lib/test/utilities/UndoRedoTests.js.map +1 -1
  537. package/package.json +22 -17
  538. package/src/ChangeCompression.ts +159 -0
  539. package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -125
  540. package/src/Checkout.ts +82 -53
  541. package/src/Common.ts +317 -117
  542. package/src/EagerCheckout.ts +38 -0
  543. package/src/EditLog.ts +153 -100
  544. package/src/EditUtilities.ts +559 -0
  545. package/src/EventTypes.ts +74 -0
  546. package/src/Forest.ts +81 -73
  547. package/src/{default-edits/HistoryEditFactory.ts → HistoryEditFactory.ts} +103 -53
  548. package/src/IdConversion.ts +125 -0
  549. package/src/Identifiers.ts +101 -1
  550. package/src/InitialTree.ts +5 -4
  551. package/src/LazyCheckout.ts +51 -0
  552. package/src/LogViewer.ts +242 -166
  553. package/src/MergeHealth.ts +447 -0
  554. package/src/NodeIdUtilities.ts +156 -0
  555. package/src/PayloadUtilities.ts +124 -0
  556. package/src/ReconciliationPath.ts +18 -13
  557. package/src/RevisionValueCache.ts +14 -5
  558. package/src/RevisionView.ts +252 -0
  559. package/src/SerializationUtilities.ts +130 -0
  560. package/src/SharedTree.ts +1501 -0
  561. package/src/SharedTreeEncoder.ts +493 -0
  562. package/src/StringInterner.ts +72 -0
  563. package/src/Summary.ts +48 -0
  564. package/src/SummaryBackCompatibility.ts +47 -57
  565. package/src/SummaryTestUtilities.ts +54 -0
  566. package/src/Transaction.ts +89 -0
  567. package/src/TransactionInternal.ts +1087 -0
  568. package/src/TreeCompressor.ts +213 -0
  569. package/src/TreeNodeHandle.ts +19 -32
  570. package/src/TreeView.ts +322 -0
  571. package/src/TreeViewUtilities.ts +77 -0
  572. package/src/{default-edits/UndoRedoHandler.ts → UndoRedoHandler.ts} +8 -13
  573. package/src/id-compressor/AppendOnlySortedMap.ts +325 -0
  574. package/src/id-compressor/IdCompressor.md +3 -0
  575. package/src/id-compressor/IdCompressor.ts +1848 -0
  576. package/src/id-compressor/IdRange.ts +33 -0
  577. package/src/id-compressor/NumericUuid.ts +414 -0
  578. package/src/id-compressor/index.ts +13 -0
  579. package/src/id-compressor/persisted-types/0.0.1.ts +179 -0
  580. package/src/id-compressor/persisted-types/README.md +3 -0
  581. package/src/id-compressor/persisted-types/index.ts +6 -0
  582. package/src/index.ts +118 -59
  583. package/src/persisted-types/0.0.2.ts +442 -0
  584. package/src/persisted-types/0.1.1.ts +476 -0
  585. package/src/persisted-types/README.md +22 -0
  586. package/src/persisted-types/index.ts +9 -0
  587. package/.mocharc.js +0 -41
  588. package/api/tree.api.md +0 -729
  589. package/dist/BasicCheckout.d.ts +0 -23
  590. package/dist/BasicCheckout.d.ts.map +0 -1
  591. package/dist/BasicCheckout.js.map +0 -1
  592. package/dist/Snapshot.d.ts +0 -198
  593. package/dist/Snapshot.d.ts.map +0 -1
  594. package/dist/Snapshot.js +0 -267
  595. package/dist/Snapshot.js.map +0 -1
  596. package/dist/SnapshotUtilities.d.ts +0 -29
  597. package/dist/SnapshotUtilities.d.ts.map +0 -1
  598. package/dist/SnapshotUtilities.js +0 -73
  599. package/dist/SnapshotUtilities.js.map +0 -1
  600. package/dist/anchored-edits/AnchorResolution.d.ts +0 -144
  601. package/dist/anchored-edits/AnchorResolution.d.ts.map +0 -1
  602. package/dist/anchored-edits/AnchorResolution.js +0 -162
  603. package/dist/anchored-edits/AnchorResolution.js.map +0 -1
  604. package/dist/anchored-edits/Factory.d.ts +0 -56
  605. package/dist/anchored-edits/Factory.d.ts.map +0 -1
  606. package/dist/anchored-edits/Factory.js +0 -79
  607. package/dist/anchored-edits/Factory.js.map +0 -1
  608. package/dist/anchored-edits/PersistedTypes.d.ts +0 -245
  609. package/dist/anchored-edits/PersistedTypes.d.ts.map +0 -1
  610. package/dist/anchored-edits/PersistedTypes.js +0 -131
  611. package/dist/anchored-edits/PersistedTypes.js.map +0 -1
  612. package/dist/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
  613. package/dist/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
  614. package/dist/anchored-edits/SharedTreeWithAnchors.js +0 -115
  615. package/dist/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
  616. package/dist/anchored-edits/TransactionWithAnchors.d.ts +0 -28
  617. package/dist/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
  618. package/dist/anchored-edits/TransactionWithAnchors.js +0 -36
  619. package/dist/anchored-edits/TransactionWithAnchors.js.map +0 -1
  620. package/dist/anchored-edits/index.d.ts +0 -10
  621. package/dist/anchored-edits/index.d.ts.map +0 -1
  622. package/dist/anchored-edits/index.js +0 -34
  623. package/dist/anchored-edits/index.js.map +0 -1
  624. package/dist/default-edits/EditUtilities.d.ts +0 -57
  625. package/dist/default-edits/EditUtilities.d.ts.map +0 -1
  626. package/dist/default-edits/EditUtilities.js +0 -192
  627. package/dist/default-edits/EditUtilities.js.map +0 -1
  628. package/dist/default-edits/Factory.d.ts +0 -56
  629. package/dist/default-edits/Factory.d.ts.map +0 -1
  630. package/dist/default-edits/Factory.js +0 -79
  631. package/dist/default-edits/Factory.js.map +0 -1
  632. package/dist/default-edits/HistoryEditFactory.d.ts +0 -19
  633. package/dist/default-edits/HistoryEditFactory.d.ts.map +0 -1
  634. package/dist/default-edits/HistoryEditFactory.js +0 -187
  635. package/dist/default-edits/HistoryEditFactory.js.map +0 -1
  636. package/dist/default-edits/PersistedTypes.d.ts.map +0 -1
  637. package/dist/default-edits/PersistedTypes.js.map +0 -1
  638. package/dist/default-edits/SharedTree.d.ts +0 -111
  639. package/dist/default-edits/SharedTree.d.ts.map +0 -1
  640. package/dist/default-edits/SharedTree.js +0 -124
  641. package/dist/default-edits/SharedTree.js.map +0 -1
  642. package/dist/default-edits/Summary.d.ts +0 -15
  643. package/dist/default-edits/Summary.d.ts.map +0 -1
  644. package/dist/default-edits/Summary.js +0 -35
  645. package/dist/default-edits/Summary.js.map +0 -1
  646. package/dist/default-edits/Transaction.d.ts +0 -41
  647. package/dist/default-edits/Transaction.d.ts.map +0 -1
  648. package/dist/default-edits/Transaction.js +0 -225
  649. package/dist/default-edits/Transaction.js.map +0 -1
  650. package/dist/default-edits/UndoRedoHandler.d.ts.map +0 -1
  651. package/dist/default-edits/UndoRedoHandler.js.map +0 -1
  652. package/dist/default-edits/index.d.ts +0 -13
  653. package/dist/default-edits/index.d.ts.map +0 -1
  654. package/dist/default-edits/index.js +0 -41
  655. package/dist/default-edits/index.js.map +0 -1
  656. package/dist/generic/GenericEditUtilities.d.ts +0 -26
  657. package/dist/generic/GenericEditUtilities.d.ts.map +0 -1
  658. package/dist/generic/GenericEditUtilities.js +0 -45
  659. package/dist/generic/GenericEditUtilities.js.map +0 -1
  660. package/dist/generic/GenericSharedTree.d.ts +0 -221
  661. package/dist/generic/GenericSharedTree.d.ts.map +0 -1
  662. package/dist/generic/GenericSharedTree.js +0 -447
  663. package/dist/generic/GenericSharedTree.js.map +0 -1
  664. package/dist/generic/GenericTransaction.d.ts +0 -87
  665. package/dist/generic/GenericTransaction.d.ts.map +0 -1
  666. package/dist/generic/GenericTransaction.js +0 -144
  667. package/dist/generic/GenericTransaction.js.map +0 -1
  668. package/dist/generic/PersistedTypes.d.ts +0 -194
  669. package/dist/generic/PersistedTypes.d.ts.map +0 -1
  670. package/dist/generic/PersistedTypes.js +0 -42
  671. package/dist/generic/PersistedTypes.js.map +0 -1
  672. package/dist/generic/Summary.d.ts +0 -63
  673. package/dist/generic/Summary.d.ts.map +0 -1
  674. package/dist/generic/Summary.js +0 -64
  675. package/dist/generic/Summary.js.map +0 -1
  676. package/dist/generic/index.d.ts +0 -10
  677. package/dist/generic/index.d.ts.map +0 -1
  678. package/dist/generic/index.js +0 -26
  679. package/dist/generic/index.js.map +0 -1
  680. package/docs/Future.md +0 -155
  681. package/lib/BasicCheckout.d.ts +0 -23
  682. package/lib/BasicCheckout.d.ts.map +0 -1
  683. package/lib/BasicCheckout.js.map +0 -1
  684. package/lib/Snapshot.d.ts +0 -198
  685. package/lib/Snapshot.d.ts.map +0 -1
  686. package/lib/Snapshot.js +0 -263
  687. package/lib/Snapshot.js.map +0 -1
  688. package/lib/SnapshotUtilities.d.ts +0 -29
  689. package/lib/SnapshotUtilities.d.ts.map +0 -1
  690. package/lib/SnapshotUtilities.js +0 -67
  691. package/lib/SnapshotUtilities.js.map +0 -1
  692. package/lib/anchored-edits/AnchorResolution.d.ts +0 -144
  693. package/lib/anchored-edits/AnchorResolution.d.ts.map +0 -1
  694. package/lib/anchored-edits/AnchorResolution.js +0 -152
  695. package/lib/anchored-edits/AnchorResolution.js.map +0 -1
  696. package/lib/anchored-edits/Factory.d.ts +0 -56
  697. package/lib/anchored-edits/Factory.d.ts.map +0 -1
  698. package/lib/anchored-edits/Factory.js +0 -74
  699. package/lib/anchored-edits/Factory.js.map +0 -1
  700. package/lib/anchored-edits/PersistedTypes.d.ts +0 -245
  701. package/lib/anchored-edits/PersistedTypes.d.ts.map +0 -1
  702. package/lib/anchored-edits/PersistedTypes.js +0 -128
  703. package/lib/anchored-edits/PersistedTypes.js.map +0 -1
  704. package/lib/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
  705. package/lib/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
  706. package/lib/anchored-edits/SharedTreeWithAnchors.js +0 -110
  707. package/lib/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
  708. package/lib/anchored-edits/TransactionWithAnchors.d.ts +0 -28
  709. package/lib/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
  710. package/lib/anchored-edits/TransactionWithAnchors.js +0 -32
  711. package/lib/anchored-edits/TransactionWithAnchors.js.map +0 -1
  712. package/lib/anchored-edits/index.d.ts +0 -10
  713. package/lib/anchored-edits/index.d.ts.map +0 -1
  714. package/lib/anchored-edits/index.js +0 -11
  715. package/lib/anchored-edits/index.js.map +0 -1
  716. package/lib/default-edits/EditUtilities.d.ts +0 -57
  717. package/lib/default-edits/EditUtilities.d.ts.map +0 -1
  718. package/lib/default-edits/EditUtilities.js +0 -181
  719. package/lib/default-edits/EditUtilities.js.map +0 -1
  720. package/lib/default-edits/Factory.d.ts +0 -56
  721. package/lib/default-edits/Factory.d.ts.map +0 -1
  722. package/lib/default-edits/Factory.js +0 -74
  723. package/lib/default-edits/Factory.js.map +0 -1
  724. package/lib/default-edits/HistoryEditFactory.d.ts +0 -19
  725. package/lib/default-edits/HistoryEditFactory.d.ts.map +0 -1
  726. package/lib/default-edits/HistoryEditFactory.js.map +0 -1
  727. package/lib/default-edits/PersistedTypes.d.ts.map +0 -1
  728. package/lib/default-edits/PersistedTypes.js.map +0 -1
  729. package/lib/default-edits/SharedTree.d.ts +0 -111
  730. package/lib/default-edits/SharedTree.d.ts.map +0 -1
  731. package/lib/default-edits/SharedTree.js +0 -100
  732. package/lib/default-edits/SharedTree.js.map +0 -1
  733. package/lib/default-edits/Summary.d.ts +0 -15
  734. package/lib/default-edits/Summary.d.ts.map +0 -1
  735. package/lib/default-edits/Summary.js +0 -31
  736. package/lib/default-edits/Summary.js.map +0 -1
  737. package/lib/default-edits/Transaction.d.ts +0 -41
  738. package/lib/default-edits/Transaction.d.ts.map +0 -1
  739. package/lib/default-edits/Transaction.js +0 -221
  740. package/lib/default-edits/Transaction.js.map +0 -1
  741. package/lib/default-edits/UndoRedoHandler.d.ts.map +0 -1
  742. package/lib/default-edits/UndoRedoHandler.js.map +0 -1
  743. package/lib/default-edits/index.d.ts +0 -13
  744. package/lib/default-edits/index.d.ts.map +0 -1
  745. package/lib/default-edits/index.js +0 -14
  746. package/lib/default-edits/index.js.map +0 -1
  747. package/lib/generic/GenericEditUtilities.d.ts +0 -26
  748. package/lib/generic/GenericEditUtilities.d.ts.map +0 -1
  749. package/lib/generic/GenericEditUtilities.js +0 -38
  750. package/lib/generic/GenericEditUtilities.js.map +0 -1
  751. package/lib/generic/GenericSharedTree.d.ts +0 -221
  752. package/lib/generic/GenericSharedTree.d.ts.map +0 -1
  753. package/lib/generic/GenericSharedTree.js +0 -443
  754. package/lib/generic/GenericSharedTree.js.map +0 -1
  755. package/lib/generic/GenericTransaction.d.ts +0 -87
  756. package/lib/generic/GenericTransaction.d.ts.map +0 -1
  757. package/lib/generic/GenericTransaction.js +0 -140
  758. package/lib/generic/GenericTransaction.js.map +0 -1
  759. package/lib/generic/PersistedTypes.d.ts +0 -194
  760. package/lib/generic/PersistedTypes.d.ts.map +0 -1
  761. package/lib/generic/PersistedTypes.js +0 -39
  762. package/lib/generic/PersistedTypes.js.map +0 -1
  763. package/lib/generic/Summary.d.ts +0 -63
  764. package/lib/generic/Summary.d.ts.map +0 -1
  765. package/lib/generic/Summary.js +0 -58
  766. package/lib/generic/Summary.js.map +0 -1
  767. package/lib/generic/index.d.ts +0 -10
  768. package/lib/generic/index.d.ts.map +0 -1
  769. package/lib/generic/index.js +0 -11
  770. package/lib/generic/index.js.map +0 -1
  771. package/lib/test/Anchors.glassBox.tests.d.ts.map +0 -1
  772. package/lib/test/Anchors.glassBox.tests.js +0 -410
  773. package/lib/test/Anchors.glassBox.tests.js.map +0 -1
  774. package/lib/test/BasicCheckout.tests.d.ts.map +0 -1
  775. package/lib/test/BasicCheckout.tests.js +0 -8
  776. package/lib/test/BasicCheckout.tests.js.map +0 -1
  777. package/lib/test/GenericTransactionWithAnchors.tests.d.ts.map +0 -1
  778. package/lib/test/GenericTransactionWithAnchors.tests.js +0 -25
  779. package/lib/test/GenericTransactionWithAnchors.tests.js.map +0 -1
  780. package/lib/test/SharedTreeWithAnchors.tests.d.ts.map +0 -1
  781. package/lib/test/SharedTreeWithAnchors.tests.js +0 -420
  782. package/lib/test/SharedTreeWithAnchors.tests.js.map +0 -1
  783. package/lib/test/Snapshot.tests.d.ts.map +0 -1
  784. package/lib/test/Snapshot.tests.js +0 -96
  785. package/lib/test/Snapshot.tests.js.map +0 -1
  786. package/lib/test/SnapshotUtilities.tests.d.ts.map +0 -1
  787. package/lib/test/SnapshotUtilities.tests.js +0 -168
  788. package/lib/test/SnapshotUtilities.tests.js.map +0 -1
  789. package/lib/test/undoRedoStackManager.d.ts +0 -26
  790. package/lib/test/undoRedoStackManager.d.ts.map +0 -1
  791. package/lib/test/undoRedoStackManager.js +0 -176
  792. package/lib/test/undoRedoStackManager.js.map +0 -1
  793. package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts +0 -13
  794. package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts.map +0 -1
  795. package/lib/test/utilities/SummaryFormatCompatibilityTests.js +0 -154
  796. package/lib/test/utilities/SummaryFormatCompatibilityTests.js.map +0 -1
  797. package/src/BasicCheckout.ts +0 -34
  798. package/src/Snapshot.ts +0 -363
  799. package/src/SnapshotUtilities.ts +0 -88
  800. package/src/anchored-edits/AnchorResolution.ts +0 -442
  801. package/src/anchored-edits/Factory.ts +0 -94
  802. package/src/anchored-edits/PersistedTypes.ts +0 -310
  803. package/src/anchored-edits/SharedTreeWithAnchors.ts +0 -200
  804. package/src/anchored-edits/TransactionWithAnchors.ts +0 -39
  805. package/src/anchored-edits/index.ts +0 -21
  806. package/src/default-edits/EditUtilities.ts +0 -220
  807. package/src/default-edits/Factory.ts +0 -94
  808. package/src/default-edits/SharedTree.ts +0 -174
  809. package/src/default-edits/Summary.ts +0 -44
  810. package/src/default-edits/Transaction.ts +0 -262
  811. package/src/default-edits/index.ts +0 -29
  812. package/src/generic/GenericEditUtilities.ts +0 -46
  813. package/src/generic/GenericSharedTree.ts +0 -593
  814. package/src/generic/GenericTransaction.ts +0 -194
  815. package/src/generic/PersistedTypes.ts +0 -221
  816. package/src/generic/Summary.ts +0 -113
  817. package/src/generic/index.ts +0 -41
@@ -0,0 +1,1087 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { assert, copyPropertyIfDefined, fail, Result } from './Common';
7
+ import { NodeId, DetachedSequenceId, TraitLabel, isDetachedSequenceId } from './Identifiers';
8
+ import { rangeFromStableRange } from './TreeViewUtilities';
9
+ import {
10
+ BuildInternal,
11
+ BuildNodeInternal,
12
+ ChangeInternal,
13
+ ChangeTypeInternal,
14
+ ConstraintEffect,
15
+ ConstraintInternal,
16
+ DetachInternal,
17
+ EditStatus,
18
+ InsertInternal,
19
+ SetValueInternal,
20
+ StablePlaceInternal,
21
+ StableRangeInternal,
22
+ } from './persisted-types';
23
+ import {
24
+ detachRange,
25
+ insertIntoTrait,
26
+ validateStablePlace,
27
+ validateStableRange,
28
+ BadPlaceValidationResult,
29
+ BadRangeValidationResult,
30
+ PlaceValidationResult,
31
+ RangeValidationResultKind,
32
+ } from './EditUtilities';
33
+ import { RevisionView, TransactionView } from './RevisionView';
34
+ import { ReconciliationChange, ReconciliationPath } from './ReconciliationPath';
35
+ import { TreeViewNode } from './TreeView';
36
+
37
+ /**
38
+ * Result of applying a transaction.
39
+ * @public
40
+ */
41
+ export type EditingResult = FailedEditingResult | ValidEditingResult;
42
+
43
+ /**
44
+ * Basic result of applying a transaction.
45
+ * @public
46
+ */
47
+ export interface EditingResultBase {
48
+ /**
49
+ * The final status of the transaction.
50
+ */
51
+ readonly status: EditStatus;
52
+ /**
53
+ * The valid changes applied as part of the transaction.
54
+ */
55
+ readonly changes: readonly ChangeInternal[];
56
+ /**
57
+ * The editing steps applied as part of the transaction.
58
+ */
59
+ readonly steps: readonly ReconciliationChange[];
60
+ /**
61
+ * The revision preceding the transaction.
62
+ */
63
+ readonly before: RevisionView;
64
+ }
65
+
66
+ /**
67
+ * Result of applying an invalid or malformed transaction.
68
+ * @public
69
+ */
70
+ export interface FailedEditingResult extends EditingResultBase {
71
+ /**
72
+ * {@inheritDoc EditingResultBase.status}
73
+ */
74
+ readonly status: EditStatus.Invalid | EditStatus.Malformed;
75
+ /**
76
+ * Information about what caused the transaction to fail.
77
+ */
78
+ readonly failure: TransactionInternal.Failure;
79
+ /**
80
+ * The valid changes applied as part of the transaction.
81
+ * Those were ultimately abandoned due to the transaction failure.
82
+ */
83
+ readonly changes: readonly ChangeInternal[];
84
+ /**
85
+ * The editing steps applied as part of the transaction.
86
+ * Those were ultimately abandoned due to the transaction failure.
87
+ */
88
+ readonly steps: readonly ReconciliationChange[];
89
+ }
90
+
91
+ /**
92
+ * Result of applying a valid transaction.
93
+ * @public
94
+ */
95
+ export interface ValidEditingResult extends EditingResultBase {
96
+ /**
97
+ * {@inheritDoc EditingResultBase.status}
98
+ */
99
+ readonly status: EditStatus.Applied;
100
+ /**
101
+ * The new revision produced by the transaction.
102
+ */
103
+ readonly after: RevisionView;
104
+ }
105
+
106
+ /**
107
+ * The result of applying a change within a transaction.
108
+ * @public
109
+ */
110
+ export type ChangeResult = Result<TransactionView, TransactionFailure>;
111
+
112
+ /**
113
+ * The ongoing state of a transaction.
114
+ * @public
115
+ */
116
+ export type TransactionState = SucceedingTransactionState | FailingTransactionState;
117
+
118
+ /**
119
+ * The state of a transaction that has not encountered an error.
120
+ */
121
+ export interface SucceedingTransactionState {
122
+ /**
123
+ * The current status of the transaction.
124
+ */
125
+ readonly status: EditStatus.Applied;
126
+ /**
127
+ * The view reflecting the latest applied change.
128
+ */
129
+ readonly view: TransactionView;
130
+ /**
131
+ * The applied changes so far.
132
+ */
133
+ readonly changes: readonly ChangeInternal[];
134
+ /**
135
+ * The editing steps applied so far.
136
+ */
137
+ readonly steps: readonly ReconciliationChange[];
138
+ }
139
+
140
+ /**
141
+ * The state of a transaction that has encountered an error.
142
+ */
143
+ export interface FailingTransactionState extends TransactionFailure {
144
+ /**
145
+ * The view reflecting the latest applied change.
146
+ */
147
+ readonly view: TransactionView;
148
+ /**
149
+ * The applied changes so far.
150
+ */
151
+ readonly changes: readonly ChangeInternal[];
152
+ /**
153
+ * The editing steps applied so far.
154
+ */
155
+ readonly steps: readonly ReconciliationChange[];
156
+ }
157
+
158
+ /**
159
+ * The failure state of a transaction.
160
+ */
161
+ export interface TransactionFailure {
162
+ /**
163
+ * The status indicating the kind of failure encountered.
164
+ */
165
+ readonly status: EditStatus.Invalid | EditStatus.Malformed;
166
+ /**
167
+ * Information about what caused the transaction to fail.
168
+ */
169
+ readonly failure: TransactionInternal.Failure;
170
+ }
171
+
172
+ /**
173
+ * A mutable transaction for applying sequences of changes to a TreeView.
174
+ * Allows viewing the intermediate states.
175
+ *
176
+ * Contains necessary state to apply changes within an edit to a TreeView.
177
+ *
178
+ * May have any number of changes applied to make up the edit.
179
+ * Use `close` to complete the transaction, returning the array of changes and an EditingResult showing the
180
+ * results of applying the changes as an Edit to the initial TreeView (passed to the constructor).
181
+ *
182
+ * No data outside the Transaction is modified by Transaction:
183
+ * the results from `close` must be used to actually submit an `Edit`.
184
+ */
185
+ export class GenericTransaction {
186
+ private readonly policy: GenericTransactionPolicy;
187
+ protected readonly before: RevisionView;
188
+ private state: TransactionState;
189
+ private open = true;
190
+
191
+ /**
192
+ * Create and open an edit of the provided `TreeView`. After applying 0 or more changes, this editor should be closed via `close()`.
193
+ * @param view - the `TreeView` at which this edit begins. The first change will be applied against this view.
194
+ */
195
+ public constructor(view: RevisionView, policy: GenericTransactionPolicy) {
196
+ this.before = view;
197
+ this.policy = policy;
198
+ this.state = {
199
+ view: view.openForTransaction(),
200
+ status: EditStatus.Applied,
201
+ changes: [],
202
+ steps: [],
203
+ };
204
+ }
205
+
206
+ /** Whether or not this transaction has been closed via `close()` */
207
+ public get isOpen(): boolean {
208
+ return this.open;
209
+ }
210
+
211
+ /**
212
+ * The most up-to-date `TreeView` for this edit. This is the state of the tree after all changes applied so far.
213
+ */
214
+ public get view(): TransactionView {
215
+ return this.state.view;
216
+ }
217
+
218
+ /**
219
+ * The status code of the most recent attempted change.
220
+ */
221
+ public get status(): EditStatus {
222
+ return this.state.status;
223
+ }
224
+
225
+ /**
226
+ * The status code of the most recent attempted change.
227
+ */
228
+ public get changes(): readonly ChangeInternal[] {
229
+ return this.state.changes;
230
+ }
231
+
232
+ /**
233
+ * The status code of the most recent attempted change.
234
+ */
235
+ public get steps(): readonly ReconciliationChange[] {
236
+ return this.state.steps;
237
+ }
238
+
239
+ /** @returns the final `EditStatus` and `TreeView` after all changes are applied. */
240
+ public close(): EditingResult {
241
+ assert(this.open, 'transaction has already been closed');
242
+ this.open = false;
243
+ if (this.state.status === EditStatus.Applied) {
244
+ const validation = this.policy.validateOnClose(this.state);
245
+ if (Result.isOk(validation)) {
246
+ if (validation.result !== this.view) {
247
+ this.state = { ...this.state, view: validation.result };
248
+ }
249
+ return {
250
+ status: EditStatus.Applied,
251
+ steps: this.steps,
252
+ changes: this.changes,
253
+ before: this.before,
254
+ after: this.view.close(),
255
+ };
256
+ }
257
+ this.state = { ...this.state, ...validation.error };
258
+ return {
259
+ ...validation.error,
260
+ steps: this.steps,
261
+ changes: this.changes,
262
+ before: this.before,
263
+ };
264
+ }
265
+ return {
266
+ status: this.state.status,
267
+ failure: this.state.failure,
268
+ steps: this.steps,
269
+ changes: this.changes,
270
+ before: this.before,
271
+ };
272
+ }
273
+
274
+ /**
275
+ * A helper to apply a sequence of changes. Changes will be applied one after the other. If a change fails to apply,
276
+ * the remaining changes in `changes` will be ignored.
277
+ * @param changes - the sequence of changes to apply.
278
+ * @param path - the reconciliation path for the first change.
279
+ * @returns this
280
+ */
281
+ public applyChanges(changes: Iterable<ChangeInternal>, path: ReconciliationPath = []): this {
282
+ const iter = changes[Symbol.iterator]();
283
+ const firsChangeInternal = iter.next().value;
284
+ let iterResult = iter.next();
285
+ if (iterResult.done === true) {
286
+ for (const change of changes) {
287
+ if (this.applyChange(change, path).status !== EditStatus.Applied) {
288
+ return this;
289
+ }
290
+ }
291
+ return this;
292
+ }
293
+
294
+ if (this.applyChange(firsChangeInternal, path).status !== EditStatus.Applied) {
295
+ return this;
296
+ }
297
+
298
+ const ongoingEdit = {
299
+ 0: this.steps[this.steps.length - 1],
300
+ before: this.view,
301
+ after: this.view,
302
+ length: 1,
303
+ };
304
+
305
+ /**
306
+ * We use a Proxy instead of `{ ...path, ...objectWithOngoingEdit }` to avoid eagerly demanding all parts of the path, which may
307
+ * require extensive computation.
308
+ */
309
+ const pathWithOngoingEdit = new Proxy(path, {
310
+ get: (target: ReconciliationPath, prop: string): ReconciliationPath[number | 'length'] => {
311
+ if (prop === 'length') {
312
+ return target.length + 1;
313
+ }
314
+ return prop === String(target.length) ? ongoingEdit : target[prop];
315
+ },
316
+ });
317
+
318
+ while (iterResult.done !== true) {
319
+ if (this.applyChange(iterResult.value, pathWithOngoingEdit).status !== EditStatus.Applied) {
320
+ return this;
321
+ }
322
+
323
+ ongoingEdit[ongoingEdit.length] = this.steps[this.steps.length - 1];
324
+ ongoingEdit.length += 1;
325
+ ongoingEdit.after = this.view;
326
+ iterResult = iter.next();
327
+ }
328
+ return this;
329
+ }
330
+
331
+ /**
332
+ * Attempt to apply the given change as part of this edit. This method should not be called if a previous change in this edit failed to
333
+ * apply.
334
+ * @param change - the change to apply
335
+ * @param path - the reconciliation path for the change.
336
+ * @returns this
337
+ */
338
+ public applyChange(change: ChangeInternal, path: ReconciliationPath = []): this {
339
+ assert(this.open, 'Editor must be open to apply changes.');
340
+ if (this.state.status !== EditStatus.Applied) {
341
+ fail('Cannot apply change to an edit unless all previous changes have applied');
342
+ }
343
+ const resolutionResult = this.policy.tryResolveChange(this.state, change, path);
344
+ if (Result.isError(resolutionResult)) {
345
+ this.state = { ...this.state, ...resolutionResult.error };
346
+ return this;
347
+ }
348
+ const resolvedChange = resolutionResult.result;
349
+ const changeResult = this.policy.dispatchChange(this.state, resolvedChange);
350
+ if (Result.isOk(changeResult)) {
351
+ this.state = {
352
+ status: EditStatus.Applied,
353
+ view: changeResult.result,
354
+ changes: this.changes.concat(change),
355
+ steps: this.steps.concat({ resolvedChange, after: changeResult.result }),
356
+ };
357
+ } else {
358
+ this.state = {
359
+ ...this.state,
360
+ ...changeResult.error,
361
+ };
362
+ }
363
+ return this;
364
+ }
365
+ }
366
+
367
+ /**
368
+ * An object that encapsulates the rules and state pertaining to a specific subclass of {@link GenericTransaction}.
369
+ * The characteristics that define such a subclass (and an implementation of this interface) are:
370
+ * - The type of change that can be applied
371
+ * - How those changes impact the state of the tree
372
+ * - How those changes are resolved in the face of concurrent changes
373
+ * - What makes a transaction valid
374
+ * - The kind of situations that might lead to a transaction failure
375
+ *
376
+ * Instances of this type are passed to the {@link GenericTransaction} constructor.
377
+ */
378
+ export interface GenericTransactionPolicy {
379
+ /**
380
+ * Given a change, attempts to derive an equivalent change which can be applied to the current state even if the given change was issued
381
+ * over a different state. This can be used to apply a sequence of changes that were issued concurrently, i.e., without knowledge of
382
+ * each other.
383
+ * @param state - The current state on which the returned change will be applied.
384
+ * @param change - The original change issued.
385
+ * @param path - The reconciliation path for the change.
386
+ * @returns The change to be applied to the current state, or a failure if the change cannot be resolved.
387
+ */
388
+ tryResolveChange(
389
+ state: SucceedingTransactionState,
390
+ change: ChangeInternal,
391
+ path: ReconciliationPath
392
+ ): Result<ChangeInternal, TransactionFailure>;
393
+
394
+ /**
395
+ * Provides a new state given the current state and a change to apply.
396
+ * @param state - The current state on which the change is applied.
397
+ * @param change - The change to apply to the current state.
398
+ * @returns The new state reflecting the applied change, or a failure.
399
+ */
400
+ dispatchChange(state: SucceedingTransactionState, change: ChangeInternal): ChangeResult;
401
+
402
+ /**
403
+ * Additional transaction validation when the transaction is closed.
404
+ * @param state - The current state of the transaction.
405
+ * @returns The new state reflecting the closed transaction, or a failure if the transaction cannot be closed.
406
+ */
407
+ validateOnClose(state: SucceedingTransactionState): ChangeResult;
408
+ }
409
+
410
+ /**
411
+ * A mutable transaction for applying sequences of changes to a TreeView.
412
+ * Allows viewing the intermediate states.
413
+ *
414
+ * Contains necessary state to apply changes within an edit to a TreeView.
415
+ *
416
+ * May have any number of changes applied to make up the edit.
417
+ * Use `close` to complete the transaction, returning the array of changes and an EditingResult showing the
418
+ * results of applying the changes as an Edit to the initial TreeView (passed to the constructor).
419
+ *
420
+ * No data outside the Transaction is modified by Transaction:
421
+ * the results from `close` must be used to actually submit an `Edit`.
422
+ * @public
423
+ */
424
+ export namespace TransactionInternal {
425
+ /**
426
+ * Makes a new {@link GenericTransaction} that follows the {@link TransactionInternal.Policy} policy.
427
+ */
428
+ export function factory(view: RevisionView): GenericTransaction {
429
+ return new GenericTransaction(view, new Policy());
430
+ }
431
+
432
+ type ValidState = SucceedingTransactionState;
433
+
434
+ /**
435
+ * The policy followed by a {@link TransactionInternal}.
436
+ */
437
+ export class Policy implements GenericTransactionPolicy {
438
+ /**
439
+ * Maps detached sequences of nodes to their NodeIds
440
+ */
441
+ protected readonly detached: Map<DetachedSequenceId, readonly NodeId[]> = new Map();
442
+
443
+ /**
444
+ * Resolves change with Result.Ok
445
+ *
446
+ * @param state - Unused
447
+ * @param change - Change to resolve
448
+ * @returns Result.Ok which contains change
449
+ */
450
+ public tryResolveChange(state: ValidState, change: ChangeInternal): Result.Ok<ChangeInternal> {
451
+ return Result.ok(change);
452
+ }
453
+
454
+ /**
455
+ * Validates the transaction when it is closed
456
+ *
457
+ * @param state - Current state
458
+ * @returns a {@link ChangeResult} containing either the change result or a Failure
459
+ */
460
+ public validateOnClose(state: ValidState): ChangeResult {
461
+ // Making the policy choice that storing a detached sequences in an edit but not using it is an error.
462
+ return this.detached.size !== 0
463
+ ? Result.error({
464
+ status: EditStatus.Malformed,
465
+ failure: {
466
+ kind: FailureKind.UnusedDetachedSequence,
467
+ sequenceId: this.detached.keys().next().value,
468
+ },
469
+ })
470
+ : Result.ok(state.view);
471
+ }
472
+
473
+ /**
474
+ * Applies a given change
475
+ *
476
+ * @param state - Current state
477
+ * @param change - Change to apply
478
+ * @returns a {@link ChangeResult} containing either the change result or a Failure
479
+ */
480
+ public dispatchChange(state: ValidState, change: ChangeInternal): ChangeResult {
481
+ switch (change.type) {
482
+ case ChangeTypeInternal.Build:
483
+ return this.applyBuild(state, change);
484
+ case ChangeTypeInternal.Insert:
485
+ return this.applyInsert(state, change);
486
+ case ChangeTypeInternal.Detach:
487
+ return this.applyDetach(state, change);
488
+ case ChangeTypeInternal.Constraint:
489
+ return this.applyConstraint(state, change);
490
+ case ChangeTypeInternal.SetValue:
491
+ return this.applySetValue(state, change);
492
+ default:
493
+ return fail('Attempted to apply unsupported change');
494
+ }
495
+ }
496
+
497
+ private applyBuild(state: ValidState, change: BuildInternal): ChangeResult {
498
+ if (this.detached.has(change.destination)) {
499
+ return Result.error({
500
+ status: EditStatus.Malformed,
501
+ failure: {
502
+ kind: FailureKind.DetachedSequenceIdAlreadyInUse,
503
+ change,
504
+ sequenceId: change.destination,
505
+ },
506
+ });
507
+ }
508
+
509
+ let idAlreadyPresent: NodeId | undefined;
510
+ let duplicateIdInBuild: NodeId | undefined;
511
+ let invalidId: NodeId | undefined;
512
+ let detachedSequenceNotFound: DetachedSequenceId | undefined;
513
+ const map = new Map<NodeId, TreeViewNode>();
514
+ const newIds = this.createViewNodesForTree(
515
+ change.source,
516
+ (id, viewNode) => {
517
+ if (map.has(id)) {
518
+ duplicateIdInBuild = id;
519
+ return true;
520
+ }
521
+ if (state.view.hasNode(viewNode.identifier)) {
522
+ idAlreadyPresent = id;
523
+ return true;
524
+ }
525
+ map.set(id, viewNode);
526
+ return false;
527
+ },
528
+ (detachedId) => {
529
+ detachedSequenceNotFound = detachedId;
530
+ }
531
+ );
532
+
533
+ if (idAlreadyPresent !== undefined) {
534
+ return Result.error({
535
+ status: EditStatus.Invalid,
536
+ failure: { kind: FailureKind.IdAlreadyInUse, change, id: idAlreadyPresent },
537
+ });
538
+ }
539
+ if (duplicateIdInBuild !== undefined) {
540
+ return Result.error({
541
+ status: EditStatus.Malformed,
542
+ failure: { kind: FailureKind.DuplicateIdInBuild, change, id: duplicateIdInBuild },
543
+ });
544
+ }
545
+ if (invalidId !== undefined) {
546
+ return Result.error({
547
+ status: EditStatus.Invalid,
548
+ failure: { kind: FailureKind.UnknownId, change, id: invalidId },
549
+ });
550
+ }
551
+ if (detachedSequenceNotFound !== undefined) {
552
+ return Result.error({
553
+ status: EditStatus.Malformed,
554
+ failure: {
555
+ kind: FailureKind.DetachedSequenceNotFound,
556
+ change,
557
+ sequenceId: detachedSequenceNotFound,
558
+ },
559
+ });
560
+ }
561
+
562
+ const view = state.view.addNodes(map.values());
563
+ this.detached.set(
564
+ change.destination,
565
+ newIds ?? fail('Unhandled failure case in Transaction.createViewNodesForTree')
566
+ );
567
+ return Result.ok(view);
568
+ }
569
+
570
+ private applyInsert(state: ValidState, change: InsertInternal): ChangeResult {
571
+ const source = this.detached.get(change.source);
572
+ if (source === undefined) {
573
+ return Result.error({
574
+ status: EditStatus.Malformed,
575
+ failure: {
576
+ kind: FailureKind.DetachedSequenceNotFound,
577
+ change,
578
+ sequenceId: change.source,
579
+ },
580
+ });
581
+ }
582
+
583
+ const validatedDestination = validateStablePlace(state.view, change.destination);
584
+ if (validatedDestination.result !== PlaceValidationResult.Valid) {
585
+ return Result.error({
586
+ status:
587
+ validatedDestination.result === PlaceValidationResult.Malformed
588
+ ? EditStatus.Malformed
589
+ : EditStatus.Invalid,
590
+ failure: {
591
+ kind: FailureKind.BadPlace,
592
+ change,
593
+ place: change.destination,
594
+ placeFailure: validatedDestination.result,
595
+ },
596
+ });
597
+ }
598
+
599
+ this.detached.delete(change.source);
600
+ const view = insertIntoTrait(state.view, source, validatedDestination);
601
+ return Result.ok(view);
602
+ }
603
+
604
+ private applyDetach(state: ValidState, change: DetachInternal): ChangeResult {
605
+ const validatedSource = validateStableRange(state.view, change.source);
606
+ if (validatedSource.result !== RangeValidationResultKind.Valid) {
607
+ return Result.error({
608
+ status:
609
+ validatedSource.result === RangeValidationResultKind.PlacesInDifferentTraits ||
610
+ validatedSource.result === RangeValidationResultKind.Inverted ||
611
+ validatedSource.result.placeFailure !== PlaceValidationResult.Malformed
612
+ ? EditStatus.Invalid
613
+ : EditStatus.Malformed,
614
+ failure: {
615
+ kind: FailureKind.BadRange,
616
+ change,
617
+ range: change.source,
618
+ rangeFailure: validatedSource.result,
619
+ },
620
+ });
621
+ }
622
+
623
+ const result = detachRange(state.view, validatedSource);
624
+ let modifiedView = result.view;
625
+ const { detached } = result;
626
+
627
+ // Store or dispose detached
628
+ if (change.destination !== undefined) {
629
+ if (this.detached.has(change.destination)) {
630
+ return Result.error({
631
+ status: EditStatus.Malformed,
632
+ failure: {
633
+ kind: FailureKind.DetachedSequenceIdAlreadyInUse,
634
+ change,
635
+ sequenceId: change.destination,
636
+ },
637
+ });
638
+ }
639
+ this.detached.set(change.destination, detached);
640
+ } else {
641
+ modifiedView = modifiedView.deleteNodes(detached);
642
+ }
643
+ return Result.ok(modifiedView);
644
+ }
645
+
646
+ private applyConstraint(state: ValidState, change: ConstraintInternal): ChangeResult {
647
+ // TODO: Implement identityHash and contentHash
648
+ assert(change.identityHash === undefined, 'identityHash constraint is not implemented');
649
+ assert(change.contentHash === undefined, 'contentHash constraint is not implemented');
650
+
651
+ const validatedChange = validateStableRange(state.view, change.toConstrain);
652
+ if (validatedChange.result !== RangeValidationResultKind.Valid) {
653
+ return validatedChange.result !== RangeValidationResultKind.PlacesInDifferentTraits &&
654
+ validatedChange.result !== RangeValidationResultKind.Inverted &&
655
+ validatedChange.result.placeFailure !== PlaceValidationResult.Malformed
656
+ ? change.effect === ConstraintEffect.ValidRetry
657
+ ? Result.ok(state.view)
658
+ : Result.error({
659
+ status: EditStatus.Invalid,
660
+ failure: {
661
+ kind: FailureKind.ConstraintViolation,
662
+ constraint: change,
663
+ violation: {
664
+ kind: ConstraintViolationKind.BadRange,
665
+ rangeFailure: validatedChange.result,
666
+ },
667
+ },
668
+ })
669
+ : Result.error({
670
+ status: EditStatus.Malformed,
671
+ failure: {
672
+ kind: FailureKind.ConstraintViolation,
673
+ constraint: change,
674
+ violation: {
675
+ kind: ConstraintViolationKind.BadRange,
676
+ rangeFailure: validatedChange.result,
677
+ },
678
+ },
679
+ });
680
+ }
681
+
682
+ const { start, end } = rangeFromStableRange(state.view, validatedChange);
683
+ const startIndex = state.view.findIndexWithinTrait(start);
684
+ const endIndex = state.view.findIndexWithinTrait(end);
685
+
686
+ if (change.length !== undefined && change.length !== endIndex - startIndex) {
687
+ return Result.error({
688
+ status: EditStatus.Invalid,
689
+ failure: {
690
+ kind: FailureKind.ConstraintViolation,
691
+ constraint: change,
692
+ violation: {
693
+ kind: ConstraintViolationKind.BadLength,
694
+ actual: endIndex - startIndex,
695
+ },
696
+ },
697
+ });
698
+ }
699
+
700
+ if (change.parentNode !== undefined && change.parentNode !== end.trait.parent) {
701
+ return Result.error({
702
+ status: EditStatus.Invalid,
703
+ failure: {
704
+ kind: FailureKind.ConstraintViolation,
705
+ constraint: change,
706
+ violation: {
707
+ kind: ConstraintViolationKind.BadParent,
708
+ actual: change.parentNode,
709
+ },
710
+ },
711
+ });
712
+ }
713
+
714
+ if (change.label !== undefined && change.label !== end.trait.label) {
715
+ return Result.error({
716
+ status: EditStatus.Invalid,
717
+ failure: {
718
+ kind: FailureKind.ConstraintViolation,
719
+ constraint: change,
720
+ violation: {
721
+ kind: ConstraintViolationKind.BadLabel,
722
+ actual: end.trait.label,
723
+ },
724
+ },
725
+ });
726
+ }
727
+
728
+ return Result.ok(state.view);
729
+ }
730
+
731
+ private applySetValue(state: ValidState, change: SetValueInternal): ChangeResult {
732
+ if (!state.view.hasNode(change.nodeToModify)) {
733
+ return Result.error({
734
+ status: EditStatus.Invalid,
735
+ failure: { kind: FailureKind.UnknownId, change, id: change.nodeToModify },
736
+ });
737
+ }
738
+
739
+ const newView = state.view.setNodeValue(change.nodeToModify, change.payload);
740
+ return Result.ok(newView);
741
+ }
742
+
743
+ /**
744
+ * Generates tree view nodes from the supplied edit nodes.
745
+ * Invokes onCreateNode for each new node, and halts creation early if it returns true.
746
+ * Invokes onInvalidDetachedId and halts early for any invalid detached IDs referenced in the edit node sequence.
747
+ * @returns all the top-level node IDs in `sequence` (both from nodes and from detached sequences).
748
+ */
749
+ protected createViewNodesForTree(
750
+ sequence: Iterable<BuildNodeInternal>,
751
+ onCreateNode: (stableId: NodeId, node: TreeViewNode) => boolean,
752
+ onInvalidDetachedId: (sequenceId: DetachedSequenceId) => void
753
+ ): NodeId[] | undefined {
754
+ const topLevelIds: NodeId[] = [];
755
+ const unprocessed: BuildNodeInternal[] = [];
756
+ for (const buildNode of sequence) {
757
+ if (isDetachedSequenceId(buildNode)) {
758
+ const detachedIds = this.getDetachedNodeIds(buildNode, onInvalidDetachedId);
759
+ if (detachedIds === undefined) {
760
+ return undefined;
761
+ }
762
+ topLevelIds.push(...detachedIds);
763
+ } else {
764
+ unprocessed.push(buildNode);
765
+ topLevelIds.push(buildNode.identifier);
766
+ }
767
+ }
768
+ while (unprocessed.length > 0) {
769
+ const node = unprocessed.pop();
770
+ assert(node !== undefined && !isDetachedSequenceId(node));
771
+ const traits = new Map<TraitLabel, readonly NodeId[]>();
772
+ // eslint-disable-next-line no-restricted-syntax
773
+ for (const key in node.traits) {
774
+ if (Object.prototype.hasOwnProperty.call(node.traits, key)) {
775
+ const children = node.traits[key];
776
+ if (children.length > 0) {
777
+ const childIds: NodeId[] = [];
778
+ for (const child of children) {
779
+ if (isDetachedSequenceId(child)) {
780
+ const detachedIds = this.getDetachedNodeIds(child, onInvalidDetachedId);
781
+ if (detachedIds === undefined) {
782
+ return undefined;
783
+ }
784
+ childIds.push(...detachedIds);
785
+ } else {
786
+ childIds.push(child.identifier);
787
+ unprocessed.push(child);
788
+ }
789
+ }
790
+ traits.set(key as TraitLabel, childIds);
791
+ }
792
+ }
793
+ }
794
+ const newNode: TreeViewNode = {
795
+ identifier: node.identifier,
796
+ definition: node.definition,
797
+ traits,
798
+ };
799
+ copyPropertyIfDefined(node, newNode, 'payload');
800
+ if (onCreateNode(node.identifier, newNode)) {
801
+ return undefined;
802
+ }
803
+ }
804
+ return topLevelIds;
805
+ }
806
+
807
+ private getDetachedNodeIds(
808
+ detachedId: DetachedSequenceId,
809
+ onInvalidDetachedId: (sequenceId: DetachedSequenceId) => void
810
+ ): readonly NodeId[] | undefined {
811
+ // Retrieve the detached sequence from the void.
812
+ const detachedNodeIds = this.detached.get(detachedId);
813
+ if (detachedNodeIds === undefined) {
814
+ onInvalidDetachedId(detachedId);
815
+ return undefined;
816
+ }
817
+ // Since we have retrieved the sequence, remove it from the void to prevent a second tree from multi-parenting it later
818
+ this.detached.delete(detachedId);
819
+ return detachedNodeIds;
820
+ }
821
+ }
822
+
823
+ /**
824
+ * The kinds of failures that a transaction might encounter.
825
+ */
826
+ export enum FailureKind {
827
+ /**
828
+ * Transaction has an unused DetachedSequenceId
829
+ */
830
+ UnusedDetachedSequence = 'UnusedDetachedSequence',
831
+ /**
832
+ * Transaction has a build operation using an already in use DetachedSequenceID.
833
+ */
834
+ DetachedSequenceIdAlreadyInUse = 'DetachedSequenceIdAlreadyInUse',
835
+ /**
836
+ * Transaction tries to operate on an unknown DetachedSequenceID
837
+ */
838
+ DetachedSequenceNotFound = 'DetachedSequenceNotFound',
839
+ /**
840
+ * Transaction has a build which uses a duplicated NodeId
841
+ */
842
+ DuplicateIdInBuild = 'DuplicateIdInBuild',
843
+ /**
844
+ * Transaction tries to build a node using an ID which is already used in the current state
845
+ */
846
+ IdAlreadyInUse = 'IdAlreadyInUse',
847
+ /**
848
+ * Transaction tries to set value of an unknown node
849
+ */
850
+ UnknownId = 'UnknownId',
851
+ /**
852
+ * Transaction tries to insert in an invalid Place
853
+ */
854
+ BadPlace = 'BadPlace',
855
+ /**
856
+ * Transaction tries to detach an invalid Range
857
+ */
858
+ BadRange = 'BadRange',
859
+ /**
860
+ * Transaction has an invalid constraint
861
+ */
862
+ ConstraintViolation = 'ConstraintViolation',
863
+ }
864
+
865
+ /**
866
+ * A failure encountered by a transaction.
867
+ */
868
+ export type Failure =
869
+ | UnusedDetachedSequenceFailure
870
+ | DetachedSequenceIdAlreadyInUseFailure
871
+ | DetachedSequenceNotFoundFailure
872
+ | DuplicateIdInBuildFailure
873
+ | IdAlreadyInUseFailure
874
+ | UnknownIdFailure
875
+ | BadPlaceFailure
876
+ | BadRangeFailure
877
+ | ConstraintViolationFailure;
878
+
879
+ /**
880
+ * Error returned when a transaction is closed while there is an unused detached sequence.
881
+ */
882
+ export interface UnusedDetachedSequenceFailure {
883
+ /**
884
+ * Failure kind (will always be FailureKind.UnusedDetachedSequence)
885
+ */
886
+ readonly kind: FailureKind.UnusedDetachedSequence;
887
+ /**
888
+ * The unused DetachedSequenceId
889
+ */
890
+ readonly sequenceId: DetachedSequenceId;
891
+ }
892
+
893
+ /**
894
+ * Error thrown when a transaction encounters a build operation using an already in use DetachedSequenceID.
895
+ */
896
+ export interface DetachedSequenceIdAlreadyInUseFailure {
897
+ /**
898
+ * Failure kind (will always be FailureKind.DetachedSequenceIdAlreadyInUse)
899
+ */
900
+ readonly kind: FailureKind.DetachedSequenceIdAlreadyInUse;
901
+ /**
902
+ * Faulting Change
903
+ */
904
+ readonly change: ChangeInternal;
905
+ /**
906
+ * The DetachedSequenceId that is already in use
907
+ */
908
+ readonly sequenceId: DetachedSequenceId;
909
+ }
910
+
911
+ /**
912
+ * Error thrown when a transaction tries to operate on an unknown DetachedSequenceID
913
+ */
914
+ export interface DetachedSequenceNotFoundFailure {
915
+ /**
916
+ * Failure kind (will always be FailureKind.DetachedSequenceNotFound)
917
+ */
918
+ readonly kind: FailureKind.DetachedSequenceNotFound;
919
+ /**
920
+ * Faulting Change
921
+ */
922
+ readonly change: ChangeInternal;
923
+ /**
924
+ * The DetachedSequenceId that wasn't found
925
+ */
926
+ readonly sequenceId: DetachedSequenceId;
927
+ }
928
+
929
+ /**
930
+ * Error thrown when a build uses a duplicated NodeId
931
+ */
932
+ export interface DuplicateIdInBuildFailure {
933
+ /**
934
+ * Failure kind (will always be FailureKind.DuplicateIdInBuild)
935
+ */
936
+ readonly kind: FailureKind.DuplicateIdInBuild;
937
+ /**
938
+ * Faulting Change
939
+ */
940
+ readonly change: ChangeInternal;
941
+ /**
942
+ * ID of duplicated node
943
+ */
944
+ readonly id: NodeId;
945
+ }
946
+
947
+ /**
948
+ * Error thrown when a build node ID is already used in the current state
949
+ */
950
+ export interface IdAlreadyInUseFailure {
951
+ /**
952
+ * Failure kind (will always be FailureKind.IdAlreadyInUse)
953
+ */
954
+ readonly kind: FailureKind.IdAlreadyInUse;
955
+ /**
956
+ * Faulting Change
957
+ */
958
+ readonly change: ChangeInternal;
959
+ /**
960
+ * ID of already in use node
961
+ */
962
+ readonly id: NodeId;
963
+ }
964
+
965
+ /**
966
+ * Error thrown when a change is attempted on an unknown NodeId
967
+ */
968
+ export interface UnknownIdFailure {
969
+ /**
970
+ * Failure kind (will always be FailureKind.UnknownId)
971
+ */
972
+ readonly kind: FailureKind.UnknownId;
973
+ /**
974
+ * Faulting Change
975
+ */
976
+ readonly change: ChangeInternal;
977
+ /**
978
+ * The unknown ID
979
+ */
980
+ readonly id: NodeId;
981
+ }
982
+
983
+ /**
984
+ * Error thrown when an insert change uses an invalid Place
985
+ */
986
+ export interface BadPlaceFailure {
987
+ /**
988
+ * Failure kind (will always be FailureKind.BadPlace)
989
+ */
990
+ readonly kind: FailureKind.BadPlace;
991
+ /**
992
+ * Faulting Change
993
+ */
994
+ readonly change: ChangeInternal;
995
+ /**
996
+ * The faulting place
997
+ */
998
+ readonly place: StablePlaceInternal;
999
+ /**
1000
+ * The reason for the failure
1001
+ */
1002
+ readonly placeFailure: BadPlaceValidationResult;
1003
+ }
1004
+
1005
+ /**
1006
+ * Error thrown when a detach operation is given an invalid or malformed Range
1007
+ */
1008
+ export interface BadRangeFailure {
1009
+ /**
1010
+ * Failure kind (will always be FailureKind.BadRange)
1011
+ */
1012
+ readonly kind: FailureKind.BadRange;
1013
+ /**
1014
+ * Faulting Change
1015
+ */
1016
+ readonly change: ChangeInternal;
1017
+ /**
1018
+ * Faulting range
1019
+ */
1020
+ readonly range: StableRangeInternal;
1021
+ /**
1022
+ * The reason for the failure
1023
+ */
1024
+ readonly rangeFailure: BadRangeValidationResult;
1025
+ }
1026
+
1027
+ /**
1028
+ * Error thrown when a constraint fails to apply
1029
+ */
1030
+ export interface ConstraintViolationFailure {
1031
+ /**
1032
+ * Failure kind (will always be FailureKind.ConstraintViolation)
1033
+ */
1034
+ readonly kind: FailureKind.ConstraintViolation;
1035
+ /**
1036
+ * Faulting Change
1037
+ */
1038
+ readonly constraint: ConstraintInternal;
1039
+ /**
1040
+ * The first violation the constraint encounters (there may be others).
1041
+ */
1042
+ readonly violation: ConstraintViolationResult;
1043
+ }
1044
+
1045
+ /**
1046
+ * The details of what kind of constraint was violated and caused a ConstraintViolationFailure error to occur
1047
+ */
1048
+ export type ConstraintViolationResult =
1049
+ | {
1050
+ readonly kind: ConstraintViolationKind.BadRange;
1051
+ readonly rangeFailure: BadRangeValidationResult;
1052
+ }
1053
+ | {
1054
+ readonly kind: ConstraintViolationKind.BadLength;
1055
+ readonly actual: number;
1056
+ }
1057
+ | {
1058
+ readonly kind: ConstraintViolationKind.BadParent;
1059
+ readonly actual: NodeId;
1060
+ }
1061
+ | {
1062
+ readonly kind: ConstraintViolationKind.BadLabel;
1063
+ readonly actual: TraitLabel;
1064
+ };
1065
+
1066
+ /**
1067
+ * Enum of possible kinds of constraint violations that can be encountered
1068
+ */
1069
+ export enum ConstraintViolationKind {
1070
+ /**
1071
+ * The constraint failed because it applies to an invalid range
1072
+ */
1073
+ BadRange = 'BadRange',
1074
+ /**
1075
+ * The constraint failed because the length prescribed by the constraint does not match the length of range being constrained
1076
+ */
1077
+ BadLength = 'BadLength',
1078
+ /**
1079
+ * The constraint failed because the parent prescribed by the constraint does not match the actual parent of the range being constrained
1080
+ */
1081
+ BadParent = 'BadParent',
1082
+ /**
1083
+ * The constraint failed because the trait label prescribed by the constraint does not match the actual trait label of the range being constrained
1084
+ */
1085
+ BadLabel = 'BadLabel',
1086
+ }
1087
+ }