@fluidframework/tree 2.102.0 → 2.110.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 (495) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/api-report/tree.alpha.api.md +12 -3
  3. package/api-report/tree.beta.api.md +11 -3
  4. package/api-report/tree.legacy.beta.api.md +11 -3
  5. package/dist/codec/versioned/format.d.ts +5 -4
  6. package/dist/codec/versioned/format.d.ts.map +1 -1
  7. package/dist/codec/versioned/format.js +4 -3
  8. package/dist/codec/versioned/format.js.map +1 -1
  9. package/dist/core/rebase/types.d.ts +4 -3
  10. package/dist/core/rebase/types.d.ts.map +1 -1
  11. package/dist/core/rebase/types.js +5 -4
  12. package/dist/core/rebase/types.js.map +1 -1
  13. package/dist/core/schema-stored/formatV1.d.ts +16 -15
  14. package/dist/core/schema-stored/formatV1.d.ts.map +1 -1
  15. package/dist/core/schema-stored/formatV1.js +9 -8
  16. package/dist/core/schema-stored/formatV1.js.map +1 -1
  17. package/dist/core/schema-stored/formatV2.d.ts +29 -28
  18. package/dist/core/schema-stored/formatV2.d.ts.map +1 -1
  19. package/dist/core/schema-stored/formatV2.js +11 -10
  20. package/dist/core/schema-stored/formatV2.js.map +1 -1
  21. package/dist/core/schema-stored/index.js +3 -25
  22. package/dist/core/schema-stored/index.js.map +1 -1
  23. package/dist/core/tree/anchorSet.js +4 -8
  24. package/dist/core/tree/anchorSet.js.map +1 -1
  25. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +11 -10
  26. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -1
  27. package/dist/core/tree/detachedFieldIndexFormatCommon.js +11 -10
  28. package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -1
  29. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +7 -6
  30. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -1
  31. package/dist/core/tree/detachedFieldIndexFormatV2.js +3 -2
  32. package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -1
  33. package/dist/core/tree/persistedTreeTextFormat.d.ts +19 -18
  34. package/dist/core/tree/persistedTreeTextFormat.d.ts.map +1 -1
  35. package/dist/core/tree/persistedTreeTextFormat.js +11 -10
  36. package/dist/core/tree/persistedTreeTextFormat.js.map +1 -1
  37. package/dist/entrypoints/internal.js +2 -15
  38. package/dist/entrypoints/internal.js.map +1 -1
  39. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  40. package/dist/feature-libraries/chunked-forest/chunkTree.js +1 -1
  41. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  42. package/dist/feature-libraries/chunked-forest/chunkedForest.js +7 -11
  43. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +13 -12
  45. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js +14 -13
  47. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.d.ts +36 -35
  49. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.d.ts.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.js +19 -18
  51. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.js.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.d.ts +26 -25
  53. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.d.ts.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.js +5 -4
  55. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.js.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.d.ts +24 -23
  57. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.d.ts.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.js +8 -7
  59. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.js.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts +66 -14
  61. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  62. package/dist/feature-libraries/chunked-forest/uniformChunk.js +101 -36
  63. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  64. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  65. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +36 -14
  66. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  67. package/dist/feature-libraries/flex-tree/lazyEntity.js +9 -19
  68. package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  69. package/dist/feature-libraries/flex-tree/lazyNode.js +3 -13
  70. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  71. package/dist/feature-libraries/forest-summary/formatCommon.d.ts +6 -5
  72. package/dist/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -1
  73. package/dist/feature-libraries/forest-summary/formatCommon.js +4 -3
  74. package/dist/feature-libraries/forest-summary/formatCommon.js.map +1 -1
  75. package/dist/feature-libraries/index.js +2 -24
  76. package/dist/feature-libraries/index.js.map +1 -1
  77. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +4 -3
  78. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  79. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js +4 -3
  80. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  81. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  82. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +10 -30
  83. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  84. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts +45 -44
  85. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  86. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js +26 -25
  87. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  88. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +23 -22
  89. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  90. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +7 -6
  91. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  92. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -5
  93. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  94. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  95. package/dist/feature-libraries/object-forest/objectForest.js +11 -55
  96. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  97. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +9 -8
  98. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  99. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.js +9 -8
  100. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.js.map +1 -1
  101. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +14 -13
  102. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  103. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.js +12 -11
  104. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.js.map +1 -1
  105. package/dist/feature-libraries/schema-edits/schemaChangeFormat.d.ts +5 -4
  106. package/dist/feature-libraries/schema-edits/schemaChangeFormat.d.ts.map +1 -1
  107. package/dist/feature-libraries/schema-edits/schemaChangeFormat.js +3 -2
  108. package/dist/feature-libraries/schema-edits/schemaChangeFormat.js.map +1 -1
  109. package/dist/feature-libraries/schema-index/formatV1.d.ts +15 -14
  110. package/dist/feature-libraries/schema-index/formatV1.d.ts.map +1 -1
  111. package/dist/feature-libraries/schema-index/formatV1.js +5 -4
  112. package/dist/feature-libraries/schema-index/formatV1.js.map +1 -1
  113. package/dist/feature-libraries/schema-index/formatV2.d.ts +20 -19
  114. package/dist/feature-libraries/schema-index/formatV2.d.ts.map +1 -1
  115. package/dist/feature-libraries/schema-index/formatV2.js +5 -4
  116. package/dist/feature-libraries/schema-index/formatV2.js.map +1 -1
  117. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  118. package/dist/feature-libraries/sequence-field/compose.js +1 -3
  119. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  120. package/dist/feature-libraries/sequence-field/formatV1.d.ts +283 -282
  121. package/dist/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  122. package/dist/feature-libraries/sequence-field/formatV1.js +41 -40
  123. package/dist/feature-libraries/sequence-field/formatV1.js.map +1 -1
  124. package/dist/feature-libraries/sequence-field/formatV2.d.ts +180 -179
  125. package/dist/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  126. package/dist/feature-libraries/sequence-field/formatV2.js +33 -32
  127. package/dist/feature-libraries/sequence-field/formatV2.js.map +1 -1
  128. package/dist/feature-libraries/sequence-field/formatV3.d.ts +126 -125
  129. package/dist/feature-libraries/sequence-field/formatV3.d.ts.map +1 -1
  130. package/dist/feature-libraries/sequence-field/formatV3.js +5 -4
  131. package/dist/feature-libraries/sequence-field/formatV3.js.map +1 -1
  132. package/dist/index.js +2 -24
  133. package/dist/index.js.map +1 -1
  134. package/dist/packageVersion.d.ts +1 -1
  135. package/dist/packageVersion.js +1 -1
  136. package/dist/packageVersion.js.map +1 -1
  137. package/dist/shared-tree/schematizingTreeView.d.ts +1 -0
  138. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  139. package/dist/shared-tree/schematizingTreeView.js +7 -41
  140. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  141. package/dist/shared-tree/sharedTree.d.ts +2 -3
  142. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  143. package/dist/shared-tree/sharedTree.js +6 -45
  144. package/dist/shared-tree/sharedTree.js.map +1 -1
  145. package/dist/shared-tree/sharedTreeChangeFormat.d.ts +8 -7
  146. package/dist/shared-tree/sharedTreeChangeFormat.d.ts.map +1 -1
  147. package/dist/shared-tree/sharedTreeChangeFormat.js +6 -5
  148. package/dist/shared-tree/sharedTreeChangeFormat.js.map +1 -1
  149. package/dist/shared-tree/treeCheckout.d.ts +14 -5
  150. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  151. package/dist/shared-tree/treeCheckout.js +106 -136
  152. package/dist/shared-tree/treeCheckout.js.map +1 -1
  153. package/dist/shared-tree-core/branch.js +13 -17
  154. package/dist/shared-tree-core/branch.js.map +1 -1
  155. package/dist/shared-tree-core/editManager.d.ts +2 -2
  156. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  157. package/dist/shared-tree-core/editManager.js.map +1 -1
  158. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +35 -34
  159. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  160. package/dist/shared-tree-core/editManagerFormatCommons.js +17 -16
  161. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  162. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +15 -15
  163. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  164. package/dist/shared-tree-core/editManagerFormatV1toV4.js +11 -10
  165. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  166. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts +40 -40
  167. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -1
  168. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js +5 -4
  169. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -1
  170. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  171. package/dist/shared-tree-core/messageCodecVSharedBranches.js +3 -2
  172. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  173. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +5 -5
  174. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  175. package/dist/shared-tree-core/messageFormatV1ToV4.js +9 -8
  176. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  177. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts +7 -7
  178. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  179. package/dist/shared-tree-core/messageFormatVSharedBranches.js +7 -6
  180. package/dist/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  181. package/dist/shared-tree-core/sharedTreeCore.js +6 -43
  182. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  183. package/dist/shared-tree-core/transaction.js +20 -30
  184. package/dist/shared-tree-core/transaction.js.map +1 -1
  185. package/dist/simple-tree/api/simpleSchemaCodec.js +2 -24
  186. package/dist/simple-tree/api/simpleSchemaCodec.js.map +1 -1
  187. package/dist/simple-tree/api/snapshotCompatibilityChecker.js +2 -24
  188. package/dist/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  189. package/dist/simple-tree/api/tree.d.ts +10 -0
  190. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  191. package/dist/simple-tree/api/tree.js.map +1 -1
  192. package/dist/simple-tree/core/treeNodeKernel.d.ts +5 -0
  193. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  194. package/dist/simple-tree/core/treeNodeKernel.js +119 -105
  195. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  196. package/dist/simple-tree/core/unhydratedFlexTree.js +6 -10
  197. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  198. package/dist/simple-tree/leafNodeSchema.js +2 -12
  199. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  200. package/dist/simple-tree/node-kinds/array/arrayNode.js +2 -6
  201. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  202. package/dist/simple-tree/simpleSchemaFormatV1.d.ts +121 -120
  203. package/dist/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
  204. package/dist/simple-tree/simpleSchemaFormatV1.js +32 -31
  205. package/dist/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  206. package/dist/tableSchema.d.ts +50 -4
  207. package/dist/tableSchema.d.ts.map +1 -1
  208. package/dist/tableSchema.js +202 -106
  209. package/dist/tableSchema.js.map +1 -1
  210. package/dist/util/arrayUtilities.d.ts +20 -0
  211. package/dist/util/arrayUtilities.d.ts.map +1 -1
  212. package/dist/util/arrayUtilities.js +24 -1
  213. package/dist/util/arrayUtilities.js.map +1 -1
  214. package/dist/util/index.d.ts +1 -1
  215. package/dist/util/index.d.ts.map +1 -1
  216. package/dist/util/index.js +3 -2
  217. package/dist/util/index.js.map +1 -1
  218. package/dist/util/rangeMap.d.ts +13 -0
  219. package/dist/util/rangeMap.d.ts.map +1 -1
  220. package/dist/util/rangeMap.js +69 -8
  221. package/dist/util/rangeMap.js.map +1 -1
  222. package/dist/util/typeboxBrand.d.ts +1 -1
  223. package/dist/util/typeboxBrand.d.ts.map +1 -1
  224. package/dist/util/typeboxBrand.js +4 -3
  225. package/dist/util/typeboxBrand.js.map +1 -1
  226. package/dist/util/utils.d.ts +2 -2
  227. package/dist/util/utils.d.ts.map +1 -1
  228. package/dist/util/utils.js +3 -2
  229. package/dist/util/utils.js.map +1 -1
  230. package/eslint.config.mts +14 -0
  231. package/lib/codec/versioned/format.d.ts +5 -4
  232. package/lib/codec/versioned/format.d.ts.map +1 -1
  233. package/lib/codec/versioned/format.js +1 -1
  234. package/lib/codec/versioned/format.js.map +1 -1
  235. package/lib/core/rebase/types.d.ts +4 -3
  236. package/lib/core/rebase/types.d.ts.map +1 -1
  237. package/lib/core/rebase/types.js +1 -1
  238. package/lib/core/rebase/types.js.map +1 -1
  239. package/lib/core/schema-stored/formatV1.d.ts +16 -15
  240. package/lib/core/schema-stored/formatV1.d.ts.map +1 -1
  241. package/lib/core/schema-stored/formatV1.js +1 -1
  242. package/lib/core/schema-stored/formatV1.js.map +1 -1
  243. package/lib/core/schema-stored/formatV2.d.ts +29 -28
  244. package/lib/core/schema-stored/formatV2.d.ts.map +1 -1
  245. package/lib/core/schema-stored/formatV2.js +1 -1
  246. package/lib/core/schema-stored/formatV2.js.map +1 -1
  247. package/lib/core/tree/anchorSet.js +1 -5
  248. package/lib/core/tree/anchorSet.js.map +1 -1
  249. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +11 -10
  250. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -1
  251. package/lib/core/tree/detachedFieldIndexFormatCommon.js +1 -1
  252. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -1
  253. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +7 -6
  254. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -1
  255. package/lib/core/tree/detachedFieldIndexFormatV2.js +1 -1
  256. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -1
  257. package/lib/core/tree/persistedTreeTextFormat.d.ts +19 -18
  258. package/lib/core/tree/persistedTreeTextFormat.d.ts.map +1 -1
  259. package/lib/core/tree/persistedTreeTextFormat.js +1 -1
  260. package/lib/core/tree/persistedTreeTextFormat.js.map +1 -1
  261. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  262. package/lib/feature-libraries/chunked-forest/chunkTree.js +1 -1
  263. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  264. package/lib/feature-libraries/chunked-forest/chunkedForest.js +1 -5
  265. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  266. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +13 -12
  267. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  268. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js +1 -1
  269. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  270. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.d.ts +36 -35
  271. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.d.ts.map +1 -1
  272. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.js +1 -1
  273. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.js.map +1 -1
  274. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.d.ts +26 -25
  275. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.d.ts.map +1 -1
  276. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.js +1 -1
  277. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.js.map +1 -1
  278. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.d.ts +24 -23
  279. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.d.ts.map +1 -1
  280. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.js +1 -1
  281. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.js.map +1 -1
  282. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts +66 -14
  283. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  284. package/lib/feature-libraries/chunked-forest/uniformChunk.js +101 -36
  285. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  286. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  287. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +36 -14
  288. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  289. package/lib/feature-libraries/flex-tree/lazyEntity.js +1 -11
  290. package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  291. package/lib/feature-libraries/flex-tree/lazyNode.js +1 -11
  292. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  293. package/lib/feature-libraries/forest-summary/formatCommon.d.ts +6 -5
  294. package/lib/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -1
  295. package/lib/feature-libraries/forest-summary/formatCommon.js +1 -1
  296. package/lib/feature-libraries/forest-summary/formatCommon.js.map +1 -1
  297. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +4 -3
  298. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  299. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js +1 -1
  300. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  301. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  302. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +10 -30
  303. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  304. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts +45 -44
  305. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  306. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js +1 -1
  307. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  308. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +23 -22
  309. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  310. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +1 -1
  311. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  312. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -5
  313. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  314. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  315. package/lib/feature-libraries/object-forest/objectForest.js +1 -45
  316. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  317. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +9 -8
  318. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  319. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.js +1 -1
  320. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.js.map +1 -1
  321. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +14 -13
  322. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  323. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.js +1 -1
  324. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.js.map +1 -1
  325. package/lib/feature-libraries/schema-edits/schemaChangeFormat.d.ts +5 -4
  326. package/lib/feature-libraries/schema-edits/schemaChangeFormat.d.ts.map +1 -1
  327. package/lib/feature-libraries/schema-edits/schemaChangeFormat.js +1 -1
  328. package/lib/feature-libraries/schema-edits/schemaChangeFormat.js.map +1 -1
  329. package/lib/feature-libraries/schema-index/formatV1.d.ts +15 -14
  330. package/lib/feature-libraries/schema-index/formatV1.d.ts.map +1 -1
  331. package/lib/feature-libraries/schema-index/formatV1.js +1 -1
  332. package/lib/feature-libraries/schema-index/formatV1.js.map +1 -1
  333. package/lib/feature-libraries/schema-index/formatV2.d.ts +20 -19
  334. package/lib/feature-libraries/schema-index/formatV2.d.ts.map +1 -1
  335. package/lib/feature-libraries/schema-index/formatV2.js +1 -1
  336. package/lib/feature-libraries/schema-index/formatV2.js.map +1 -1
  337. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  338. package/lib/feature-libraries/sequence-field/compose.js +1 -3
  339. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  340. package/lib/feature-libraries/sequence-field/formatV1.d.ts +283 -282
  341. package/lib/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  342. package/lib/feature-libraries/sequence-field/formatV1.js +1 -1
  343. package/lib/feature-libraries/sequence-field/formatV1.js.map +1 -1
  344. package/lib/feature-libraries/sequence-field/formatV2.d.ts +180 -179
  345. package/lib/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  346. package/lib/feature-libraries/sequence-field/formatV2.js +1 -1
  347. package/lib/feature-libraries/sequence-field/formatV2.js.map +1 -1
  348. package/lib/feature-libraries/sequence-field/formatV3.d.ts +126 -125
  349. package/lib/feature-libraries/sequence-field/formatV3.d.ts.map +1 -1
  350. package/lib/feature-libraries/sequence-field/formatV3.js +1 -1
  351. package/lib/feature-libraries/sequence-field/formatV3.js.map +1 -1
  352. package/lib/packageVersion.d.ts +1 -1
  353. package/lib/packageVersion.js +1 -1
  354. package/lib/packageVersion.js.map +1 -1
  355. package/lib/shared-tree/schematizingTreeView.d.ts +1 -0
  356. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  357. package/lib/shared-tree/schematizingTreeView.js +4 -38
  358. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  359. package/lib/shared-tree/sharedTree.d.ts +2 -3
  360. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  361. package/lib/shared-tree/sharedTree.js +2 -41
  362. package/lib/shared-tree/sharedTree.js.map +1 -1
  363. package/lib/shared-tree/sharedTreeChangeFormat.d.ts +8 -7
  364. package/lib/shared-tree/sharedTreeChangeFormat.d.ts.map +1 -1
  365. package/lib/shared-tree/sharedTreeChangeFormat.js +1 -1
  366. package/lib/shared-tree/sharedTreeChangeFormat.js.map +1 -1
  367. package/lib/shared-tree/treeCheckout.d.ts +14 -5
  368. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  369. package/lib/shared-tree/treeCheckout.js +63 -93
  370. package/lib/shared-tree/treeCheckout.js.map +1 -1
  371. package/lib/shared-tree-core/branch.js +1 -5
  372. package/lib/shared-tree-core/branch.js.map +1 -1
  373. package/lib/shared-tree-core/editManager.d.ts +2 -2
  374. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  375. package/lib/shared-tree-core/editManager.js.map +1 -1
  376. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +35 -34
  377. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  378. package/lib/shared-tree-core/editManagerFormatCommons.js +1 -1
  379. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  380. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +15 -15
  381. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  382. package/lib/shared-tree-core/editManagerFormatV1toV4.js +1 -1
  383. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  384. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts +40 -40
  385. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -1
  386. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js +1 -1
  387. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -1
  388. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  389. package/lib/shared-tree-core/messageCodecVSharedBranches.js +1 -1
  390. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  391. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +5 -5
  392. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  393. package/lib/shared-tree-core/messageFormatV1ToV4.js +1 -1
  394. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  395. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts +7 -7
  396. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  397. package/lib/shared-tree-core/messageFormatVSharedBranches.js +1 -1
  398. package/lib/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  399. package/lib/shared-tree-core/sharedTreeCore.js +1 -38
  400. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  401. package/lib/shared-tree-core/transaction.js +1 -11
  402. package/lib/shared-tree-core/transaction.js.map +1 -1
  403. package/lib/simple-tree/api/tree.d.ts +10 -0
  404. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  405. package/lib/simple-tree/api/tree.js.map +1 -1
  406. package/lib/simple-tree/core/treeNodeKernel.d.ts +5 -0
  407. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  408. package/lib/simple-tree/core/treeNodeKernel.js +36 -23
  409. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  410. package/lib/simple-tree/core/unhydratedFlexTree.js +1 -5
  411. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  412. package/lib/simple-tree/leafNodeSchema.js +1 -11
  413. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  414. package/lib/simple-tree/node-kinds/array/arrayNode.js +1 -5
  415. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  416. package/lib/simple-tree/simpleSchemaFormatV1.d.ts +121 -120
  417. package/lib/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
  418. package/lib/simple-tree/simpleSchemaFormatV1.js +1 -1
  419. package/lib/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  420. package/lib/tableSchema.d.ts +50 -4
  421. package/lib/tableSchema.d.ts.map +1 -1
  422. package/lib/tableSchema.js +171 -75
  423. package/lib/tableSchema.js.map +1 -1
  424. package/lib/util/arrayUtilities.d.ts +20 -0
  425. package/lib/util/arrayUtilities.d.ts.map +1 -1
  426. package/lib/util/arrayUtilities.js +22 -0
  427. package/lib/util/arrayUtilities.js.map +1 -1
  428. package/lib/util/index.d.ts +1 -1
  429. package/lib/util/index.d.ts.map +1 -1
  430. package/lib/util/index.js +1 -1
  431. package/lib/util/index.js.map +1 -1
  432. package/lib/util/rangeMap.d.ts +13 -0
  433. package/lib/util/rangeMap.d.ts.map +1 -1
  434. package/lib/util/rangeMap.js +69 -8
  435. package/lib/util/rangeMap.js.map +1 -1
  436. package/lib/util/typeboxBrand.d.ts +1 -1
  437. package/lib/util/typeboxBrand.d.ts.map +1 -1
  438. package/lib/util/typeboxBrand.js +1 -1
  439. package/lib/util/typeboxBrand.js.map +1 -1
  440. package/lib/util/utils.d.ts +2 -2
  441. package/lib/util/utils.d.ts.map +1 -1
  442. package/lib/util/utils.js +1 -1
  443. package/lib/util/utils.js.map +1 -1
  444. package/package.json +24 -23
  445. package/src/codec/versioned/format.ts +2 -1
  446. package/src/core/rebase/types.ts +1 -1
  447. package/src/core/schema-stored/formatV1.ts +2 -1
  448. package/src/core/schema-stored/formatV2.ts +2 -1
  449. package/src/core/tree/detachedFieldIndexFormatCommon.ts +2 -1
  450. package/src/core/tree/detachedFieldIndexFormatV2.ts +2 -1
  451. package/src/core/tree/persistedTreeTextFormat.ts +2 -1
  452. package/src/feature-libraries/chunked-forest/chunkTree.ts +3 -2
  453. package/src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts +2 -1
  454. package/src/feature-libraries/chunked-forest/codec/format/formatV1.ts +2 -1
  455. package/src/feature-libraries/chunked-forest/codec/format/formatV2.ts +2 -1
  456. package/src/feature-libraries/chunked-forest/codec/format/formatVText.ts +2 -1
  457. package/src/feature-libraries/chunked-forest/uniformChunk.ts +131 -44
  458. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +36 -14
  459. package/src/feature-libraries/forest-summary/formatCommon.ts +2 -1
  460. package/src/feature-libraries/modular-schema/genericFieldKindFormat.ts +2 -1
  461. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +14 -47
  462. package/src/feature-libraries/modular-schema/modularChangeFormatV1.ts +2 -1
  463. package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +2 -1
  464. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +0 -5
  465. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV1.ts +2 -1
  466. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV2.ts +2 -1
  467. package/src/feature-libraries/schema-edits/schemaChangeFormat.ts +2 -1
  468. package/src/feature-libraries/schema-index/formatV1.ts +2 -1
  469. package/src/feature-libraries/schema-index/formatV2.ts +2 -1
  470. package/src/feature-libraries/sequence-field/compose.ts +1 -4
  471. package/src/feature-libraries/sequence-field/formatV1.ts +2 -1
  472. package/src/feature-libraries/sequence-field/formatV2.ts +2 -1
  473. package/src/feature-libraries/sequence-field/formatV3.ts +2 -1
  474. package/src/packageVersion.ts +1 -1
  475. package/src/shared-tree/schematizingTreeView.ts +4 -0
  476. package/src/shared-tree/sharedTree.ts +3 -10
  477. package/src/shared-tree/sharedTreeChangeFormat.ts +2 -1
  478. package/src/shared-tree/treeCheckout.ts +61 -56
  479. package/src/shared-tree-core/editManager.ts +2 -2
  480. package/src/shared-tree-core/editManagerFormatCommons.ts +2 -1
  481. package/src/shared-tree-core/editManagerFormatV1toV4.ts +2 -1
  482. package/src/shared-tree-core/editManagerFormatVSharedBranches.ts +2 -1
  483. package/src/shared-tree-core/messageCodecVSharedBranches.ts +2 -1
  484. package/src/shared-tree-core/messageFormatV1ToV4.ts +2 -1
  485. package/src/shared-tree-core/messageFormatVSharedBranches.ts +2 -1
  486. package/src/simple-tree/api/tree.ts +11 -0
  487. package/src/simple-tree/core/treeNodeKernel.ts +39 -15
  488. package/src/simple-tree/simpleSchemaFormatV1.ts +2 -1
  489. package/src/tableSchema.ts +306 -80
  490. package/src/util/arrayUtilities.ts +35 -0
  491. package/src/util/index.ts +2 -0
  492. package/src/util/rangeMap.ts +108 -9
  493. package/src/util/typeboxBrand.ts +2 -1
  494. package/src/util/utils.ts +2 -1
  495. package/tsconfig.json +5 -0
@@ -3,7 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { type ObjectOptions, type Static, type TSchema, Type } from "@sinclair/typebox";
6
+ import * as Type from "@sinclair/typebox";
7
+ import type { ObjectOptions, Static, TSchema } from "@sinclair/typebox";
7
8
 
8
9
  import { unionOptions } from "../../codec/index.js";
9
10
  import { RevisionTagSchema } from "../../core/index.js";
@@ -3,7 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { type ObjectOptions, type Static, type TSchema, Type } from "@sinclair/typebox";
6
+ import * as Type from "@sinclair/typebox";
7
+ import type { ObjectOptions, Static, TSchema } from "@sinclair/typebox";
7
8
 
8
9
  import { unionOptions } from "../../codec/index.js";
9
10
  import { RevisionTagSchema } from "../../core/index.js";
@@ -3,7 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { type ObjectOptions, type Static, type TSchema, Type } from "@sinclair/typebox";
6
+ import * as Type from "@sinclair/typebox";
7
+ import type { ObjectOptions, Static, TSchema } from "@sinclair/typebox";
7
8
 
8
9
  import { unionOptions } from "../../codec/index.js";
9
10
 
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.102.0";
9
+ export const pkgVersion = "2.110.0";
@@ -529,5 +529,9 @@ export class SchematizingSimpleTreeView<
529
529
  this.checkout.rebaseOnto(context);
530
530
  }
531
531
 
532
+ public isMissingEditsFrom(context: TreeBranchAlpha): boolean {
533
+ return this.checkout.isMissingEditsFrom(context);
534
+ }
535
+
532
536
  // #endregion Branching
533
537
  }
@@ -13,10 +13,7 @@ import type {
13
13
  IFluidSerializer,
14
14
  SharedKernel,
15
15
  } from "@fluidframework/shared-object-base/internal";
16
- import {
17
- UsageError,
18
- type ITelemetryLoggerExt,
19
- } from "@fluidframework/telemetry-utils/internal";
16
+ import { type TelemetryLoggerExt, UsageError } from "@fluidframework/telemetry-utils/internal";
20
17
 
21
18
  import {
22
19
  type CodecTree,
@@ -201,7 +198,7 @@ export class SharedTreeKernel
201
198
  submitLocalMessage: (content: unknown, localOpMetadata?: unknown) => void,
202
199
  lastSequenceNumber: () => number | undefined,
203
200
  initialSequenceNumber: number,
204
- private readonly logger: ITelemetryLoggerExt | undefined,
201
+ private readonly logger: TelemetryLoggerExt | undefined,
205
202
  idCompressor: IIdCompressor,
206
203
  optionsParam: SharedTreeOptionsInternal,
207
204
  ) {
@@ -320,7 +317,6 @@ export class SharedTreeKernel
320
317
  chunkCompressionStrategy: options.treeEncodeType,
321
318
  logger,
322
319
  breaker: this.breaker,
323
- disposeForksAfterTransaction: options.disposeForksAfterTransaction,
324
320
  });
325
321
 
326
322
  this.registerSharedBranchForEditing("main", this.checkout);
@@ -635,9 +631,7 @@ export interface SharedTreeOptions
635
631
 
636
632
  export interface SharedTreeOptionsInternal
637
633
  extends SharedTreeOptions,
638
- Partial<SharedTreeCoreOptionsInternal> {
639
- disposeForksAfterTransaction?: boolean;
640
- }
634
+ Partial<SharedTreeCoreOptionsInternal> {}
641
635
 
642
636
  /**
643
637
  * Configuration options for SharedTree's internal tree storage.
@@ -760,7 +754,6 @@ export const defaultSharedTreeOptions: Required<SharedTreeOptionsInternal> = {
760
754
  minVersionForCollab: FluidClientVersion.v2_0,
761
755
  forest: ForestTypeReference,
762
756
  treeEncodeType: TreeCompressionStrategy.Compressed,
763
- disposeForksAfterTransaction: true,
764
757
  shouldEncodeIncrementally: defaultIncrementalEncodingPolicy,
765
758
  enableSharedBranches: false,
766
759
  healUnresolvableIdentifiersOnDecode: false,
@@ -3,7 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { type Static, type TSchema, Type } from "@sinclair/typebox";
6
+ import * as Type from "@sinclair/typebox";
7
+ import type { Static, TSchema } from "@sinclair/typebox";
7
8
 
8
9
  import type { EncodedSchemaChange } from "../feature-libraries/index.js";
9
10
  import { JsonCompatibleReadOnlySchema } from "../util/index.js";
@@ -8,10 +8,7 @@ import type { IFluidHandle, Listenable } from "@fluidframework/core-interfaces/i
8
8
  import { assert, unreachableCase, fail } from "@fluidframework/core-utils/internal";
9
9
  import type { IIdCompressor, SessionId } from "@fluidframework/id-compressor";
10
10
  import { isStableId } from "@fluidframework/id-compressor/internal";
11
- import {
12
- UsageError,
13
- type ITelemetryLoggerExt,
14
- } from "@fluidframework/telemetry-utils/internal";
11
+ import { type TelemetryLoggerExt, UsageError } from "@fluidframework/telemetry-utils/internal";
15
12
 
16
13
  import {
17
14
  FluidClientVersion,
@@ -60,6 +57,7 @@ import {
60
57
  makeAnonChange,
61
58
  type TaggedChange,
62
59
  deltaFieldMapHasVisibleChanges,
60
+ findCommonAncestor,
63
61
  } from "../core/index.js";
64
62
  import {
65
63
  type FieldBatchCodec,
@@ -77,7 +75,6 @@ import {
77
75
  SquashingTransactionStack,
78
76
  SharedTreeBranch,
79
77
  TransactionResult as InternalTransactionResult,
80
- onForkTransitive,
81
78
  type SharedTreeBranchChange,
82
79
  type Transactor,
83
80
  } from "../shared-tree-core/index.js";
@@ -90,7 +87,6 @@ import {
90
87
  type ViewableTree,
91
88
  type TreeBranch,
92
89
  type TreeBranchAlpha,
93
- type TreeChangeEvents,
94
90
  type VerboseTree,
95
91
  type VoidTransactionCallbackStatus,
96
92
  type TransactionCallbackStatus,
@@ -309,9 +305,8 @@ export function createTreeCheckout(
309
305
  fieldBatchCodec?: FieldBatchCodec;
310
306
  removedRoots?: DetachedFieldIndex;
311
307
  chunkCompressionStrategy?: TreeCompressionStrategy;
312
- logger?: ITelemetryLoggerExt;
308
+ logger?: TelemetryLoggerExt;
313
309
  breaker?: Breakable;
314
- disposeForksAfterTransaction?: boolean;
315
310
  codecOptions?: Partial<CodecWriteOptions>;
316
311
  },
317
312
  ): TreeCheckout {
@@ -358,7 +353,6 @@ export function createTreeCheckout(
358
353
  args?.removedRoots,
359
354
  args?.logger,
360
355
  breaker,
361
- args?.disposeForksAfterTransaction,
362
356
  );
363
357
  }
364
358
 
@@ -528,9 +522,8 @@ export class TreeCheckout implements ITreeCheckout {
528
522
  idCompressor,
529
523
  ),
530
524
  /** Optional logger for telemetry. */
531
- private readonly logger?: ITelemetryLoggerExt,
525
+ private readonly logger?: TelemetryLoggerExt,
532
526
  public readonly breaker: Breakable = new Breakable("TreeCheckout"),
533
- public readonly disposeForksAfterTransaction = true,
534
527
  ) {
535
528
  this.#transaction = this.createTransactionStack(branch);
536
529
  this.editLock = new EditLock(this.#transaction.activeBranchEditor);
@@ -662,9 +655,6 @@ export class TreeCheckout implements ITreeCheckout {
662
655
  branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
663
656
  ): SquashingTransactionStack<SharedTreeEditBuilder, SharedTreeChange> {
664
657
  return new SquashingTransactionStack(branch, this.mintRevisionTag, () => {
665
- const disposeForks = this.disposeForksAfterTransaction
666
- ? trackForksForDisposal(this)
667
- : undefined;
668
658
  // When each transaction is started, make a restorable checkpoint of the current state of removed roots
669
659
  const restoreRemovedRoots = this._removedRoots.createCheckpoint();
670
660
  return (result, viewUpdate: SharedTreeChange | undefined) => {
@@ -691,7 +681,6 @@ export class TreeCheckout implements ITreeCheckout {
691
681
  unreachableCase(result);
692
682
  }
693
683
  }
694
- disposeForks?.();
695
684
  };
696
685
  });
697
686
  }
@@ -791,19 +780,48 @@ export class TreeCheckout implements ITreeCheckout {
791
780
  labels: buildLabelsSet(this.labelTreeNode),
792
781
  };
793
782
 
794
- this.#events.emit("changed", metadata, getRevertible);
783
+ this.emitChangedLocked(() => {
784
+ this.#events.emit("changed", metadata, getRevertible);
785
+ });
795
786
  withinEventContext = false;
796
787
  }
797
788
  } else if (this.isRemoteChangeEvent(event)) {
798
789
  // TODO: figure out how to plumb through commit kind info for remote changes
799
- this.#events.emit("changed", {
800
- isLocal: false,
801
- kind: CommitKind.Default,
802
- labels: new Set<unknown>(),
790
+ this.emitChangedLocked(() => {
791
+ this.#events.emit("changed", {
792
+ isLocal: false,
793
+ kind: CommitKind.Default,
794
+ labels: new Set<unknown>(),
795
+ });
803
796
  });
804
797
  }
805
798
  };
806
799
 
800
+ /**
801
+ * Hold the `editLock` for the duration of `emit`, so that re-entrant edits, transactions,
802
+ * branch operations, etc. attempted from inside a `changed` listener throw the canonical
803
+ * "forbidden during a change event" {@link UsageError} via {@link EditLock.checkUnlocked}.
804
+ *
805
+ * @remarks
806
+ * Shared by both the local and remote `changed` emission paths in {@link TreeCheckout.onAfterBranchChange}.
807
+ * The `try`/`finally` ensures the lock is released even if a listener throws.
808
+ */
809
+ private emitChangedLocked(emit: () => void): void {
810
+ this.editLock.lock();
811
+ try {
812
+ emit();
813
+ } finally {
814
+ // TODO: any event that throws potentially leaves the code which triggered that event,
815
+ // and thus this checkout (and likely more) in a broken state.
816
+ // Unlocking this editLock prevents future use of this broken state from giving a confusing error in this case,
817
+ // however, a better approach would probably be to put something (this checkout and/or the editLock)
818
+ // into a broken state (using a properly scoped `Breakable`),
819
+ // likely by moving emitChangedLocked into EditLock, and having EditLock get a Breakable,
820
+ // and having the new emitChangedLocked use `Breakable.use`.
821
+ this.editLock.unlock();
822
+ }
823
+ }
824
+
807
825
  private readonly onAfterChange = (event: SharedTreeBranchChange<SharedTreeChange>): void => {
808
826
  this.editLock.lock();
809
827
  this.#events.emit("beforeBatch", event);
@@ -911,6 +929,15 @@ export class TreeCheckout implements ITreeCheckout {
911
929
 
912
930
  private mountTransaction(params: RunTransactionParams | undefined, isAsync: boolean): void {
913
931
  this.checkNotDisposed();
932
+ // Starting a transaction is an edit, so it is forbidden from within a change-event
933
+ // callback (where the edit lock is held), the same as direct edits. For the async
934
+ // entry point this throw is captured as a rejected promise by the `async` wrapper.
935
+ //
936
+ // Note: because runTransaction/runTransactionAsync are `@breakingMethod`, this throw also
937
+ // puts the checkout into a broken state (unlike a direct edit, which throws recoverably).
938
+ // That is the same pre-existing broken-state limitation tracked by the TODO in
939
+ // `emitChangedLocked`, not something specific to transactions.
940
+ this.editLock.checkUnlocked("Running a transaction");
914
941
  if (isAsync && this.transaction.size > 0) {
915
942
  throw new UsageError(
916
943
  "An asynchronous transaction cannot be started while another transaction is already in progress.",
@@ -1173,7 +1200,6 @@ export class TreeCheckout implements ITreeCheckout {
1173
1200
  throw new UsageError("A view cannot be forked while it has a pending transaction.");
1174
1201
  }
1175
1202
 
1176
- this.editLock.checkUnlocked("Branching");
1177
1203
  const branch = this.#transaction.activeBranch.fork();
1178
1204
  const storedSchema = this.storedSchema.clone();
1179
1205
  const forkBreaker = new Breakable("TreeCheckout");
@@ -1190,7 +1216,6 @@ export class TreeCheckout implements ITreeCheckout {
1190
1216
  this._removedRoots.clone(),
1191
1217
  this.logger,
1192
1218
  forkBreaker,
1193
- this.disposeForksAfterTransaction,
1194
1219
  );
1195
1220
  this.#events.emit("fork", checkout);
1196
1221
  return checkout;
@@ -1253,6 +1278,19 @@ export class TreeCheckout implements ITreeCheckout {
1253
1278
  getCheckout(branch).rebase(this);
1254
1279
  }
1255
1280
 
1281
+ public isMissingEditsFrom(branch: TreeBranch): boolean {
1282
+ const branchCheckout = getCheckout(branch);
1283
+ const targetPath: GraphCommit<unknown>[] = [];
1284
+ const ancestor = findCommonAncestor(this.mainBranch.getHead(), [
1285
+ branchCheckout.mainBranch.getHead(),
1286
+ targetPath,
1287
+ ]);
1288
+ if (ancestor === undefined) {
1289
+ throw new UsageError("Branches do not share a common ancestor.");
1290
+ }
1291
+ return targetPath.length > 0;
1292
+ }
1293
+
1256
1294
  public merge(branch: TreeBranch): void;
1257
1295
  public merge(branch: TreeBranch, disposeMerged: boolean): void;
1258
1296
  public merge(branch: TreeBranch, disposeMerged = true): void {
@@ -1684,12 +1722,7 @@ class EditLock {
1684
1722
  */
1685
1723
  public checkUnlocked<T extends string>(action: T extends Capitalize<T> ? T : never): void {
1686
1724
  if (this.locked) {
1687
- // These type assertions ensure that the event name strings used here match the actual event names
1688
- const nodeChanged: keyof TreeChangeEvents = "nodeChanged";
1689
- const treeChanged: keyof TreeChangeEvents = "treeChanged";
1690
- throw new UsageError(
1691
- `${action} is forbidden during a ${nodeChanged} or ${treeChanged} event`,
1692
- );
1725
+ throw new UsageError(`${action} is forbidden during a change event callback`);
1693
1726
  }
1694
1727
  }
1695
1728
 
@@ -1703,34 +1736,6 @@ class EditLock {
1703
1736
  }
1704
1737
  }
1705
1738
 
1706
- /**
1707
- * Keeps track of all new forks created until the returned function is invoked, which will dispose all of those for.
1708
- * The returned function may only be called once.
1709
- *
1710
- * @param checkout - The tree checkout for which you want to monitor forks for disposal.
1711
- * @returns a function which can be called to dispose all of the tracked forks.
1712
- */
1713
- function trackForksForDisposal(checkout: TreeCheckout): () => void {
1714
- const forks = new Set<TreeCheckout>();
1715
- const onDisposeUnSubscribes: (() => void)[] = [];
1716
- const onForkUnSubscribe = onForkTransitive(checkout, (fork) => {
1717
- forks.add(fork);
1718
- onDisposeUnSubscribes.push(fork.events.on("dispose", () => forks.delete(fork)));
1719
- });
1720
- let disposed = false;
1721
- return () => {
1722
- assert(!disposed, 0xaa9 /* Forks may only be disposed once */);
1723
- for (const fork of forks) {
1724
- fork.dispose();
1725
- }
1726
- for (const unsubscribe of onDisposeUnSubscribes) {
1727
- unsubscribe();
1728
- }
1729
- onForkUnSubscribe();
1730
- disposed = true;
1731
- };
1732
- }
1733
-
1734
1739
  function verboseFromCursor(
1735
1740
  reader: ITreeCursor,
1736
1741
  schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>,
@@ -9,7 +9,7 @@ import { assert, fail } from "@fluidframework/core-utils/internal";
9
9
  import type { SessionId } from "@fluidframework/id-compressor";
10
10
  import {
11
11
  TelemetryEventBatcher,
12
- type ITelemetryLoggerExt,
12
+ type TelemetryLoggerExt,
13
13
  } from "@fluidframework/telemetry-utils/internal";
14
14
  import { BTree } from "@tylerbu/sorted-btree-es6";
15
15
 
@@ -123,7 +123,7 @@ export class EditManager<
123
123
  public readonly localSessionId: SessionId,
124
124
  private readonly mintRevisionTag: () => RevisionTag,
125
125
  private readonly onSharedBranchCreated?: (branchId: BranchId) => void,
126
- logger?: ITelemetryLoggerExt,
126
+ logger?: TelemetryLoggerExt,
127
127
  ) {
128
128
  this.trunkBase = {
129
129
  revision: rootRevision,
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { SessionId } from "@fluidframework/id-compressor";
7
- import { type ObjectOptions, type Static, type TSchema, Type } from "@sinclair/typebox";
7
+ import * as Type from "@sinclair/typebox";
8
+ import type { ObjectOptions, Static, TSchema } from "@sinclair/typebox";
8
9
 
9
10
  import {
10
11
  type EncodedRevisionTag,
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { SessionId } from "@fluidframework/id-compressor";
7
- import { type ObjectOptions, type TSchema, Type } from "@sinclair/typebox";
7
+ import * as Type from "@sinclair/typebox";
8
+ import type { ObjectOptions, TSchema } from "@sinclair/typebox";
8
9
 
9
10
  import { SessionIdSchema } from "../core/index.js";
10
11
 
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { SessionId } from "@fluidframework/id-compressor";
7
- import { type ObjectOptions, type TSchema, Type } from "@sinclair/typebox";
7
+ import * as Type from "@sinclair/typebox";
8
+ import type { ObjectOptions, TSchema } from "@sinclair/typebox";
8
9
 
9
10
  import { SessionIdSchema } from "../core/index.js";
10
11
 
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
7
- import { type TAnySchema, Type } from "@sinclair/typebox";
7
+ import * as Type from "@sinclair/typebox";
8
+ import type { TAnySchema } from "@sinclair/typebox";
8
9
 
9
10
  import type { CodecAndSchema, IJsonCodec, Versioned } from "../codec/index.js";
10
11
  import type {
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { SessionId } from "@fluidframework/id-compressor";
7
- import { type TSchema, Type } from "@sinclair/typebox";
7
+ import * as Type from "@sinclair/typebox";
8
+ import type { TSchema } from "@sinclair/typebox";
8
9
 
9
10
  import { type EncodedRevisionTag, RevisionTagSchema, SessionIdSchema } from "../core/index.js";
10
11
  import type { JsonCompatibleReadOnly } from "../util/index.js";
@@ -4,7 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { SessionId } from "@fluidframework/id-compressor";
7
- import { type TSchema, Type } from "@sinclair/typebox";
7
+ import * as Type from "@sinclair/typebox";
8
+ import type { TSchema } from "@sinclair/typebox";
8
9
 
9
10
  import { type EncodedRevisionTag, RevisionTagSchema, SessionIdSchema } from "../core/index.js";
10
11
  import type { JsonCompatibleReadOnly } from "../util/index.js";
@@ -342,6 +342,17 @@ export interface TreeBranchAlpha extends TreeBranch, TreeContextAlpha {
342
342
  * Update the tests and docs to match when that is done.
343
343
  */
344
344
  applyChange(change: JsonCompatibleReadOnly): void;
345
+
346
+ /**
347
+ * Determines if there are changes on the given branch that are not present on this branch.
348
+ * @param branch - The branch to compare to.
349
+ *
350
+ * The new edits, if any, can be applied to this branch by {@link TreeBranch.rebaseOnto | rebasing this branch onto the given branch}
351
+ * or by {@link TreeBranch.merge | merging the given branch into this branch}.
352
+ *
353
+ * @throws UsageError if the branches are unrelated.
354
+ */
355
+ isMissingEditsFrom(branch: TreeBranch): boolean;
345
356
  }
346
357
 
347
358
  /**
@@ -332,34 +332,53 @@ export function withBufferedTreeEvents(callback: () => void): void {
332
332
  callback();
333
333
  } else {
334
334
  bufferTreeEvents = true;
335
+ const toFlush: KernelEventBuffer[] = [];
335
336
  try {
336
337
  callback();
337
338
  } finally {
338
339
  bufferTreeEvents = false;
339
- flushEventsEmitter.emit("flush");
340
+ // Snapshot-and-clear before flushing to safely handle reentrant `withBufferedTreeEvents`
341
+ // calls made by listeners that fire during `buffer.flush()` below:
342
+ // - Iterating an array means a reentrant call's `clear()` cannot truncate our loop
343
+ // and cause buffers later in `activeBuffers` to be skipped (and their events dropped).
344
+ // - Clearing up front means the reentrant call starts from an empty set, so its own
345
+ // finally block only flushes what it buffered - not a re-flush of our remaining buffers.
346
+ toFlush.push(...activeBuffers);
347
+ activeBuffers.clear();
348
+ }
349
+
350
+ // Don't flush/emit events in the case of an error
351
+ for (const buffer of toFlush) {
352
+ buffer.flush();
340
353
  }
341
354
  }
342
355
  }
343
356
 
344
357
  /**
345
- * Event emitter to notify subscribers when tree events buffered due to {@link withBufferedTreeEvents} should be flushed.
358
+ * Set of {@link KernelEventBuffer}s that have accumulated buffered events during the current
359
+ * {@link withBufferedTreeEvents} window and therefore need to be flushed when it ends.
360
+ *
361
+ * @remarks
362
+ * The set should be empty whenever no buffering window is in progress.
346
363
  */
347
- const flushEventsEmitter = createEmitter<{
348
- flush: () => void;
349
- }>();
364
+ const activeBuffers: Set<KernelEventBuffer> = new Set();
365
+
366
+ /**
367
+ * Test-only accessor for the current size of {@link activeBuffers}.
368
+ * @remarks Only exported for testing purposes. Not intended for any other use.
369
+ */
370
+ export function TEST_activeBufferCount(): number {
371
+ return activeBuffers.size;
372
+ }
350
373
 
351
374
  /**
352
375
  * Event emitter for {@link TreeNodeKernel}, which optionally buffers events based on {@link bufferTreeEvents}.
353
- * @remarks Listens to {@link flushEventsEmitter} to know when to flush any buffered events.
376
+ * @remarks When buffering is active, this adds itself to {@link activeBuffers} so that
377
+ * {@link withBufferedTreeEvents} can flush it at the end of the buffering window.
354
378
  */
355
379
  class KernelEventBuffer implements Listenable<KernelEvents> {
356
380
  #disposed: boolean = false;
357
381
 
358
- /**
359
- * Listen to {@link flushEventsEmitter} to know when to flush buffered events.
360
- */
361
- readonly #disposeOnFlushListener = flushEventsEmitter.on("flush", this.flush.bind(this));
362
-
363
382
  readonly #events = createEmitter<KernelEvents>();
364
383
 
365
384
  #eventSource: Listenable<KernelEvents> & HasListeners<KernelEvents>;
@@ -501,6 +520,7 @@ class KernelEventBuffer implements Listenable<KernelEvents> {
501
520
  fieldMarks: ReadonlyMap<FieldKey, readonly DeltaMark[]>,
502
521
  ): void {
503
522
  if (bufferTreeEvents) {
523
+ activeBuffers.add(this);
504
524
  for (const fieldKey of changedFields) {
505
525
  this.#childrenChangedBuffer.add(fieldKey);
506
526
  }
@@ -528,6 +548,7 @@ class KernelEventBuffer implements Listenable<KernelEvents> {
528
548
 
529
549
  #handleSubtreeChangedAfterBatch(): void {
530
550
  if (bufferTreeEvents) {
551
+ activeBuffers.add(this);
531
552
  this.#subTreeChangedBuffer = true;
532
553
  } else {
533
554
  this.#events.emit("subtreeChangedAfterBatch");
@@ -565,12 +586,15 @@ class KernelEventBuffer implements Listenable<KernelEvents> {
565
586
  return;
566
587
  }
567
588
 
568
- assert(
569
- this.#childrenChangedBuffer.size === 0 && !this.#subTreeChangedBuffer,
570
- 0xc52 /* Buffered kernel events should have been flushed before disposing. */,
589
+ debugAssert(
590
+ () =>
591
+ (this.#childrenChangedBuffer.size === 0 && !this.#subTreeChangedBuffer) ||
592
+ "Buffered kernel events should have been flushed before disposing.",
593
+ );
594
+ debugAssert(
595
+ () => !activeBuffers.has(this) || "Disposed buffer should not be in activeBuffers.",
571
596
  );
572
597
 
573
- this.#disposeOnFlushListener();
574
598
  for (const off of this.#disposeSourceListeners.values()) {
575
599
  off();
576
600
  }
@@ -11,7 +11,8 @@
11
11
  * It may not include some details which impact maintenance of application enforced invariants (like persisted metadata or logic in view schema).
12
12
  */
13
13
 
14
- import { Type, type ObjectOptions, type Static } from "@sinclair/typebox";
14
+ import * as Type from "@sinclair/typebox";
15
+ import type { ObjectOptions, Static } from "@sinclair/typebox";
15
16
 
16
17
  const noAdditionalProps: ObjectOptions = { additionalProperties: false };
17
18