@fluidframework/tree 2.1.0-281041 → 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 (315) hide show
  1. package/.vscode/Tree.code-workspace +2 -1
  2. package/CHANGELOG.md +38 -0
  3. package/README.md +6 -6
  4. package/api-report/tree.alpha.api.md +1 -1
  5. package/api-report/tree.beta.api.md +1 -1
  6. package/api-report/tree.public.api.md +1 -1
  7. package/dist/core/forest/editableForest.d.ts.map +1 -1
  8. package/dist/core/forest/editableForest.js +4 -2
  9. package/dist/core/forest/editableForest.js.map +1 -1
  10. package/dist/core/tree/anchorSet.d.ts +1 -0
  11. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  12. package/dist/core/tree/anchorSet.js +13 -0
  13. package/dist/core/tree/anchorSet.js.map +1 -1
  14. package/dist/core/tree/detachedFieldIndex.d.ts +48 -11
  15. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  16. package/dist/core/tree/detachedFieldIndex.js +144 -20
  17. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  18. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
  19. package/dist/core/tree/detachedFieldIndexCodec.js +13 -4
  20. package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
  21. package/dist/core/tree/detachedFieldIndexFormat.d.ts +1 -1
  22. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
  23. package/dist/core/tree/detachedFieldIndexFormat.js.map +1 -1
  24. package/dist/core/tree/detachedFieldIndexTypes.d.ts +39 -4
  25. package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  26. package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
  27. package/dist/core/tree/index.d.ts +2 -1
  28. package/dist/core/tree/index.d.ts.map +1 -1
  29. package/dist/core/tree/index.js.map +1 -1
  30. package/dist/core/tree/visitDelta.d.ts +3 -1
  31. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  32. package/dist/core/tree/visitDelta.js +31 -15
  33. package/dist/core/tree/visitDelta.js.map +1 -1
  34. package/dist/core/tree/visitorUtils.d.ts +3 -3
  35. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  36. package/dist/core/tree/visitorUtils.js +4 -4
  37. package/dist/core/tree/visitorUtils.js.map +1 -1
  38. package/dist/feature-libraries/editableTreeBinder.js +1 -1
  39. package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
  40. package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -8
  41. package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
  42. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +0 -52
  43. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  44. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -13
  45. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  46. package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  47. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  48. package/dist/feature-libraries/flex-tree/index.d.ts +2 -1
  49. package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
  50. package/dist/feature-libraries/flex-tree/index.js +5 -1
  51. package/dist/feature-libraries/flex-tree/index.js.map +1 -1
  52. package/dist/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
  53. package/dist/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
  54. package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  55. package/dist/feature-libraries/flex-tree/lazyField.d.ts +1 -2
  56. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  57. package/dist/feature-libraries/flex-tree/lazyField.js +10 -18
  58. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  59. package/dist/feature-libraries/flex-tree/lazyNode.d.ts +1 -4
  60. package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  61. package/dist/feature-libraries/flex-tree/lazyNode.js +0 -27
  62. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  63. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  64. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -1
  65. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  66. package/dist/feature-libraries/index.d.ts +1 -1
  67. package/dist/feature-libraries/index.d.ts.map +1 -1
  68. package/dist/feature-libraries/index.js +4 -1
  69. package/dist/feature-libraries/index.js.map +1 -1
  70. package/dist/feature-libraries/modular-schema/discrepancies.js +3 -3
  71. package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  72. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
  73. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  74. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  75. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +14 -17
  76. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  77. package/dist/feature-libraries/object-forest/objectForest.d.ts +3 -2
  78. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  79. package/dist/feature-libraries/object-forest/objectForest.js +5 -4
  80. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  81. package/dist/packageVersion.d.ts +1 -1
  82. package/dist/packageVersion.d.ts.map +1 -1
  83. package/dist/packageVersion.js +1 -1
  84. package/dist/packageVersion.js.map +1 -1
  85. package/dist/shared-tree/sharedTree.d.ts +5 -1
  86. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  87. package/dist/shared-tree/sharedTree.js +8 -1
  88. package/dist/shared-tree/sharedTree.js.map +1 -1
  89. package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
  90. package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  91. package/dist/shared-tree/treeApi.js +1 -1
  92. package/dist/shared-tree/treeApi.js.map +1 -1
  93. package/dist/shared-tree/treeCheckout.d.ts +10 -1
  94. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  95. package/dist/shared-tree/treeCheckout.js +47 -4
  96. package/dist/shared-tree/treeCheckout.js.map +1 -1
  97. package/dist/shared-tree/treeView.d.ts.map +1 -1
  98. package/dist/shared-tree/treeView.js +7 -3
  99. package/dist/shared-tree/treeView.js.map +1 -1
  100. package/dist/shared-tree-core/branch.d.ts +6 -0
  101. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  102. package/dist/shared-tree-core/branch.js +2 -0
  103. package/dist/shared-tree-core/branch.js.map +1 -1
  104. package/dist/shared-tree-core/sharedTreeCore.d.ts +4 -0
  105. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  106. package/dist/shared-tree-core/sharedTreeCore.js +6 -0
  107. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  108. package/dist/simple-tree/arrayNode.js +1 -1
  109. package/dist/simple-tree/arrayNode.js.map +1 -1
  110. package/dist/simple-tree/index.d.ts +3 -3
  111. package/dist/simple-tree/index.d.ts.map +1 -1
  112. package/dist/simple-tree/index.js +2 -1
  113. package/dist/simple-tree/index.js.map +1 -1
  114. package/dist/simple-tree/proxies.d.ts.map +1 -1
  115. package/dist/simple-tree/proxies.js +7 -21
  116. package/dist/simple-tree/proxies.js.map +1 -1
  117. package/dist/simple-tree/proxyBinding.d.ts +4 -0
  118. package/dist/simple-tree/proxyBinding.d.ts.map +1 -1
  119. package/dist/simple-tree/proxyBinding.js +23 -1
  120. package/dist/simple-tree/proxyBinding.js.map +1 -1
  121. package/dist/simple-tree/tree.d.ts.map +1 -1
  122. package/dist/simple-tree/tree.js +1 -1
  123. package/dist/simple-tree/tree.js.map +1 -1
  124. package/dist/simple-tree/treeNodeApi.d.ts +2 -75
  125. package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
  126. package/dist/simple-tree/treeNodeApi.js +7 -15
  127. package/dist/simple-tree/treeNodeApi.js.map +1 -1
  128. package/dist/simple-tree/treeNodeKernel.d.ts +26 -0
  129. package/dist/simple-tree/treeNodeKernel.d.ts.map +1 -0
  130. package/dist/simple-tree/treeNodeKernel.js +83 -0
  131. package/dist/simple-tree/treeNodeKernel.js.map +1 -0
  132. package/dist/simple-tree/types.d.ts +73 -0
  133. package/dist/simple-tree/types.d.ts.map +1 -1
  134. package/dist/simple-tree/types.js +89 -1
  135. package/dist/simple-tree/types.js.map +1 -1
  136. package/dist/util/breakable.js +1 -1
  137. package/dist/util/breakable.js.map +1 -1
  138. package/dist/util/index.d.ts +1 -1
  139. package/dist/util/index.d.ts.map +1 -1
  140. package/dist/util/index.js.map +1 -1
  141. package/lib/core/forest/editableForest.d.ts.map +1 -1
  142. package/lib/core/forest/editableForest.js +4 -2
  143. package/lib/core/forest/editableForest.js.map +1 -1
  144. package/lib/core/tree/anchorSet.d.ts +1 -0
  145. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  146. package/lib/core/tree/anchorSet.js +13 -0
  147. package/lib/core/tree/anchorSet.js.map +1 -1
  148. package/lib/core/tree/detachedFieldIndex.d.ts +48 -11
  149. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  150. package/lib/core/tree/detachedFieldIndex.js +145 -21
  151. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  152. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
  153. package/lib/core/tree/detachedFieldIndexCodec.js +13 -4
  154. package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
  155. package/lib/core/tree/detachedFieldIndexFormat.d.ts +1 -1
  156. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
  157. package/lib/core/tree/detachedFieldIndexFormat.js.map +1 -1
  158. package/lib/core/tree/detachedFieldIndexTypes.d.ts +39 -4
  159. package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  160. package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
  161. package/lib/core/tree/index.d.ts +2 -1
  162. package/lib/core/tree/index.d.ts.map +1 -1
  163. package/lib/core/tree/index.js.map +1 -1
  164. package/lib/core/tree/visitDelta.d.ts +3 -1
  165. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  166. package/lib/core/tree/visitDelta.js +31 -15
  167. package/lib/core/tree/visitDelta.js.map +1 -1
  168. package/lib/core/tree/visitorUtils.d.ts +3 -3
  169. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  170. package/lib/core/tree/visitorUtils.js +4 -4
  171. package/lib/core/tree/visitorUtils.js.map +1 -1
  172. package/lib/feature-libraries/editableTreeBinder.js +1 -1
  173. package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
  174. package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -8
  175. package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
  176. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +2 -54
  177. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  178. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -13
  179. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  180. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  181. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  182. package/lib/feature-libraries/flex-tree/index.d.ts +2 -1
  183. package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
  184. package/lib/feature-libraries/flex-tree/index.js +2 -1
  185. package/lib/feature-libraries/flex-tree/index.js.map +1 -1
  186. package/lib/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
  187. package/lib/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
  188. package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  189. package/lib/feature-libraries/flex-tree/lazyField.d.ts +1 -2
  190. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  191. package/lib/feature-libraries/flex-tree/lazyField.js +12 -20
  192. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  193. package/lib/feature-libraries/flex-tree/lazyNode.d.ts +1 -4
  194. package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  195. package/lib/feature-libraries/flex-tree/lazyNode.js +3 -30
  196. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  197. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  198. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -1
  199. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  200. package/lib/feature-libraries/index.d.ts +1 -1
  201. package/lib/feature-libraries/index.d.ts.map +1 -1
  202. package/lib/feature-libraries/index.js +1 -1
  203. package/lib/feature-libraries/index.js.map +1 -1
  204. package/lib/feature-libraries/modular-schema/discrepancies.js +3 -3
  205. package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  206. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
  207. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  208. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  209. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +14 -17
  210. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  211. package/lib/feature-libraries/object-forest/objectForest.d.ts +3 -2
  212. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  213. package/lib/feature-libraries/object-forest/objectForest.js +5 -4
  214. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  215. package/lib/packageVersion.d.ts +1 -1
  216. package/lib/packageVersion.d.ts.map +1 -1
  217. package/lib/packageVersion.js +1 -1
  218. package/lib/packageVersion.js.map +1 -1
  219. package/lib/shared-tree/sharedTree.d.ts +5 -1
  220. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  221. package/lib/shared-tree/sharedTree.js +8 -1
  222. package/lib/shared-tree/sharedTree.js.map +1 -1
  223. package/lib/shared-tree/sharedTreeChangeEnricher.js +1 -1
  224. package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  225. package/lib/shared-tree/treeApi.js +1 -1
  226. package/lib/shared-tree/treeApi.js.map +1 -1
  227. package/lib/shared-tree/treeCheckout.d.ts +10 -1
  228. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  229. package/lib/shared-tree/treeCheckout.js +47 -4
  230. package/lib/shared-tree/treeCheckout.js.map +1 -1
  231. package/lib/shared-tree/treeView.d.ts.map +1 -1
  232. package/lib/shared-tree/treeView.js +4 -0
  233. package/lib/shared-tree/treeView.js.map +1 -1
  234. package/lib/shared-tree-core/branch.d.ts +6 -0
  235. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  236. package/lib/shared-tree-core/branch.js +2 -0
  237. package/lib/shared-tree-core/branch.js.map +1 -1
  238. package/lib/shared-tree-core/sharedTreeCore.d.ts +4 -0
  239. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  240. package/lib/shared-tree-core/sharedTreeCore.js +6 -0
  241. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  242. package/lib/simple-tree/arrayNode.js +2 -2
  243. package/lib/simple-tree/arrayNode.js.map +1 -1
  244. package/lib/simple-tree/index.d.ts +3 -3
  245. package/lib/simple-tree/index.d.ts.map +1 -1
  246. package/lib/simple-tree/index.js +1 -1
  247. package/lib/simple-tree/index.js.map +1 -1
  248. package/lib/simple-tree/proxies.d.ts.map +1 -1
  249. package/lib/simple-tree/proxies.js +7 -21
  250. package/lib/simple-tree/proxies.js.map +1 -1
  251. package/lib/simple-tree/proxyBinding.d.ts +4 -0
  252. package/lib/simple-tree/proxyBinding.d.ts.map +1 -1
  253. package/lib/simple-tree/proxyBinding.js +19 -0
  254. package/lib/simple-tree/proxyBinding.js.map +1 -1
  255. package/lib/simple-tree/tree.d.ts.map +1 -1
  256. package/lib/simple-tree/tree.js +1 -1
  257. package/lib/simple-tree/tree.js.map +1 -1
  258. package/lib/simple-tree/treeNodeApi.d.ts +2 -75
  259. package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
  260. package/lib/simple-tree/treeNodeApi.js +9 -17
  261. package/lib/simple-tree/treeNodeApi.js.map +1 -1
  262. package/lib/simple-tree/treeNodeKernel.d.ts +26 -0
  263. package/lib/simple-tree/treeNodeKernel.d.ts.map +1 -0
  264. package/lib/simple-tree/treeNodeKernel.js +79 -0
  265. package/lib/simple-tree/treeNodeKernel.js.map +1 -0
  266. package/lib/simple-tree/types.d.ts +73 -0
  267. package/lib/simple-tree/types.d.ts.map +1 -1
  268. package/lib/simple-tree/types.js +90 -2
  269. package/lib/simple-tree/types.js.map +1 -1
  270. package/lib/util/breakable.js +1 -1
  271. package/lib/util/breakable.js.map +1 -1
  272. package/lib/util/index.d.ts +1 -1
  273. package/lib/util/index.d.ts.map +1 -1
  274. package/lib/util/index.js.map +1 -1
  275. package/package.json +22 -22
  276. package/src/core/forest/editableForest.ts +10 -2
  277. package/src/core/tree/anchorSet.ts +14 -0
  278. package/src/core/tree/detachedFieldIndex.ts +217 -35
  279. package/src/core/tree/detachedFieldIndexCodec.ts +17 -8
  280. package/src/core/tree/detachedFieldIndexFormat.ts +1 -1
  281. package/src/core/tree/detachedFieldIndexTypes.ts +41 -5
  282. package/src/core/tree/index.ts +2 -1
  283. package/src/core/tree/visitDelta.ts +57 -16
  284. package/src/core/tree/visitorUtils.ts +7 -4
  285. package/src/feature-libraries/editableTreeBinder.ts +1 -1
  286. package/src/feature-libraries/flex-map-tree/mapTreeNode.ts +1 -65
  287. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -19
  288. package/src/feature-libraries/flex-tree/index.ts +7 -1
  289. package/src/feature-libraries/flex-tree/lazyEntity.ts +0 -3
  290. package/src/feature-libraries/flex-tree/lazyField.ts +14 -26
  291. package/src/feature-libraries/flex-tree/lazyNode.ts +1 -42
  292. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -0
  293. package/src/feature-libraries/index.ts +3 -0
  294. package/src/feature-libraries/modular-schema/discrepancies.ts +3 -3
  295. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +1 -1
  296. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +22 -20
  297. package/src/feature-libraries/object-forest/objectForest.ts +7 -3
  298. package/src/packageVersion.ts +1 -1
  299. package/src/shared-tree/sharedTree.ts +8 -1
  300. package/src/shared-tree/sharedTreeChangeEnricher.ts +1 -1
  301. package/src/shared-tree/treeApi.ts +1 -1
  302. package/src/shared-tree/treeCheckout.ts +56 -5
  303. package/src/shared-tree/treeView.ts +5 -0
  304. package/src/shared-tree-core/branch.ts +9 -0
  305. package/src/shared-tree-core/sharedTreeCore.ts +7 -0
  306. package/src/simple-tree/arrayNode.ts +2 -2
  307. package/src/simple-tree/index.ts +3 -3
  308. package/src/simple-tree/proxies.ts +8 -29
  309. package/src/simple-tree/proxyBinding.ts +23 -0
  310. package/src/simple-tree/tree.ts +4 -1
  311. package/src/simple-tree/treeNodeApi.ts +14 -96
  312. package/src/simple-tree/treeNodeKernel.ts +91 -0
  313. package/src/simple-tree/types.ts +233 -2
  314. package/src/util/breakable.ts +1 -1
  315. package/src/util/index.ts +1 -0
@@ -7,11 +7,12 @@ import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import type { ICodecOptions } from "../../codec/index.js";
9
9
  import { type IdAllocator, idAllocatorFromMaxId } from "../../util/index.js";
10
- import type { RevisionTagCodec } from "../rebase/index.js";
10
+ import type { RevisionTag, RevisionTagCodec } from "../rebase/index.js";
11
11
  import type { FieldKey } from "../schema-stored/index.js";
12
12
 
13
13
  import type { ProtoNodes, Root } from "./delta.js";
14
- import { DetachedFieldIndex, type ForestRootId } from "./detachedFieldIndex.js";
14
+ import { DetachedFieldIndex } from "./detachedFieldIndex.js";
15
+ import type { ForestRootId } from "./detachedFieldIndexTypes.js";
15
16
  import type { PlaceIndex, Range } from "./pathTree.js";
16
17
  import { type DeltaVisitor, visitDelta } from "./visitDelta.js";
17
18
  import type { IIdCompressor } from "@fluidframework/id-compressor";
@@ -33,21 +34,23 @@ export function makeDetachedFieldIndex(
33
34
 
34
35
  export function applyDelta(
35
36
  delta: Root,
37
+ latestRevision: RevisionTag | undefined,
36
38
  deltaProcessor: { acquireVisitor: () => DeltaVisitor },
37
39
  detachedFieldIndex: DetachedFieldIndex,
38
40
  ): void {
39
41
  const visitor = deltaProcessor.acquireVisitor();
40
- visitDelta(delta, visitor, detachedFieldIndex);
42
+ visitDelta(delta, visitor, detachedFieldIndex, latestRevision);
41
43
  visitor.free();
42
44
  }
43
45
 
44
46
  export function announceDelta(
45
47
  delta: Root,
48
+ latestRevision: RevisionTag | undefined,
46
49
  deltaProcessor: { acquireVisitor: () => DeltaVisitor & AnnouncedVisitor },
47
50
  detachedFieldIndex: DetachedFieldIndex,
48
51
  ): void {
49
52
  const visitor = deltaProcessor.acquireVisitor();
50
- visitDelta(delta, combineVisitors([visitor], [visitor]), detachedFieldIndex);
53
+ visitDelta(delta, combineVisitors([visitor], [visitor]), detachedFieldIndex, latestRevision);
51
54
  visitor.free();
52
55
  }
53
56
 
@@ -741,7 +741,7 @@ class AbstractDataBinder<
741
741
  const visitor = getOrCreate(this.visitors, anchor, () => {
742
742
  const newVisitor = this.visitorFactory(anchor);
743
743
  this.unregisterHandles.add(
744
- anchor.on("subtreeChanging", (upPath: UpPath) => {
744
+ anchor.anchorNode.on("subtreeChanging", (upPath: UpPath) => {
745
745
  assert(newVisitor !== undefined, 0x6dc /* visitor expected to be defined */);
746
746
  if (!this.visitorLocations.has(newVisitor)) {
747
747
  this.visitorLocations.set(newVisitor, upPath);
@@ -14,7 +14,7 @@ import {
14
14
  type TreeValue,
15
15
  type Value,
16
16
  } from "../../core/index.js";
17
- import { brand, fail, getOrCreate, mapIterable } from "../../util/index.js";
17
+ import { brand, fail, mapIterable } from "../../util/index.js";
18
18
  import {
19
19
  type FlexTreeContext,
20
20
  FlexTreeEntityKind,
@@ -23,7 +23,6 @@ import {
23
23
  type FlexTreeLeafNode,
24
24
  type FlexTreeMapNode,
25
25
  type FlexTreeNode,
26
- type FlexTreeNodeEvents,
27
26
  type FlexTreeOptionalField,
28
27
  type FlexTreeRequiredField,
29
28
  type FlexTreeSequenceField,
@@ -34,7 +33,6 @@ import {
34
33
  type FlexTreeUnboxNodeUnion,
35
34
  type FlexibleFieldContent,
36
35
  type FlexibleNodeSubSequence,
37
- TreeStatus,
38
36
  flexTreeMarker,
39
37
  indexForAt,
40
38
  } from "../flex-tree/index.js";
@@ -54,7 +52,6 @@ import {
54
52
  import { type FlexImplicitAllowedTypes, normalizeAllowedTypes } from "../schemaBuilderBase.js";
55
53
  import type { FlexFieldKind } from "../modular-schema/index.js";
56
54
  import { FieldKinds, type SequenceFieldEditBuilder } from "../default-schema/index.js";
57
- import { ComposableEventEmitter, type Listenable, type Off } from "../../events/index.js";
58
55
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
59
56
 
60
57
  // #region Nodes
@@ -66,7 +63,6 @@ import { UsageError } from "@fluidframework/telemetry-utils/internal";
66
63
  */
67
64
  export interface MapTreeNode extends FlexTreeNode {
68
65
  readonly mapTree: MapTree;
69
- forwardEvents(to: Listenable<FlexTreeNodeEvents>): void;
70
66
  }
71
67
 
72
68
  /**
@@ -82,38 +78,6 @@ interface LocationInField {
82
78
  readonly index: number;
83
79
  }
84
80
 
85
- /**
86
- * Allows events to be forwarded to another event emitter.
87
- * @remarks TODO: After the eventing library is simplified, find a way to support this pattern elegantly in the library.
88
- */
89
- class ForwardingEventEmitter extends ComposableEventEmitter<FlexTreeNodeEvents> {
90
- // A map from deregistration functions produced by this class to deregistration functions of Listenables that have been forwarded to
91
- private readonly forwardedOffs = new Map<Off, Off[]>();
92
-
93
- public override on<K extends keyof FlexTreeNodeEvents>(
94
- eventName: K,
95
- listener: FlexTreeNodeEvents[K],
96
- ): Off {
97
- const off = super.on(eventName, listener);
98
- // Return a deregister function which...
99
- return (): void => {
100
- off(); // ...deregisters the event in this emitter,
101
- // and also deregisters the event in any Listenable that it gets forwarded to
102
- (this.forwardedOffs.get(off) ?? []).forEach((f) => f());
103
- };
104
- }
105
-
106
- public forwardEvents(to: Listenable<FlexTreeNodeEvents>): void {
107
- for (const [eventName, listeners] of this.listeners) {
108
- for (const [off, listener] of listeners) {
109
- // For every one of our listeners, make the same subscription in the Listenable that we're forwarding to,
110
- // and then create a mapping from our deregistration function to theirs, so we can call it later if need be.
111
- getOrCreate(this.forwardedOffs, off, () => []).push(to.on(eventName, listener));
112
- }
113
- }
114
- }
115
- }
116
-
117
81
  /**
118
82
  * A readonly implementation of {@link FlexTreeNode} which wraps a {@link MapTree}.
119
83
  * @remarks Any methods that would mutate the node will fail,
@@ -123,10 +87,6 @@ class ForwardingEventEmitter extends ComposableEventEmitter<FlexTreeNodeEvents>
123
87
  */
124
88
  export class EagerMapTreeNode<TSchema extends FlexTreeNodeSchema> implements MapTreeNode {
125
89
  public readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;
126
- private readonly events = new ForwardingEventEmitter();
127
- public forwardEvents(to: Listenable<FlexTreeNodeEvents>): void {
128
- this.events.forwardEvents(to);
129
- }
130
90
 
131
91
  /**
132
92
  * Create a new MapTreeNode.
@@ -212,27 +172,10 @@ export class EagerMapTreeNode<TSchema extends FlexTreeNodeSchema> implements Map
212
172
  );
213
173
  }
214
174
 
215
- public treeStatus(): TreeStatus {
216
- return TreeStatus.New;
217
- }
218
-
219
175
  public get value(): Value {
220
176
  return this.mapTree.value;
221
177
  }
222
178
 
223
- public on<K extends keyof FlexTreeNodeEvents>(
224
- eventName: K,
225
- listener: FlexTreeNodeEvents[K],
226
- ): () => void {
227
- switch (eventName) {
228
- case "nodeChanged":
229
- case "treeChanged":
230
- return this.events.on(eventName, listener);
231
- default:
232
- throw unsupportedUsageError(`Subscribing to ${eventName}`);
233
- }
234
- }
235
-
236
179
  public get context(): FlexTreeContext {
237
180
  // This API is relevant to `LazyTreeNode`s, but not `MapTreeNode`s.
238
181
  // TODO: Refactor the FlexTreeNode interface so that stubbing this out isn't necessary.
@@ -418,9 +361,6 @@ export const rootMapTreeField: MapTreeField<FlexAllowedTypes> = {
418
361
  get context(): FlexTreeContext {
419
362
  return fail("MapTreeField does not implement context");
420
363
  },
421
- treeStatus(): TreeStatus {
422
- return TreeStatus.New;
423
- },
424
364
  mapTrees: [],
425
365
  };
426
366
 
@@ -492,10 +432,6 @@ class MapTreeField<T extends FlexAllowedTypes> implements FlexTreeField {
492
432
  public get context(): FlexTreeContext {
493
433
  return fail("MapTreeField does not implement context");
494
434
  }
495
-
496
- public treeStatus(): TreeStatus {
497
- return TreeStatus.New;
498
- }
499
435
  }
500
436
 
501
437
  class MapTreeRequiredField<T extends FlexAllowedTypes>
@@ -34,7 +34,6 @@ import type {
34
34
  } from "../typed-schema/index.js";
35
35
 
36
36
  import type { FlexTreeContext } from "./context.js";
37
- import type { FlexTreeNodeEvents } from "./treeEvents.js";
38
37
 
39
38
  /**
40
39
  * An anchor slot which records the {@link FlexTreeNode} associated with that anchor, if there is one.
@@ -98,14 +97,6 @@ export interface FlexTreeEntity<out TSchema = unknown> {
98
97
  */
99
98
  readonly context: FlexTreeContext;
100
99
 
101
- /**
102
- * Gets the {@link TreeStatus} of this tree.
103
- *
104
- * @remarks
105
- * For non-root fields, this is the status of the parent node, since fields do not have a separate lifetime.
106
- */
107
- treeStatus(): TreeStatus;
108
-
109
100
  /**
110
101
  * Iterate through all nodes/fields in this field/node.
111
102
  *
@@ -167,14 +158,6 @@ export interface FlexTreeNode extends FlexTreeEntity<FlexTreeNodeSchema> {
167
158
  */
168
159
  readonly value?: TreeValue;
169
160
 
170
- /**
171
- * {@inheritDoc ISubscribable#on}
172
- */
173
- on<K extends keyof FlexTreeNodeEvents>(
174
- eventName: K,
175
- listener: FlexTreeNodeEvents[K],
176
- ): () => void;
177
-
178
161
  /**
179
162
  * Gets a field of this node, if it is not empty.
180
163
  */
@@ -585,10 +568,8 @@ export const reservedObjectNodeFieldPropertyNames = [
585
568
  "constructor",
586
569
  "context",
587
570
  "is",
588
- "on",
589
571
  "parentField",
590
572
  "schema",
591
- "treeStatus",
592
573
  "tryGetField",
593
574
  "type",
594
575
  "value",
@@ -60,6 +60,12 @@ export type {
60
60
  FlexibleNodeSubSequence,
61
61
  } from "./flexTreeTypes.js";
62
62
 
63
- export { assertFlexTreeEntityNotFreed } from "./lazyEntity.js";
63
+ export {
64
+ assertFlexTreeEntityNotFreed,
65
+ isFreedSymbol,
66
+ LazyEntity,
67
+ } from "./lazyEntity.js";
64
68
 
65
69
  export { getSchemaAndPolicy, indexForAt } from "./utilities.js";
70
+
71
+ export { treeStatusFromAnchorCache } from "./utilities.js";
@@ -16,7 +16,6 @@ import type { Context } from "./context.js";
16
16
  import {
17
17
  type FlexTreeEntity,
18
18
  type FlexTreeEntityKind,
19
- type TreeStatus,
20
19
  flexTreeMarker,
21
20
  } from "./flexTreeTypes.js";
22
21
 
@@ -65,8 +64,6 @@ export abstract class LazyEntity<TSchema = unknown, TAnchor = unknown>
65
64
  public abstract boxedIterator(): IterableIterator<FlexTreeEntity>;
66
65
  public abstract get [flexTreeMarker](): FlexTreeEntityKind;
67
66
 
68
- public abstract treeStatus(): TreeStatus;
69
-
70
67
  public [disposeSymbol](): void {
71
68
  this.#lazyCursor.free();
72
69
  this.context.withCursors.delete(this);
@@ -16,7 +16,7 @@ import {
16
16
  inCursorNode,
17
17
  isCursor,
18
18
  iterateCursorField,
19
- keyAsDetachedField,
19
+ rootFieldKey,
20
20
  } from "../../core/index.js";
21
21
  import {
22
22
  assertValidIndex,
@@ -64,11 +64,7 @@ import {
64
64
  } from "./lazyEntity.js";
65
65
  import { type LazyTreeNode, makeTree } from "./lazyNode.js";
66
66
  import { unboxedUnion } from "./unboxed.js";
67
- import {
68
- indexForAt,
69
- treeStatusFromAnchorCache,
70
- treeStatusFromDetachedField,
71
- } from "./utilities.js";
67
+ import { indexForAt, treeStatusFromAnchorCache } from "./utilities.js";
72
68
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
73
69
 
74
70
  /**
@@ -259,23 +255,6 @@ export abstract class LazyField<
259
255
  );
260
256
  }
261
257
 
262
- public treeStatus(): TreeStatus {
263
- if (this[isFreedSymbol]()) {
264
- return TreeStatus.Deleted;
265
- }
266
- const fieldAnchor = this[anchorSymbol];
267
- const parentAnchor = fieldAnchor.parent;
268
- // If the parentAnchor is undefined it is a detached field.
269
- if (parentAnchor === undefined) {
270
- return treeStatusFromDetachedField(keyAsDetachedField(fieldAnchor.fieldKey));
271
- }
272
- const parentAnchorNode = this.context.checkout.forest.anchors.locate(parentAnchor);
273
-
274
- // As the "parentAnchor === undefined" case is handled above, parentAnchorNode should exist.
275
- assert(parentAnchorNode !== undefined, 0x77e /* parentAnchorNode must exist. */);
276
- return treeStatusFromAnchorCache(parentAnchorNode);
277
- }
278
-
279
258
  public getFieldPath(): FieldUpPath {
280
259
  return this[cursorSymbol].getFieldPath();
281
260
  }
@@ -285,10 +264,19 @@ export abstract class LazyField<
285
264
  * This path is not valid to hold onto across edits: this must be recalled for each edit.
286
265
  */
287
266
  public getFieldPathForEditing(): FieldUpPath {
288
- if (this.treeStatus() !== TreeStatus.InDocument) {
289
- throw new UsageError("Editing only allowed on fields with TreeStatus.InDocument status");
267
+ if (!this[isFreedSymbol]()) {
268
+ if (
269
+ // Only allow editing if we are the root document field...
270
+ (this.parent === undefined && this[anchorSymbol].fieldKey === rootFieldKey) ||
271
+ // ...or are under a node in the document
272
+ (this.parent !== undefined &&
273
+ treeStatusFromAnchorCache(this.parent.anchorNode) === TreeStatus.InDocument)
274
+ ) {
275
+ return this.getFieldPath();
276
+ }
290
277
  }
291
- return this.getFieldPath();
278
+
279
+ throw new UsageError("Editing only allowed on fields with TreeStatus.InDocument status");
292
280
  }
293
281
  }
294
282
 
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
6
+ import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import {
9
9
  type Anchor,
@@ -55,7 +55,6 @@ import {
55
55
  type FlexibleFieldContent,
56
56
  type FlexibleNodeContent,
57
57
  type PropertyNameFromFieldKey,
58
- TreeStatus,
59
58
  flexTreeMarker,
60
59
  flexTreeSlot,
61
60
  reservedObjectNodeFieldPropertyNamePrefixes,
@@ -66,13 +65,10 @@ import {
66
65
  anchorSymbol,
67
66
  cursorSymbol,
68
67
  forgetAnchorSymbol,
69
- isFreedSymbol,
70
68
  tryMoveCursorToAnchorSymbol,
71
69
  } from "./lazyEntity.js";
72
70
  import { makeField } from "./lazyField.js";
73
- import type { FlexTreeNodeEvents } from "./treeEvents.js";
74
71
  import { unboxedField } from "./unboxed.js";
75
- import { treeStatusFromAnchorCache } from "./utilities.js";
76
72
 
77
73
  /**
78
74
  * @param cursor - This does not take ownership of this cursor: Node will fork it as needed.
@@ -256,43 +252,6 @@ export abstract class LazyTreeNode<TSchema extends FlexTreeNodeSchema = FlexTree
256
252
 
257
253
  return { parent: proxifiedField, index };
258
254
  }
259
-
260
- public override treeStatus(): TreeStatus {
261
- if (this[isFreedSymbol]()) {
262
- return TreeStatus.Deleted;
263
- }
264
- return treeStatusFromAnchorCache(this.anchorNode);
265
- }
266
-
267
- public on<K extends keyof FlexTreeNodeEvents>(
268
- eventName: K,
269
- listener: FlexTreeNodeEvents[K],
270
- ): () => void {
271
- switch (eventName) {
272
- case "changing": {
273
- const unsubscribeFromChildrenChange = this.anchorNode.on(
274
- "childrenChanging",
275
- (anchorNode: AnchorNode) => listener(anchorNode),
276
- );
277
- return unsubscribeFromChildrenChange;
278
- }
279
- case "subtreeChanging": {
280
- const unsubscribeFromSubtreeChange = this.anchorNode.on(
281
- "subtreeChanging",
282
- (anchorNode: AnchorNode) => listener(anchorNode),
283
- );
284
- return unsubscribeFromSubtreeChange;
285
- }
286
- case "nodeChanged": {
287
- return this.anchorNode.on("childrenChangedAfterBatch", listener);
288
- }
289
- case "treeChanged": {
290
- return this.anchorNode.on("subtreeChangedAfterBatch", listener);
291
- }
292
- default:
293
- unreachableCase(eventName);
294
- }
295
- }
296
255
  }
297
256
 
298
257
  export class LazyMap<TSchema extends FlexMapNodeSchema>
@@ -158,6 +158,7 @@ export class ForestSummarizer implements Summarizable {
158
158
  assert(this.forest.isEmpty, 0x797 /* forest must be empty */);
159
159
  applyDelta(
160
160
  { build, fields: new Map(fieldChanges) },
161
+ undefined,
161
162
  this.forest,
162
163
  makeDetachedFieldIndex("init", this.revisionTagCodec, this.idCompressor),
163
164
  );
@@ -280,6 +280,9 @@ export {
280
280
  assertFlexTreeEntityNotFreed,
281
281
  flexTreeSlot,
282
282
  getSchemaAndPolicy,
283
+ isFreedSymbol,
284
+ LazyEntity,
285
+ treeStatusFromAnchorCache,
283
286
  } from "./flex-tree/index.js";
284
287
 
285
288
  export { treeSchemaFromStoredSchema } from "./storedToViewSchema.js";
@@ -147,7 +147,7 @@ export function getAllowedContentIncompatibilities(
147
147
  const storedNodeSchema = stored.nodeSchema.get(key);
148
148
  assert(
149
149
  storedNodeSchema !== undefined,
150
- "The storedNodeSchema in stored.nodeSchema should not be undefined",
150
+ 0x9be /* The storedNodeSchema in stored.nodeSchema should not be undefined */,
151
151
  );
152
152
  if (storedNodeSchema instanceof MapNodeStoredSchema) {
153
153
  incompatibilities.push({
@@ -188,7 +188,7 @@ export function getAllowedContentIncompatibilities(
188
188
  const storedNodeSchema = stored.nodeSchema.get(key);
189
189
  assert(
190
190
  storedNodeSchema !== undefined,
191
- "The storedNodeSchema in stored.nodeSchema should not be undefined",
191
+ 0x9bf /* The storedNodeSchema in stored.nodeSchema should not be undefined */,
192
192
  );
193
193
  if (storedNodeSchema instanceof ObjectNodeStoredSchema) {
194
194
  incompatibilities.push({
@@ -228,7 +228,7 @@ export function getAllowedContentIncompatibilities(
228
228
  const storedNodeSchema = stored.nodeSchema.get(key);
229
229
  assert(
230
230
  storedNodeSchema !== undefined,
231
- "The storedNodeSchema in stored.nodeSchema should not be undefined",
231
+ 0x9c0 /* The storedNodeSchema in stored.nodeSchema should not be undefined */,
232
232
  );
233
233
  if (storedNodeSchema instanceof MapNodeStoredSchema) {
234
234
  incompatibilities.push({
@@ -511,6 +511,6 @@ function getChangeHandler(
511
511
  }
512
512
 
513
513
  const handler = fieldKinds.get(fieldKind)?.kind.changeHandler;
514
- assert(handler !== undefined, "Unknown field kind");
514
+ assert(handler !== undefined, 0x9c1 /* Unknown field kind */);
515
515
  return handler;
516
516
  }
@@ -211,16 +211,12 @@ export class ModularChangeFamily
211
211
  const { revInfos, maxId } = getRevInfoFromTaggedChanges(changes);
212
212
  const idState: IdAllocationState = { maxId };
213
213
 
214
- return changes.reduce(
215
- (change1, change2) =>
216
- makeAnonChange(this.composePair(change1, change2, revInfos, idState)),
217
- makeAnonChange({
218
- fieldChanges: new Map(),
219
- nodeChanges: new Map(),
220
- nodeToParent: new Map(),
221
- nodeAliases: new Map(),
222
- crossFieldKeys: newCrossFieldKeyTable(),
223
- }),
214
+ if (changes.length === 0) {
215
+ return makeModularChangeset();
216
+ }
217
+
218
+ return changes.reduce((change1, change2) =>
219
+ makeAnonChange(this.composePair(change1, change2, revInfos, idState)),
224
220
  ).change;
225
221
  }
226
222
 
@@ -1024,7 +1020,10 @@ export class ModularChangeFamily
1024
1020
  baseNodeId,
1025
1021
  ).get(fieldKey);
1026
1022
 
1027
- assert(baseFieldChange !== undefined, "Cross field key registered for empty field");
1023
+ assert(
1024
+ baseFieldChange !== undefined,
1025
+ 0x9c2 /* Cross field key registered for empty field */,
1026
+ );
1028
1027
  if (crossFieldTable.baseFieldToContext.has(baseFieldChange)) {
1029
1028
  // This field has already been processed because there were changes to rebase.
1030
1029
  continue;
@@ -1037,7 +1036,7 @@ export class ModularChangeFamily
1037
1036
  baseChild: NodeId | undefined,
1038
1037
  stateChange: NodeAttachState | undefined,
1039
1038
  ): NodeId | undefined => {
1040
- assert(child === undefined, "There should be no new changes in this field");
1039
+ assert(child === undefined, 0x9c3 /* There should be no new changes in this field */);
1041
1040
  return undefined;
1042
1041
  };
1043
1042
 
@@ -1109,7 +1108,7 @@ export class ModularChangeFamily
1109
1108
  return;
1110
1109
  }
1111
1110
 
1112
- assert(!rebasedNode.fieldChanges.has(fieldKey), "Expected an empty field");
1111
+ assert(!rebasedNode.fieldChanges.has(fieldKey), 0x9c4 /* Expected an empty field */);
1113
1112
  rebasedNode.fieldChanges.set(fieldKey, rebasedField);
1114
1113
  return;
1115
1114
  }
@@ -2233,7 +2232,7 @@ class InvertManager extends CrossFieldManagerI<FieldChange> {
2233
2232
  id: ChangesetLocalId,
2234
2233
  count: number,
2235
2234
  ): void {
2236
- assert(false, "Keys should not be moved manually during invert");
2235
+ assert(false, 0x9c5 /* Keys should not be moved manually during invert */);
2237
2236
  }
2238
2237
 
2239
2238
  private get table(): InvertTable {
@@ -2269,7 +2268,7 @@ class RebaseManager extends CrossFieldManagerI<FieldChange> {
2269
2268
 
2270
2269
  assert(
2271
2270
  newFieldIds.length === 0,
2272
- "TODO: Modifying a cross-field key from the new changeset is currently unsupported",
2271
+ 0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */,
2273
2272
  );
2274
2273
 
2275
2274
  const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, [
@@ -2279,7 +2278,10 @@ class RebaseManager extends CrossFieldManagerI<FieldChange> {
2279
2278
  count,
2280
2279
  ]);
2281
2280
 
2282
- assert(baseFieldIds.length > 0, "Cross field key not registered in base or new change");
2281
+ assert(
2282
+ baseFieldIds.length > 0,
2283
+ 0x9c7 /* Cross field key not registered in base or new change */,
2284
+ );
2283
2285
 
2284
2286
  for (const baseFieldId of baseFieldIds) {
2285
2287
  this.table.affectedBaseFields.set(
@@ -2356,7 +2358,7 @@ class ComposeManager extends CrossFieldManagerI<FieldChange> {
2356
2358
 
2357
2359
  assert(
2358
2360
  baseFieldIds.length > 0,
2359
- "Cross field key not registered in base or new change",
2361
+ 0x9c8 /* Cross field key not registered in base or new change */,
2360
2362
  );
2361
2363
 
2362
2364
  for (const baseFieldId of baseFieldIds) {
@@ -2798,7 +2800,7 @@ function fieldMapFromNodeId(
2798
2800
  }
2799
2801
 
2800
2802
  const node = nodeChangeFromId(nodes, nodeId);
2801
- assert(node.fieldChanges !== undefined, "Expected node to have field changes");
2803
+ assert(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);
2802
2804
  return node.fieldChanges;
2803
2805
  }
2804
2806
 
@@ -2816,7 +2818,7 @@ function rebasedNodeIdFromBaseNodeId(table: RebaseTable, baseId: NodeId): NodeId
2816
2818
 
2817
2819
  function nodeChangeFromId(nodes: ChangeAtomIdMap<NodeChangeset>, id: NodeId): NodeChangeset {
2818
2820
  const node = getFromChangeAtomIdMap(nodes, id);
2819
- assert(node !== undefined, "Unknown node ID");
2821
+ assert(node !== undefined, 0x9ca /* Unknown node ID */);
2820
2822
  return node;
2821
2823
  }
2822
2824
 
@@ -2850,7 +2852,7 @@ function replaceFieldIdRevision(
2850
2852
 
2851
2853
  export function getParentFieldId(changeset: ModularChangeset, nodeId: NodeId): FieldId {
2852
2854
  const parentId = getFromChangeAtomIdMap(changeset.nodeToParent, nodeId);
2853
- assert(parentId !== undefined, "Parent field should be defined");
2855
+ assert(parentId !== undefined, 0x9cb /* Parent field should be defined */);
2854
2856
  return normalizeFieldId(parentId, changeset.nodeAliases);
2855
2857
  }
2856
2858
 
@@ -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
  }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.1.0-281041";
9
+ export const pkgVersion = "2.1.0";
@@ -193,7 +193,9 @@ export class SharedTree
193
193
  const forest =
194
194
  options.forest === ForestType.Optimized
195
195
  ? buildChunkedForest(makeTreeChunker(schema, defaultSchemaPolicy))
196
- : buildForest();
196
+ : options.forest === ForestType.Reference
197
+ ? buildForest()
198
+ : buildForest(undefined, true);
197
199
  const revisionTagCodec = new RevisionTagCodec(runtime.idCompressor);
198
200
  const removedRoots = makeDetachedFieldIndex(
199
201
  "repair",
@@ -335,6 +337,7 @@ export class SharedTree
335
337
 
336
338
  protected override async loadCore(services: IChannelStorageService): Promise<void> {
337
339
  await super.loadCore(services);
340
+ this.checkout.setTipRevisionForLoadedData(this.trunkHeadRevision);
338
341
  this._events.emit("afterBatch");
339
342
  }
340
343
  }
@@ -423,6 +426,10 @@ export enum ForestType {
423
426
  * The "ChunkedForest" forest type.
424
427
  */
425
428
  Optimized = 1,
429
+ /**
430
+ * The "ObjectForest" forest type with expensive asserts for debugging.
431
+ */
432
+ Expensive = 2,
426
433
  }
427
434
 
428
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);