@fluid-experimental/tree 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/experimental-tree.api.md +2 -2
  3. package/dist/ChangeCompression.d.ts +2 -2
  4. package/dist/ChangeCompression.d.ts.map +1 -1
  5. package/dist/ChangeCompression.js +1 -1
  6. package/dist/ChangeCompression.js.map +1 -1
  7. package/dist/ChangeTypes.d.ts +1 -1
  8. package/dist/ChangeTypes.d.ts.map +1 -1
  9. package/dist/ChangeTypes.js +4 -4
  10. package/dist/ChangeTypes.js.map +1 -1
  11. package/dist/Checkout.d.ts +3 -3
  12. package/dist/Checkout.d.ts.map +1 -1
  13. package/dist/Checkout.js +17 -17
  14. package/dist/Checkout.js.map +1 -1
  15. package/dist/EditLog.d.ts +1 -1
  16. package/dist/EditLog.d.ts.map +1 -1
  17. package/dist/EditLog.js +9 -9
  18. package/dist/EditLog.js.map +1 -1
  19. package/dist/EditUtilities.d.ts +3 -3
  20. package/dist/EditUtilities.d.ts.map +1 -1
  21. package/dist/EditUtilities.js +6 -6
  22. package/dist/EditUtilities.js.map +1 -1
  23. package/dist/Forest.d.ts.map +1 -1
  24. package/dist/Forest.js +23 -23
  25. package/dist/Forest.js.map +1 -1
  26. package/dist/HistoryEditFactory.d.ts +1 -1
  27. package/dist/HistoryEditFactory.d.ts.map +1 -1
  28. package/dist/HistoryEditFactory.js +7 -7
  29. package/dist/HistoryEditFactory.js.map +1 -1
  30. package/dist/IdConversion.d.ts.map +1 -1
  31. package/dist/IdConversion.js.map +1 -1
  32. package/dist/LogViewer.d.ts +2 -2
  33. package/dist/LogViewer.d.ts.map +1 -1
  34. package/dist/LogViewer.js +7 -7
  35. package/dist/LogViewer.js.map +1 -1
  36. package/dist/MergeHealth.d.ts.map +1 -1
  37. package/dist/MergeHealth.js +1 -1
  38. package/dist/MergeHealth.js.map +1 -1
  39. package/dist/NodeIdUtilities.d.ts +1 -1
  40. package/dist/NodeIdUtilities.d.ts.map +1 -1
  41. package/dist/NodeIdUtilities.js +1 -1
  42. package/dist/NodeIdUtilities.js.map +1 -1
  43. package/dist/PayloadUtilities.d.ts.map +1 -1
  44. package/dist/PayloadUtilities.js +2 -2
  45. package/dist/PayloadUtilities.js.map +1 -1
  46. package/dist/ReconciliationPath.d.ts +1 -1
  47. package/dist/ReconciliationPath.d.ts.map +1 -1
  48. package/dist/ReconciliationPath.js.map +1 -1
  49. package/dist/RevisionValueCache.d.ts.map +1 -1
  50. package/dist/RevisionValueCache.js +2 -2
  51. package/dist/RevisionValueCache.js.map +1 -1
  52. package/dist/RevisionView.d.ts +2 -2
  53. package/dist/RevisionView.d.ts.map +1 -1
  54. package/dist/RevisionView.js.map +1 -1
  55. package/dist/SerializationUtilities.d.ts +1 -1
  56. package/dist/SerializationUtilities.d.ts.map +1 -1
  57. package/dist/SerializationUtilities.js.map +1 -1
  58. package/dist/SharedTree.d.ts +8 -7
  59. package/dist/SharedTree.d.ts.map +1 -1
  60. package/dist/SharedTree.js +78 -78
  61. package/dist/SharedTree.js.map +1 -1
  62. package/dist/SharedTreeEncoder.d.ts +1 -1
  63. package/dist/SharedTreeEncoder.d.ts.map +1 -1
  64. package/dist/SharedTreeEncoder.js +31 -31
  65. package/dist/SharedTreeEncoder.js.map +1 -1
  66. package/dist/Summary.d.ts +2 -2
  67. package/dist/Summary.d.ts.map +1 -1
  68. package/dist/Summary.js +2 -2
  69. package/dist/Summary.js.map +1 -1
  70. package/dist/SummaryBackCompatibility.d.ts.map +1 -1
  71. package/dist/SummaryBackCompatibility.js.map +1 -1
  72. package/dist/SummaryTestUtilities.d.ts +1 -1
  73. package/dist/SummaryTestUtilities.d.ts.map +1 -1
  74. package/dist/SummaryTestUtilities.js.map +1 -1
  75. package/dist/Transaction.d.ts +3 -3
  76. package/dist/Transaction.d.ts.map +1 -1
  77. package/dist/Transaction.js +3 -3
  78. package/dist/Transaction.js.map +1 -1
  79. package/dist/TransactionInternal.d.ts +3 -3
  80. package/dist/TransactionInternal.d.ts.map +1 -1
  81. package/dist/TransactionInternal.js +6 -6
  82. package/dist/TransactionInternal.js.map +1 -1
  83. package/dist/TreeCompressor.d.ts +5 -1
  84. package/dist/TreeCompressor.d.ts.map +1 -1
  85. package/dist/TreeCompressor.js +5 -5
  86. package/dist/TreeCompressor.js.map +1 -1
  87. package/dist/TreeNodeHandle.d.ts +1 -1
  88. package/dist/TreeNodeHandle.d.ts.map +1 -1
  89. package/dist/TreeNodeHandle.js.map +1 -1
  90. package/dist/TreeView.d.ts +1 -1
  91. package/dist/TreeView.d.ts.map +1 -1
  92. package/dist/TreeView.js +2 -3
  93. package/dist/TreeView.js.map +1 -1
  94. package/dist/UuidUtilities.d.ts.map +1 -1
  95. package/dist/UuidUtilities.js.map +1 -1
  96. package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
  97. package/dist/id-compressor/AppendOnlySortedMap.js +3 -3
  98. package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
  99. package/dist/id-compressor/IdCompressor.d.ts +1 -1
  100. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  101. package/dist/id-compressor/IdCompressor.js +25 -26
  102. package/dist/id-compressor/IdCompressor.js.map +1 -1
  103. package/dist/id-compressor/IdRange.d.ts.map +1 -1
  104. package/dist/id-compressor/IdRange.js +2 -2
  105. package/dist/id-compressor/IdRange.js.map +1 -1
  106. package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
  107. package/dist/id-compressor/NumericUuid.js +2 -1
  108. package/dist/id-compressor/NumericUuid.js.map +1 -1
  109. package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  110. package/dist/id-compressor/SessionIdNormalizer.js +8 -9
  111. package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
  112. package/dist/migration-shim/migrationDeltaHandler.d.ts +1 -1
  113. package/dist/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
  114. package/dist/migration-shim/migrationDeltaHandler.js +11 -11
  115. package/dist/migration-shim/migrationDeltaHandler.js.map +1 -1
  116. package/dist/migration-shim/migrationShim.d.ts +8 -4
  117. package/dist/migration-shim/migrationShim.d.ts.map +1 -1
  118. package/dist/migration-shim/migrationShim.js +13 -13
  119. package/dist/migration-shim/migrationShim.js.map +1 -1
  120. package/dist/migration-shim/migrationShimFactory.d.ts +2 -2
  121. package/dist/migration-shim/migrationShimFactory.d.ts.map +1 -1
  122. package/dist/migration-shim/migrationShimFactory.js +2 -2
  123. package/dist/migration-shim/migrationShimFactory.js.map +1 -1
  124. package/dist/migration-shim/packageVersion.d.ts +0 -2
  125. package/dist/migration-shim/packageVersion.d.ts.map +1 -1
  126. package/dist/migration-shim/packageVersion.js +0 -2
  127. package/dist/migration-shim/packageVersion.js.map +1 -1
  128. package/dist/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
  129. package/dist/migration-shim/sharedTreeDeltaHandler.js +8 -8
  130. package/dist/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
  131. package/dist/migration-shim/sharedTreeShim.d.ts +2 -2
  132. package/dist/migration-shim/sharedTreeShim.d.ts.map +1 -1
  133. package/dist/migration-shim/sharedTreeShim.js +8 -4
  134. package/dist/migration-shim/sharedTreeShim.js.map +1 -1
  135. package/dist/migration-shim/sharedTreeShimFactory.d.ts +1 -1
  136. package/dist/migration-shim/sharedTreeShimFactory.d.ts.map +1 -1
  137. package/dist/migration-shim/sharedTreeShimFactory.js +2 -2
  138. package/dist/migration-shim/sharedTreeShimFactory.js.map +1 -1
  139. package/dist/migration-shim/shimChannelServices.d.ts +1 -1
  140. package/dist/migration-shim/shimChannelServices.d.ts.map +1 -1
  141. package/dist/migration-shim/shimChannelServices.js.map +1 -1
  142. package/dist/migration-shim/shimDeltaConnection.d.ts +1 -1
  143. package/dist/migration-shim/shimDeltaConnection.d.ts.map +1 -1
  144. package/dist/migration-shim/shimDeltaConnection.js +2 -2
  145. package/dist/migration-shim/shimDeltaConnection.js.map +1 -1
  146. package/dist/migration-shim/shimHandle.d.ts.map +1 -1
  147. package/dist/migration-shim/shimHandle.js.map +1 -1
  148. package/dist/migration-shim/types.d.ts +1 -1
  149. package/dist/migration-shim/types.d.ts.map +1 -1
  150. package/dist/migration-shim/types.js.map +1 -1
  151. package/dist/migration-shim/utils.d.ts +1 -1
  152. package/dist/migration-shim/utils.d.ts.map +1 -1
  153. package/dist/migration-shim/utils.js.map +1 -1
  154. package/dist/persisted-types/0.0.2.d.ts +1 -1
  155. package/dist/persisted-types/0.0.2.d.ts.map +1 -1
  156. package/dist/persisted-types/0.0.2.js.map +1 -1
  157. package/dist/persisted-types/0.1.1.d.ts +1 -1
  158. package/dist/persisted-types/0.1.1.d.ts.map +1 -1
  159. package/dist/persisted-types/0.1.1.js +3 -3
  160. package/dist/persisted-types/0.1.1.js.map +1 -1
  161. package/lib/ChangeCompression.d.ts +2 -2
  162. package/lib/ChangeCompression.d.ts.map +1 -1
  163. package/lib/ChangeCompression.js +1 -1
  164. package/lib/ChangeCompression.js.map +1 -1
  165. package/lib/ChangeTypes.d.ts +1 -1
  166. package/lib/ChangeTypes.d.ts.map +1 -1
  167. package/lib/ChangeTypes.js +2 -2
  168. package/lib/ChangeTypes.js.map +1 -1
  169. package/lib/Checkout.d.ts +3 -3
  170. package/lib/Checkout.d.ts.map +1 -1
  171. package/lib/Checkout.js +4 -4
  172. package/lib/Checkout.js.map +1 -1
  173. package/lib/EditLog.d.ts +1 -1
  174. package/lib/EditLog.d.ts.map +1 -1
  175. package/lib/EditLog.js +2 -2
  176. package/lib/EditLog.js.map +1 -1
  177. package/lib/EditUtilities.d.ts +3 -3
  178. package/lib/EditUtilities.d.ts.map +1 -1
  179. package/lib/EditUtilities.js +5 -5
  180. package/lib/EditUtilities.js.map +1 -1
  181. package/lib/Forest.d.ts.map +1 -1
  182. package/lib/Forest.js +2 -2
  183. package/lib/Forest.js.map +1 -1
  184. package/lib/HistoryEditFactory.d.ts +1 -1
  185. package/lib/HistoryEditFactory.d.ts.map +1 -1
  186. package/lib/HistoryEditFactory.js +5 -5
  187. package/lib/HistoryEditFactory.js.map +1 -1
  188. package/lib/IdConversion.d.ts.map +1 -1
  189. package/lib/IdConversion.js.map +1 -1
  190. package/lib/LogViewer.d.ts +2 -2
  191. package/lib/LogViewer.d.ts.map +1 -1
  192. package/lib/LogViewer.js +3 -3
  193. package/lib/LogViewer.js.map +1 -1
  194. package/lib/MergeHealth.d.ts.map +1 -1
  195. package/lib/MergeHealth.js +1 -1
  196. package/lib/MergeHealth.js.map +1 -1
  197. package/lib/NodeIdUtilities.d.ts +1 -1
  198. package/lib/NodeIdUtilities.d.ts.map +1 -1
  199. package/lib/NodeIdUtilities.js +1 -1
  200. package/lib/NodeIdUtilities.js.map +1 -1
  201. package/lib/PayloadUtilities.d.ts.map +1 -1
  202. package/lib/PayloadUtilities.js +1 -1
  203. package/lib/PayloadUtilities.js.map +1 -1
  204. package/lib/ReconciliationPath.d.ts +1 -1
  205. package/lib/ReconciliationPath.d.ts.map +1 -1
  206. package/lib/ReconciliationPath.js.map +1 -1
  207. package/lib/RevisionValueCache.d.ts.map +1 -1
  208. package/lib/RevisionValueCache.js +2 -2
  209. package/lib/RevisionValueCache.js.map +1 -1
  210. package/lib/RevisionView.d.ts +2 -2
  211. package/lib/RevisionView.d.ts.map +1 -1
  212. package/lib/RevisionView.js.map +1 -1
  213. package/lib/SerializationUtilities.d.ts +1 -1
  214. package/lib/SerializationUtilities.d.ts.map +1 -1
  215. package/lib/SerializationUtilities.js.map +1 -1
  216. package/lib/SharedTree.d.ts +8 -7
  217. package/lib/SharedTree.d.ts.map +1 -1
  218. package/lib/SharedTree.js +13 -13
  219. package/lib/SharedTree.js.map +1 -1
  220. package/lib/SharedTreeEncoder.d.ts +1 -1
  221. package/lib/SharedTreeEncoder.d.ts.map +1 -1
  222. package/lib/SharedTreeEncoder.js +5 -5
  223. package/lib/SharedTreeEncoder.js.map +1 -1
  224. package/lib/Summary.d.ts +2 -2
  225. package/lib/Summary.d.ts.map +1 -1
  226. package/lib/Summary.js +1 -1
  227. package/lib/Summary.js.map +1 -1
  228. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  229. package/lib/SummaryBackCompatibility.js.map +1 -1
  230. package/lib/SummaryTestUtilities.d.ts +1 -1
  231. package/lib/SummaryTestUtilities.d.ts.map +1 -1
  232. package/lib/SummaryTestUtilities.js.map +1 -1
  233. package/lib/Transaction.d.ts +3 -3
  234. package/lib/Transaction.d.ts.map +1 -1
  235. package/lib/Transaction.js +3 -3
  236. package/lib/Transaction.js.map +1 -1
  237. package/lib/TransactionInternal.d.ts +3 -3
  238. package/lib/TransactionInternal.d.ts.map +1 -1
  239. package/lib/TransactionInternal.js +3 -3
  240. package/lib/TransactionInternal.js.map +1 -1
  241. package/lib/TreeCompressor.d.ts +5 -1
  242. package/lib/TreeCompressor.d.ts.map +1 -1
  243. package/lib/TreeCompressor.js +2 -2
  244. package/lib/TreeCompressor.js.map +1 -1
  245. package/lib/TreeNodeHandle.d.ts +1 -1
  246. package/lib/TreeNodeHandle.d.ts.map +1 -1
  247. package/lib/TreeNodeHandle.js.map +1 -1
  248. package/lib/TreeView.d.ts +1 -1
  249. package/lib/TreeView.d.ts.map +1 -1
  250. package/lib/TreeView.js +1 -2
  251. package/lib/TreeView.js.map +1 -1
  252. package/lib/UuidUtilities.d.ts.map +1 -1
  253. package/lib/UuidUtilities.js +1 -1
  254. package/lib/UuidUtilities.js.map +1 -1
  255. package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
  256. package/lib/id-compressor/AppendOnlySortedMap.js +1 -1
  257. package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
  258. package/lib/id-compressor/IdCompressor.d.ts +1 -1
  259. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  260. package/lib/id-compressor/IdCompressor.js +4 -5
  261. package/lib/id-compressor/IdCompressor.js.map +1 -1
  262. package/lib/id-compressor/IdRange.d.ts.map +1 -1
  263. package/lib/id-compressor/IdRange.js +1 -1
  264. package/lib/id-compressor/IdRange.js.map +1 -1
  265. package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
  266. package/lib/id-compressor/NumericUuid.js +2 -1
  267. package/lib/id-compressor/NumericUuid.js.map +1 -1
  268. package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  269. package/lib/id-compressor/SessionIdNormalizer.js +1 -2
  270. package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
  271. package/lib/migration-shim/migrationDeltaHandler.d.ts +1 -1
  272. package/lib/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
  273. package/lib/migration-shim/migrationDeltaHandler.js +1 -1
  274. package/lib/migration-shim/migrationDeltaHandler.js.map +1 -1
  275. package/lib/migration-shim/migrationShim.d.ts +8 -4
  276. package/lib/migration-shim/migrationShim.d.ts.map +1 -1
  277. package/lib/migration-shim/migrationShim.js +3 -3
  278. package/lib/migration-shim/migrationShim.js.map +1 -1
  279. package/lib/migration-shim/migrationShimFactory.d.ts +2 -2
  280. package/lib/migration-shim/migrationShimFactory.d.ts.map +1 -1
  281. package/lib/migration-shim/migrationShimFactory.js +1 -1
  282. package/lib/migration-shim/migrationShimFactory.js.map +1 -1
  283. package/lib/migration-shim/packageVersion.d.ts +0 -2
  284. package/lib/migration-shim/packageVersion.d.ts.map +1 -1
  285. package/lib/migration-shim/packageVersion.js +0 -2
  286. package/lib/migration-shim/packageVersion.js.map +1 -1
  287. package/lib/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
  288. package/lib/migration-shim/sharedTreeDeltaHandler.js +1 -1
  289. package/lib/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
  290. package/lib/migration-shim/sharedTreeShim.d.ts +2 -2
  291. package/lib/migration-shim/sharedTreeShim.d.ts.map +1 -1
  292. package/lib/migration-shim/sharedTreeShim.js +6 -2
  293. package/lib/migration-shim/sharedTreeShim.js.map +1 -1
  294. package/lib/migration-shim/sharedTreeShimFactory.d.ts +1 -1
  295. package/lib/migration-shim/sharedTreeShimFactory.d.ts.map +1 -1
  296. package/lib/migration-shim/sharedTreeShimFactory.js +1 -1
  297. package/lib/migration-shim/sharedTreeShimFactory.js.map +1 -1
  298. package/lib/migration-shim/shimChannelServices.d.ts +1 -1
  299. package/lib/migration-shim/shimChannelServices.d.ts.map +1 -1
  300. package/lib/migration-shim/shimChannelServices.js.map +1 -1
  301. package/lib/migration-shim/shimDeltaConnection.d.ts +1 -1
  302. package/lib/migration-shim/shimDeltaConnection.d.ts.map +1 -1
  303. package/lib/migration-shim/shimDeltaConnection.js +1 -1
  304. package/lib/migration-shim/shimDeltaConnection.js.map +1 -1
  305. package/lib/migration-shim/shimHandle.d.ts.map +1 -1
  306. package/lib/migration-shim/shimHandle.js.map +1 -1
  307. package/lib/migration-shim/types.d.ts +1 -1
  308. package/lib/migration-shim/types.d.ts.map +1 -1
  309. package/lib/migration-shim/types.js.map +1 -1
  310. package/lib/migration-shim/utils.d.ts +1 -1
  311. package/lib/migration-shim/utils.d.ts.map +1 -1
  312. package/lib/migration-shim/utils.js.map +1 -1
  313. package/lib/persisted-types/0.0.2.d.ts +1 -1
  314. package/lib/persisted-types/0.0.2.d.ts.map +1 -1
  315. package/lib/persisted-types/0.0.2.js.map +1 -1
  316. package/lib/persisted-types/0.1.1.d.ts +1 -1
  317. package/lib/persisted-types/0.1.1.d.ts.map +1 -1
  318. package/lib/persisted-types/0.1.1.js +1 -1
  319. package/lib/persisted-types/0.1.1.js.map +1 -1
  320. package/package.json +33 -32
  321. package/src/ChangeCompression.ts +8 -8
  322. package/src/ChangeTypes.ts +5 -4
  323. package/src/Checkout.ts +9 -7
  324. package/src/EditLog.ts +4 -3
  325. package/src/EditUtilities.ts +9 -8
  326. package/src/Forest.ts +3 -2
  327. package/src/HistoryEditFactory.ts +12 -11
  328. package/src/IdConversion.ts +2 -2
  329. package/src/LogViewer.ts +5 -4
  330. package/src/MergeHealth.ts +2 -1
  331. package/src/NodeIdUtilities.ts +2 -2
  332. package/src/PayloadUtilities.ts +2 -1
  333. package/src/ReconciliationPath.ts +1 -1
  334. package/src/RevisionValueCache.ts +3 -2
  335. package/src/RevisionView.ts +3 -3
  336. package/src/SerializationUtilities.ts +1 -1
  337. package/src/SharedTree.ts +46 -49
  338. package/src/SharedTreeEncoder.ts +30 -29
  339. package/src/Summary.ts +5 -3
  340. package/src/SummaryBackCompatibility.ts +1 -0
  341. package/src/SummaryTestUtilities.ts +2 -1
  342. package/src/Transaction.ts +7 -6
  343. package/src/TransactionInternal.ts +17 -16
  344. package/src/TreeCompressor.ts +6 -4
  345. package/src/TreeNodeHandle.ts +2 -2
  346. package/src/TreeView.ts +3 -3
  347. package/src/UuidUtilities.ts +2 -1
  348. package/src/id-compressor/AppendOnlySortedMap.ts +2 -1
  349. package/src/id-compressor/IdCompressor.ts +18 -17
  350. package/src/id-compressor/IdRange.ts +2 -1
  351. package/src/id-compressor/NumericUuid.ts +1 -1
  352. package/src/id-compressor/SessionIdNormalizer.ts +3 -3
  353. package/src/migration-shim/migrationDeltaHandler.ts +3 -2
  354. package/src/migration-shim/migrationShim.ts +14 -10
  355. package/src/migration-shim/migrationShimFactory.ts +6 -4
  356. package/src/migration-shim/packageVersion.ts +0 -2
  357. package/src/migration-shim/sharedTreeDeltaHandler.ts +3 -2
  358. package/src/migration-shim/sharedTreeShim.ts +7 -5
  359. package/src/migration-shim/sharedTreeShimFactory.ts +3 -3
  360. package/src/migration-shim/shimChannelServices.ts +1 -1
  361. package/src/migration-shim/shimDeltaConnection.ts +3 -2
  362. package/src/migration-shim/shimHandle.ts +1 -0
  363. package/src/migration-shim/types.ts +3 -1
  364. package/src/migration-shim/utils.ts +2 -1
  365. package/src/persisted-types/0.0.2.ts +2 -2
  366. package/src/persisted-types/0.1.1.ts +10 -8
  367. package/dist/tree-alpha.d.ts +0 -2901
  368. package/dist/tree-beta.d.ts +0 -348
  369. package/dist/tree-public.d.ts +0 -348
  370. package/dist/tree-untrimmed.d.ts +0 -3820
  371. package/lib/test/AppendOnlySortedMap.perf.tests.d.ts +0 -6
  372. package/lib/test/AppendOnlySortedMap.perf.tests.d.ts.map +0 -1
  373. package/lib/test/AppendOnlySortedMap.perf.tests.js +0 -49
  374. package/lib/test/AppendOnlySortedMap.perf.tests.js.map +0 -1
  375. package/lib/test/AppendOnlySortedMap.tests.d.ts +0 -6
  376. package/lib/test/AppendOnlySortedMap.tests.d.ts.map +0 -1
  377. package/lib/test/AppendOnlySortedMap.tests.js +0 -213
  378. package/lib/test/AppendOnlySortedMap.tests.js.map +0 -1
  379. package/lib/test/ChangeCompression.tests.d.ts +0 -6
  380. package/lib/test/ChangeCompression.tests.d.ts.map +0 -1
  381. package/lib/test/ChangeCompression.tests.js +0 -154
  382. package/lib/test/ChangeCompression.tests.js.map +0 -1
  383. package/lib/test/Checkout.tests.d.ts +0 -10
  384. package/lib/test/Checkout.tests.d.ts.map +0 -1
  385. package/lib/test/Checkout.tests.js +0 -460
  386. package/lib/test/Checkout.tests.js.map +0 -1
  387. package/lib/test/Common.tests.d.ts +0 -6
  388. package/lib/test/Common.tests.d.ts.map +0 -1
  389. package/lib/test/Common.tests.js +0 -102
  390. package/lib/test/Common.tests.js.map +0 -1
  391. package/lib/test/EagerCheckout.tests.d.ts +0 -6
  392. package/lib/test/EagerCheckout.tests.d.ts.map +0 -1
  393. package/lib/test/EagerCheckout.tests.js +0 -20
  394. package/lib/test/EagerCheckout.tests.js.map +0 -1
  395. package/lib/test/Edit.tests.d.ts +0 -6
  396. package/lib/test/Edit.tests.d.ts.map +0 -1
  397. package/lib/test/Edit.tests.js +0 -60
  398. package/lib/test/Edit.tests.js.map +0 -1
  399. package/lib/test/EditLog.perf.tests.d.ts +0 -6
  400. package/lib/test/EditLog.perf.tests.d.ts.map +0 -1
  401. package/lib/test/EditLog.perf.tests.js +0 -41
  402. package/lib/test/EditLog.perf.tests.js.map +0 -1
  403. package/lib/test/EditLog.tests.d.ts +0 -6
  404. package/lib/test/EditLog.tests.d.ts.map +0 -1
  405. package/lib/test/EditLog.tests.js +0 -355
  406. package/lib/test/EditLog.tests.js.map +0 -1
  407. package/lib/test/EditUtilities.tests.d.ts +0 -6
  408. package/lib/test/EditUtilities.tests.d.ts.map +0 -1
  409. package/lib/test/EditUtilities.tests.js +0 -512
  410. package/lib/test/EditUtilities.tests.js.map +0 -1
  411. package/lib/test/Forest.perf.tests.d.ts +0 -6
  412. package/lib/test/Forest.perf.tests.d.ts.map +0 -1
  413. package/lib/test/Forest.perf.tests.js +0 -135
  414. package/lib/test/Forest.perf.tests.js.map +0 -1
  415. package/lib/test/Forest.tests.d.ts +0 -6
  416. package/lib/test/Forest.tests.d.ts.map +0 -1
  417. package/lib/test/Forest.tests.js +0 -213
  418. package/lib/test/Forest.tests.js.map +0 -1
  419. package/lib/test/GenericTransaction.tests.d.ts +0 -6
  420. package/lib/test/GenericTransaction.tests.d.ts.map +0 -1
  421. package/lib/test/GenericTransaction.tests.js +0 -31
  422. package/lib/test/GenericTransaction.tests.js.map +0 -1
  423. package/lib/test/HistoryEditFactory.tests.d.ts +0 -6
  424. package/lib/test/HistoryEditFactory.tests.d.ts.map +0 -1
  425. package/lib/test/HistoryEditFactory.tests.js +0 -170
  426. package/lib/test/HistoryEditFactory.tests.js.map +0 -1
  427. package/lib/test/IdCompressor.perf.tests.d.ts +0 -6
  428. package/lib/test/IdCompressor.perf.tests.d.ts.map +0 -1
  429. package/lib/test/IdCompressor.perf.tests.js +0 -290
  430. package/lib/test/IdCompressor.perf.tests.js.map +0 -1
  431. package/lib/test/IdCompressor.tests.d.ts +0 -6
  432. package/lib/test/IdCompressor.tests.d.ts.map +0 -1
  433. package/lib/test/IdCompressor.tests.js +0 -1542
  434. package/lib/test/IdCompressor.tests.js.map +0 -1
  435. package/lib/test/IdConversion.tests.d.ts +0 -6
  436. package/lib/test/IdConversion.tests.d.ts.map +0 -1
  437. package/lib/test/IdConversion.tests.js +0 -36
  438. package/lib/test/IdConversion.tests.js.map +0 -1
  439. package/lib/test/LazyCheckout.tests.d.ts +0 -6
  440. package/lib/test/LazyCheckout.tests.d.ts.map +0 -1
  441. package/lib/test/LazyCheckout.tests.js +0 -22
  442. package/lib/test/LazyCheckout.tests.js.map +0 -1
  443. package/lib/test/LogViewer.tests.d.ts +0 -6
  444. package/lib/test/LogViewer.tests.d.ts.map +0 -1
  445. package/lib/test/LogViewer.tests.js +0 -588
  446. package/lib/test/LogViewer.tests.js.map +0 -1
  447. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts +0 -6
  448. package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +0 -1
  449. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +0 -351
  450. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +0 -1
  451. package/lib/test/NumericUuid.perf.tests.d.ts +0 -6
  452. package/lib/test/NumericUuid.perf.tests.d.ts.map +0 -1
  453. package/lib/test/NumericUuid.perf.tests.js +0 -68
  454. package/lib/test/NumericUuid.perf.tests.js.map +0 -1
  455. package/lib/test/NumericUuid.tests.d.ts +0 -6
  456. package/lib/test/NumericUuid.tests.d.ts.map +0 -1
  457. package/lib/test/NumericUuid.tests.js +0 -192
  458. package/lib/test/NumericUuid.tests.js.map +0 -1
  459. package/lib/test/RevisionValueCache.tests.d.ts +0 -6
  460. package/lib/test/RevisionValueCache.tests.d.ts.map +0 -1
  461. package/lib/test/RevisionValueCache.tests.js +0 -106
  462. package/lib/test/RevisionValueCache.tests.js.map +0 -1
  463. package/lib/test/RevisionView.tests.d.ts +0 -6
  464. package/lib/test/RevisionView.tests.d.ts.map +0 -1
  465. package/lib/test/RevisionView.tests.js +0 -131
  466. package/lib/test/RevisionView.tests.js.map +0 -1
  467. package/lib/test/SessionIdNormalizer.tests.d.ts +0 -6
  468. package/lib/test/SessionIdNormalizer.tests.d.ts.map +0 -1
  469. package/lib/test/SessionIdNormalizer.tests.js +0 -377
  470. package/lib/test/SessionIdNormalizer.tests.js.map +0 -1
  471. package/lib/test/SharedTree.fuzz.tests.d.ts +0 -6
  472. package/lib/test/SharedTree.fuzz.tests.d.ts.map +0 -1
  473. package/lib/test/SharedTree.fuzz.tests.js +0 -9
  474. package/lib/test/SharedTree.fuzz.tests.js.map +0 -1
  475. package/lib/test/SharedTree.perf.tests.d.ts +0 -6
  476. package/lib/test/SharedTree.perf.tests.d.ts.map +0 -1
  477. package/lib/test/SharedTree.perf.tests.js +0 -39
  478. package/lib/test/SharedTree.perf.tests.js.map +0 -1
  479. package/lib/test/SharedTree.tests.d.ts +0 -6
  480. package/lib/test/SharedTree.tests.d.ts.map +0 -1
  481. package/lib/test/SharedTree.tests.js +0 -22
  482. package/lib/test/SharedTree.tests.js.map +0 -1
  483. package/lib/test/StringInterner.tests.d.ts +0 -6
  484. package/lib/test/StringInterner.tests.d.ts.map +0 -1
  485. package/lib/test/StringInterner.tests.js +0 -73
  486. package/lib/test/StringInterner.tests.js.map +0 -1
  487. package/lib/test/Summary.tests.d.ts +0 -7
  488. package/lib/test/Summary.tests.d.ts.map +0 -1
  489. package/lib/test/Summary.tests.js +0 -386
  490. package/lib/test/Summary.tests.js.map +0 -1
  491. package/lib/test/Transaction.tests.d.ts +0 -6
  492. package/lib/test/Transaction.tests.d.ts.map +0 -1
  493. package/lib/test/Transaction.tests.js +0 -124
  494. package/lib/test/Transaction.tests.js.map +0 -1
  495. package/lib/test/TransactionInternal.tests.d.ts +0 -6
  496. package/lib/test/TransactionInternal.tests.d.ts.map +0 -1
  497. package/lib/test/TransactionInternal.tests.js +0 -576
  498. package/lib/test/TransactionInternal.tests.js.map +0 -1
  499. package/lib/test/TreeCompression.tests.d.ts +0 -6
  500. package/lib/test/TreeCompression.tests.d.ts.map +0 -1
  501. package/lib/test/TreeCompression.tests.js +0 -291
  502. package/lib/test/TreeCompression.tests.js.map +0 -1
  503. package/lib/test/TreeView.tests.d.ts +0 -6
  504. package/lib/test/TreeView.tests.d.ts.map +0 -1
  505. package/lib/test/TreeView.tests.js +0 -178
  506. package/lib/test/TreeView.tests.js.map +0 -1
  507. package/lib/test/UndoRedoHandler.tests.d.ts +0 -6
  508. package/lib/test/UndoRedoHandler.tests.d.ts.map +0 -1
  509. package/lib/test/UndoRedoHandler.tests.js +0 -37
  510. package/lib/test/UndoRedoHandler.tests.js.map +0 -1
  511. package/lib/test/fuzz/Generators.d.ts +0 -8
  512. package/lib/test/fuzz/Generators.d.ts.map +0 -1
  513. package/lib/test/fuzz/Generators.js +0 -345
  514. package/lib/test/fuzz/Generators.js.map +0 -1
  515. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +0 -23
  516. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +0 -1
  517. package/lib/test/fuzz/SharedTreeFuzzTests.js +0 -241
  518. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +0 -1
  519. package/lib/test/fuzz/Types.d.ts +0 -136
  520. package/lib/test/fuzz/Types.d.ts.map +0 -1
  521. package/lib/test/fuzz/Types.js +0 -6
  522. package/lib/test/fuzz/Types.js.map +0 -1
  523. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +0 -246
  524. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +0 -1
  525. package/lib/test/utilities/IdCompressorTestUtilities.js +0 -608
  526. package/lib/test/utilities/IdCompressorTestUtilities.js.map +0 -1
  527. package/lib/test/utilities/MockTransaction.d.ts +0 -35
  528. package/lib/test/utilities/MockTransaction.d.ts.map +0 -1
  529. package/lib/test/utilities/MockTransaction.js +0 -51
  530. package/lib/test/utilities/MockTransaction.js.map +0 -1
  531. package/lib/test/utilities/PendingLocalStateTests.d.ts +0 -12
  532. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +0 -1
  533. package/lib/test/utilities/PendingLocalStateTests.js +0 -223
  534. package/lib/test/utilities/PendingLocalStateTests.js.map +0 -1
  535. package/lib/test/utilities/SharedTreeTests.d.ts +0 -12
  536. package/lib/test/utilities/SharedTreeTests.d.ts.map +0 -1
  537. package/lib/test/utilities/SharedTreeTests.js +0 -949
  538. package/lib/test/utilities/SharedTreeTests.js.map +0 -1
  539. package/lib/test/utilities/SharedTreeVersioningTests.d.ts +0 -11
  540. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +0 -1
  541. package/lib/test/utilities/SharedTreeVersioningTests.js +0 -439
  542. package/lib/test/utilities/SharedTreeVersioningTests.js.map +0 -1
  543. package/lib/test/utilities/SummaryLoadPerfTests.d.ts +0 -10
  544. package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +0 -1
  545. package/lib/test/utilities/SummaryLoadPerfTests.js +0 -105
  546. package/lib/test/utilities/SummaryLoadPerfTests.js.map +0 -1
  547. package/lib/test/utilities/SummarySizeTests.d.ts +0 -11
  548. package/lib/test/utilities/SummarySizeTests.d.ts.map +0 -1
  549. package/lib/test/utilities/SummarySizeTests.js +0 -160
  550. package/lib/test/utilities/SummarySizeTests.js.map +0 -1
  551. package/lib/test/utilities/TestCommon.d.ts +0 -13
  552. package/lib/test/utilities/TestCommon.d.ts.map +0 -1
  553. package/lib/test/utilities/TestCommon.js +0 -19
  554. package/lib/test/utilities/TestCommon.js.map +0 -1
  555. package/lib/test/utilities/TestNode.d.ts +0 -140
  556. package/lib/test/utilities/TestNode.d.ts.map +0 -1
  557. package/lib/test/utilities/TestNode.js +0 -282
  558. package/lib/test/utilities/TestNode.js.map +0 -1
  559. package/lib/test/utilities/TestSerializer.d.ts +0 -24
  560. package/lib/test/utilities/TestSerializer.d.ts.map +0 -1
  561. package/lib/test/utilities/TestSerializer.js +0 -40
  562. package/lib/test/utilities/TestSerializer.js.map +0 -1
  563. package/lib/test/utilities/TestUtilities.d.ts +0 -212
  564. package/lib/test/utilities/TestUtilities.d.ts.map +0 -1
  565. package/lib/test/utilities/TestUtilities.js +0 -413
  566. package/lib/test/utilities/TestUtilities.js.map +0 -1
  567. package/lib/test/utilities/UndoRedoTests.d.ts +0 -32
  568. package/lib/test/utilities/UndoRedoTests.d.ts.map +0 -1
  569. package/lib/test/utilities/UndoRedoTests.js +0 -317
  570. package/lib/test/utilities/UndoRedoTests.js.map +0 -1
  571. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Forest.js","sourceRoot":"","sources":["../src/Forest.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,gEAAkD;AAClD,2DAAoD;AACpD,2CAA+F;AAE/F,+DAAwD;AAkBxD;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,IAAgB;IACpD,MAAM,YAAY,GAAG,IAAgD,CAAC;IACtE,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAC;IACtD,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,KAAK,SAAS,CAAC;IAC9D,IAAA,mBAAM,EAAC,SAAS,KAAK,cAAc,EAAE,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACnH,OAAO,SAAS,CAAC;AAClB,CAAC;AAND,oDAMC;AAmCD;;;;GAIG;AACH,MAAa,MAAM;IAuBlB,YAAoB,IAA4B;QAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;SACpD;aAAM;YACN,IAAI,CAAC,KAAK,GAAG,IAAI,wBAAK,CAAqB,SAAS,EAAE,gCAAoB,CAAC,CAAC;YAC5E,IAAI,CAAC,mBAAmB,GAAG,IAAI,IAAI,KAAK,CAAC;SACzC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;SACxB;IACF,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,MAAM,CAAC,mBAAmB,GAAG,KAAK;QAC/C,OAAO,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAC,KAA2B;QACrC,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAExC,+HAA+H;QAC/H,yHAAyH;QAEzH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB,CAAC,CAAC,qEAAqE;QAE1H,6HAA6H;QAC7H,0HAA0H;QAC1H,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC5B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;YAC5B,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;gBAC9C,IAAA,mBAAM,EAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBAC3F,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;oBAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACxC,IAAI,KAAK,KAAK,SAAS,EAAE;wBACxB,0EAA0E;wBAC1E,IAAA,mBAAM,EAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;wBACxF,MAAM,aAAa,GAAG;4BACrB,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,QAAQ,EAAE,UAAU;4BACpB,WAAW,EAAE,UAAU;yBACvB,CAAC;wBACF,IAAA,iCAAqB,EAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;wBACvD,yDAAyD;wBACzD,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;qBACzC;yBAAM;wBACN,yFAAyF;wBACzF,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;qBAC9E;iBACD;aACD;SACD;QAED,8FAA8F;QAC9F,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC5B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtD,IAAA,mBAAM,EAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAClG,IAAI,UAAU,KAAK,SAAS,EAAE;gBAC7B,0HAA0H;gBAC1H,MAAM,KAAK,GAAG;oBACb,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,UAAU;iBACb,CAAC;gBACF,IAAA,iCAAqB,EAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC9C,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;aACzC;iBAAM;gBACN,2EAA2E;gBAC3E,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;aACxC;SACD;QAED,OAAO,IAAI,MAAM,CAAC;YACjB,KAAK,EAAE,YAAY;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC7C,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACI,qBAAqB,CAC3B,QAAgB,EAChB,KAAiB,EACjB,KAAa,EACb,QAA2B;QAE3B,IAAA,mBAAM,EAAC,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAA,mBAAM,EAAC,UAAU,KAAK,SAAS,EAAE,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACrG,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,IAAA,mBAAM,EAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAEhE,+CAA+C;QAC/C,wHAAwH;QACxH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC;SACZ;QACD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC/B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC/B,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvD,IAAA,mBAAM,EAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBAC5F,MAAM,QAAQ,GAAkC;oBAC/C,KAAK,EAAE;wBACN,GAAG,CAAC;wBACJ,QAAQ;wBACR,WAAW,EAAE,KAAK;qBAClB;iBACD,CAAC;gBACF,OAAO,QAAQ,CAAC;YACjB,CAAC,CAAC,CAAC;SACH;QAED,OAAO,IAAI,MAAM,CAAC;YACjB,KAAK,EAAE,YAAY;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC7C,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACI,qBAAqB,CAC3B,QAAgB,EAChB,KAAiB,EACjB,UAAkB,EAClB,QAAgB;QAEhB,IAAA,mBAAM,EAAC,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,UAAU,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAA,mBAAM,EAAC,UAAU,KAAK,SAAS,EAAE,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACrG,IAAI,UAAU,KAAK,QAAQ,EAAE;YAC5B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;SACtC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,IAAA,mBAAM,EAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAa,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE;YAChB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACrB;aAAM;YACN,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;SAC/B;QAED,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC/B,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvD,MAAM,QAAQ,GAA0B;oBACvC,KAAK,EAAE;wBACN,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;qBAChB;iBACD,CAAC;gBACF,IAAA,iCAAqB,EAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBACpD,OAAO,QAAQ,CAAC;YACjB,CAAC,CAAC,CAAC;SACH;QAED,OAAO;YACN,MAAM,EAAE,IAAI,MAAM,CAAC;gBAClB,KAAK,EAAE,YAAY;gBACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;aAC7C,CAAC;YACF,QAAQ;SACR,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,kDAAkD;IAC3C,QAAQ,CAAC,MAAc,EAAE,KAAqB;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAA,mBAAM,EAAC,IAAI,KAAK,SAAS,EAAE,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,IAAI,EAAE;YACnB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;SACxB;aAAM;YACN,OAAO,OAAO,CAAC,OAAO,CAAC;SACvB;QACD,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,IAAI,MAAM,CAAC;YACjB,KAAK,EAAE,YAAY;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC7C,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAA,gBAAI,EAAC,kBAAkB,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,GAAqB,EAAE,cAAuB;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;YACrB,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;SACvD;QAED,OAAO,IAAI,MAAM,CAAC;YACjB,KAAK,EAAE,YAAY;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC7C,CAAC,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,YAAuC,EAAE,EAAU,EAAE,cAAuB;QACnG,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAA,gBAAI,EAAC,2BAA2B,CAAC,CAAC;QACvE,IAAA,mBAAM,EAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAClF,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;YACzC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;gBAC5B,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACvD,MAAM,QAAQ,GAA0B;wBACvC,KAAK,EAAE;4BACN,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,MAAM,EAAE,CAAC,CAAC,MAAM;yBAChB;qBACD,CAAC;oBACF,IAAA,iCAAqB,EAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBACpD,OAAO,QAAQ,CAAC;gBACjB,CAAC,CAAC,CAAC;gBAEH,IAAI,cAAc,EAAE;oBACnB,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;iBAC5D;aACD;SACD;IACF,CAAC;IAED;;;OAGG;IACI,gBAAgB;QACtB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE;YAC/D,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClD,IAAA,mBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACtD,IAAA,mBAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC;aAClF;YAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;gBACzC,IAAA,mBAAM,EAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACjE,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;oBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACtC,IAAA,mBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;oBACzE,IAAA,mBAAM,EAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBACvE,IAAA,mBAAM,EAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;oBAC1F,IAAA,mBAAM,EACL,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAC7B,KAAK,CAAC,wEAAwE,CAC9E,CAAC;oBACF,IAAA,mBAAM,EACL,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAA,gBAAI,EAAC,yCAAyC,CAAC,CAAC,KAAK,MAAM,EAC9E,KAAK,CAAC,gCAAgC,CACtC,CAAC;oBACF,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;iBAC7B;aACD;SACD;IACF,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,EAAU;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE;YACxB,IAAA,gBAAI,EAAC,kBAAkB,CAAC,CAAC;SACzB;QAED,IAAA,mBAAM,EAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACtE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IACrE,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,EAAU;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE;YACxD,OAAO,SAAS,CAAC;SACjB;QAED,OAAO;YACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC9B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,MAAc;QAC3B,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;YACnD,OAAO,IAAI,CAAC;SACZ;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;YAC9B,OAAO,KAAK,CAAC;SACb;QAED,OAAO,IAAA,yBAAa,EAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAc;QAC1B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CACrB,MAAM,CAAC,KAAK,EACZ,CAAC,EAAE,EAAE,EAAE;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,EACD,CAAC,EAAE,EAAE,EAAE;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC,EACD,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACjB;QACF,CAAC,CACD,CAAC;QACF,OAAO;YACN,OAAO;YACP,KAAK;YACL,OAAO;SACP,CAAC;IACH,CAAC;CACD;AAxaD,wBAwaC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,KAAiB,EAAE,KAAiB;IACtE,IAAI,KAAK,KAAK,KAAK,EAAE;QACpB,OAAO,IAAI,CAAC;KACZ;IAED,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,EAAE;QAC1C,OAAO,KAAK,CAAC;KACb;IAED,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,EAAE;QAC1C,OAAO,KAAK,CAAC;KACb;IAED,IAAI,CAAC,IAAA,qCAAe,EAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;QACnD,OAAO,KAAK,CAAC;KACb;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;QAC5C,OAAO,KAAK,CAAC;KACb;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;QAClC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,MAAM,CAAC;QAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE;YACnB,OAAO,KAAK,CAAC;SACb;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE;YAClD,OAAO,KAAK,CAAC;SACb;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE;gBAC1C,OAAO,KAAK,CAAC;aACb;SACD;KACD;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAxCD,gDAwCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BTree } from '@tylerbu/sorted-btree-es6';\nimport { assert } from '@fluidframework/core-utils';\nimport { fail, copyPropertyIfDefined, compareBtrees, compareFiniteNumbers } from './Common.js';\nimport { NodeId, TraitLabel } from './Identifiers.js';\nimport { comparePayloads } from './PayloadUtilities.js';\nimport { NodeData, Payload } from './persisted-types/index.js';\n\n/**\n * A node that can be contained within a Forest\n * @alpha\n */\nexport interface ForestNode extends NodeData<NodeId> {\n\treadonly traits: ReadonlyMap<TraitLabel, readonly NodeId[]>;\n}\n\n/**\n * A node within a Forest that has a parent (and is therefore not the root node)\n *\n * @public\n */\nexport interface ParentedForestNode extends ForestNode, ParentData {}\n\n/**\n * Check whether or not the given node in a forest is parented\n *\n * @public\n */\nexport function isParentedForestNode(node: ForestNode): node is ParentedForestNode {\n\tconst parentedNode = node as ForestNode & Partial<ParentedForestNode>;\n\tconst hasParent = parentedNode.parentId !== undefined;\n\tconst hasTraitParent = parentedNode.traitParent !== undefined;\n\tassert(hasParent === hasTraitParent, 0x610 /* node must have either both parent and traitParent set or neither */);\n\treturn hasParent;\n}\n\n/**\n * Information about a ForestNode's parent\n * @alpha\n */\nexport interface ParentData {\n\treadonly parentId: NodeId;\n\treadonly traitParent: TraitLabel;\n}\n\n/**\n * Differences from one forest to another.\n * @alpha\n */\nexport interface Delta<NodeId> {\n\t/**\n\t * Nodes whose content changed.\n\t */\n\treadonly changed: readonly NodeId[];\n\t/**\n\t * Nodes that were added.\n\t */\n\treadonly added: readonly NodeId[];\n\t/**\n\t * Nodes that were removed.\n\t */\n\treadonly removed: readonly NodeId[];\n}\n\ninterface ForestState {\n\tnodes: BTree<NodeId, ForestNode>;\n\texpensiveValidation: boolean;\n}\n\n/**\n * An immutable forest of ForestNode.\n * Enforces single parenting, and allows querying the parent.\n * @alpha\n */\nexport class Forest {\n\t/**\n\t * Contains the nodes in the forest.\n\t * Used as an immutable data-structure: must not be modified.\n\t */\n\tprivate readonly nodes: BTree<NodeId, ForestNode>;\n\n\t/**\n\t * If true, consistency checks will be applied after forest operations.\n\t */\n\tprivate readonly expensiveValidation: boolean;\n\n\t/**\n\t * Caller must ensure provided BTrees are not modified.\n\t * Will not modify the BTrees.\n\t */\n\tprivate constructor(data: ForestState);\n\n\t/**\n\t * Construct a new forest without reusing nodes from a previous one.\n\t */\n\tprivate constructor(expensiveValidation: boolean);\n\n\tprivate constructor(data?: ForestState | boolean) {\n\t\tif (typeof data === 'object') {\n\t\t\tthis.nodes = data.nodes;\n\t\t\tthis.expensiveValidation = data.expensiveValidation;\n\t\t} else {\n\t\t\tthis.nodes = new BTree<NodeId, ForestNode>(undefined, compareFiniteNumbers);\n\t\t\tthis.expensiveValidation = data ?? false;\n\t\t}\n\t\tif (this.expensiveValidation) {\n\t\t\tthis.assertConsistent();\n\t\t}\n\t}\n\n\t/**\n\t * Creates a new Forest.\n\t */\n\tpublic static create(expensiveValidation = false): Forest {\n\t\treturn new Forest(expensiveValidation);\n\t}\n\n\t/**\n\t * Returns the number of nodes in the forest.\n\t */\n\tpublic get size(): number {\n\t\treturn this.nodes.size;\n\t}\n\n\t/**\n\t * Adds the supplied nodes to the forest. The nodes' IDs must be unique in the forest.\n\t * @param nodes - the sequence of nodes to add to the forest. If any of them have children which exist in the forest already, those\n\t * children will be parented. Any trait arrays present in a node must be non-empty. The nodes may be provided in any order.\n\t */\n\tpublic add(nodes: Iterable<ForestNode>): Forest {\n\t\tconst newNodes = [...nodes];\n\t\tconst mutableNodes = this.nodes.clone();\n\n\t\t// This method iterates through the supplied nodes in two passes, first looking only at children and second actually adding the\n\t\t// nodes. This allows nodes to be passed in any order, e.g. a parent followed by a child or a child followed by a parent.\n\n\t\tconst childToParent = new Map<NodeId, ParentData>(); // Temporarily records the parentage of children that don't exist yet\n\n\t\t// First, inspect the children of each node. If the child is already in the forest, update its parentage. If it is not in the\n\t\t// forest, it may be about to be added in the second loop below so record its parentage temporarily for when that happens.\n\t\tfor (const node of newNodes) {\n\t\t\tconst { identifier } = node;\n\t\t\tfor (const [traitLabel, trait] of node.traits) {\n\t\t\t\tassert(trait.length > 0, 0x611 /* any trait arrays present in a node must be non-empty */);\n\t\t\t\tfor (const childId of trait) {\n\t\t\t\t\tconst child = mutableNodes.get(childId);\n\t\t\t\t\tif (child !== undefined) {\n\t\t\t\t\t\t// A child already exists in the forest, and its parent is now being added\n\t\t\t\t\t\tassert(!isParentedForestNode(child), 0x612 /* can not give a child multiple parents */);\n\t\t\t\t\t\tconst parentedChild = {\n\t\t\t\t\t\t\tdefinition: child.definition,\n\t\t\t\t\t\t\tidentifier: child.identifier,\n\t\t\t\t\t\t\ttraits: child.traits,\n\t\t\t\t\t\t\tparentId: identifier,\n\t\t\t\t\t\t\ttraitParent: traitLabel,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcopyPropertyIfDefined(child, parentedChild, 'payload');\n\t\t\t\t\t\t// Overwrite the existing child with its parented version\n\t\t\t\t\t\tmutableNodes.set(childId, parentedChild);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// The child hasn't been added yet, so record its parentage to use when it is added below\n\t\t\t\t\t\tchildToParent.set(childId, { parentId: identifier, traitParent: traitLabel });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Now add each node to the forest and apply any parentage information that was recorded above\n\t\tfor (const node of newNodes) {\n\t\t\tconst parentData = childToParent.get(node.identifier);\n\t\t\tassert(!mutableNodes.has(node.identifier), 0x613 /* can not add node with already existing id */);\n\t\t\tif (parentData !== undefined) {\n\t\t\t\t// This is a child whom we haven't added yet, but whose parent we already added above. Supply the recorded parentage info.\n\t\t\t\tconst child = {\n\t\t\t\t\tdefinition: node.definition,\n\t\t\t\t\tidentifier: node.identifier,\n\t\t\t\t\ttraits: node.traits,\n\t\t\t\t\t...parentData,\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(node, child, 'payload');\n\t\t\t\tmutableNodes.set(node.identifier, child);\n\t\t\t} else {\n\t\t\t\t// This is a node that has no parent. Add it with no parentage information.\n\t\t\t\tmutableNodes.set(node.identifier, node);\n\t\t\t}\n\t\t}\n\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\t/**\n\t * Parents a set of nodes already in the forest at a specified location within a trait.\n\t * @param parentId - the id of the parent under which to insert the new nodes\n\t * @param label - the label of the trait under which to insert the new nodes\n\t * @param index - the index in the trait after which to insert the new nodes\n\t * @param childIds - the ids of the nodes to insert\n\t */\n\tpublic attachRangeOfChildren(\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tindex: number,\n\t\tchildIds: readonly NodeId[]\n\t): Forest {\n\t\tassert(index >= 0, 0x614 /* invalid attach index */);\n\t\tconst parentNode = this.nodes.get(parentId);\n\t\tassert(parentNode !== undefined, 0x615 /* can not insert children under node that does not exist */);\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tconst traits = new Map(parentNode.traits);\n\t\tconst trait = traits.get(label) ?? [];\n\t\tassert(index <= trait.length, 0x616 /* invalid attach index */);\n\n\t\t// If there is nothing to insert, return early.\n\t\t// This is good for performance, but also avoids an edge case where an empty trait could be created (which is an error).\n\t\tif (childIds.length === 0) {\n\t\t\treturn this;\n\t\t}\n\t\tconst newChildren = [...trait.slice(0, index), ...childIds, ...trait.slice(index)];\n\t\ttraits.set(label, newChildren);\n\t\tmutableNodes.set(parentId, { ...parentNode, traits });\n\n\t\tfor (const childId of childIds) {\n\t\t\tmutableNodes.editRange(childId, childId, true, (_, n) => {\n\t\t\t\tassert(!isParentedForestNode(n), 0x617 /* can not attach node that already has a parent */);\n\t\t\t\tconst breakVal: { value: ParentedForestNode } = {\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\t...n,\n\t\t\t\t\t\tparentId,\n\t\t\t\t\t\ttraitParent: label,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\treturn breakVal;\n\t\t\t});\n\t\t}\n\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\t/**\n\t * Detaches a range of nodes from their parent. The detached nodes remain in the `Forest`.\n\t * @param parentId - the id of the parent from which to detach the nodes\n\t * @param label - the label of the trait from which to detach the nodes\n\t * @param startIndex - the index of the first node in the range to detach\n\t * @param endIndex - the index after the last node in the range to detach\n\t * @returns a new `Forest` with the nodes detached, and a list of the ids of the nodes that were detached\n\t */\n\tpublic detachRangeOfChildren(\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tstartIndex: number,\n\t\tendIndex: number\n\t): { forest: Forest; detached: readonly NodeId[] } {\n\t\tassert(startIndex >= 0 && endIndex >= startIndex, 0x618 /* invalid detach index range */);\n\t\tconst parentNode = this.nodes.get(parentId);\n\t\tassert(parentNode !== undefined, 0x619 /* can not detach children under node that does not exist */);\n\t\tif (startIndex === endIndex) {\n\t\t\treturn { forest: this, detached: [] };\n\t\t}\n\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tconst traits = new Map(parentNode.traits);\n\t\tconst trait = traits.get(label) ?? [];\n\t\tassert(endIndex <= trait.length, 0x61a /* invalid detach index range */);\n\t\tconst detached: NodeId[] = trait.slice(startIndex, endIndex);\n\t\tconst newChildren = [...trait.slice(0, startIndex), ...trait.slice(endIndex)];\n\t\tconst deleteTrait = newChildren.length === 0;\n\t\tif (deleteTrait) {\n\t\t\ttraits.delete(label);\n\t\t} else {\n\t\t\ttraits.set(label, newChildren);\n\t\t}\n\n\t\tmutableNodes.set(parentId, { ...parentNode, traits });\n\t\tfor (const childId of detached) {\n\t\t\tmutableNodes.editRange(childId, childId, true, (_, n) => {\n\t\t\t\tconst breakVal: { value: ForestNode } = {\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tdefinition: n.definition,\n\t\t\t\t\t\tidentifier: n.identifier,\n\t\t\t\t\t\ttraits: n.traits,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(n, breakVal.value, 'payload');\n\t\t\t\treturn breakVal;\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tforest: new Forest({\n\t\t\t\tnodes: mutableNodes,\n\t\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t\t}),\n\t\t\tdetached,\n\t\t};\n\t}\n\n\t/**\n\t * Replaces a node's value. The node must exist in this `Forest`.\n\t * @param nodeId - the id of the node\n\t * @param value - the new value\n\t */\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tpublic setValue(nodeId: NodeId, value: Payload | null): Forest {\n\t\tconst node = this.nodes.get(nodeId);\n\t\tassert(node !== undefined, 0x61b /* can not replace payload for node that does not exist */);\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tconst newNode = { ...node };\n\t\tif (value !== null) {\n\t\t\tnewNode.payload = value;\n\t\t} else {\n\t\t\tdelete newNode.payload;\n\t\t}\n\t\tmutableNodes.set(nodeId, newNode);\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\t/**\n\t * @returns true if the node associated with `id` exists in this forest, otherwise false\n\t */\n\tpublic has(id: NodeId): boolean {\n\t\treturn this.nodes.has(id);\n\t}\n\n\t/**\n\t * @returns the node associated with `id`. Should not be used if there is no node with the provided id.\n\t */\n\tpublic get(id: NodeId): ForestNode {\n\t\treturn this.nodes.get(id) ?? fail('NodeId not found');\n\t}\n\n\t/**\n\t * @returns the node associated with `id`, or undefined if there is none\n\t */\n\tpublic tryGet(id: NodeId): ForestNode | undefined {\n\t\treturn this.nodes.get(id);\n\t}\n\n\t/**\n\t * Deletes every node in ids (each of which must be unparented)\n\t * @param ids - The IDs of the nodes to delete.\n\t * @param deleteChildren - If true, recursively deletes descendants. Otherwise, leaves children unparented.\n\t */\n\tpublic delete(ids: Iterable<NodeId>, deleteChildren: boolean): Forest {\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tfor (const id of ids) {\n\t\t\tthis.deleteRecursive(mutableNodes, id, deleteChildren);\n\t\t}\n\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\tprivate deleteRecursive(mutableNodes: BTree<NodeId, ForestNode>, id: NodeId, deleteChildren: boolean): void {\n\t\tconst node = mutableNodes.get(id) ?? fail('node to delete must exist');\n\t\tassert(!isParentedForestNode(node), 0x61c /* deleted nodes must be unparented */);\n\t\tmutableNodes.delete(id);\n\t\tfor (const trait of node.traits.values()) {\n\t\t\tfor (const childId of trait) {\n\t\t\t\tmutableNodes.editRange(childId, childId, true, (_, n) => {\n\t\t\t\t\tconst breakVal: { value: ForestNode } = {\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tdefinition: n.definition,\n\t\t\t\t\t\t\tidentifier: n.identifier,\n\t\t\t\t\t\t\ttraits: n.traits,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tcopyPropertyIfDefined(n, breakVal.value, 'payload');\n\t\t\t\t\treturn breakVal;\n\t\t\t\t});\n\n\t\t\t\tif (deleteChildren) {\n\t\t\t\t\tthis.deleteRecursive(mutableNodes, childId, deleteChildren);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks that the metadata is correct, and the items form a forest.\n\t * This is an expensive O(map size) operation.\n\t */\n\tpublic assertConsistent(): void {\n\t\tconst checkedChildren = new Set<NodeId>([]);\n\t\tfor (const [nodeId, node] of this.nodes.entries(undefined, [])) {\n\t\t\tif (isParentedForestNode(node)) {\n\t\t\t\tconst parent = this.get(node.parentId);\n\t\t\t\tconst trait = parent.traits.get(node.traitParent);\n\t\t\t\tassert(trait !== undefined, 0x61d /* trait exists */);\n\t\t\t\tassert(trait.includes(node.identifier), 0x61e /* node is parented incorrectly */);\n\t\t\t}\n\n\t\t\tfor (const trait of node.traits.values()) {\n\t\t\t\tassert(trait.length > 0, 0x61f /* trait is present but empty */);\n\t\t\t\tfor (const childId of trait) {\n\t\t\t\t\tconst child = this.nodes.get(childId);\n\t\t\t\t\tassert(child !== undefined, 0x620 /* child in trait is not in forest */);\n\t\t\t\t\tassert(isParentedForestNode(child), 0x621 /* child is not parented */);\n\t\t\t\t\tassert(child.parentId === node.identifier, 0x622 /* child parent pointer is incorrect */);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!checkedChildren.has(childId),\n\t\t\t\t\t\t0x623 /* the item tree tree must not contain cycles or multi-parented nodes */\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(child.parentId ?? fail('each node must have associated metadata')) === nodeId,\n\t\t\t\t\t\t0x624 /* cached parent is incorrect */\n\t\t\t\t\t);\n\t\t\t\t\tcheckedChildren.add(childId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @returns the parent of `id`. Should not be used if there is no node with id or if id refers to the root node.\n\t */\n\tpublic getParent(id: NodeId): ParentData {\n\t\tconst child = this.nodes.get(id);\n\t\tif (child === undefined) {\n\t\t\tfail('NodeId not found');\n\t\t}\n\n\t\tassert(isParentedForestNode(child), 0x625 /* Node is not parented */);\n\t\treturn { parentId: child.parentId, traitParent: child.traitParent };\n\t}\n\n\t/**\n\t * @returns undefined iff root, otherwise the parent of `id`.\n\t */\n\tpublic tryGetParent(id: NodeId): ParentData | undefined {\n\t\tconst child = this.nodes.get(id);\n\t\tif (child === undefined || !isParentedForestNode(child)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tparentId: child.parentId,\n\t\t\ttraitParent: child.traitParent,\n\t\t};\n\t}\n\n\t/**\n\t * Compares two forests for equality.\n\t * @param forest - the other forest to compare to this one\n\t * @param comparator - a function which returns true if two objects of type ForestNode are equivalent, false otherwise\n\t * @returns true iff the forests are equal.\n\t */\n\tpublic equals(forest: Forest): boolean {\n\t\tif (this === forest || this.nodes === forest.nodes) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (forest.size !== this.size) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn compareBtrees(this.nodes, forest.nodes, compareForestNodes);\n\t}\n\n\t/**\n\t * Calculate the difference between two forests.\n\t * @param forest - the other forest to compare to this one\n\t * @param comparator - a function which returns true if two objects of type ForestNode are equivalent, false otherwise\n\t * @returns A {@link Delta} listing which nodes must be changed, added, and removed to get from `this` to `forest`.\n\t */\n\tpublic delta(forest: Forest): Delta<NodeId> {\n\t\tconst changed: NodeId[] = [];\n\t\tconst removed: NodeId[] = [];\n\t\tconst added: NodeId[] = [];\n\t\tthis.nodes.diffAgainst(\n\t\t\tforest.nodes,\n\t\t\t(id) => {\n\t\t\t\tremoved.push(id);\n\t\t\t},\n\t\t\t(id) => {\n\t\t\t\tadded.push(id);\n\t\t\t},\n\t\t\t(id, nodeThis, nodeOther) => {\n\t\t\t\tif (!compareForestNodes(nodeThis, nodeOther)) {\n\t\t\t\t\tchanged.push(id);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\treturn {\n\t\t\tchanged,\n\t\t\tadded,\n\t\t\tremoved,\n\t\t};\n\t}\n}\n\n/**\n * @returns true iff two `ForestNodes` are equivalent.\n * May return false for nodes they contain equivalent payloads encoded differently.\n */\nexport function compareForestNodes(nodeA: ForestNode, nodeB: ForestNode): boolean {\n\tif (nodeA === nodeB) {\n\t\treturn true;\n\t}\n\n\tif (nodeA.identifier !== nodeB.identifier) {\n\t\treturn false;\n\t}\n\n\tif (nodeA.definition !== nodeB.definition) {\n\t\treturn false;\n\t}\n\n\tif (!comparePayloads(nodeA.payload, nodeB.payload)) {\n\t\treturn false;\n\t}\n\n\tif (nodeA.traits.size !== nodeB.traits.size) {\n\t\treturn false;\n\t}\n\n\tfor (const traitA of nodeA.traits) {\n\t\tconst [traitLabelA, nodeSequenceA] = traitA;\n\t\tconst nodeSequenceB = nodeB.traits.get(traitLabelA);\n\t\tif (!nodeSequenceB) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (nodeSequenceA.length !== nodeSequenceB.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let i = 0; i < nodeSequenceA.length; i++) {\n\t\t\tif (nodeSequenceA[i] !== nodeSequenceB[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"Forest.js","sourceRoot":"","sources":["../src/Forest.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from '@fluidframework/core-utils/internal';\nimport { BTree } from '@tylerbu/sorted-btree-es6';\n\nimport { compareBtrees, compareFiniteNumbers, copyPropertyIfDefined, fail } from './Common.js';\nimport { NodeId, TraitLabel } from './Identifiers.js';\nimport { comparePayloads } from './PayloadUtilities.js';\nimport { NodeData, Payload } from './persisted-types/index.js';\n\n/**\n * A node that can be contained within a Forest\n * @alpha\n */\nexport interface ForestNode extends NodeData<NodeId> {\n\treadonly traits: ReadonlyMap<TraitLabel, readonly NodeId[]>;\n}\n\n/**\n * A node within a Forest that has a parent (and is therefore not the root node)\n *\n * @public\n */\nexport interface ParentedForestNode extends ForestNode, ParentData {}\n\n/**\n * Check whether or not the given node in a forest is parented\n *\n * @public\n */\nexport function isParentedForestNode(node: ForestNode): node is ParentedForestNode {\n\tconst parentedNode = node as ForestNode & Partial<ParentedForestNode>;\n\tconst hasParent = parentedNode.parentId !== undefined;\n\tconst hasTraitParent = parentedNode.traitParent !== undefined;\n\tassert(hasParent === hasTraitParent, 0x610 /* node must have either both parent and traitParent set or neither */);\n\treturn hasParent;\n}\n\n/**\n * Information about a ForestNode's parent\n * @alpha\n */\nexport interface ParentData {\n\treadonly parentId: NodeId;\n\treadonly traitParent: TraitLabel;\n}\n\n/**\n * Differences from one forest to another.\n * @alpha\n */\nexport interface Delta<NodeId> {\n\t/**\n\t * Nodes whose content changed.\n\t */\n\treadonly changed: readonly NodeId[];\n\t/**\n\t * Nodes that were added.\n\t */\n\treadonly added: readonly NodeId[];\n\t/**\n\t * Nodes that were removed.\n\t */\n\treadonly removed: readonly NodeId[];\n}\n\ninterface ForestState {\n\tnodes: BTree<NodeId, ForestNode>;\n\texpensiveValidation: boolean;\n}\n\n/**\n * An immutable forest of ForestNode.\n * Enforces single parenting, and allows querying the parent.\n * @alpha\n */\nexport class Forest {\n\t/**\n\t * Contains the nodes in the forest.\n\t * Used as an immutable data-structure: must not be modified.\n\t */\n\tprivate readonly nodes: BTree<NodeId, ForestNode>;\n\n\t/**\n\t * If true, consistency checks will be applied after forest operations.\n\t */\n\tprivate readonly expensiveValidation: boolean;\n\n\t/**\n\t * Caller must ensure provided BTrees are not modified.\n\t * Will not modify the BTrees.\n\t */\n\tprivate constructor(data: ForestState);\n\n\t/**\n\t * Construct a new forest without reusing nodes from a previous one.\n\t */\n\tprivate constructor(expensiveValidation: boolean);\n\n\tprivate constructor(data?: ForestState | boolean) {\n\t\tif (typeof data === 'object') {\n\t\t\tthis.nodes = data.nodes;\n\t\t\tthis.expensiveValidation = data.expensiveValidation;\n\t\t} else {\n\t\t\tthis.nodes = new BTree<NodeId, ForestNode>(undefined, compareFiniteNumbers);\n\t\t\tthis.expensiveValidation = data ?? false;\n\t\t}\n\t\tif (this.expensiveValidation) {\n\t\t\tthis.assertConsistent();\n\t\t}\n\t}\n\n\t/**\n\t * Creates a new Forest.\n\t */\n\tpublic static create(expensiveValidation = false): Forest {\n\t\treturn new Forest(expensiveValidation);\n\t}\n\n\t/**\n\t * Returns the number of nodes in the forest.\n\t */\n\tpublic get size(): number {\n\t\treturn this.nodes.size;\n\t}\n\n\t/**\n\t * Adds the supplied nodes to the forest. The nodes' IDs must be unique in the forest.\n\t * @param nodes - the sequence of nodes to add to the forest. If any of them have children which exist in the forest already, those\n\t * children will be parented. Any trait arrays present in a node must be non-empty. The nodes may be provided in any order.\n\t */\n\tpublic add(nodes: Iterable<ForestNode>): Forest {\n\t\tconst newNodes = [...nodes];\n\t\tconst mutableNodes = this.nodes.clone();\n\n\t\t// This method iterates through the supplied nodes in two passes, first looking only at children and second actually adding the\n\t\t// nodes. This allows nodes to be passed in any order, e.g. a parent followed by a child or a child followed by a parent.\n\n\t\tconst childToParent = new Map<NodeId, ParentData>(); // Temporarily records the parentage of children that don't exist yet\n\n\t\t// First, inspect the children of each node. If the child is already in the forest, update its parentage. If it is not in the\n\t\t// forest, it may be about to be added in the second loop below so record its parentage temporarily for when that happens.\n\t\tfor (const node of newNodes) {\n\t\t\tconst { identifier } = node;\n\t\t\tfor (const [traitLabel, trait] of node.traits) {\n\t\t\t\tassert(trait.length > 0, 0x611 /* any trait arrays present in a node must be non-empty */);\n\t\t\t\tfor (const childId of trait) {\n\t\t\t\t\tconst child = mutableNodes.get(childId);\n\t\t\t\t\tif (child !== undefined) {\n\t\t\t\t\t\t// A child already exists in the forest, and its parent is now being added\n\t\t\t\t\t\tassert(!isParentedForestNode(child), 0x612 /* can not give a child multiple parents */);\n\t\t\t\t\t\tconst parentedChild = {\n\t\t\t\t\t\t\tdefinition: child.definition,\n\t\t\t\t\t\t\tidentifier: child.identifier,\n\t\t\t\t\t\t\ttraits: child.traits,\n\t\t\t\t\t\t\tparentId: identifier,\n\t\t\t\t\t\t\ttraitParent: traitLabel,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcopyPropertyIfDefined(child, parentedChild, 'payload');\n\t\t\t\t\t\t// Overwrite the existing child with its parented version\n\t\t\t\t\t\tmutableNodes.set(childId, parentedChild);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// The child hasn't been added yet, so record its parentage to use when it is added below\n\t\t\t\t\t\tchildToParent.set(childId, { parentId: identifier, traitParent: traitLabel });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Now add each node to the forest and apply any parentage information that was recorded above\n\t\tfor (const node of newNodes) {\n\t\t\tconst parentData = childToParent.get(node.identifier);\n\t\t\tassert(!mutableNodes.has(node.identifier), 0x613 /* can not add node with already existing id */);\n\t\t\tif (parentData !== undefined) {\n\t\t\t\t// This is a child whom we haven't added yet, but whose parent we already added above. Supply the recorded parentage info.\n\t\t\t\tconst child = {\n\t\t\t\t\tdefinition: node.definition,\n\t\t\t\t\tidentifier: node.identifier,\n\t\t\t\t\ttraits: node.traits,\n\t\t\t\t\t...parentData,\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(node, child, 'payload');\n\t\t\t\tmutableNodes.set(node.identifier, child);\n\t\t\t} else {\n\t\t\t\t// This is a node that has no parent. Add it with no parentage information.\n\t\t\t\tmutableNodes.set(node.identifier, node);\n\t\t\t}\n\t\t}\n\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\t/**\n\t * Parents a set of nodes already in the forest at a specified location within a trait.\n\t * @param parentId - the id of the parent under which to insert the new nodes\n\t * @param label - the label of the trait under which to insert the new nodes\n\t * @param index - the index in the trait after which to insert the new nodes\n\t * @param childIds - the ids of the nodes to insert\n\t */\n\tpublic attachRangeOfChildren(\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tindex: number,\n\t\tchildIds: readonly NodeId[]\n\t): Forest {\n\t\tassert(index >= 0, 0x614 /* invalid attach index */);\n\t\tconst parentNode = this.nodes.get(parentId);\n\t\tassert(parentNode !== undefined, 0x615 /* can not insert children under node that does not exist */);\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tconst traits = new Map(parentNode.traits);\n\t\tconst trait = traits.get(label) ?? [];\n\t\tassert(index <= trait.length, 0x616 /* invalid attach index */);\n\n\t\t// If there is nothing to insert, return early.\n\t\t// This is good for performance, but also avoids an edge case where an empty trait could be created (which is an error).\n\t\tif (childIds.length === 0) {\n\t\t\treturn this;\n\t\t}\n\t\tconst newChildren = [...trait.slice(0, index), ...childIds, ...trait.slice(index)];\n\t\ttraits.set(label, newChildren);\n\t\tmutableNodes.set(parentId, { ...parentNode, traits });\n\n\t\tfor (const childId of childIds) {\n\t\t\tmutableNodes.editRange(childId, childId, true, (_, n) => {\n\t\t\t\tassert(!isParentedForestNode(n), 0x617 /* can not attach node that already has a parent */);\n\t\t\t\tconst breakVal: { value: ParentedForestNode } = {\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\t...n,\n\t\t\t\t\t\tparentId,\n\t\t\t\t\t\ttraitParent: label,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\treturn breakVal;\n\t\t\t});\n\t\t}\n\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\t/**\n\t * Detaches a range of nodes from their parent. The detached nodes remain in the `Forest`.\n\t * @param parentId - the id of the parent from which to detach the nodes\n\t * @param label - the label of the trait from which to detach the nodes\n\t * @param startIndex - the index of the first node in the range to detach\n\t * @param endIndex - the index after the last node in the range to detach\n\t * @returns a new `Forest` with the nodes detached, and a list of the ids of the nodes that were detached\n\t */\n\tpublic detachRangeOfChildren(\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tstartIndex: number,\n\t\tendIndex: number\n\t): { forest: Forest; detached: readonly NodeId[] } {\n\t\tassert(startIndex >= 0 && endIndex >= startIndex, 0x618 /* invalid detach index range */);\n\t\tconst parentNode = this.nodes.get(parentId);\n\t\tassert(parentNode !== undefined, 0x619 /* can not detach children under node that does not exist */);\n\t\tif (startIndex === endIndex) {\n\t\t\treturn { forest: this, detached: [] };\n\t\t}\n\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tconst traits = new Map(parentNode.traits);\n\t\tconst trait = traits.get(label) ?? [];\n\t\tassert(endIndex <= trait.length, 0x61a /* invalid detach index range */);\n\t\tconst detached: NodeId[] = trait.slice(startIndex, endIndex);\n\t\tconst newChildren = [...trait.slice(0, startIndex), ...trait.slice(endIndex)];\n\t\tconst deleteTrait = newChildren.length === 0;\n\t\tif (deleteTrait) {\n\t\t\ttraits.delete(label);\n\t\t} else {\n\t\t\ttraits.set(label, newChildren);\n\t\t}\n\n\t\tmutableNodes.set(parentId, { ...parentNode, traits });\n\t\tfor (const childId of detached) {\n\t\t\tmutableNodes.editRange(childId, childId, true, (_, n) => {\n\t\t\t\tconst breakVal: { value: ForestNode } = {\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tdefinition: n.definition,\n\t\t\t\t\t\tidentifier: n.identifier,\n\t\t\t\t\t\ttraits: n.traits,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(n, breakVal.value, 'payload');\n\t\t\t\treturn breakVal;\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tforest: new Forest({\n\t\t\t\tnodes: mutableNodes,\n\t\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t\t}),\n\t\t\tdetached,\n\t\t};\n\t}\n\n\t/**\n\t * Replaces a node's value. The node must exist in this `Forest`.\n\t * @param nodeId - the id of the node\n\t * @param value - the new value\n\t */\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tpublic setValue(nodeId: NodeId, value: Payload | null): Forest {\n\t\tconst node = this.nodes.get(nodeId);\n\t\tassert(node !== undefined, 0x61b /* can not replace payload for node that does not exist */);\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tconst newNode = { ...node };\n\t\tif (value !== null) {\n\t\t\tnewNode.payload = value;\n\t\t} else {\n\t\t\tdelete newNode.payload;\n\t\t}\n\t\tmutableNodes.set(nodeId, newNode);\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\t/**\n\t * @returns true if the node associated with `id` exists in this forest, otherwise false\n\t */\n\tpublic has(id: NodeId): boolean {\n\t\treturn this.nodes.has(id);\n\t}\n\n\t/**\n\t * @returns the node associated with `id`. Should not be used if there is no node with the provided id.\n\t */\n\tpublic get(id: NodeId): ForestNode {\n\t\treturn this.nodes.get(id) ?? fail('NodeId not found');\n\t}\n\n\t/**\n\t * @returns the node associated with `id`, or undefined if there is none\n\t */\n\tpublic tryGet(id: NodeId): ForestNode | undefined {\n\t\treturn this.nodes.get(id);\n\t}\n\n\t/**\n\t * Deletes every node in ids (each of which must be unparented)\n\t * @param ids - The IDs of the nodes to delete.\n\t * @param deleteChildren - If true, recursively deletes descendants. Otherwise, leaves children unparented.\n\t */\n\tpublic delete(ids: Iterable<NodeId>, deleteChildren: boolean): Forest {\n\t\tconst mutableNodes = this.nodes.clone();\n\t\tfor (const id of ids) {\n\t\t\tthis.deleteRecursive(mutableNodes, id, deleteChildren);\n\t\t}\n\n\t\treturn new Forest({\n\t\t\tnodes: mutableNodes,\n\t\t\texpensiveValidation: this.expensiveValidation,\n\t\t});\n\t}\n\n\tprivate deleteRecursive(mutableNodes: BTree<NodeId, ForestNode>, id: NodeId, deleteChildren: boolean): void {\n\t\tconst node = mutableNodes.get(id) ?? fail('node to delete must exist');\n\t\tassert(!isParentedForestNode(node), 0x61c /* deleted nodes must be unparented */);\n\t\tmutableNodes.delete(id);\n\t\tfor (const trait of node.traits.values()) {\n\t\t\tfor (const childId of trait) {\n\t\t\t\tmutableNodes.editRange(childId, childId, true, (_, n) => {\n\t\t\t\t\tconst breakVal: { value: ForestNode } = {\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tdefinition: n.definition,\n\t\t\t\t\t\t\tidentifier: n.identifier,\n\t\t\t\t\t\t\ttraits: n.traits,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tcopyPropertyIfDefined(n, breakVal.value, 'payload');\n\t\t\t\t\treturn breakVal;\n\t\t\t\t});\n\n\t\t\t\tif (deleteChildren) {\n\t\t\t\t\tthis.deleteRecursive(mutableNodes, childId, deleteChildren);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks that the metadata is correct, and the items form a forest.\n\t * This is an expensive O(map size) operation.\n\t */\n\tpublic assertConsistent(): void {\n\t\tconst checkedChildren = new Set<NodeId>([]);\n\t\tfor (const [nodeId, node] of this.nodes.entries(undefined, [])) {\n\t\t\tif (isParentedForestNode(node)) {\n\t\t\t\tconst parent = this.get(node.parentId);\n\t\t\t\tconst trait = parent.traits.get(node.traitParent);\n\t\t\t\tassert(trait !== undefined, 0x61d /* trait exists */);\n\t\t\t\tassert(trait.includes(node.identifier), 0x61e /* node is parented incorrectly */);\n\t\t\t}\n\n\t\t\tfor (const trait of node.traits.values()) {\n\t\t\t\tassert(trait.length > 0, 0x61f /* trait is present but empty */);\n\t\t\t\tfor (const childId of trait) {\n\t\t\t\t\tconst child = this.nodes.get(childId);\n\t\t\t\t\tassert(child !== undefined, 0x620 /* child in trait is not in forest */);\n\t\t\t\t\tassert(isParentedForestNode(child), 0x621 /* child is not parented */);\n\t\t\t\t\tassert(child.parentId === node.identifier, 0x622 /* child parent pointer is incorrect */);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t!checkedChildren.has(childId),\n\t\t\t\t\t\t0x623 /* the item tree tree must not contain cycles or multi-parented nodes */\n\t\t\t\t\t);\n\t\t\t\t\tassert(\n\t\t\t\t\t\t(child.parentId ?? fail('each node must have associated metadata')) === nodeId,\n\t\t\t\t\t\t0x624 /* cached parent is incorrect */\n\t\t\t\t\t);\n\t\t\t\t\tcheckedChildren.add(childId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @returns the parent of `id`. Should not be used if there is no node with id or if id refers to the root node.\n\t */\n\tpublic getParent(id: NodeId): ParentData {\n\t\tconst child = this.nodes.get(id);\n\t\tif (child === undefined) {\n\t\t\tfail('NodeId not found');\n\t\t}\n\n\t\tassert(isParentedForestNode(child), 0x625 /* Node is not parented */);\n\t\treturn { parentId: child.parentId, traitParent: child.traitParent };\n\t}\n\n\t/**\n\t * @returns undefined iff root, otherwise the parent of `id`.\n\t */\n\tpublic tryGetParent(id: NodeId): ParentData | undefined {\n\t\tconst child = this.nodes.get(id);\n\t\tif (child === undefined || !isParentedForestNode(child)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tparentId: child.parentId,\n\t\t\ttraitParent: child.traitParent,\n\t\t};\n\t}\n\n\t/**\n\t * Compares two forests for equality.\n\t * @param forest - the other forest to compare to this one\n\t * @param comparator - a function which returns true if two objects of type ForestNode are equivalent, false otherwise\n\t * @returns true iff the forests are equal.\n\t */\n\tpublic equals(forest: Forest): boolean {\n\t\tif (this === forest || this.nodes === forest.nodes) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (forest.size !== this.size) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn compareBtrees(this.nodes, forest.nodes, compareForestNodes);\n\t}\n\n\t/**\n\t * Calculate the difference between two forests.\n\t * @param forest - the other forest to compare to this one\n\t * @param comparator - a function which returns true if two objects of type ForestNode are equivalent, false otherwise\n\t * @returns A {@link Delta} listing which nodes must be changed, added, and removed to get from `this` to `forest`.\n\t */\n\tpublic delta(forest: Forest): Delta<NodeId> {\n\t\tconst changed: NodeId[] = [];\n\t\tconst removed: NodeId[] = [];\n\t\tconst added: NodeId[] = [];\n\t\tthis.nodes.diffAgainst(\n\t\t\tforest.nodes,\n\t\t\t(id) => {\n\t\t\t\tremoved.push(id);\n\t\t\t},\n\t\t\t(id) => {\n\t\t\t\tadded.push(id);\n\t\t\t},\n\t\t\t(id, nodeThis, nodeOther) => {\n\t\t\t\tif (!compareForestNodes(nodeThis, nodeOther)) {\n\t\t\t\t\tchanged.push(id);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\treturn {\n\t\t\tchanged,\n\t\t\tadded,\n\t\t\tremoved,\n\t\t};\n\t}\n}\n\n/**\n * @returns true iff two `ForestNodes` are equivalent.\n * May return false for nodes they contain equivalent payloads encoded differently.\n */\nexport function compareForestNodes(nodeA: ForestNode, nodeB: ForestNode): boolean {\n\tif (nodeA === nodeB) {\n\t\treturn true;\n\t}\n\n\tif (nodeA.identifier !== nodeB.identifier) {\n\t\treturn false;\n\t}\n\n\tif (nodeA.definition !== nodeB.definition) {\n\t\treturn false;\n\t}\n\n\tif (!comparePayloads(nodeA.payload, nodeB.payload)) {\n\t\treturn false;\n\t}\n\n\tif (nodeA.traits.size !== nodeB.traits.size) {\n\t\treturn false;\n\t}\n\n\tfor (const traitA of nodeA.traits) {\n\t\tconst [traitLabelA, nodeSequenceA] = traitA;\n\t\tconst nodeSequenceB = nodeB.traits.get(traitLabelA);\n\t\tif (!nodeSequenceB) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (nodeSequenceA.length !== nodeSequenceB.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let i = 0; i < nodeSequenceA.length; i++) {\n\t\t\tif (nodeSequenceA[i] !== nodeSequenceB[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils';
6
- import { ChangeInternal } from './persisted-types/index.js';
7
6
  import { RevisionView } from './RevisionView.js';
7
+ import { ChangeInternal } from './persisted-types/index.js';
8
8
  /**
9
9
  * Events emitted from the history edit factory
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"HistoryEditFactory.d.ts","sourceRoot":"","sources":["../src/HistoryEditFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAItE,OAAO,EACN,cAAc,EASd,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD;;GAEG;AACH,oBAAY,wBAAwB;IACnC,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CACrB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,mBAAmB,EAC5B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAC5C,cAAc,EAAE,GAAG,SAAS,CAkI9B"}
1
+ {"version":3,"file":"HistoryEditFactory.d.ts","sourceRoot":"","sources":["../src/HistoryEditFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAMtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKjD,OAAO,EAEN,cAAc,EAQd,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,oBAAY,wBAAwB;IACnC,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CACrB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,mBAAmB,EAC5B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAC5C,cAAc,EAAE,GAAG,SAAS,CAkI9B"}
@@ -5,14 +5,14 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.revert = exports.HistoryEditFactoryEvents = void 0;
8
- const core_utils_1 = require("@fluidframework/core-utils");
9
- const Identifiers_js_1 = require("./Identifiers.js");
8
+ const internal_1 = require("@fluidframework/core-utils/internal");
10
9
  const Common_js_1 = require("./Common.js");
11
- const TreeViewUtilities_js_1 = require("./TreeViewUtilities.js");
12
- const index_js_1 = require("./persisted-types/index.js");
13
- const TransactionInternal_js_1 = require("./TransactionInternal.js");
14
10
  const EditUtilities_js_1 = require("./EditUtilities.js");
11
+ const Identifiers_js_1 = require("./Identifiers.js");
15
12
  const SerializationUtilities_js_1 = require("./SerializationUtilities.js");
13
+ const TransactionInternal_js_1 = require("./TransactionInternal.js");
14
+ const TreeViewUtilities_js_1 = require("./TreeViewUtilities.js");
15
+ const index_js_1 = require("./persisted-types/index.js");
16
16
  /**
17
17
  * Events emitted from the history edit factory
18
18
  */
@@ -49,8 +49,8 @@ function revert(changes, before, logger, emit) {
49
49
  case index_js_1.ChangeTypeInternal.Build: {
50
50
  // Save nodes added to the detached state for use in future changes
51
51
  const { destination, source } = change;
52
- (0, core_utils_1.assert)(!builtNodes.has(destination), 0x626 /* Cannot revert Build: destination is already used by a Build */);
53
- (0, core_utils_1.assert)(!detachedNodes.has(destination), 0x627 /* Cannot revert Build: destination is already used by a Detach */);
52
+ (0, internal_1.assert)(!builtNodes.has(destination), 0x626 /* Cannot revert Build: destination is already used by a Build */);
53
+ (0, internal_1.assert)(!detachedNodes.has(destination), 0x627 /* Cannot revert Build: destination is already used by a Detach */);
54
54
  builtNodes.set(destination, source.reduce((ids, curr) => {
55
55
  if ((0, Identifiers_js_1.isDetachedSequenceId)(curr)) {
56
56
  const nodesForDetachedSequence = builtNodes.get(curr) ?? (0, Common_js_1.fail)('detached sequence must have associated built nodes');
@@ -1 +1 @@
1
- {"version":3,"file":"HistoryEditFactory.js","sourceRoot":"","sources":["../src/HistoryEditFactory.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from '@fluidframework/core-utils';\nimport { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils';\nimport { DetachedSequenceId, isDetachedSequenceId, NodeId } from './Identifiers.js';\nimport { fail } from './Common.js';\nimport { rangeFromStableRange } from './TreeViewUtilities.js';\nimport {\n\tChangeInternal,\n\tChangeTypeInternal,\n\tDetachInternal,\n\tSetValueInternal,\n\tInsertInternal,\n\tBuildNodeInternal,\n\tSide,\n\tStableRangeInternal,\n\tEditStatus,\n} from './persisted-types/index.js';\nimport { TransactionInternal } from './TransactionInternal.js';\nimport { RangeValidationResultKind, validateStableRange } from './EditUtilities.js';\nimport { StablePlace } from './ChangeTypes.js';\nimport { RevisionView } from './RevisionView.js';\nimport { TreeView } from './TreeView.js';\nimport { getChangeNodeFromViewNode } from './SerializationUtilities.js';\n\n/**\n * Events emitted from the history edit factory\n */\nexport enum HistoryEditFactoryEvents {\n\tMalformedEdit = 'malformedEdit',\n\tMissingNodes = 'missingNodes',\n}\n\n/**\n * Given a sequence of changes, produces an inverse sequence of changes, i.e. the minimal changes required to revert the given changes\n * @param changes - the changes for which to produce an inverse.\n * @param before - a view of the tree state before `changes` are/were applied - used as a basis for generating the inverse.\n * @param logger - an optional logger for logging telemetry coming from the revert operation\n * @param emit - an optional event emitter to emit events from the revert operation and to allow clients to respond to them\n * @returns if the changes could be reverted, a sequence of changes _r_ that will produce `before` if applied to a view _A_, where _A_ is the result of\n * applying `changes` to `before`. Note that the size of the array of reverted changes may not be the same as the input array, and may even be empty in cases where\n * the view did not change. Applying _r_ to views other than _A_ is legal but may cause the changes to fail to apply or may not be a true semantic inverse.\n * If the changes could not be reverted given the state of `before`, returns undefined.\n *\n * TODO: what should this do if `changes` fails to apply to `before`?\n * TODO:#68574: Pass a view that corresponds to the appropriate Fluid reference sequence number rather than the view just before\n * @internal\n */\nexport function revert(\n\tchanges: readonly ChangeInternal[],\n\tbefore: RevisionView,\n\tlogger?: ITelemetryLoggerExt,\n\temit?: (event: string, ...args: any[]) => void\n): ChangeInternal[] | undefined {\n\tconst result: ChangeInternal[] = [];\n\n\tconst builtNodes = new Map<DetachedSequenceId, NodeId[]>();\n\tconst detachedNodes = new Map<DetachedSequenceId, NodeId[]>();\n\n\t// Open edit on revision to update it as changes are walked through\n\tconst editor = TransactionInternal.factory(before);\n\t// Apply `edit`, generating an inverse as we go.\n\tfor (const change of changes) {\n\t\t// Generate an inverse of each change\n\t\tswitch (change.type) {\n\t\t\tcase ChangeTypeInternal.Build: {\n\t\t\t\t// Save nodes added to the detached state for use in future changes\n\t\t\t\tconst { destination, source } = change;\n\t\t\t\tassert(\n\t\t\t\t\t!builtNodes.has(destination),\n\t\t\t\t\t0x626 /* Cannot revert Build: destination is already used by a Build */\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\t!detachedNodes.has(destination),\n\t\t\t\t\t0x627 /* Cannot revert Build: destination is already used by a Detach */\n\t\t\t\t);\n\t\t\t\tbuiltNodes.set(\n\t\t\t\t\tdestination,\n\t\t\t\t\tsource.reduce((ids: NodeId[], curr: BuildNodeInternal) => {\n\t\t\t\t\t\tif (isDetachedSequenceId(curr)) {\n\t\t\t\t\t\t\tconst nodesForDetachedSequence =\n\t\t\t\t\t\t\t\tbuiltNodes.get(curr) ?? fail('detached sequence must have associated built nodes');\n\n\t\t\t\t\t\t\tids.push(...nodesForDetachedSequence);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tids.push(curr.identifier);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn ids;\n\t\t\t\t\t}, [])\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.Insert: {\n\t\t\t\tconst { source } = change;\n\t\t\t\tconst nodesBuilt = builtNodes.get(source);\n\t\t\t\tconst nodesDetached = detachedNodes.get(source);\n\n\t\t\t\tif (nodesBuilt !== undefined) {\n\t\t\t\t\tif (nodesBuilt.length === 0) {\n\t\t\t\t\t\tbuiltNodes.delete(source);\n\t\t\t\t\t\tlogger?.sendTelemetryEvent({ eventName: 'reverting insertion of empty traits' });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tresult.unshift(createInvertedInsert(change, nodesBuilt));\n\t\t\t\t\tbuiltNodes.delete(source);\n\t\t\t\t} else if (nodesDetached !== undefined) {\n\t\t\t\t\tif (nodesDetached.length === 0) {\n\t\t\t\t\t\tdetachedNodes.delete(source);\n\t\t\t\t\t\tlogger?.sendTelemetryEvent({ eventName: 'reverting insertion of empty traits' });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tresult.unshift(createInvertedInsert(change, nodesDetached, true));\n\t\t\t\t\tdetachedNodes.delete(source);\n\t\t\t\t} else {\n\t\t\t\t\t// Cannot revert an insert whose source is no longer available for inserting (i.e. not just built, and not detached)\n\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\temit(HistoryEditFactoryEvents.MissingNodes, change, changes);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.Detach: {\n\t\t\t\tconst { destination } = change;\n\t\t\t\tconst invert = createInvertedDetach(change, editor.view);\n\t\t\t\tif (invert === undefined) {\n\t\t\t\t\t// Cannot revert a detach whose source does not exist in the tree\n\t\t\t\t\t// TODO:68574: May not be possible once associated todo in `createInvertedDetach` is addressed\n\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\temit(HistoryEditFactoryEvents.MissingNodes, change, changes);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst { invertedDetach, detachedNodeIds } = invert;\n\n\t\t\t\tif (detachedNodeIds.length === 0) {\n\t\t\t\t\tlogger?.sendTelemetryEvent({ eventName: 'reverting detachment of empty traits' });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (destination !== undefined) {\n\t\t\t\t\tif (builtNodes.has(destination) || detachedNodes.has(destination)) {\n\t\t\t\t\t\t// Malformed: destination was already used by a prior build or detach\n\t\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\t\temit(HistoryEditFactoryEvents.MalformedEdit, change, changes);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tdetachedNodes.set(destination, detachedNodeIds);\n\t\t\t\t}\n\n\t\t\t\tresult.unshift(...invertedDetach);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.SetValue: {\n\t\t\t\tconst invert = createInvertedSetValue(change, editor.view);\n\t\t\t\tif (invert === undefined) {\n\t\t\t\t\t// Cannot revert a set for a node that does not exist in the tree\n\t\t\t\t\t// TODO:68574: May not be possible once associated todo in `createInvertedSetValue` is addressed\n\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\temit(HistoryEditFactoryEvents.MissingNodes, change, changes);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tresult.unshift(...invert);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.Constraint:\n\t\t\t\t// TODO:#46759: Support Constraint in reverts\n\t\t\t\tfail('Revert currently does not support Constraints');\n\t\t\tdefault:\n\t\t\t\tfail('Revert does not support the change type.');\n\t\t}\n\n\t\t// Abort the entire revert if this change can't be applied successfully.\n\t\tif (editor.applyChange(change).status !== EditStatus.Applied) {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\teditor.close();\n\treturn result;\n}\n\n/**\n * The inverse of an Insert is a Detach that starts before the leftmost node inserted and ends after the rightmost.\n */\nfunction createInvertedInsert(\n\tinsert: InsertInternal,\n\tnodesInserted: readonly NodeId[],\n\tsaveDetached = false\n): ChangeInternal {\n\tconst leftmostNode = nodesInserted[0];\n\tconst rightmostNode = nodesInserted[nodesInserted.length - 1];\n\n\tconst source: StableRangeInternal = {\n\t\tstart: {\n\t\t\treferenceSibling: leftmostNode,\n\t\t\tside: Side.Before,\n\t\t},\n\t\tend: {\n\t\t\treferenceSibling: rightmostNode,\n\t\t\tside: Side.After,\n\t\t},\n\t};\n\n\treturn ChangeInternal.detach(source, saveDetached ? insert.source : undefined);\n}\n\n/**\n * If a detach does not include a destination, its inverse is a build and insert. Otherwise, it is just an insert.\n * Information on the nodes that were detached is obtained by going to the revision before the detach.\n *\n * The anchor for the resulting Insert is chosen in the following order:\n *\n * ```markdown\n * 1. If detach.source.start.side is After: detach.source.start\n *\n * ex: For nodes A B [C..F] G H where [C..F] represents the detached nodes,\n * if detach.source.start is \"After B\", the anchor for the resulting Insert will also be \"After B\".\n *\n * For nodes [A..F] G H where [A..F] represents the detached nodes,\n * if detach.source.start is \"After start of trait\", the anchor for the resulting Insert will also be\n * \"After start of trait\".\n *\n * 2. Else if detach.source.end.side is Before: detach.source.end\n *\n * ex: For nodes A B [C..F] G H where [C..F] represents the detached nodes,\n * if detach.source.start is \"Before C\" and detach.source.end is \"Before G\",\n * the anchor for the resulting Insert will be \"Before G\".\n *\n * 3. Else: After the node directly to the left of the originally detached nodes\n *\n * ex: For nodes A B [C..F] G H where [C..F] represents the detached nodes,\n * if detach.source.start is \"Before C\" and detach.source.end is \"After F\",\n * the anchor for the resulting Insert will be \"After B\".\n * ```\n *\n * When choosing the anchor, the existing anchors on detach.source are preferred when they have a valid sibling.\n * Otherwise, the valid anchor to the left of the originally detached nodes is chosen.\n */\nfunction createInvertedDetach(\n\tdetach: DetachInternal,\n\tviewBeforeChange: TreeView\n): { invertedDetach: ChangeInternal[]; detachedNodeIds: NodeId[] } | undefined {\n\tconst validatedSource = validateStableRange(viewBeforeChange, detach.source);\n\tif (validatedSource.result !== RangeValidationResultKind.Valid) {\n\t\t// TODO:#68574: having the reference view would potentially allow us to revert some detaches that currently conflict\n\t\treturn undefined;\n\t}\n\n\tconst { start, end } = rangeFromStableRange(viewBeforeChange, validatedSource);\n\tconst { trait: referenceTrait } = start;\n\tconst nodes = viewBeforeChange.getTrait(referenceTrait);\n\n\tconst startIndex = viewBeforeChange.findIndexWithinTrait(start);\n\tconst endIndex = viewBeforeChange.findIndexWithinTrait(end);\n\tconst detachedNodeIds: NodeId[] = nodes.slice(startIndex, endIndex);\n\n\tconst leftOfDetached = nodes.slice(0, startIndex);\n\n\tlet insertDestination: StablePlace;\n\n\tif (start.side === Side.After) {\n\t\tinsertDestination =\n\t\t\tstart.sibling === undefined\n\t\t\t\t? { side: Side.After, referenceTrait }\n\t\t\t\t: { side: Side.After, referenceSibling: start.sibling };\n\t} else if (end.side === Side.Before) {\n\t\tinsertDestination =\n\t\t\tend.sibling === undefined\n\t\t\t\t? { side: Side.Before, referenceTrait }\n\t\t\t\t: { side: Side.Before, referenceSibling: end.sibling };\n\t} else {\n\t\tconst referenceSibling = leftOfDetached.pop();\n\t\tinsertDestination = {\n\t\t\tside: Side.After,\n\t\t\treferenceSibling,\n\t\t\treferenceTrait: referenceSibling === undefined ? referenceTrait : undefined,\n\t\t};\n\t}\n\n\tif (detach.destination !== undefined) {\n\t\treturn {\n\t\t\tinvertedDetach: [ChangeInternal.insert(detach.destination, insertDestination)],\n\t\t\tdetachedNodeIds,\n\t\t};\n\t}\n\n\tconst detachedSequenceId = 0 as DetachedSequenceId;\n\treturn {\n\t\tinvertedDetach: [\n\t\t\tChangeInternal.build(\n\t\t\t\tdetachedNodeIds.map((id) => getChangeNodeFromViewNode(viewBeforeChange, id)),\n\t\t\t\tdetachedSequenceId\n\t\t\t),\n\t\t\tChangeInternal.insert(detachedSequenceId, insertDestination),\n\t\t],\n\t\tdetachedNodeIds,\n\t};\n}\n\n/**\n * The inverse of a SetValue is a SetValue that sets the value to what it was prior to the change.\n */\nfunction createInvertedSetValue(setValue: SetValueInternal, viewBeforeChange: TreeView): ChangeInternal[] | undefined {\n\tconst { nodeToModify } = setValue;\n\tconst node = viewBeforeChange.tryGetViewNode(nodeToModify);\n\tif (node === undefined) {\n\t\t// TODO:68574: With a reference view, may be able to better resolve conflicting sets\n\t\treturn undefined;\n\t}\n\n\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\tif (node.payload !== null) {\n\t\treturn [ChangeInternal.setPayload(nodeToModify, node.payload)];\n\t}\n\treturn [ChangeInternal.clearPayload(nodeToModify)];\n}\n"]}
1
+ {"version":3,"file":"HistoryEditFactory.js","sourceRoot":"","sources":["../src/HistoryEditFactory.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from '@fluidframework/core-utils/internal';\nimport { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils';\n\nimport { StablePlace } from './ChangeTypes.js';\nimport { fail } from './Common.js';\nimport { RangeValidationResultKind, validateStableRange } from './EditUtilities.js';\nimport { DetachedSequenceId, NodeId, isDetachedSequenceId } from './Identifiers.js';\nimport { RevisionView } from './RevisionView.js';\nimport { getChangeNodeFromViewNode } from './SerializationUtilities.js';\nimport { TransactionInternal } from './TransactionInternal.js';\nimport { TreeView } from './TreeView.js';\nimport { rangeFromStableRange } from './TreeViewUtilities.js';\nimport {\n\tBuildNodeInternal,\n\tChangeInternal,\n\tChangeTypeInternal,\n\tDetachInternal,\n\tEditStatus,\n\tInsertInternal,\n\tSetValueInternal,\n\tSide,\n\tStableRangeInternal,\n} from './persisted-types/index.js';\n\n/**\n * Events emitted from the history edit factory\n */\nexport enum HistoryEditFactoryEvents {\n\tMalformedEdit = 'malformedEdit',\n\tMissingNodes = 'missingNodes',\n}\n\n/**\n * Given a sequence of changes, produces an inverse sequence of changes, i.e. the minimal changes required to revert the given changes\n * @param changes - the changes for which to produce an inverse.\n * @param before - a view of the tree state before `changes` are/were applied - used as a basis for generating the inverse.\n * @param logger - an optional logger for logging telemetry coming from the revert operation\n * @param emit - an optional event emitter to emit events from the revert operation and to allow clients to respond to them\n * @returns if the changes could be reverted, a sequence of changes _r_ that will produce `before` if applied to a view _A_, where _A_ is the result of\n * applying `changes` to `before`. Note that the size of the array of reverted changes may not be the same as the input array, and may even be empty in cases where\n * the view did not change. Applying _r_ to views other than _A_ is legal but may cause the changes to fail to apply or may not be a true semantic inverse.\n * If the changes could not be reverted given the state of `before`, returns undefined.\n *\n * TODO: what should this do if `changes` fails to apply to `before`?\n * TODO:#68574: Pass a view that corresponds to the appropriate Fluid reference sequence number rather than the view just before\n * @internal\n */\nexport function revert(\n\tchanges: readonly ChangeInternal[],\n\tbefore: RevisionView,\n\tlogger?: ITelemetryLoggerExt,\n\temit?: (event: string, ...args: any[]) => void\n): ChangeInternal[] | undefined {\n\tconst result: ChangeInternal[] = [];\n\n\tconst builtNodes = new Map<DetachedSequenceId, NodeId[]>();\n\tconst detachedNodes = new Map<DetachedSequenceId, NodeId[]>();\n\n\t// Open edit on revision to update it as changes are walked through\n\tconst editor = TransactionInternal.factory(before);\n\t// Apply `edit`, generating an inverse as we go.\n\tfor (const change of changes) {\n\t\t// Generate an inverse of each change\n\t\tswitch (change.type) {\n\t\t\tcase ChangeTypeInternal.Build: {\n\t\t\t\t// Save nodes added to the detached state for use in future changes\n\t\t\t\tconst { destination, source } = change;\n\t\t\t\tassert(\n\t\t\t\t\t!builtNodes.has(destination),\n\t\t\t\t\t0x626 /* Cannot revert Build: destination is already used by a Build */\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\t!detachedNodes.has(destination),\n\t\t\t\t\t0x627 /* Cannot revert Build: destination is already used by a Detach */\n\t\t\t\t);\n\t\t\t\tbuiltNodes.set(\n\t\t\t\t\tdestination,\n\t\t\t\t\tsource.reduce((ids: NodeId[], curr: BuildNodeInternal) => {\n\t\t\t\t\t\tif (isDetachedSequenceId(curr)) {\n\t\t\t\t\t\t\tconst nodesForDetachedSequence =\n\t\t\t\t\t\t\t\tbuiltNodes.get(curr) ?? fail('detached sequence must have associated built nodes');\n\n\t\t\t\t\t\t\tids.push(...nodesForDetachedSequence);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tids.push(curr.identifier);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn ids;\n\t\t\t\t\t}, [])\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.Insert: {\n\t\t\t\tconst { source } = change;\n\t\t\t\tconst nodesBuilt = builtNodes.get(source);\n\t\t\t\tconst nodesDetached = detachedNodes.get(source);\n\n\t\t\t\tif (nodesBuilt !== undefined) {\n\t\t\t\t\tif (nodesBuilt.length === 0) {\n\t\t\t\t\t\tbuiltNodes.delete(source);\n\t\t\t\t\t\tlogger?.sendTelemetryEvent({ eventName: 'reverting insertion of empty traits' });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tresult.unshift(createInvertedInsert(change, nodesBuilt));\n\t\t\t\t\tbuiltNodes.delete(source);\n\t\t\t\t} else if (nodesDetached !== undefined) {\n\t\t\t\t\tif (nodesDetached.length === 0) {\n\t\t\t\t\t\tdetachedNodes.delete(source);\n\t\t\t\t\t\tlogger?.sendTelemetryEvent({ eventName: 'reverting insertion of empty traits' });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tresult.unshift(createInvertedInsert(change, nodesDetached, true));\n\t\t\t\t\tdetachedNodes.delete(source);\n\t\t\t\t} else {\n\t\t\t\t\t// Cannot revert an insert whose source is no longer available for inserting (i.e. not just built, and not detached)\n\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\temit(HistoryEditFactoryEvents.MissingNodes, change, changes);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.Detach: {\n\t\t\t\tconst { destination } = change;\n\t\t\t\tconst invert = createInvertedDetach(change, editor.view);\n\t\t\t\tif (invert === undefined) {\n\t\t\t\t\t// Cannot revert a detach whose source does not exist in the tree\n\t\t\t\t\t// TODO:68574: May not be possible once associated todo in `createInvertedDetach` is addressed\n\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\temit(HistoryEditFactoryEvents.MissingNodes, change, changes);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst { invertedDetach, detachedNodeIds } = invert;\n\n\t\t\t\tif (detachedNodeIds.length === 0) {\n\t\t\t\t\tlogger?.sendTelemetryEvent({ eventName: 'reverting detachment of empty traits' });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (destination !== undefined) {\n\t\t\t\t\tif (builtNodes.has(destination) || detachedNodes.has(destination)) {\n\t\t\t\t\t\t// Malformed: destination was already used by a prior build or detach\n\t\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\t\temit(HistoryEditFactoryEvents.MalformedEdit, change, changes);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tdetachedNodes.set(destination, detachedNodeIds);\n\t\t\t\t}\n\n\t\t\t\tresult.unshift(...invertedDetach);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.SetValue: {\n\t\t\t\tconst invert = createInvertedSetValue(change, editor.view);\n\t\t\t\tif (invert === undefined) {\n\t\t\t\t\t// Cannot revert a set for a node that does not exist in the tree\n\t\t\t\t\t// TODO:68574: May not be possible once associated todo in `createInvertedSetValue` is addressed\n\t\t\t\t\tif (emit !== undefined) {\n\t\t\t\t\t\temit(HistoryEditFactoryEvents.MissingNodes, change, changes);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tresult.unshift(...invert);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.Constraint:\n\t\t\t\t// TODO:#46759: Support Constraint in reverts\n\t\t\t\tfail('Revert currently does not support Constraints');\n\t\t\tdefault:\n\t\t\t\tfail('Revert does not support the change type.');\n\t\t}\n\n\t\t// Abort the entire revert if this change can't be applied successfully.\n\t\tif (editor.applyChange(change).status !== EditStatus.Applied) {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\teditor.close();\n\treturn result;\n}\n\n/**\n * The inverse of an Insert is a Detach that starts before the leftmost node inserted and ends after the rightmost.\n */\nfunction createInvertedInsert(\n\tinsert: InsertInternal,\n\tnodesInserted: readonly NodeId[],\n\tsaveDetached = false\n): ChangeInternal {\n\tconst leftmostNode = nodesInserted[0];\n\tconst rightmostNode = nodesInserted[nodesInserted.length - 1];\n\n\tconst source: StableRangeInternal = {\n\t\tstart: {\n\t\t\treferenceSibling: leftmostNode,\n\t\t\tside: Side.Before,\n\t\t},\n\t\tend: {\n\t\t\treferenceSibling: rightmostNode,\n\t\t\tside: Side.After,\n\t\t},\n\t};\n\n\treturn ChangeInternal.detach(source, saveDetached ? insert.source : undefined);\n}\n\n/**\n * If a detach does not include a destination, its inverse is a build and insert. Otherwise, it is just an insert.\n * Information on the nodes that were detached is obtained by going to the revision before the detach.\n *\n * The anchor for the resulting Insert is chosen in the following order:\n *\n * ```markdown\n * 1. If detach.source.start.side is After: detach.source.start\n *\n * ex: For nodes A B [C..F] G H where [C..F] represents the detached nodes,\n * if detach.source.start is \"After B\", the anchor for the resulting Insert will also be \"After B\".\n *\n * For nodes [A..F] G H where [A..F] represents the detached nodes,\n * if detach.source.start is \"After start of trait\", the anchor for the resulting Insert will also be\n * \"After start of trait\".\n *\n * 2. Else if detach.source.end.side is Before: detach.source.end\n *\n * ex: For nodes A B [C..F] G H where [C..F] represents the detached nodes,\n * if detach.source.start is \"Before C\" and detach.source.end is \"Before G\",\n * the anchor for the resulting Insert will be \"Before G\".\n *\n * 3. Else: After the node directly to the left of the originally detached nodes\n *\n * ex: For nodes A B [C..F] G H where [C..F] represents the detached nodes,\n * if detach.source.start is \"Before C\" and detach.source.end is \"After F\",\n * the anchor for the resulting Insert will be \"After B\".\n * ```\n *\n * When choosing the anchor, the existing anchors on detach.source are preferred when they have a valid sibling.\n * Otherwise, the valid anchor to the left of the originally detached nodes is chosen.\n */\nfunction createInvertedDetach(\n\tdetach: DetachInternal,\n\tviewBeforeChange: TreeView\n): { invertedDetach: ChangeInternal[]; detachedNodeIds: NodeId[] } | undefined {\n\tconst validatedSource = validateStableRange(viewBeforeChange, detach.source);\n\tif (validatedSource.result !== RangeValidationResultKind.Valid) {\n\t\t// TODO:#68574: having the reference view would potentially allow us to revert some detaches that currently conflict\n\t\treturn undefined;\n\t}\n\n\tconst { start, end } = rangeFromStableRange(viewBeforeChange, validatedSource);\n\tconst { trait: referenceTrait } = start;\n\tconst nodes = viewBeforeChange.getTrait(referenceTrait);\n\n\tconst startIndex = viewBeforeChange.findIndexWithinTrait(start);\n\tconst endIndex = viewBeforeChange.findIndexWithinTrait(end);\n\tconst detachedNodeIds: NodeId[] = nodes.slice(startIndex, endIndex);\n\n\tconst leftOfDetached = nodes.slice(0, startIndex);\n\n\tlet insertDestination: StablePlace;\n\n\tif (start.side === Side.After) {\n\t\tinsertDestination =\n\t\t\tstart.sibling === undefined\n\t\t\t\t? { side: Side.After, referenceTrait }\n\t\t\t\t: { side: Side.After, referenceSibling: start.sibling };\n\t} else if (end.side === Side.Before) {\n\t\tinsertDestination =\n\t\t\tend.sibling === undefined\n\t\t\t\t? { side: Side.Before, referenceTrait }\n\t\t\t\t: { side: Side.Before, referenceSibling: end.sibling };\n\t} else {\n\t\tconst referenceSibling = leftOfDetached.pop();\n\t\tinsertDestination = {\n\t\t\tside: Side.After,\n\t\t\treferenceSibling,\n\t\t\treferenceTrait: referenceSibling === undefined ? referenceTrait : undefined,\n\t\t};\n\t}\n\n\tif (detach.destination !== undefined) {\n\t\treturn {\n\t\t\tinvertedDetach: [ChangeInternal.insert(detach.destination, insertDestination)],\n\t\t\tdetachedNodeIds,\n\t\t};\n\t}\n\n\tconst detachedSequenceId = 0 as DetachedSequenceId;\n\treturn {\n\t\tinvertedDetach: [\n\t\t\tChangeInternal.build(\n\t\t\t\tdetachedNodeIds.map((id) => getChangeNodeFromViewNode(viewBeforeChange, id)),\n\t\t\t\tdetachedSequenceId\n\t\t\t),\n\t\t\tChangeInternal.insert(detachedSequenceId, insertDestination),\n\t\t],\n\t\tdetachedNodeIds,\n\t};\n}\n\n/**\n * The inverse of a SetValue is a SetValue that sets the value to what it was prior to the change.\n */\nfunction createInvertedSetValue(setValue: SetValueInternal, viewBeforeChange: TreeView): ChangeInternal[] | undefined {\n\tconst { nodeToModify } = setValue;\n\tconst node = viewBeforeChange.tryGetViewNode(nodeToModify);\n\tif (node === undefined) {\n\t\t// TODO:68574: With a reference view, may be able to better resolve conflicting sets\n\t\treturn undefined;\n\t}\n\n\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\tif (node.payload !== null) {\n\t\treturn [ChangeInternal.setPayload(nodeToModify, node.payload)];\n\t}\n\treturn [ChangeInternal.clearPayload(nodeToModify)];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IdConversion.d.ts","sourceRoot":"","sources":["../src/IdConversion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwC,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EAA4C,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAEN,cAAc,EAId,IAAI,EACJ,QAAQ,EACR,mBAAmB,EACnB,mBAAmB,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,EAC1C,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAyDtD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAC9C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,QAAQ,CAAC,IAAI,CAAC,CAKhB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EACjD,KAAK,EAAE,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAIrD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EACjD,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,EAAE,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,EACjG,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAmBrD"}
1
+ {"version":3,"file":"IdConversion.d.ts","sourceRoot":"","sources":["../src/IdConversion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAW,gBAAgB,EAA+B,MAAM,aAAa,CAAC;AAErF,OAAO,EAAsB,MAAM,EAAwB,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAEN,cAAc,EAId,IAAI,EACJ,QAAQ,EACR,mBAAmB,EACnB,mBAAmB,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,EAC1C,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAyDtD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAC9C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,QAAQ,CAAC,IAAI,CAAC,CAKhB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EACjD,KAAK,EAAE,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAIrD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,EACjD,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,EAAE,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,EACjG,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAC3B,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAmBrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"IdConversion.js","sourceRoot":"","sources":["../src/IdConversion.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2CAAqF;AACrF,yDAAsD;AACtD,qDAAoF;AACpF,yDAWoC;AAEpC,SAAgB,cAAc,CAC7B,IAA4D,EAC5D,OAA6B;IAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAkD,EAAE;QAC3F,QAAQ,MAAM,CAAC,IAAI,EAAE;YACpB,KAAK,6BAAkB,CAAC,KAAK;gBAC5B,OAAO;oBACN,IAAI,EAAE,6BAAkB,CAAC,KAAK;oBAC9B,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBAClC,OAAO,IAAA,mCAAgB,EAIrB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,qCAAoB,CAAC,CAAC;oBAC5E,CAAC,CAAC;iBACF,CAAC;YACH,KAAK,6BAAkB,CAAC,MAAM;gBAC7B,OAAO;oBACN,IAAI,EAAE,6BAAkB,CAAC,MAAM;oBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,WAAW,EAAE,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;iBAC/D,CAAC;YACH,KAAK,6BAAkB,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAmD;oBAC9D,IAAI,EAAE,6BAAkB,CAAC,MAAM;oBAC/B,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBACrD,CAAC;gBACF,IAAA,iCAAqB,EAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;gBACrD,OAAO,MAAM,CAAC;aACd;YACD,KAAK,6BAAkB,CAAC,QAAQ;gBAC/B,OAAO;oBACN,IAAI,EAAE,6BAAkB,CAAC,QAAQ;oBACjC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;iBACvB,CAAC;YACH,KAAK,6BAAkB,CAAC,UAAU,CAAC,CAAC;gBACnC,MAAM,UAAU,GAAgE;oBAC/E,IAAI,EAAE,6BAAkB,CAAC,UAAU;oBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,WAAW,EAAE,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;iBAC/D,CAAC;gBACF,IAAA,iCAAqB,EAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBAC1D,IAAA,iCAAqB,EAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBACnD,IAAA,iCAAqB,EAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACpD,IAAA,iCAAqB,EAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBACzD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;oBACpC,UAAU,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;iBACnD;gBACD,OAAO,UAAU,CAAC;aAClB;YACD;gBACC,IAAA,gBAAI,EAAC,sBAAsB,CAAC,CAAC;SAC9B;IACF,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;IACzC,IAAA,iCAAqB,EAAC,IAAI,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC;AAChB,CAAC;AA5DD,wCA4DC;AAED,SAAgB,kBAAkB,CACjC,QAA0B,EAC1B,OAA6B;IAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;IAC/D,IAAA,iCAAqB,EAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AACf,CAAC;AARD,gDAQC;AAED,SAAgB,qBAAqB,CACpC,KAA4D,EAC5D,OAA6B;IAE7B,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC;AAPD,sDAOC;AAED,SAAgB,qBAAqB,CACpC,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAyD,EACjG,OAA6B;IAE7B,MAAM,cAAc,GAAiE;QACpF,IAAI;KACJ,CAAC;IAEF,IAAI,gBAAgB,KAAK,SAAS,EAAE;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzC,cAAc,CAAC,gBAAgB,GAAG,MAAM,CAAC;KACzC;IAED,IAAI,cAAc,KAAK,SAAS,EAAE;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9C,cAAc,CAAC,cAAc,GAAG;YAC/B,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,MAAM;SACN,CAAC;KACF;IAED,OAAO,cAAc,CAAC;AACvB,CAAC;AAtBD,sDAsBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { copyPropertyIfDefined, fail, Mutable, ReplaceRecursive } from './Common.js';\nimport { convertTreeNodes } from './EditUtilities.js';\nimport { DetachedSequenceId, isDetachedSequenceId, NodeId } from './Identifiers.js';\nimport {\n\tBuildNodeInternal,\n\tChangeInternal,\n\tChangeTypeInternal,\n\tConstraintInternal,\n\tDetachInternal,\n\tEdit,\n\tNodeData,\n\tStablePlaceInternal,\n\tStableRangeInternal,\n\tTreeNode,\n} from './persisted-types/index.js';\n\nexport function convertEditIds<IdFrom, IdTo>(\n\tedit: ReplaceRecursive<Edit<ChangeInternal>, NodeId, IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): Edit<ReplaceRecursive<ChangeInternal, NodeId, IdTo>> {\n\tconst changes = edit.changes.map((change): ReplaceRecursive<ChangeInternal, NodeId, IdTo> => {\n\t\tswitch (change.type) {\n\t\t\tcase ChangeTypeInternal.Build:\n\t\t\t\treturn {\n\t\t\t\t\ttype: ChangeTypeInternal.Build,\n\t\t\t\t\tdestination: change.destination,\n\t\t\t\t\tsource: change.source.map((tree) => {\n\t\t\t\t\t\treturn convertTreeNodes<\n\t\t\t\t\t\t\tTreeNode<ReplaceRecursive<BuildNodeInternal, NodeId, IdFrom>, IdFrom>,\n\t\t\t\t\t\t\tTreeNode<ReplaceRecursive<BuildNodeInternal, NodeId, IdTo>, IdTo>,\n\t\t\t\t\t\t\tDetachedSequenceId\n\t\t\t\t\t\t>(tree, (node) => convertNodeDataIds(node, convert), isDetachedSequenceId);\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\tcase ChangeTypeInternal.Insert:\n\t\t\t\treturn {\n\t\t\t\t\ttype: ChangeTypeInternal.Insert,\n\t\t\t\t\tsource: change.source,\n\t\t\t\t\tdestination: convertStablePlaceIds(change.destination, convert),\n\t\t\t\t};\n\t\t\tcase ChangeTypeInternal.Detach: {\n\t\t\t\tconst detach: ReplaceRecursive<DetachInternal, NodeId, IdTo> = {\n\t\t\t\t\ttype: ChangeTypeInternal.Detach,\n\t\t\t\t\tsource: convertStableRangeIds(change.source, convert),\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(change, detach, 'destination');\n\t\t\t\treturn detach;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.SetValue:\n\t\t\t\treturn {\n\t\t\t\t\ttype: ChangeTypeInternal.SetValue,\n\t\t\t\t\tnodeToModify: convert(change.nodeToModify),\n\t\t\t\t\tpayload: change.payload,\n\t\t\t\t};\n\t\t\tcase ChangeTypeInternal.Constraint: {\n\t\t\t\tconst constraint: Mutable<ReplaceRecursive<ConstraintInternal, NodeId, IdTo>> = {\n\t\t\t\t\ttype: ChangeTypeInternal.Constraint,\n\t\t\t\t\teffect: change.effect,\n\t\t\t\t\ttoConstrain: convertStableRangeIds(change.toConstrain, convert),\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'identityHash');\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'label');\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'length');\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'contentHash');\n\t\t\t\tif (change.parentNode !== undefined) {\n\t\t\t\t\tconstraint.parentNode = convert(change.parentNode);\n\t\t\t\t}\n\t\t\t\treturn constraint;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tfail('Unknown change type.');\n\t\t}\n\t});\n\tconst newEdit = { id: edit.id, changes };\n\tcopyPropertyIfDefined(edit, newEdit, 'pastAttemptCount');\n\treturn newEdit;\n}\n\nexport function convertNodeDataIds<IdFrom, IdTo>(\n\tnodeData: NodeData<IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): NodeData<IdTo> {\n\tconst identifier = convert(nodeData.identifier);\n\tconst output = { definition: nodeData.definition, identifier };\n\tcopyPropertyIfDefined(nodeData, output, 'payload');\n\treturn output;\n}\n\nexport function convertStableRangeIds<IdFrom, IdTo>(\n\trange: ReplaceRecursive<StableRangeInternal, NodeId, IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): ReplaceRecursive<StableRangeInternal, NodeId, IdTo> {\n\tconst start = convertStablePlaceIds(range.start, convert);\n\tconst end = convertStablePlaceIds(range.end, convert);\n\treturn { start, end };\n}\n\nexport function convertStablePlaceIds<IdFrom, IdTo>(\n\t{ side, referenceSibling, referenceTrait }: ReplaceRecursive<StablePlaceInternal, NodeId, IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): ReplaceRecursive<StablePlaceInternal, NodeId, IdTo> {\n\tconst stablePlaceNew: Mutable<ReplaceRecursive<StablePlaceInternal, NodeId, IdTo>> = {\n\t\tside,\n\t};\n\n\tif (referenceSibling !== undefined) {\n\t\tconst nodeId = convert(referenceSibling);\n\t\tstablePlaceNew.referenceSibling = nodeId;\n\t}\n\n\tif (referenceTrait !== undefined) {\n\t\tconst parent = convert(referenceTrait.parent);\n\t\tstablePlaceNew.referenceTrait = {\n\t\t\tlabel: referenceTrait.label,\n\t\t\tparent,\n\t\t};\n\t}\n\n\treturn stablePlaceNew;\n}\n"]}
1
+ {"version":3,"file":"IdConversion.js","sourceRoot":"","sources":["../src/IdConversion.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 { Mutable, ReplaceRecursive, copyPropertyIfDefined, fail } from './Common.js';\nimport { convertTreeNodes } from './EditUtilities.js';\nimport { DetachedSequenceId, NodeId, isDetachedSequenceId } from './Identifiers.js';\nimport {\n\tBuildNodeInternal,\n\tChangeInternal,\n\tChangeTypeInternal,\n\tConstraintInternal,\n\tDetachInternal,\n\tEdit,\n\tNodeData,\n\tStablePlaceInternal,\n\tStableRangeInternal,\n\tTreeNode,\n} from './persisted-types/index.js';\n\nexport function convertEditIds<IdFrom, IdTo>(\n\tedit: ReplaceRecursive<Edit<ChangeInternal>, NodeId, IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): Edit<ReplaceRecursive<ChangeInternal, NodeId, IdTo>> {\n\tconst changes = edit.changes.map((change): ReplaceRecursive<ChangeInternal, NodeId, IdTo> => {\n\t\tswitch (change.type) {\n\t\t\tcase ChangeTypeInternal.Build:\n\t\t\t\treturn {\n\t\t\t\t\ttype: ChangeTypeInternal.Build,\n\t\t\t\t\tdestination: change.destination,\n\t\t\t\t\tsource: change.source.map((tree) => {\n\t\t\t\t\t\treturn convertTreeNodes<\n\t\t\t\t\t\t\tTreeNode<ReplaceRecursive<BuildNodeInternal, NodeId, IdFrom>, IdFrom>,\n\t\t\t\t\t\t\tTreeNode<ReplaceRecursive<BuildNodeInternal, NodeId, IdTo>, IdTo>,\n\t\t\t\t\t\t\tDetachedSequenceId\n\t\t\t\t\t\t>(tree, (node) => convertNodeDataIds(node, convert), isDetachedSequenceId);\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\tcase ChangeTypeInternal.Insert:\n\t\t\t\treturn {\n\t\t\t\t\ttype: ChangeTypeInternal.Insert,\n\t\t\t\t\tsource: change.source,\n\t\t\t\t\tdestination: convertStablePlaceIds(change.destination, convert),\n\t\t\t\t};\n\t\t\tcase ChangeTypeInternal.Detach: {\n\t\t\t\tconst detach: ReplaceRecursive<DetachInternal, NodeId, IdTo> = {\n\t\t\t\t\ttype: ChangeTypeInternal.Detach,\n\t\t\t\t\tsource: convertStableRangeIds(change.source, convert),\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(change, detach, 'destination');\n\t\t\t\treturn detach;\n\t\t\t}\n\t\t\tcase ChangeTypeInternal.SetValue:\n\t\t\t\treturn {\n\t\t\t\t\ttype: ChangeTypeInternal.SetValue,\n\t\t\t\t\tnodeToModify: convert(change.nodeToModify),\n\t\t\t\t\tpayload: change.payload,\n\t\t\t\t};\n\t\t\tcase ChangeTypeInternal.Constraint: {\n\t\t\t\tconst constraint: Mutable<ReplaceRecursive<ConstraintInternal, NodeId, IdTo>> = {\n\t\t\t\t\ttype: ChangeTypeInternal.Constraint,\n\t\t\t\t\teffect: change.effect,\n\t\t\t\t\ttoConstrain: convertStableRangeIds(change.toConstrain, convert),\n\t\t\t\t};\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'identityHash');\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'label');\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'length');\n\t\t\t\tcopyPropertyIfDefined(change, constraint, 'contentHash');\n\t\t\t\tif (change.parentNode !== undefined) {\n\t\t\t\t\tconstraint.parentNode = convert(change.parentNode);\n\t\t\t\t}\n\t\t\t\treturn constraint;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tfail('Unknown change type.');\n\t\t}\n\t});\n\tconst newEdit = { id: edit.id, changes };\n\tcopyPropertyIfDefined(edit, newEdit, 'pastAttemptCount');\n\treturn newEdit;\n}\n\nexport function convertNodeDataIds<IdFrom, IdTo>(\n\tnodeData: NodeData<IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): NodeData<IdTo> {\n\tconst identifier = convert(nodeData.identifier);\n\tconst output = { definition: nodeData.definition, identifier };\n\tcopyPropertyIfDefined(nodeData, output, 'payload');\n\treturn output;\n}\n\nexport function convertStableRangeIds<IdFrom, IdTo>(\n\trange: ReplaceRecursive<StableRangeInternal, NodeId, IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): ReplaceRecursive<StableRangeInternal, NodeId, IdTo> {\n\tconst start = convertStablePlaceIds(range.start, convert);\n\tconst end = convertStablePlaceIds(range.end, convert);\n\treturn { start, end };\n}\n\nexport function convertStablePlaceIds<IdFrom, IdTo>(\n\t{ side, referenceSibling, referenceTrait }: ReplaceRecursive<StablePlaceInternal, NodeId, IdFrom>,\n\tconvert: (id: IdFrom) => IdTo\n): ReplaceRecursive<StablePlaceInternal, NodeId, IdTo> {\n\tconst stablePlaceNew: Mutable<ReplaceRecursive<StablePlaceInternal, NodeId, IdTo>> = {\n\t\tside,\n\t};\n\n\tif (referenceSibling !== undefined) {\n\t\tconst nodeId = convert(referenceSibling);\n\t\tstablePlaceNew.referenceSibling = nodeId;\n\t}\n\n\tif (referenceTrait !== undefined) {\n\t\tconst parent = convert(referenceTrait.parent);\n\t\tstablePlaceNew.referenceTrait = {\n\t\t\tlabel: referenceTrait.label,\n\t\t\tparent,\n\t\t};\n\t}\n\n\treturn stablePlaceNew;\n}\n"]}
@@ -6,11 +6,11 @@ import { TypedEventEmitter } from '@fluid-internal/client-utils';
6
6
  import { IEvent } from '@fluidframework/core-interfaces';
7
7
  import { EditLog } from './EditLog.js';
8
8
  import { EditId } from './Identifiers.js';
9
- import { Revision } from './RevisionValueCache.js';
10
9
  import { ReconciliationChange, ReconciliationPath } from './ReconciliationPath.js';
11
- import { ChangeInternal, Edit, EditStatus } from './persisted-types/index.js';
10
+ import { Revision } from './RevisionValueCache.js';
12
11
  import { RevisionView } from './RevisionView.js';
13
12
  import { EditingResult, TransactionInternal } from './TransactionInternal.js';
13
+ import { ChangeInternal, Edit, EditStatus } from './persisted-types/index.js';
14
14
  /**
15
15
  * Callback for when an edit is applied (meaning the result of applying it to a particular revision is computed).
16
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../src/LogViewer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../src/LogViewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAKzD,OAAO,EAAE,OAAO,EAA0B,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAsB,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAsB,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;AAEtG;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,EAAE,6BAA6B,CAAC;IACtC;;OAEG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,wBAAwB,GAAG,0BAA0B,GAAG,8BAA8B,CAAC;AAEpH;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,wBAAwB,GAAG,0BAA0B,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;IACpC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAC1C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC9C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAAG,6BAA6B,GAAG;IACjE;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC5C,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,SAAS;IACzB;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3D;;;;;;;;;;;;;OAaG;IACH,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAC;IAE3D;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAC;CAC1D;AAED;;GAEG;AACH,oBAAY,gCAAgC;IAC3C,gBAAgB,qBAAqB;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,MAAM;IACtD,CAAC,KAAK,EAAE,gCAAgC,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,OAAE;CACnG;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB,CAAC,uBAAuB,CAAE,YAAW,SAAS;IACpG,SAAgB,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE7C;;OAEG;IACH,gBAAuB,qBAAqB,MAAM;IAElD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA+C;IAElF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqC;IAE5E;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA8B;IAEzE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqB;IAEvD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAE3D;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAC,CAA4C;IAErE;;;OAGG;IACH,OAAO,CAAC,yBAAyB,CAAC,CAAiB;IAEnD;;;OAGG;IACH,SAAgB,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAE9C;;OAEG;IACI,qBAAqB,IAAI,OAAO;IAIvC;;;;;;;;;OASG;gBAEF,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,EAC5B,QAAQ,EAAE,YAAY,EACtB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,EAC5C,iBAAiB,GAAE,kBAAyB,EAC5C,0BAA0B,GAAE,2BAAkC,EAC9D,qBAAqB,SAAI;IAyB1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAqCvB;;OAEG;IACI,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IAI9D;;OAEG;IACI,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc;IAYhE;;;;;OAKG;IACI,wBAAwB,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI;IAOpE;;;OAGG;IACI,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAIrF;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAsDjB;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;;;;OAKG;IACI,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IA2DrE;;OAEG;IACI,6BAA6B,IAAI;QAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAe1G;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA0B9B;;;;OAIG;IACI,+BAA+B,CAAC,cAAc,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IA+C/F;;OAEG;IACU,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;IAIvE;;OAEG;IACU,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvE;;OAEG;IACI,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc;IAIjE;;OAEG;IACI,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY;CAGjE"}
package/dist/LogViewer.js CHANGED
@@ -8,13 +8,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.CachingLogViewer = exports.CachingLogViewerDiagnosticEvents = void 0;
11
- const denque_1 = __importDefault(require("denque"));
12
11
  const client_utils_1 = require("@fluid-internal/client-utils");
13
- const core_utils_1 = require("@fluidframework/core-utils");
12
+ const internal_1 = require("@fluidframework/core-utils/internal");
13
+ const denque_1 = __importDefault(require("denque"));
14
14
  const Common_js_1 = require("./Common.js");
15
15
  const RevisionValueCache_js_1 = require("./RevisionValueCache.js");
16
- const index_js_1 = require("./persisted-types/index.js");
17
16
  const TransactionInternal_js_1 = require("./TransactionInternal.js");
17
+ const index_js_1 = require("./persisted-types/index.js");
18
18
  /**
19
19
  * Events reported by {@link CachingLogViewer} for diagnostics or testing purposes.
20
20
  */
@@ -62,8 +62,8 @@ class CachingLogViewer extends client_utils_1.TypedEventEmitter {
62
62
  this.unappliedSelfEdits = new denque_1.default();
63
63
  this.log = log;
64
64
  if (initialRevision !== undefined) {
65
- (0, core_utils_1.assert)(Number.isInteger(initialRevision[0]), 0x628 /* revision must be an integer */);
66
- (0, core_utils_1.assert)(this.log.isSequencedRevision(initialRevision[0]), 0x629 /* revision must correspond to the result of a SequencedEdit */);
65
+ (0, internal_1.assert)(Number.isInteger(initialRevision[0]), 0x628 /* revision must be an integer */);
66
+ (0, internal_1.assert)(this.log.isSequencedRevision(initialRevision[0]), 0x629 /* revision must correspond to the result of a SequencedEdit */);
67
67
  }
68
68
  this.sequencedRevisionCache = new RevisionValueCache_js_1.RevisionValueCache(CachingLogViewer.sequencedCacheSizeMax, minimumSequenceNumber, initialRevision ?? [0, { view: baseView }]);
69
69
  this.processEditStatus = processEditStatus ?? Common_js_1.noop;
@@ -120,7 +120,7 @@ class CachingLogViewer extends client_utils_1.TypedEventEmitter {
120
120
  * @returns the {@link EditCacheEntry} for the requested revision
121
121
  */
122
122
  getEditResultInMemory(revision) {
123
- (0, core_utils_1.assert)(revision >= this.log.earliestAvailableEditIndex, 0x62a /* revision not stored in memory */);
123
+ (0, internal_1.assert)(revision >= this.log.earliestAvailableEditIndex, 0x62a /* revision not stored in memory */);
124
124
  const startingPoint = this.getStartingPoint(revision);
125
125
  const { startRevision } = startingPoint;
126
126
  let current = startingPoint;
@@ -236,7 +236,7 @@ class CachingLogViewer extends client_utils_1.TypedEventEmitter {
236
236
  // This relies on local edits being append only, and that generating the view for a local revision requires generating
237
237
  // the views for all local revisions before it in the log. Thus, generating such a view will necessarily require
238
238
  // calls to this method for all local revisions prior, guaranteeing the correct push order.
239
- (0, core_utils_1.assert)(revision === this.log.numberOfSequencedEdits + this.localRevisionCache.length + 1, 0x62b /* Local revision view cached out of order. */);
239
+ (0, internal_1.assert)(revision === this.log.numberOfSequencedEdits + this.localRevisionCache.length + 1, 0x62b /* Local revision view cached out of order. */);
240
240
  this.localRevisionCache.push(computedCacheEntry);
241
241
  }
242
242
  // Only update highestRevisionCacheEntry if this snapshot is the highest revision.