@fluidframework/tree 2.1.0-276985 → 2.1.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 (583) hide show
  1. package/.eslintrc.cjs +7 -0
  2. package/.vscode/Tree.code-workspace +9 -2
  3. package/CHANGELOG.md +38 -0
  4. package/README.md +55 -12
  5. package/api-report/tree.alpha.api.md +2 -1
  6. package/api-report/tree.beta.api.md +2 -1
  7. package/api-report/tree.public.api.md +2 -1
  8. package/beta.d.ts +1 -1
  9. package/dist/beta.d.ts +1 -1
  10. package/dist/core/forest/editableForest.d.ts +6 -3
  11. package/dist/core/forest/editableForest.d.ts.map +1 -1
  12. package/dist/core/forest/editableForest.js +16 -4
  13. package/dist/core/forest/editableForest.js.map +1 -1
  14. package/dist/core/index.d.ts +1 -1
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +3 -1
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/rebase/index.d.ts +1 -1
  19. package/dist/core/rebase/index.d.ts.map +1 -1
  20. package/dist/core/rebase/index.js +3 -1
  21. package/dist/core/rebase/index.js.map +1 -1
  22. package/dist/core/rebase/types.d.ts +2 -0
  23. package/dist/core/rebase/types.d.ts.map +1 -1
  24. package/dist/core/rebase/types.js +9 -1
  25. package/dist/core/rebase/types.js.map +1 -1
  26. package/dist/core/tree/anchorSet.d.ts +1 -0
  27. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  28. package/dist/core/tree/anchorSet.js +13 -0
  29. package/dist/core/tree/anchorSet.js.map +1 -1
  30. package/dist/core/tree/detachedFieldIndex.d.ts +48 -11
  31. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  32. package/dist/core/tree/detachedFieldIndex.js +144 -20
  33. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  34. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
  35. package/dist/core/tree/detachedFieldIndexCodec.js +13 -4
  36. package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
  37. package/dist/core/tree/detachedFieldIndexFormat.d.ts +1 -1
  38. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
  39. package/dist/core/tree/detachedFieldIndexFormat.js.map +1 -1
  40. package/dist/core/tree/detachedFieldIndexTypes.d.ts +39 -4
  41. package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  42. package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
  43. package/dist/core/tree/index.d.ts +2 -1
  44. package/dist/core/tree/index.d.ts.map +1 -1
  45. package/dist/core/tree/index.js.map +1 -1
  46. package/dist/core/tree/visitDelta.d.ts +3 -1
  47. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  48. package/dist/core/tree/visitDelta.js +31 -15
  49. package/dist/core/tree/visitDelta.js.map +1 -1
  50. package/dist/core/tree/visitorUtils.d.ts +3 -3
  51. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  52. package/dist/core/tree/visitorUtils.js +4 -4
  53. package/dist/core/tree/visitorUtils.js.map +1 -1
  54. package/dist/events/events.d.ts +4 -1
  55. package/dist/events/events.d.ts.map +1 -1
  56. package/dist/events/events.js.map +1 -1
  57. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +1 -1
  58. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  59. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  60. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
  61. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  62. package/dist/feature-libraries/editableTreeBinder.js +1 -1
  63. package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
  64. package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -10
  65. package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
  66. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +0 -72
  67. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  68. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -51
  69. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  70. package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  71. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  72. package/dist/feature-libraries/flex-tree/index.d.ts +3 -2
  73. package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
  74. package/dist/feature-libraries/flex-tree/index.js +5 -1
  75. package/dist/feature-libraries/flex-tree/index.js.map +1 -1
  76. package/dist/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
  77. package/dist/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
  78. package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  79. package/dist/feature-libraries/flex-tree/lazyField.d.ts +1 -6
  80. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  81. package/dist/feature-libraries/flex-tree/lazyField.js +11 -32
  82. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  83. package/dist/feature-libraries/flex-tree/lazyNode.d.ts +1 -5
  84. package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  85. package/dist/feature-libraries/flex-tree/lazyNode.js +0 -30
  86. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  87. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  88. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -1
  89. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  90. package/dist/feature-libraries/index.d.ts +3 -3
  91. package/dist/feature-libraries/index.d.ts.map +1 -1
  92. package/dist/feature-libraries/index.js +6 -3
  93. package/dist/feature-libraries/index.js.map +1 -1
  94. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +11 -0
  95. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  96. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  97. package/dist/feature-libraries/modular-schema/discrepancies.d.ts +96 -0
  98. package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -0
  99. package/dist/feature-libraries/modular-schema/discrepancies.js +264 -0
  100. package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -0
  101. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -2
  102. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  103. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  104. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  105. package/dist/feature-libraries/modular-schema/genericFieldKind.js +3 -0
  106. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  107. package/dist/feature-libraries/modular-schema/index.d.ts +2 -1
  108. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  109. package/dist/feature-libraries/modular-schema/index.js +3 -1
  110. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  111. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  112. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +42 -26
  113. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  114. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +51 -2
  115. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  116. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +827 -245
  117. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  118. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  119. package/dist/feature-libraries/modular-schema/modularChangeFormat.js +2 -0
  120. package/dist/feature-libraries/modular-schema/modularChangeFormat.js.map +1 -1
  121. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +44 -1
  122. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  123. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  124. package/dist/feature-libraries/node-key/index.d.ts +0 -1
  125. package/dist/feature-libraries/node-key/index.d.ts.map +1 -1
  126. package/dist/feature-libraries/node-key/index.js +1 -3
  127. package/dist/feature-libraries/node-key/index.js.map +1 -1
  128. package/dist/feature-libraries/object-forest/objectForest.d.ts +3 -2
  129. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  130. package/dist/feature-libraries/object-forest/objectForest.js +5 -4
  131. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  132. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  133. package/dist/feature-libraries/optional-field/optionalField.js +1 -0
  134. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  135. package/dist/feature-libraries/sequence-field/index.d.ts +1 -1
  136. package/dist/feature-libraries/sequence-field/index.d.ts.map +1 -1
  137. package/dist/feature-libraries/sequence-field/index.js +1 -2
  138. package/dist/feature-libraries/sequence-field/index.js.map +1 -1
  139. package/dist/feature-libraries/sequence-field/invert.js +1 -1
  140. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  141. package/dist/feature-libraries/sequence-field/rebase.js +6 -1
  142. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  143. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  144. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +1 -0
  145. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  146. package/dist/feature-libraries/sequence-field/utils.d.ts +2 -17
  147. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  148. package/dist/feature-libraries/sequence-field/utils.js +31 -39
  149. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  150. package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts +1 -0
  151. package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +1 -1
  152. package/dist/feature-libraries/typed-schema/typedTreeSchema.js +2 -0
  153. package/dist/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
  154. package/dist/index.d.ts +1 -1
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js.map +1 -1
  157. package/dist/packageVersion.d.ts +1 -1
  158. package/dist/packageVersion.d.ts.map +1 -1
  159. package/dist/packageVersion.js +1 -1
  160. package/dist/packageVersion.js.map +1 -1
  161. package/dist/public.d.ts +1 -1
  162. package/dist/shared-tree/schematizingTreeView.d.ts +4 -2
  163. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  164. package/dist/shared-tree/schematizingTreeView.js +240 -184
  165. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  166. package/dist/shared-tree/sharedTree.d.ts +5 -1
  167. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  168. package/dist/shared-tree/sharedTree.js +157 -90
  169. package/dist/shared-tree/sharedTree.js.map +1 -1
  170. package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
  171. package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  172. package/dist/shared-tree/treeApi.js +1 -1
  173. package/dist/shared-tree/treeApi.js.map +1 -1
  174. package/dist/shared-tree/treeCheckout.d.ts +10 -1
  175. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  176. package/dist/shared-tree/treeCheckout.js +47 -3
  177. package/dist/shared-tree/treeCheckout.js.map +1 -1
  178. package/dist/shared-tree/treeView.d.ts.map +1 -1
  179. package/dist/shared-tree/treeView.js +7 -3
  180. package/dist/shared-tree/treeView.js.map +1 -1
  181. package/dist/shared-tree-core/branch.d.ts +6 -0
  182. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  183. package/dist/shared-tree-core/branch.js +3 -0
  184. package/dist/shared-tree-core/branch.js.map +1 -1
  185. package/dist/shared-tree-core/sharedTreeCore.d.ts +8 -6
  186. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  187. package/dist/shared-tree-core/sharedTreeCore.js +271 -209
  188. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  189. package/dist/simple-tree/arrayNode.d.ts +4 -0
  190. package/dist/simple-tree/arrayNode.d.ts.map +1 -1
  191. package/dist/simple-tree/arrayNode.js +36 -19
  192. package/dist/simple-tree/arrayNode.js.map +1 -1
  193. package/dist/simple-tree/index.d.ts +3 -3
  194. package/dist/simple-tree/index.d.ts.map +1 -1
  195. package/dist/simple-tree/index.js +2 -1
  196. package/dist/simple-tree/index.js.map +1 -1
  197. package/dist/simple-tree/leafNodeSchema.d.ts +22 -1
  198. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  199. package/dist/simple-tree/leafNodeSchema.js +2 -1
  200. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  201. package/dist/simple-tree/mapNode.d.ts.map +1 -1
  202. package/dist/simple-tree/mapNode.js.map +1 -1
  203. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  204. package/dist/simple-tree/objectNode.js +2 -1
  205. package/dist/simple-tree/objectNode.js.map +1 -1
  206. package/dist/simple-tree/proxies.d.ts.map +1 -1
  207. package/dist/simple-tree/proxies.js +9 -25
  208. package/dist/simple-tree/proxies.js.map +1 -1
  209. package/dist/simple-tree/proxyBinding.d.ts +4 -0
  210. package/dist/simple-tree/proxyBinding.d.ts.map +1 -1
  211. package/dist/simple-tree/proxyBinding.js +23 -1
  212. package/dist/simple-tree/proxyBinding.js.map +1 -1
  213. package/dist/simple-tree/schemaFactory.d.ts +16 -1
  214. package/dist/simple-tree/schemaFactory.d.ts.map +1 -1
  215. package/dist/simple-tree/schemaFactory.js +32 -4
  216. package/dist/simple-tree/schemaFactory.js.map +1 -1
  217. package/dist/simple-tree/schemaTypes.d.ts +36 -1
  218. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  219. package/dist/simple-tree/schemaTypes.js.map +1 -1
  220. package/dist/simple-tree/toFlexSchema.d.ts +2 -2
  221. package/dist/simple-tree/toFlexSchema.d.ts.map +1 -1
  222. package/dist/simple-tree/toFlexSchema.js +3 -2
  223. package/dist/simple-tree/toFlexSchema.js.map +1 -1
  224. package/dist/simple-tree/tree.d.ts +4 -1
  225. package/dist/simple-tree/tree.d.ts.map +1 -1
  226. package/dist/simple-tree/tree.js +48 -1
  227. package/dist/simple-tree/tree.js.map +1 -1
  228. package/dist/simple-tree/treeNodeApi.d.ts +2 -75
  229. package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
  230. package/dist/simple-tree/treeNodeApi.js +17 -25
  231. package/dist/simple-tree/treeNodeApi.js.map +1 -1
  232. package/dist/simple-tree/treeNodeKernel.d.ts +26 -0
  233. package/dist/simple-tree/treeNodeKernel.d.ts.map +1 -0
  234. package/dist/simple-tree/treeNodeKernel.js +83 -0
  235. package/dist/simple-tree/treeNodeKernel.js.map +1 -0
  236. package/dist/simple-tree/types.d.ts +95 -3
  237. package/dist/simple-tree/types.d.ts.map +1 -1
  238. package/dist/simple-tree/types.js +120 -21
  239. package/dist/simple-tree/types.js.map +1 -1
  240. package/dist/util/breakable.d.ts +83 -0
  241. package/dist/util/breakable.d.ts.map +1 -0
  242. package/dist/util/breakable.js +178 -0
  243. package/dist/util/breakable.js.map +1 -0
  244. package/dist/util/index.d.ts +3 -2
  245. package/dist/util/index.d.ts.map +1 -1
  246. package/dist/util/index.js +9 -2
  247. package/dist/util/index.js.map +1 -1
  248. package/dist/util/nestedMap.d.ts +17 -3
  249. package/dist/util/nestedMap.d.ts.map +1 -1
  250. package/dist/util/nestedMap.js +21 -1
  251. package/dist/util/nestedMap.js.map +1 -1
  252. package/dist/util/utils.d.ts +7 -0
  253. package/dist/util/utils.d.ts.map +1 -1
  254. package/dist/util/utils.js +15 -1
  255. package/dist/util/utils.js.map +1 -1
  256. package/internal.d.ts +1 -1
  257. package/lib/beta.d.ts +1 -1
  258. package/lib/core/forest/editableForest.d.ts +6 -3
  259. package/lib/core/forest/editableForest.d.ts.map +1 -1
  260. package/lib/core/forest/editableForest.js +17 -5
  261. package/lib/core/forest/editableForest.js.map +1 -1
  262. package/lib/core/index.d.ts +1 -1
  263. package/lib/core/index.d.ts.map +1 -1
  264. package/lib/core/index.js +1 -1
  265. package/lib/core/index.js.map +1 -1
  266. package/lib/core/rebase/index.d.ts +1 -1
  267. package/lib/core/rebase/index.d.ts.map +1 -1
  268. package/lib/core/rebase/index.js +1 -1
  269. package/lib/core/rebase/index.js.map +1 -1
  270. package/lib/core/rebase/types.d.ts +2 -0
  271. package/lib/core/rebase/types.d.ts.map +1 -1
  272. package/lib/core/rebase/types.js +7 -1
  273. package/lib/core/rebase/types.js.map +1 -1
  274. package/lib/core/tree/anchorSet.d.ts +1 -0
  275. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  276. package/lib/core/tree/anchorSet.js +13 -0
  277. package/lib/core/tree/anchorSet.js.map +1 -1
  278. package/lib/core/tree/detachedFieldIndex.d.ts +48 -11
  279. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  280. package/lib/core/tree/detachedFieldIndex.js +145 -21
  281. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  282. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
  283. package/lib/core/tree/detachedFieldIndexCodec.js +13 -4
  284. package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
  285. package/lib/core/tree/detachedFieldIndexFormat.d.ts +1 -1
  286. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
  287. package/lib/core/tree/detachedFieldIndexFormat.js.map +1 -1
  288. package/lib/core/tree/detachedFieldIndexTypes.d.ts +39 -4
  289. package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  290. package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
  291. package/lib/core/tree/index.d.ts +2 -1
  292. package/lib/core/tree/index.d.ts.map +1 -1
  293. package/lib/core/tree/index.js.map +1 -1
  294. package/lib/core/tree/visitDelta.d.ts +3 -1
  295. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  296. package/lib/core/tree/visitDelta.js +31 -15
  297. package/lib/core/tree/visitDelta.js.map +1 -1
  298. package/lib/core/tree/visitorUtils.d.ts +3 -3
  299. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  300. package/lib/core/tree/visitorUtils.js +4 -4
  301. package/lib/core/tree/visitorUtils.js.map +1 -1
  302. package/lib/events/events.d.ts +4 -1
  303. package/lib/events/events.d.ts.map +1 -1
  304. package/lib/events/events.js.map +1 -1
  305. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +1 -1
  306. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  307. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  308. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
  309. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  310. package/lib/feature-libraries/editableTreeBinder.js +1 -1
  311. package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
  312. package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -10
  313. package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
  314. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +2 -74
  315. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  316. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -51
  317. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  318. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  319. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  320. package/lib/feature-libraries/flex-tree/index.d.ts +3 -2
  321. package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
  322. package/lib/feature-libraries/flex-tree/index.js +2 -1
  323. package/lib/feature-libraries/flex-tree/index.js.map +1 -1
  324. package/lib/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
  325. package/lib/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
  326. package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  327. package/lib/feature-libraries/flex-tree/lazyField.d.ts +1 -6
  328. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  329. package/lib/feature-libraries/flex-tree/lazyField.js +13 -34
  330. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  331. package/lib/feature-libraries/flex-tree/lazyNode.d.ts +1 -5
  332. package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  333. package/lib/feature-libraries/flex-tree/lazyNode.js +3 -33
  334. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  335. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  336. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -1
  337. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  338. package/lib/feature-libraries/index.d.ts +3 -3
  339. package/lib/feature-libraries/index.d.ts.map +1 -1
  340. package/lib/feature-libraries/index.js +3 -3
  341. package/lib/feature-libraries/index.js.map +1 -1
  342. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +11 -0
  343. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  344. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  345. package/lib/feature-libraries/modular-schema/discrepancies.d.ts +96 -0
  346. package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -0
  347. package/lib/feature-libraries/modular-schema/discrepancies.js +260 -0
  348. package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -0
  349. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -2
  350. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  351. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  352. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  353. package/lib/feature-libraries/modular-schema/genericFieldKind.js +3 -0
  354. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  355. package/lib/feature-libraries/modular-schema/index.d.ts +2 -1
  356. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  357. package/lib/feature-libraries/modular-schema/index.js +1 -0
  358. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  359. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  360. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +42 -26
  361. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  362. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +51 -2
  363. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  364. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +826 -247
  365. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  366. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  367. package/lib/feature-libraries/modular-schema/modularChangeFormat.js +2 -0
  368. package/lib/feature-libraries/modular-schema/modularChangeFormat.js.map +1 -1
  369. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +44 -1
  370. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  371. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  372. package/lib/feature-libraries/node-key/index.d.ts +0 -1
  373. package/lib/feature-libraries/node-key/index.d.ts.map +1 -1
  374. package/lib/feature-libraries/node-key/index.js +0 -1
  375. package/lib/feature-libraries/node-key/index.js.map +1 -1
  376. package/lib/feature-libraries/object-forest/objectForest.d.ts +3 -2
  377. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  378. package/lib/feature-libraries/object-forest/objectForest.js +5 -4
  379. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  380. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  381. package/lib/feature-libraries/optional-field/optionalField.js +1 -0
  382. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  383. package/lib/feature-libraries/sequence-field/index.d.ts +1 -1
  384. package/lib/feature-libraries/sequence-field/index.d.ts.map +1 -1
  385. package/lib/feature-libraries/sequence-field/index.js +1 -1
  386. package/lib/feature-libraries/sequence-field/index.js.map +1 -1
  387. package/lib/feature-libraries/sequence-field/invert.js +1 -1
  388. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  389. package/lib/feature-libraries/sequence-field/rebase.js +6 -1
  390. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  391. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  392. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +2 -1
  393. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  394. package/lib/feature-libraries/sequence-field/utils.d.ts +2 -17
  395. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  396. package/lib/feature-libraries/sequence-field/utils.js +31 -39
  397. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  398. package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts +1 -0
  399. package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +1 -1
  400. package/lib/feature-libraries/typed-schema/typedTreeSchema.js +4 -2
  401. package/lib/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
  402. package/lib/index.d.ts +1 -1
  403. package/lib/index.d.ts.map +1 -1
  404. package/lib/index.js.map +1 -1
  405. package/lib/packageVersion.d.ts +1 -1
  406. package/lib/packageVersion.d.ts.map +1 -1
  407. package/lib/packageVersion.js +1 -1
  408. package/lib/packageVersion.js.map +1 -1
  409. package/lib/public.d.ts +1 -1
  410. package/lib/shared-tree/schematizingTreeView.d.ts +4 -2
  411. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  412. package/lib/shared-tree/schematizingTreeView.js +242 -185
  413. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  414. package/lib/shared-tree/sharedTree.d.ts +5 -1
  415. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  416. package/lib/shared-tree/sharedTree.js +158 -90
  417. package/lib/shared-tree/sharedTree.js.map +1 -1
  418. package/lib/shared-tree/sharedTreeChangeEnricher.js +1 -1
  419. package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  420. package/lib/shared-tree/treeApi.js +1 -1
  421. package/lib/shared-tree/treeApi.js.map +1 -1
  422. package/lib/shared-tree/treeCheckout.d.ts +10 -1
  423. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  424. package/lib/shared-tree/treeCheckout.js +47 -3
  425. package/lib/shared-tree/treeCheckout.js.map +1 -1
  426. package/lib/shared-tree/treeView.d.ts.map +1 -1
  427. package/lib/shared-tree/treeView.js +4 -0
  428. package/lib/shared-tree/treeView.js.map +1 -1
  429. package/lib/shared-tree-core/branch.d.ts +6 -0
  430. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  431. package/lib/shared-tree-core/branch.js +3 -0
  432. package/lib/shared-tree-core/branch.js.map +1 -1
  433. package/lib/shared-tree-core/sharedTreeCore.d.ts +8 -6
  434. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  435. package/lib/shared-tree-core/sharedTreeCore.js +273 -210
  436. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  437. package/lib/simple-tree/arrayNode.d.ts +4 -0
  438. package/lib/simple-tree/arrayNode.d.ts.map +1 -1
  439. package/lib/simple-tree/arrayNode.js +39 -22
  440. package/lib/simple-tree/arrayNode.js.map +1 -1
  441. package/lib/simple-tree/index.d.ts +3 -3
  442. package/lib/simple-tree/index.d.ts.map +1 -1
  443. package/lib/simple-tree/index.js +1 -1
  444. package/lib/simple-tree/index.js.map +1 -1
  445. package/lib/simple-tree/leafNodeSchema.d.ts +22 -1
  446. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  447. package/lib/simple-tree/leafNodeSchema.js +1 -1
  448. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  449. package/lib/simple-tree/mapNode.d.ts.map +1 -1
  450. package/lib/simple-tree/mapNode.js.map +1 -1
  451. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  452. package/lib/simple-tree/objectNode.js +3 -2
  453. package/lib/simple-tree/objectNode.js.map +1 -1
  454. package/lib/simple-tree/proxies.d.ts.map +1 -1
  455. package/lib/simple-tree/proxies.js +9 -25
  456. package/lib/simple-tree/proxies.js.map +1 -1
  457. package/lib/simple-tree/proxyBinding.d.ts +4 -0
  458. package/lib/simple-tree/proxyBinding.d.ts.map +1 -1
  459. package/lib/simple-tree/proxyBinding.js +19 -0
  460. package/lib/simple-tree/proxyBinding.js.map +1 -1
  461. package/lib/simple-tree/schemaFactory.d.ts +16 -1
  462. package/lib/simple-tree/schemaFactory.d.ts.map +1 -1
  463. package/lib/simple-tree/schemaFactory.js +30 -3
  464. package/lib/simple-tree/schemaFactory.js.map +1 -1
  465. package/lib/simple-tree/schemaTypes.d.ts +36 -1
  466. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  467. package/lib/simple-tree/schemaTypes.js.map +1 -1
  468. package/lib/simple-tree/toFlexSchema.d.ts +2 -2
  469. package/lib/simple-tree/toFlexSchema.d.ts.map +1 -1
  470. package/lib/simple-tree/toFlexSchema.js +3 -2
  471. package/lib/simple-tree/toFlexSchema.js.map +1 -1
  472. package/lib/simple-tree/tree.d.ts +4 -1
  473. package/lib/simple-tree/tree.d.ts.map +1 -1
  474. package/lib/simple-tree/tree.js +44 -0
  475. package/lib/simple-tree/tree.js.map +1 -1
  476. package/lib/simple-tree/treeNodeApi.d.ts +2 -75
  477. package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
  478. package/lib/simple-tree/treeNodeApi.js +20 -28
  479. package/lib/simple-tree/treeNodeApi.js.map +1 -1
  480. package/lib/simple-tree/treeNodeKernel.d.ts +26 -0
  481. package/lib/simple-tree/treeNodeKernel.d.ts.map +1 -0
  482. package/lib/simple-tree/treeNodeKernel.js +79 -0
  483. package/lib/simple-tree/treeNodeKernel.js.map +1 -0
  484. package/lib/simple-tree/types.d.ts +95 -3
  485. package/lib/simple-tree/types.d.ts.map +1 -1
  486. package/lib/simple-tree/types.js +121 -22
  487. package/lib/simple-tree/types.js.map +1 -1
  488. package/lib/util/breakable.d.ts +83 -0
  489. package/lib/util/breakable.d.ts.map +1 -0
  490. package/lib/util/breakable.js +171 -0
  491. package/lib/util/breakable.js.map +1 -0
  492. package/lib/util/index.d.ts +3 -2
  493. package/lib/util/index.d.ts.map +1 -1
  494. package/lib/util/index.js +3 -2
  495. package/lib/util/index.js.map +1 -1
  496. package/lib/util/nestedMap.d.ts +17 -3
  497. package/lib/util/nestedMap.d.ts.map +1 -1
  498. package/lib/util/nestedMap.js +19 -0
  499. package/lib/util/nestedMap.js.map +1 -1
  500. package/lib/util/utils.d.ts +7 -0
  501. package/lib/util/utils.d.ts.map +1 -1
  502. package/lib/util/utils.js +13 -0
  503. package/lib/util/utils.js.map +1 -1
  504. package/package.json +29 -27
  505. package/src/core/forest/editableForest.ts +25 -4
  506. package/src/core/index.ts +2 -0
  507. package/src/core/rebase/index.ts +2 -0
  508. package/src/core/rebase/types.ts +17 -0
  509. package/src/core/tree/anchorSet.ts +14 -0
  510. package/src/core/tree/detachedFieldIndex.ts +217 -35
  511. package/src/core/tree/detachedFieldIndexCodec.ts +17 -8
  512. package/src/core/tree/detachedFieldIndexFormat.ts +1 -1
  513. package/src/core/tree/detachedFieldIndexTypes.ts +41 -5
  514. package/src/core/tree/index.ts +2 -1
  515. package/src/core/tree/visitDelta.ts +58 -16
  516. package/src/core/tree/visitorUtils.ts +7 -4
  517. package/src/events/events.ts +4 -2
  518. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +1 -1
  519. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -0
  520. package/src/feature-libraries/editableTreeBinder.ts +1 -1
  521. package/src/feature-libraries/flex-map-tree/mapTreeNode.ts +1 -95
  522. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -62
  523. package/src/feature-libraries/flex-tree/index.ts +7 -2
  524. package/src/feature-libraries/flex-tree/lazyEntity.ts +0 -3
  525. package/src/feature-libraries/flex-tree/lazyField.ts +15 -47
  526. package/src/feature-libraries/flex-tree/lazyNode.ts +1 -48
  527. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -0
  528. package/src/feature-libraries/index.ts +4 -2
  529. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +18 -0
  530. package/src/feature-libraries/modular-schema/discrepancies.ts +395 -0
  531. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +10 -2
  532. package/src/feature-libraries/modular-schema/genericFieldKind.ts +3 -0
  533. package/src/feature-libraries/modular-schema/index.ts +2 -0
  534. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +81 -35
  535. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +1521 -444
  536. package/src/feature-libraries/modular-schema/modularChangeFormat.ts +2 -0
  537. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +51 -0
  538. package/src/feature-libraries/node-key/index.ts +0 -1
  539. package/src/feature-libraries/object-forest/objectForest.ts +7 -3
  540. package/src/feature-libraries/optional-field/optionalField.ts +1 -0
  541. package/src/feature-libraries/sequence-field/index.ts +0 -2
  542. package/src/feature-libraries/sequence-field/invert.ts +1 -1
  543. package/src/feature-libraries/sequence-field/rebase.ts +7 -1
  544. package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +2 -1
  545. package/src/feature-libraries/sequence-field/utils.ts +37 -85
  546. package/src/feature-libraries/typed-schema/typedTreeSchema.ts +10 -0
  547. package/src/index.ts +0 -1
  548. package/src/packageVersion.ts +1 -1
  549. package/src/shared-tree/schematizingTreeView.ts +6 -2
  550. package/src/shared-tree/sharedTree.ts +12 -1
  551. package/src/shared-tree/sharedTreeChangeEnricher.ts +1 -1
  552. package/src/shared-tree/treeApi.ts +1 -1
  553. package/src/shared-tree/treeCheckout.ts +60 -5
  554. package/src/shared-tree/treeView.ts +5 -0
  555. package/src/shared-tree-core/branch.ts +10 -0
  556. package/src/shared-tree-core/sharedTreeCore.ts +25 -6
  557. package/src/simple-tree/arrayNode.ts +50 -23
  558. package/src/simple-tree/index.ts +3 -3
  559. package/src/simple-tree/leafNodeSchema.ts +1 -1
  560. package/src/simple-tree/mapNode.ts +2 -2
  561. package/src/simple-tree/objectNode.ts +9 -3
  562. package/src/simple-tree/proxies.ts +10 -33
  563. package/src/simple-tree/proxyBinding.ts +23 -0
  564. package/src/simple-tree/schemaFactory.ts +37 -2
  565. package/src/simple-tree/schemaTypes.ts +36 -1
  566. package/src/simple-tree/toFlexSchema.ts +5 -4
  567. package/src/simple-tree/tree.ts +68 -4
  568. package/src/simple-tree/treeNodeApi.ts +29 -111
  569. package/src/simple-tree/treeNodeKernel.ts +91 -0
  570. package/src/simple-tree/types.ts +292 -31
  571. package/src/util/breakable.ts +214 -0
  572. package/src/util/index.ts +11 -0
  573. package/src/util/nestedMap.ts +33 -3
  574. package/src/util/utils.ts +17 -0
  575. package/dist/feature-libraries/node-key/nodeKeyIndex.d.ts +0 -41
  576. package/dist/feature-libraries/node-key/nodeKeyIndex.d.ts.map +0 -1
  577. package/dist/feature-libraries/node-key/nodeKeyIndex.js +0 -101
  578. package/dist/feature-libraries/node-key/nodeKeyIndex.js.map +0 -1
  579. package/lib/feature-libraries/node-key/nodeKeyIndex.d.ts +0 -41
  580. package/lib/feature-libraries/node-key/nodeKeyIndex.d.ts.map +0 -1
  581. package/lib/feature-libraries/node-key/nodeKeyIndex.js +0 -97
  582. package/lib/feature-libraries/node-key/nodeKeyIndex.js.map +0 -1
  583. package/src/feature-libraries/node-key/nodeKeyIndex.ts +0 -132
@@ -130,6 +130,8 @@ export const EncodedModularChangeset = Type.Object(
130
130
  maxId: Type.Optional(ChangesetLocalIdSchema),
131
131
  changes: EncodedFieldChangeMap,
132
132
  revisions: Type.ReadonlyOptional(Type.Array(EncodedRevisionInfo)),
133
+ // TODO#8574: separating `builds` and `refreshers` here means that we encode their `EncodedBuilds.trees` separately.
134
+ // This can lead to a less efficient wire representation because of duplicated schema/shape information.
133
135
  builds: Type.Optional(EncodedBuilds),
134
136
  refreshers: Type.Optional(EncodedBuilds),
135
137
  /**
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import type { BTree } from "@tylerbu/sorted-btree-es6";
6
7
  import type {
7
8
  ChangeAtomId,
8
9
  ChangeAtomIdMap,
@@ -10,9 +11,11 @@ import type {
10
11
  FieldKey,
11
12
  FieldKindIdentifier,
12
13
  RevisionInfo,
14
+ RevisionTag,
13
15
  } from "../../core/index.js";
14
16
  import type { Brand } from "../../util/index.js";
15
17
  import type { TreeChunk } from "../chunked-forest/index.js";
18
+ import type { CrossFieldTarget } from "./crossFieldQueries.js";
16
19
 
17
20
  /**
18
21
  * @internal
@@ -30,13 +33,61 @@ export interface ModularChangeset extends HasFieldChanges {
30
33
  */
31
34
  readonly revisions?: readonly RevisionInfo[];
32
35
  readonly fieldChanges: FieldChangeMap;
36
+
37
+ /**
38
+ * Maps from this changeset's canonical ID for a node (see comment on node aliases) to the changes for that node.
39
+ */
33
40
  readonly nodeChanges: ChangeAtomIdMap<NodeChangeset>;
41
+
42
+ /**
43
+ * Maps from this changeset's canonical ID for a node to the ID for the field which contains that node.
44
+ */
45
+ // TODO: Should this be merged with `nodeChanges`?
46
+ readonly nodeToParent: ChangeAtomIdMap<FieldId>;
47
+
48
+ /**
49
+ * Maps from a node ID to another ID for the same node.
50
+ * If a node ID used in this changeset has no entry in this table, then it is the canonical ID for that node.
51
+ * The aliases form a set of trees, where the root of each tree is a canonical ID.
52
+ *
53
+ * When composing changesets with different canonical IDs for the same node,
54
+ * one of those IDs becomes the canonical ID for the composition, while the other is added to this table as an alias.
55
+ *
56
+ * Node aliases are preserved when composing changesets so we can avoid having to find and update all changed node IDs
57
+ * in the field IDs in nodeToParent and crossFieldKeys.
58
+ */
59
+ readonly nodeAliases: ChangeAtomIdMap<NodeId>;
60
+ readonly crossFieldKeys: CrossFieldKeyTable;
34
61
  readonly constraintViolationCount?: number;
35
62
  readonly builds?: ChangeAtomIdMap<TreeChunk>;
36
63
  readonly destroys?: ChangeAtomIdMap<number>;
37
64
  readonly refreshers?: ChangeAtomIdMap<TreeChunk>;
38
65
  }
39
66
 
67
+ export type TupleBTree<K, V> = Brand<BTree<K, V>, "TupleBTree">;
68
+ export type CrossFieldKeyTable = TupleBTree<CrossFieldKeyRange, FieldId>;
69
+ export type CrossFieldKeyRange = readonly [
70
+ CrossFieldTarget,
71
+ RevisionTag | undefined,
72
+ ChangesetLocalId,
73
+ /**
74
+ * The length of this range.
75
+ * TODO: This does not need to be part of the key and could be part of the value instead.
76
+ */
77
+ number,
78
+ ];
79
+
80
+ export type CrossFieldKey = readonly [
81
+ CrossFieldTarget,
82
+ RevisionTag | undefined,
83
+ ChangesetLocalId,
84
+ ];
85
+
86
+ export interface FieldId {
87
+ readonly nodeId: NodeId | undefined;
88
+ readonly field: FieldKey;
89
+ }
90
+
40
91
  /**
41
92
  * @internal
42
93
  */
@@ -10,7 +10,6 @@ export {
10
10
  type StableNodeKey,
11
11
  nodeKeyTreeIdentifier,
12
12
  } from "./nodeKey.js";
13
- export { NodeKeyIndex } from "./nodeKeyIndex.js";
14
13
  export {
15
14
  createNodeKeyManager,
16
15
  isStableNodeKey,
@@ -94,6 +94,7 @@ export class ObjectForest implements IEditableForest {
94
94
 
95
95
  public constructor(
96
96
  public readonly anchors: AnchorSet = new AnchorSet(),
97
+ public readonly additionalAsserts: boolean = false,
97
98
  roots?: MapTree,
98
99
  ) {
99
100
  this.#roots =
@@ -117,7 +118,7 @@ export class ObjectForest implements IEditableForest {
117
118
  }
118
119
 
119
120
  public clone(_: TreeStoredSchemaSubscription, anchors: AnchorSet): ObjectForest {
120
- return new ObjectForest(anchors, this.roots);
121
+ return new ObjectForest(anchors, this.additionalAsserts, this.roots);
121
122
  }
122
123
 
123
124
  public forgetAnchor(anchor: Anchor): void {
@@ -554,6 +555,9 @@ class Cursor extends SynchronousCursor implements ITreeSubscriptionCursor {
554
555
  /**
555
556
  * @returns an implementation of {@link IEditableForest} with no data or schema.
556
557
  */
557
- export function buildForest(anchors?: AnchorSet): ObjectForest {
558
- return new ObjectForest(anchors);
558
+ export function buildForest(
559
+ anchors?: AnchorSet,
560
+ additionalAsserts: boolean = false,
561
+ ): ObjectForest {
562
+ return new ObjectForest(anchors, additionalAsserts);
559
563
  }
@@ -713,6 +713,7 @@ export const optionalChangeHandler: FieldChangeHandler<
713
713
  getNestedChanges,
714
714
 
715
715
  createEmpty: () => ({ moves: [], childChanges: [] }),
716
+ getCrossFieldKeys: (_change) => [],
716
717
  };
717
718
 
718
719
  function getNestedChanges(change: OptionalChangeset): [NodeId, number | undefined][] {
@@ -42,8 +42,6 @@ export { compose } from "./compose.js";
42
42
  export {
43
43
  getInputLength,
44
44
  isDetach,
45
- newCrossFieldTable,
46
- type CrossFieldTable,
47
45
  cloneMark,
48
46
  extractMarkEffect,
49
47
  } from "./utils.js";
@@ -194,7 +194,6 @@ function invertMark(
194
194
  return applyMovedChanges(invertedMark, mark.revision, crossFieldManager);
195
195
  }
196
196
  case "AttachAndDetach": {
197
- // Which should get the child change? Don't want to invert twice
198
197
  const attach: Mark = {
199
198
  count: mark.count,
200
199
  cellId: mark.cellId,
@@ -294,6 +293,7 @@ function applyMovedChanges(
294
293
  }
295
294
 
296
295
  if (entry.value !== undefined) {
296
+ manager.onMoveIn(entry.value);
297
297
  return [withNodeChange<CellMark<MoveOut>, MoveOut>(mark, entry.value)];
298
298
  }
299
299
 
@@ -270,6 +270,7 @@ function rebaseMark(
270
270
  0x8dc /* Unexpected collision of new node changes */,
271
271
  );
272
272
  rebasedMark.changes = movedNodeChanges;
273
+ moveEffects.onMoveIn(movedNodeChanges);
273
274
  }
274
275
 
275
276
  return rebaseMarkIgnoreChild(rebasedMark, baseMark, moveEffects);
@@ -514,7 +515,12 @@ function getMovedEffect(
514
515
  ): MarkEffect | undefined {
515
516
  const effect = getMoveEffect(moveEffects, CrossFieldTarget.Destination, revision, id, count);
516
517
  assert(effect.length === count, 0x6f3 /* Expected effect to cover entire mark */);
517
- return effect.value?.movedEffect;
518
+ const movedEffect = effect.value?.movedEffect;
519
+ if (movedEffect !== undefined && movedEffect.type === "MoveOut") {
520
+ moveEffects.moveKey(CrossFieldTarget.Source, movedEffect.revision, movedEffect.id, count);
521
+ }
522
+
523
+ return movedEffect;
518
524
  }
519
525
 
520
526
  function getMovedChangesFromBaseMark(
@@ -11,7 +11,7 @@ import { sequenceFieldChangeCodecFactory } from "./sequenceFieldCodecs.js";
11
11
  import { type SequenceFieldEditor, sequenceFieldEditor } from "./sequenceFieldEditor.js";
12
12
  import { sequenceFieldToDelta } from "./sequenceFieldToDelta.js";
13
13
  import type { Changeset } from "./types.js";
14
- import { createEmpty, getNestedChanges, isEmpty } from "./utils.js";
14
+ import { createEmpty, getCrossFieldKeys, getNestedChanges, isEmpty } from "./utils.js";
15
15
 
16
16
  export type SequenceFieldChangeHandler = FieldChangeHandler<Changeset, SequenceFieldEditor>;
17
17
 
@@ -24,4 +24,5 @@ export const sequenceFieldChangeHandler: SequenceFieldChangeHandler = {
24
24
  isEmpty,
25
25
  getNestedChanges,
26
26
  createEmpty,
27
+ getCrossFieldKeys,
27
28
  };
@@ -13,20 +13,11 @@ import {
13
13
  areEqualChangeAtomIds,
14
14
  makeChangeAtomId,
15
15
  } from "../../core/index.js";
16
+ import { type Mutable, brand, fail } from "../../util/index.js";
16
17
  import {
17
- type Mutable,
18
- type RangeMap,
19
- brand,
20
- fail,
21
- getFromRangeMap,
22
- } from "../../util/index.js";
23
- import {
24
- type CrossFieldManager,
25
- type CrossFieldQuerySet,
26
18
  CrossFieldTarget,
27
19
  type NodeId,
28
- addCrossFieldQuery,
29
- setInCrossFieldMap,
20
+ type CrossFieldKeyRange,
30
21
  } from "../modular-schema/index.js";
31
22
 
32
23
  import type {
@@ -47,7 +38,6 @@ import {
47
38
  type Insert,
48
39
  type Mark,
49
40
  type MarkEffect,
50
- type MoveId,
51
41
  type MoveIn,
52
42
  type MoveOut,
53
43
  type NoopMark,
@@ -708,79 +698,6 @@ function tryMergeEffects(
708
698
  return undefined;
709
699
  }
710
700
 
711
- /**
712
- * @internal
713
- */
714
- export interface CrossFieldTable<T = unknown> extends CrossFieldManager<T> {
715
- srcQueries: CrossFieldQuerySet;
716
- dstQueries: CrossFieldQuerySet;
717
- isInvalidated: boolean;
718
- mapSrc: Map<RevisionTag | undefined, RangeMap<T>>;
719
- mapDst: Map<RevisionTag | undefined, RangeMap<T>>;
720
- reset: () => void;
721
- }
722
-
723
- /**
724
- * @internal
725
- */
726
- export function newCrossFieldTable<T = unknown>(): CrossFieldTable<T> {
727
- const srcQueries: CrossFieldQuerySet = new Map();
728
- const dstQueries: CrossFieldQuerySet = new Map();
729
- const mapSrc: Map<RevisionTag | undefined, RangeMap<T>> = new Map();
730
- const mapDst: Map<RevisionTag | undefined, RangeMap<T>> = new Map();
731
-
732
- const getMap = (target: CrossFieldTarget): Map<RevisionTag | undefined, RangeMap<T>> =>
733
- target === CrossFieldTarget.Source ? mapSrc : mapDst;
734
-
735
- const getQueries = (target: CrossFieldTarget): CrossFieldQuerySet =>
736
- target === CrossFieldTarget.Source ? srcQueries : dstQueries;
737
-
738
- const table = {
739
- srcQueries,
740
- dstQueries,
741
- isInvalidated: false,
742
- mapSrc,
743
- mapDst,
744
-
745
- get: (
746
- target: CrossFieldTarget,
747
- revision: RevisionTag | undefined,
748
- id: MoveId,
749
- count: number,
750
- addDependency: boolean,
751
- ) => {
752
- if (addDependency) {
753
- addCrossFieldQuery(getQueries(target), revision, id, count);
754
- }
755
- return getFromRangeMap(getMap(target).get(revision) ?? [], id, count);
756
- },
757
- set: (
758
- target: CrossFieldTarget,
759
- revision: RevisionTag | undefined,
760
- id: MoveId,
761
- count: number,
762
- value: T,
763
- invalidateDependents: boolean,
764
- ) => {
765
- if (
766
- invalidateDependents &&
767
- getFromRangeMap(getQueries(target).get(revision) ?? [], id, count) !== undefined
768
- ) {
769
- table.isInvalidated = true;
770
- }
771
- setInCrossFieldMap(getMap(target), revision, id, count, value);
772
- },
773
-
774
- reset: () => {
775
- table.isInvalidated = false;
776
- table.srcQueries.clear();
777
- table.dstQueries.clear();
778
- },
779
- };
780
-
781
- return table;
782
- }
783
-
784
701
  /**
785
702
  * Splits the `mark` into two marks such that the first returned mark has length `length`.
786
703
  * @param mark - The mark to split.
@@ -969,3 +886,38 @@ export function getEndpoint(effect: MoveMarkEffect): ChangeAtomId {
969
886
  }
970
887
  : { revision: effect.revision, localId: effect.id };
971
888
  }
889
+
890
+ export function getCrossFieldKeys(change: Changeset): CrossFieldKeyRange[] {
891
+ const keys: CrossFieldKeyRange[] = [];
892
+ for (const mark of change) {
893
+ keys.push(...getCrossFieldKeysForMarkEffect(mark, mark.count));
894
+ }
895
+
896
+ return keys;
897
+ }
898
+
899
+ function getCrossFieldKeysForMarkEffect(
900
+ effect: MarkEffect,
901
+ count: number,
902
+ ): CrossFieldKeyRange[] {
903
+ switch (effect.type) {
904
+ case "Insert":
905
+ // An insert behaves like a move where the source and destination are at the same location.
906
+ // An insert can become a move when after rebasing.
907
+ return [
908
+ [CrossFieldTarget.Source, effect.revision, effect.id, count],
909
+ [CrossFieldTarget.Destination, effect.revision, effect.id, count],
910
+ ];
911
+ case "MoveOut":
912
+ return [[CrossFieldTarget.Source, effect.revision, effect.id, count]];
913
+ case "MoveIn":
914
+ return [[CrossFieldTarget.Destination, effect.revision, effect.id, count]];
915
+ case "AttachAndDetach":
916
+ return [
917
+ ...getCrossFieldKeysForMarkEffect(effect.attach, count),
918
+ ...getCrossFieldKeysForMarkEffect(effect.detach, count),
919
+ ];
920
+ default:
921
+ return [];
922
+ }
923
+ }
@@ -19,6 +19,7 @@ import {
19
19
  type TreeStoredSchema,
20
20
  type TreeTypeSet,
21
21
  type ValueSchema,
22
+ identifierFieldKindIdentifier,
22
23
  } from "../../core/index.js";
23
24
  import {
24
25
  type Assume,
@@ -28,6 +29,7 @@ import {
28
29
  mapIterable,
29
30
  oneFromSet,
30
31
  type requireAssignableTo,
32
+ filterIterable,
31
33
  } from "../../util/index.js";
32
34
  import { FieldKinds } from "../default-schema/index.js";
33
35
  import type { FlexFieldKind, FullSchemaPolicy } from "../modular-schema/index.js";
@@ -154,6 +156,7 @@ export class FlexObjectNodeSchema<
154
156
  const out Specification extends Unenforced<FlexObjectNodeFields> = FlexObjectNodeFields,
155
157
  > extends TreeNodeSchemaBase<Name, Specification> {
156
158
  protected _typeCheck2?: MakeNominal;
159
+ public readonly identifierFieldKeys: readonly FieldKey[] = [];
157
160
 
158
161
  public static create<
159
162
  const Name extends string,
@@ -192,6 +195,13 @@ export class FlexObjectNodeSchema<
192
195
  ) {
193
196
  const fields = mapIterable(objectNodeFields, ([k, v]) => [k, v.stored] as const);
194
197
  super(builder, name, info, new ObjectNodeStoredSchema(new Map(fields)));
198
+ this.identifierFieldKeys = Array.from(
199
+ filterIterable(
200
+ objectNodeFields.entries(),
201
+ ([k, f]) => f.kind.identifier === identifierFieldKindIdentifier,
202
+ ),
203
+ ([k]) => k,
204
+ );
195
205
  }
196
206
 
197
207
  public override getFieldSchema(field: FieldKey): FlexFieldSchema {
package/src/index.ts CHANGED
@@ -358,7 +358,6 @@ export {
358
358
  type FlexTreeUnboxField,
359
359
  type FlexTreeUnboxNode,
360
360
  type FlexTreeUnboxNodeUnion,
361
- type FlexTreeNodeKeyField,
362
361
  type IsArrayOfOne,
363
362
  type FlexibleNodeSubSequence,
364
363
  flexTreeMarker,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.1.0-276985";
9
+ export const pkgVersion = "2.1.0";
@@ -39,7 +39,7 @@ import {
39
39
  mapTreeFromNodeData,
40
40
  prepareContentForHydration,
41
41
  } from "../simple-tree/index.js";
42
- import { disposeSymbol } from "../util/index.js";
42
+ import { Breakable, breakingClass, disposeSymbol, type WithBreakable } from "../util/index.js";
43
43
 
44
44
  import { canInitialize, ensureSchema, initialize } from "./schematizeTree.js";
45
45
  import type { TreeCheckout } from "./treeCheckout.js";
@@ -48,8 +48,9 @@ import { CheckoutFlexTreeView } from "./treeView.js";
48
48
  /**
49
49
  * Implementation of TreeView wrapping a FlexTreeView.
50
50
  */
51
+ @breakingClass
51
52
  export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitFieldSchema>
52
- implements TreeView<TRootSchema>
53
+ implements TreeView<TRootSchema>, WithBreakable
53
54
  {
54
55
  /**
55
56
  * The view is set to undefined when this object is disposed or the view schema does not support viewing the document's stored schema.
@@ -86,6 +87,7 @@ export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitField
86
87
  public readonly checkout: TreeCheckout,
87
88
  public readonly config: TreeViewConfiguration<TRootSchema>,
88
89
  public readonly nodeKeyManager: NodeKeyManager,
90
+ public readonly breaker: Breakable = new Breakable("SchematizingSimpleTreeView"),
89
91
  ) {
90
92
  const policy = {
91
93
  ...defaultSchemaPolicy,
@@ -306,6 +308,7 @@ export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitField
306
308
  }
307
309
 
308
310
  public get root(): TreeFieldFromImplicitField<TRootSchema> {
311
+ this.breaker.use();
309
312
  if (!this.compatibility.canView) {
310
313
  throw new UsageError(
311
314
  "Document is out of schema. Check TreeView.compatibility before accessing TreeView.root.",
@@ -316,6 +319,7 @@ export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitField
316
319
  }
317
320
 
318
321
  public set root(newRoot: InsertableTreeFieldFromImplicitField<TRootSchema>) {
322
+ this.breaker.use();
319
323
  if (!this.compatibility.canView) {
320
324
  throw new UsageError(
321
325
  "Document is out of schema. Check TreeView.compatibility before accessing TreeView.root.",
@@ -64,6 +64,7 @@ import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
64
64
  import type { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
65
65
  import { type CheckoutEvents, type TreeCheckout, createTreeCheckout } from "./treeCheckout.js";
66
66
  import type { CheckoutFlexTreeView, FlexTreeView } from "./treeView.js";
67
+ import { breakingClass, throwIfBroken } from "../util/index.js";
67
68
 
68
69
  /**
69
70
  * Copy of data from an {@link ISharedTree} at some point in time.
@@ -162,6 +163,7 @@ function getCodecVersions(formatVersion: number): ExplicitCodecVersions {
162
163
  *
163
164
  * TODO: detail compatibility requirements.
164
165
  */
166
+ @breakingClass
165
167
  export class SharedTree
166
168
  extends SharedTreeCore<SharedTreeEditBuilder, SharedTreeChange>
167
169
  implements ISharedTree
@@ -191,7 +193,9 @@ export class SharedTree
191
193
  const forest =
192
194
  options.forest === ForestType.Optimized
193
195
  ? buildChunkedForest(makeTreeChunker(schema, defaultSchemaPolicy))
194
- : buildForest();
196
+ : options.forest === ForestType.Reference
197
+ ? buildForest()
198
+ : buildForest(undefined, true);
195
199
  const revisionTagCodec = new RevisionTagCodec(runtime.idCompressor);
196
200
  const removedRoots = makeDetachedFieldIndex(
197
201
  "repair",
@@ -288,6 +292,7 @@ export class SharedTree
288
292
  );
289
293
  }
290
294
 
295
+ @throwIfBroken
291
296
  public contentSnapshot(): SharedTreeContentSnapshot {
292
297
  const cursor = this.checkout.forest.allocateCursor("contentSnapshot");
293
298
  try {
@@ -326,11 +331,13 @@ export class SharedTree
326
331
  this.checkout,
327
332
  config,
328
333
  createNodeKeyManager(this.runtime.idCompressor),
334
+ this.breaker,
329
335
  );
330
336
  }
331
337
 
332
338
  protected override async loadCore(services: IChannelStorageService): Promise<void> {
333
339
  await super.loadCore(services);
340
+ this.checkout.setTipRevisionForLoadedData(this.trunkHeadRevision);
334
341
  this._events.emit("afterBatch");
335
342
  }
336
343
  }
@@ -419,6 +426,10 @@ export enum ForestType {
419
426
  * The "ChunkedForest" forest type.
420
427
  */
421
428
  Optimized = 1,
429
+ /**
430
+ * The "ObjectForest" forest type with expensive asserts for debugging.
431
+ */
432
+ Expensive = 2,
422
433
  }
423
434
 
424
435
  export const defaultSharedTreeOptions: Required<SharedTreeOptions> = {
@@ -87,7 +87,7 @@ export class SharedTreeMutableChangeEnricher
87
87
  case "data": {
88
88
  const delta = intoDelta(tagChange(dataOrSchemaChange.innerChange, revision));
89
89
  const visitor = this.forest.acquireVisitor();
90
- visitDelta(delta, visitor, this.removedRoots);
90
+ visitDelta(delta, visitor, this.removedRoots, revision);
91
91
  visitor.free();
92
92
  break;
93
93
  }
@@ -455,7 +455,7 @@ function runTransactionInCheckout<TResult>(
455
455
  case "nodeInDocument": {
456
456
  const node = getFlexNode(constraint.node);
457
457
  assert(
458
- node.treeStatus() === TreeStatus.InDocument,
458
+ treeApi.status(constraint.node) === TreeStatus.InDocument,
459
459
  0x90f /* Attempted to apply "nodeExists" constraint when building a transaction, but the node is not in the document. */,
460
460
  );
461
461
  checkout.editor.addNodeExistsConstraint(node.anchorNode);
@@ -387,6 +387,11 @@ export class TreeCheckout implements ITreeCheckoutFork {
387
387
  SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>
388
388
  >();
389
389
 
390
+ /**
391
+ * copies of the removed roots used as snapshots for reverting to previous state when transactions are aborted
392
+ */
393
+ private readonly removedRootsSnapshots: DetachedFieldIndex[] = [];
394
+
390
395
  /**
391
396
  * The name of the telemetry event logged for calls to {@link TreeCheckout.revertRevertible}.
392
397
  * @privateRemarks Exposed for testing purposes.
@@ -405,7 +410,7 @@ export class TreeCheckout implements ITreeCheckoutFork {
405
410
  private readonly mintRevisionTag: () => RevisionTag,
406
411
  private readonly revisionTagCodec: RevisionTagCodec,
407
412
  private readonly idCompressor: IIdCompressor,
408
- private readonly removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(
413
+ private removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(
409
414
  "repair",
410
415
  revisionTagCodec,
411
416
  idCompressor,
@@ -413,18 +418,38 @@ export class TreeCheckout implements ITreeCheckoutFork {
413
418
  /** Optional logger for telemetry. */
414
419
  private readonly logger?: ITelemetryLoggerExt,
415
420
  ) {
421
+ // when a transaction is started, take a snapshot of the current state of removed roots
422
+ branch.on("transactionStarted", () => {
423
+ this.removedRootsSnapshots.push(this.removedRoots.clone());
424
+ });
425
+ // when a transaction is committed, the latest snapshot of removed roots can be discarded
426
+ branch.on("transactionCommitted", () => {
427
+ this.removedRootsSnapshots.pop();
428
+ });
429
+ // after a transaction is rolled back, revert removed roots back to the latest snapshot
430
+ branch.on("transactionRolledBack", () => {
431
+ const snapshot = this.removedRootsSnapshots.pop();
432
+ assert(snapshot !== undefined, 0x9ae /* a snapshot for removed roots does not exist */);
433
+ this.removedRoots = snapshot;
434
+ });
435
+
416
436
  // We subscribe to `beforeChange` rather than `afterChange` here because it's possible that the change is invalid WRT our forest.
417
437
  // For example, a bug in the editor might produce a malformed change object and thus applying the change to the forest will throw an error.
418
438
  // In such a case we will crash here, preventing the change from being added to the commit graph, and preventing `afterChange` from firing.
419
439
  // One important consequence of this is that we will not submit the op containing the invalid change, since op submissions happens in response to `afterChange`.
420
440
  branch.on("beforeChange", (event) => {
421
441
  if (event.change !== undefined) {
442
+ const revision =
443
+ event.type === "replace"
444
+ ? event.newCommits[event.newCommits.length - 1].revision
445
+ : event.change.revision;
446
+
422
447
  // Conflicts due to schema will be empty and thus are not applied.
423
448
  for (const change of event.change.change.changes) {
424
449
  if (change.type === "data") {
425
- const delta = intoDelta(tagChange(change.innerChange, event.change.revision));
450
+ const delta = intoDelta(tagChange(change.innerChange, revision));
426
451
  this.withCombinedVisitor((visitor) => {
427
- visitDelta(delta, visitor, this.removedRoots);
452
+ visitDelta(delta, visitor, this.removedRoots, revision);
428
453
  });
429
454
  } else if (change.type === "schema") {
430
455
  // Schema changes from a current to a new schema are expected to be backwards compatible.
@@ -518,6 +543,24 @@ export class TreeCheckout implements ITreeCheckoutFork {
518
543
  this.events.emit("commitApplied", data, getRevertible);
519
544
  withinEventContext = false;
520
545
  });
546
+
547
+ // When the branch is trimmed, we can garbage collect any repair data whose latest relevant revision is one of the
548
+ // trimmed revisions.
549
+ branch.on("ancestryTrimmed", (revisions) => {
550
+ this.withCombinedVisitor((visitor) => {
551
+ revisions.forEach((revision) => {
552
+ // get all the roots last created or used by the revision
553
+ const roots = this.removedRoots.getRootsLastTouchedByRevision(revision);
554
+
555
+ // get the detached field for the root and delete it from the removed roots
556
+ for (const root of roots) {
557
+ visitor.destroy(this.removedRoots.toFieldKey(root), 1);
558
+ }
559
+
560
+ this.removedRoots.deleteRootsLastTouchedByRevision(revision);
561
+ });
562
+ });
563
+ });
521
564
  }
522
565
 
523
566
  private withCombinedVisitor(fn: (visitor: DeltaVisitor) => void): void {
@@ -572,6 +615,10 @@ export class TreeCheckout implements ITreeCheckoutFork {
572
615
 
573
616
  public rebase(view: TreeCheckout): void {
574
617
  this.checkNotDisposed();
618
+ assert(
619
+ !view.transaction.inProgress(),
620
+ 0x9af /* A view cannot be rebased while it has a pending transaction */,
621
+ );
575
622
  view.branch.rebaseOnto(this.branch);
576
623
  }
577
624
 
@@ -585,8 +632,8 @@ export class TreeCheckout implements ITreeCheckoutFork {
585
632
  public merge(view: TreeCheckout, disposeView = true): void {
586
633
  this.checkNotDisposed();
587
634
  assert(
588
- !this.transaction.inProgress() || disposeView,
589
- 0x710 /* A view that is merged into an in-progress transaction must be disposed */,
635
+ !this.transaction.inProgress(),
636
+ 0x9b0 /* Views cannot be merged into a view while it has a pending transaction */,
590
637
  );
591
638
  while (view.transaction.inProgress()) {
592
639
  view.transaction.commit();
@@ -625,6 +672,14 @@ export class TreeCheckout implements ITreeCheckoutFork {
625
672
  return trees;
626
673
  }
627
674
 
675
+ /**
676
+ * This sets the tip revision as the latest relevant revision for any removed roots that are loaded from a summary.
677
+ * This needs to be called right after loading {@link this.removedRoots} from a summary to allow loaded data to be garbage collected.
678
+ */
679
+ public setTipRevisionForLoadedData(revision: RevisionTag): void {
680
+ this.removedRoots.setRevisionsForLoadedData(revision);
681
+ }
682
+
628
683
  private purgeRevertibles(): void {
629
684
  for (const revertible of this.revertibles) {
630
685
  revertible.dispose();
@@ -12,6 +12,7 @@ import {
12
12
  type NodeKeyManager,
13
13
  getTreeContext,
14
14
  } from "../feature-libraries/index.js";
15
+ import { tryDisposeTreeNode } from "../simple-tree/index.js";
15
16
  import { type IDisposable, disposeSymbol } from "../util/index.js";
16
17
 
17
18
  import type { ITreeCheckout, ITreeCheckoutFork, TreeCheckout } from "./treeCheckout.js";
@@ -94,6 +95,10 @@ export class CheckoutFlexTreeView<
94
95
  }
95
96
 
96
97
  public [disposeSymbol](): void {
98
+ for (const anchorNode of this.checkout.forest.anchors) {
99
+ tryDisposeTreeNode(anchorNode);
100
+ }
101
+
97
102
  this.context[disposeSymbol]();
98
103
  this.onDispose?.();
99
104
  }