@fluidframework/tree 2.13.0 → 2.20.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 (303) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/api-report/tree.alpha.api.md +22 -12
  3. package/api-report/tree.beta.api.md +9 -5
  4. package/api-report/tree.legacy.alpha.api.md +9 -5
  5. package/api-report/tree.legacy.public.api.md +9 -5
  6. package/api-report/tree.public.api.md +9 -5
  7. package/assertTagging.config.mjs +14 -0
  8. package/dist/alpha.d.ts +3 -0
  9. package/dist/core/index.d.ts +2 -2
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +6 -4
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/index.d.ts +2 -2
  14. package/dist/core/rebase/index.d.ts.map +1 -1
  15. package/dist/core/rebase/index.js +5 -1
  16. package/dist/core/rebase/index.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +5 -4
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js +29 -1
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/rebase/utils.d.ts +10 -0
  22. package/dist/core/rebase/utils.d.ts.map +1 -1
  23. package/dist/core/rebase/utils.js +22 -1
  24. package/dist/core/rebase/utils.js.map +1 -1
  25. package/dist/core/tree/delta.d.ts +21 -26
  26. package/dist/core/tree/delta.d.ts.map +1 -1
  27. package/dist/core/tree/delta.js.map +1 -1
  28. package/dist/core/tree/deltaUtil.d.ts +1 -3
  29. package/dist/core/tree/deltaUtil.d.ts.map +1 -1
  30. package/dist/core/tree/deltaUtil.js +2 -14
  31. package/dist/core/tree/deltaUtil.js.map +1 -1
  32. package/dist/core/tree/index.d.ts +1 -1
  33. package/dist/core/tree/index.d.ts.map +1 -1
  34. package/dist/core/tree/index.js +1 -3
  35. package/dist/core/tree/index.js.map +1 -1
  36. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  37. package/dist/core/tree/visitDelta.js +82 -80
  38. package/dist/core/tree/visitDelta.js.map +1 -1
  39. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  40. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  41. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  42. package/dist/feature-libraries/deltaUtils.js +13 -0
  43. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  44. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  45. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  46. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  47. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  48. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  49. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  50. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  51. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  52. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  53. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  54. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  55. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  56. package/dist/feature-libraries/modular-schema/index.d.ts +2 -2
  57. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  58. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  60. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  61. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -8
  62. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  63. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  64. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  65. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +105 -199
  66. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  67. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  68. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  69. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +20 -0
  70. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  71. package/dist/feature-libraries/optional-field/optionalField.d.ts +3 -3
  72. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  73. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  74. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  75. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  76. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  77. package/dist/feature-libraries/sequence-field/rebase.js +4 -4
  78. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  79. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  80. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  81. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  82. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  83. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  84. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  85. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  86. package/dist/feature-libraries/sequence-field/utils.js +36 -4
  87. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  88. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  89. package/dist/feature-libraries/treeCursorUtils.js +4 -1
  90. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  91. package/dist/index.d.ts +26 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +4 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/package.json +2 -1
  96. package/dist/packageVersion.d.ts +1 -1
  97. package/dist/packageVersion.js +1 -1
  98. package/dist/packageVersion.js.map +1 -1
  99. package/dist/shared-tree/index.d.ts +1 -1
  100. package/dist/shared-tree/index.d.ts.map +1 -1
  101. package/dist/shared-tree/index.js +4 -2
  102. package/dist/shared-tree/index.js.map +1 -1
  103. package/dist/shared-tree/sharedTree.d.ts +38 -18
  104. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  105. package/dist/shared-tree/sharedTree.js +38 -34
  106. package/dist/shared-tree/sharedTree.js.map +1 -1
  107. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  108. package/dist/shared-tree/treeCheckout.js +12 -8
  109. package/dist/shared-tree/treeCheckout.js.map +1 -1
  110. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  111. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  112. package/dist/simple-tree/arrayNode.js +1 -1
  113. package/dist/simple-tree/arrayNode.js.map +1 -1
  114. package/dist/simple-tree/toMapTree.js +1 -1
  115. package/dist/simple-tree/toMapTree.js.map +1 -1
  116. package/dist/util/bTreeUtils.d.ts +10 -0
  117. package/dist/util/bTreeUtils.d.ts.map +1 -0
  118. package/dist/util/bTreeUtils.js +52 -0
  119. package/dist/util/bTreeUtils.js.map +1 -0
  120. package/dist/util/idAllocator.d.ts +0 -2
  121. package/dist/util/idAllocator.d.ts.map +1 -1
  122. package/dist/util/idAllocator.js +0 -2
  123. package/dist/util/idAllocator.js.map +1 -1
  124. package/dist/util/index.d.ts +2 -1
  125. package/dist/util/index.d.ts.map +1 -1
  126. package/dist/util/index.js +5 -1
  127. package/dist/util/index.js.map +1 -1
  128. package/dist/util/rangeMap.d.ts +52 -30
  129. package/dist/util/rangeMap.d.ts.map +1 -1
  130. package/dist/util/rangeMap.js +161 -117
  131. package/dist/util/rangeMap.js.map +1 -1
  132. package/dist/util/utils.d.ts +4 -1
  133. package/dist/util/utils.d.ts.map +1 -1
  134. package/dist/util/utils.js +7 -1
  135. package/dist/util/utils.js.map +1 -1
  136. package/lib/alpha.d.ts +3 -0
  137. package/lib/core/index.d.ts +2 -2
  138. package/lib/core/index.d.ts.map +1 -1
  139. package/lib/core/index.js +2 -2
  140. package/lib/core/index.js.map +1 -1
  141. package/lib/core/rebase/index.d.ts +2 -2
  142. package/lib/core/rebase/index.d.ts.map +1 -1
  143. package/lib/core/rebase/index.js +2 -2
  144. package/lib/core/rebase/index.js.map +1 -1
  145. package/lib/core/rebase/types.d.ts +5 -4
  146. package/lib/core/rebase/types.d.ts.map +1 -1
  147. package/lib/core/rebase/types.js +26 -1
  148. package/lib/core/rebase/types.js.map +1 -1
  149. package/lib/core/rebase/utils.d.ts +10 -0
  150. package/lib/core/rebase/utils.d.ts.map +1 -1
  151. package/lib/core/rebase/utils.js +20 -0
  152. package/lib/core/rebase/utils.js.map +1 -1
  153. package/lib/core/tree/delta.d.ts +21 -26
  154. package/lib/core/tree/delta.d.ts.map +1 -1
  155. package/lib/core/tree/delta.js.map +1 -1
  156. package/lib/core/tree/deltaUtil.d.ts +1 -3
  157. package/lib/core/tree/deltaUtil.d.ts.map +1 -1
  158. package/lib/core/tree/deltaUtil.js +1 -12
  159. package/lib/core/tree/deltaUtil.js.map +1 -1
  160. package/lib/core/tree/index.d.ts +1 -1
  161. package/lib/core/tree/index.d.ts.map +1 -1
  162. package/lib/core/tree/index.js +1 -1
  163. package/lib/core/tree/index.js.map +1 -1
  164. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  165. package/lib/core/tree/visitDelta.js +82 -80
  166. package/lib/core/tree/visitDelta.js.map +1 -1
  167. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  168. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  169. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  170. package/lib/feature-libraries/deltaUtils.js +13 -0
  171. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  172. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  173. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  174. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  175. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  176. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  177. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  178. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  179. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  180. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  181. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  182. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  183. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  184. package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
  185. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  186. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  187. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  188. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  189. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  190. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  191. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  192. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  193. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +74 -166
  194. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  195. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  196. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  197. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +18 -1
  198. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  199. package/lib/feature-libraries/optional-field/optionalField.d.ts +3 -3
  200. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  201. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  202. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  203. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  204. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  205. package/lib/feature-libraries/sequence-field/rebase.js +4 -4
  206. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  207. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  208. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  209. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  210. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  211. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  212. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  213. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  214. package/lib/feature-libraries/sequence-field/utils.js +36 -4
  215. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  216. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  217. package/lib/feature-libraries/treeCursorUtils.js +4 -1
  218. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  219. package/lib/index.d.ts +26 -2
  220. package/lib/index.d.ts.map +1 -1
  221. package/lib/index.js +1 -1
  222. package/lib/index.js.map +1 -1
  223. package/lib/packageVersion.d.ts +1 -1
  224. package/lib/packageVersion.js +1 -1
  225. package/lib/packageVersion.js.map +1 -1
  226. package/lib/shared-tree/index.d.ts +1 -1
  227. package/lib/shared-tree/index.d.ts.map +1 -1
  228. package/lib/shared-tree/index.js +1 -1
  229. package/lib/shared-tree/index.js.map +1 -1
  230. package/lib/shared-tree/sharedTree.d.ts +38 -18
  231. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  232. package/lib/shared-tree/sharedTree.js +37 -33
  233. package/lib/shared-tree/sharedTree.js.map +1 -1
  234. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  235. package/lib/shared-tree/treeCheckout.js +13 -9
  236. package/lib/shared-tree/treeCheckout.js.map +1 -1
  237. package/lib/simple-tree/api/treeNodeApi.js +1 -1
  238. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  239. package/lib/simple-tree/arrayNode.js +1 -1
  240. package/lib/simple-tree/arrayNode.js.map +1 -1
  241. package/lib/simple-tree/toMapTree.js +1 -1
  242. package/lib/simple-tree/toMapTree.js.map +1 -1
  243. package/lib/util/bTreeUtils.d.ts +10 -0
  244. package/lib/util/bTreeUtils.d.ts.map +1 -0
  245. package/lib/util/bTreeUtils.js +47 -0
  246. package/lib/util/bTreeUtils.js.map +1 -0
  247. package/lib/util/idAllocator.d.ts +0 -2
  248. package/lib/util/idAllocator.d.ts.map +1 -1
  249. package/lib/util/idAllocator.js +0 -2
  250. package/lib/util/idAllocator.js.map +1 -1
  251. package/lib/util/index.d.ts +2 -1
  252. package/lib/util/index.d.ts.map +1 -1
  253. package/lib/util/index.js +2 -1
  254. package/lib/util/index.js.map +1 -1
  255. package/lib/util/rangeMap.d.ts +52 -30
  256. package/lib/util/rangeMap.d.ts.map +1 -1
  257. package/lib/util/rangeMap.js +160 -117
  258. package/lib/util/rangeMap.js.map +1 -1
  259. package/lib/util/utils.d.ts +4 -1
  260. package/lib/util/utils.d.ts.map +1 -1
  261. package/lib/util/utils.js +7 -1
  262. package/lib/util/utils.js.map +1 -1
  263. package/package.json +23 -23
  264. package/src/core/index.ts +5 -2
  265. package/src/core/rebase/index.ts +5 -0
  266. package/src/core/rebase/types.ts +33 -5
  267. package/src/core/rebase/utils.ts +27 -0
  268. package/src/core/tree/delta.ts +21 -26
  269. package/src/core/tree/deltaUtil.ts +1 -16
  270. package/src/core/tree/index.ts +0 -2
  271. package/src/core/tree/visitDelta.ts +108 -97
  272. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +2 -2
  273. package/src/feature-libraries/deltaUtils.ts +13 -0
  274. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -6
  275. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +12 -13
  276. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +21 -1
  277. package/src/feature-libraries/modular-schema/genericFieldKind.ts +2 -2
  278. package/src/feature-libraries/modular-schema/index.ts +2 -0
  279. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +12 -11
  280. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +138 -225
  281. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +40 -27
  282. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  283. package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
  284. package/src/feature-libraries/sequence-field/rebase.ts +9 -3
  285. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
  286. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
  287. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +3 -4
  288. package/src/feature-libraries/sequence-field/utils.ts +36 -4
  289. package/src/feature-libraries/treeCursorUtils.ts +6 -1
  290. package/src/index.ts +34 -6
  291. package/src/packageVersion.ts +1 -1
  292. package/src/shared-tree/index.ts +4 -1
  293. package/src/shared-tree/sharedTree.ts +60 -40
  294. package/src/shared-tree/treeCheckout.ts +19 -12
  295. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  296. package/src/simple-tree/arrayNode.ts +1 -1
  297. package/src/simple-tree/toMapTree.ts +1 -1
  298. package/src/util/bTreeUtils.ts +60 -0
  299. package/src/util/idAllocator.ts +0 -2
  300. package/src/util/index.ts +3 -0
  301. package/src/util/rangeMap.ts +208 -143
  302. package/src/util/utils.ts +10 -3
  303. package/lib/package.json +0 -3
@@ -11,7 +11,6 @@ import {
11
11
  type ChangesetLocalId,
12
12
  type DeltaDetachedNodeChanges,
13
13
  type DeltaDetachedNodeId,
14
- type DeltaFieldChanges,
15
14
  type DeltaMark,
16
15
  type RevisionTag,
17
16
  areEqualChangeAtomIds,
@@ -40,6 +39,7 @@ import {
40
39
  type RelevantRemovedRootsFromChild,
41
40
  type ToDelta,
42
41
  type NestedChangesIndices,
42
+ type FieldChangeDelta,
43
43
  } from "../modular-schema/index.js";
44
44
 
45
45
  import type {
@@ -657,8 +657,8 @@ export const optionalFieldEditor: OptionalFieldEditor = {
657
657
  export function optionalFieldIntoDelta(
658
658
  change: OptionalChangeset,
659
659
  deltaFromChild: ToDelta,
660
- ): DeltaFieldChanges {
661
- const delta: Mutable<DeltaFieldChanges> = {};
660
+ ): FieldChangeDelta {
661
+ const delta: Mutable<FieldChangeDelta> = {};
662
662
 
663
663
  let markIsANoop = true;
664
664
  const mark: Mutable<DeltaMark> = { count: 1 };
@@ -101,7 +101,7 @@ export function getMoveEffect(
101
101
  id: MoveId,
102
102
  count: number,
103
103
  addDependency: boolean = true,
104
- ): RangeQueryResult<MoveEffect> {
104
+ ): RangeQueryResult<ChangeAtomId, MoveEffect> {
105
105
  const result = moveEffects.get(target, revision, id, count, addDependency);
106
106
  return result.value !== undefined
107
107
  ? { ...result, value: adjustMoveEffectBasis(result.value as MoveEffectWithBasis, id) }
@@ -545,9 +545,14 @@ function getMovedChangesFromBaseMark(
545
545
  baseMark: Mark,
546
546
  ): NodeId | undefined {
547
547
  if (isMoveIn(baseMark)) {
548
- return getMovedNodeChanges(moveEffects, baseMark.revision, baseMark.id);
548
+ return getMovedNodeChanges(moveEffects, baseMark.revision, baseMark.id, baseMark.count);
549
549
  } else if (isAttachAndDetachEffect(baseMark) && isMoveIn(baseMark.attach)) {
550
- return getMovedNodeChanges(moveEffects, baseMark.attach.revision, baseMark.attach.id);
550
+ return getMovedNodeChanges(
551
+ moveEffects,
552
+ baseMark.attach.revision,
553
+ baseMark.attach.id,
554
+ baseMark.count,
555
+ );
551
556
  } else {
552
557
  return undefined;
553
558
  }
@@ -557,7 +562,8 @@ function getMovedNodeChanges(
557
562
  moveEffects: MoveEffectTable,
558
563
  revision: RevisionTag | undefined,
559
564
  id: MoveId,
565
+ count: number,
560
566
  ): NodeId | undefined {
561
- return getMoveEffect(moveEffects, CrossFieldTarget.Destination, revision, id, 1).value
567
+ return getMoveEffect(moveEffects, CrossFieldTarget.Destination, revision, id, count).value
562
568
  ?.rebasedChanges;
563
569
  }
@@ -145,7 +145,7 @@ export function makeV1Codec(
145
145
  context,
146
146
  );
147
147
  case NoopMarkType:
148
- fail(`Mark type: ${type} should not be encoded.`);
148
+ fail("Mark type: NoopMarkType should not be encoded.");
149
149
  default:
150
150
  unreachableCase(type);
151
151
  }
@@ -132,7 +132,7 @@ export function makeV2CodecHelpers(
132
132
  context,
133
133
  );
134
134
  case NoopMarkType:
135
- fail(`Mark type: ${type} should not be encoded.`);
135
+ fail("Mark type: NoopMarkType should not be encoded.");
136
136
  default:
137
137
  unreachableCase(type);
138
138
  }
@@ -8,7 +8,6 @@ import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
8
8
  import {
9
9
  type DeltaDetachedNodeChanges,
10
10
  type DeltaDetachedNodeRename,
11
- type DeltaFieldChanges,
12
11
  type DeltaMark,
13
12
  areEqualChangeAtomIds,
14
13
  } from "../../core/index.js";
@@ -25,12 +24,12 @@ import {
25
24
  getInputCellId,
26
25
  isAttachAndDetachEffect,
27
26
  } from "./utils.js";
28
- import type { ToDelta } from "../modular-schema/index.js";
27
+ import type { FieldChangeDelta, ToDelta } from "../modular-schema/index.js";
29
28
 
30
29
  export function sequenceFieldToDelta(
31
30
  change: MarkList,
32
31
  deltaFromChild: ToDelta,
33
- ): DeltaFieldChanges {
32
+ ): FieldChangeDelta {
34
33
  const local: DeltaMark[] = [];
35
34
  const global: DeltaDetachedNodeChanges[] = [];
36
35
  const rename: DeltaDetachedNodeRename[] = [];
@@ -187,7 +186,7 @@ export function sequenceFieldToDelta(
187
186
  }
188
187
  local.pop();
189
188
  }
190
- const delta: Mutable<DeltaFieldChanges> = {};
189
+ const delta: Mutable<FieldChangeDelta> = {};
191
190
  if (local.length > 0) {
192
191
  delta.local = local;
193
192
  }
@@ -942,13 +942,45 @@ function getCrossFieldKeysForMarkEffect(
942
942
  // An insert behaves like a move where the source and destination are at the same location.
943
943
  // An insert can become a move when after rebasing.
944
944
  return [
945
- [CrossFieldTarget.Source, effect.revision, effect.id, count],
946
- [CrossFieldTarget.Destination, effect.revision, effect.id, count],
945
+ {
946
+ key: {
947
+ target: CrossFieldTarget.Source,
948
+ revision: effect.revision,
949
+ localId: effect.id,
950
+ },
951
+ count,
952
+ },
953
+ {
954
+ key: {
955
+ target: CrossFieldTarget.Destination,
956
+ revision: effect.revision,
957
+ localId: effect.id,
958
+ },
959
+ count,
960
+ },
947
961
  ];
948
962
  case "MoveOut":
949
- return [[CrossFieldTarget.Source, effect.revision, effect.id, count]];
963
+ return [
964
+ {
965
+ key: {
966
+ target: CrossFieldTarget.Source,
967
+ revision: effect.revision,
968
+ localId: effect.id,
969
+ },
970
+ count,
971
+ },
972
+ ];
950
973
  case "MoveIn":
951
- return [[CrossFieldTarget.Destination, effect.revision, effect.id, count]];
974
+ return [
975
+ {
976
+ key: {
977
+ target: CrossFieldTarget.Destination,
978
+ revision: effect.revision,
979
+ localId: effect.id,
980
+ },
981
+ count,
982
+ },
983
+ ];
952
984
  case "AttachAndDetach":
953
985
  return [
954
986
  ...getCrossFieldKeysForMarkEffect(effect.attach, count),
@@ -20,6 +20,7 @@ import {
20
20
  rootField,
21
21
  } from "../core/index.js";
22
22
  import { fail } from "../util/index.js";
23
+ import { UsageError } from "@fluidframework/telemetry-utils/internal";
23
24
 
24
25
  /**
25
26
  * {@link ITreeCursorSynchronous} that can return the underlying node objects.
@@ -177,7 +178,11 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
177
178
  public enterNode(index: number): void {
178
179
  // assert(this.mode === CursorLocationType.Fields, "must be in fields mode");
179
180
  const siblings = this.getField();
180
- assert(index in siblings, 0x405 /* child must exist at index */);
181
+ if (!(index in siblings)) {
182
+ throw new UsageError(
183
+ "A child does not exist at the specified index, check the status of a node using `Tree.status()`.",
184
+ );
185
+ }
181
186
  this.siblingStack.push(this.siblings);
182
187
  this.indexStack.push(this.index);
183
188
  this.index = index;
package/src/index.ts CHANGED
@@ -14,13 +14,38 @@ export {
14
14
  type RevertibleAlpha,
15
15
  } from "./core/index.js";
16
16
 
17
- export type {
18
- Listeners,
19
- IsListener,
20
- Listenable,
21
- Off,
17
+ import type {
18
+ Listeners as EventListeners,
19
+ IsListener as EventIsListener,
20
+ Listenable as EventListenable,
21
+ Off as EventOff,
22
22
  } from "@fluidframework/core-interfaces";
23
23
 
24
+ /**
25
+ * {@inheritdoc @fluidframework/core-interfaces#Listeners}
26
+ * @public
27
+ * @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
28
+ */
29
+ export type Listeners<T extends object> = EventListeners<T>;
30
+ /**
31
+ * {@inheritdoc @fluidframework/core-interfaces#IsListener}
32
+ * @public
33
+ * @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
34
+ */
35
+ export type IsListener<T> = EventIsListener<T>;
36
+ /**
37
+ * {@inheritdoc @fluidframework/core-interfaces#Listenable}
38
+ * @public
39
+ * @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
40
+ */
41
+ export type Listenable<T extends object> = EventListenable<T>;
42
+ /**
43
+ * {@inheritdoc @fluidframework/core-interfaces#Off}
44
+ * @public
45
+ * @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
46
+ */
47
+ export type Off = EventOff;
48
+
24
49
  export {
25
50
  TreeStatus,
26
51
  TreeCompressionStrategy,
@@ -32,7 +57,7 @@ export {
32
57
  export {
33
58
  type ITreeInternal,
34
59
  type SharedTreeOptions,
35
- ForestType,
60
+ type ForestType,
36
61
  type SharedTreeFormatOptions,
37
62
  SharedTreeFormatVersion,
38
63
  Tree,
@@ -55,6 +80,9 @@ export {
55
80
  type TransactionResultExt,
56
81
  type TransactionResultSuccess,
57
82
  type TransactionResultFailed,
83
+ ForestTypeOptimized,
84
+ ForestTypeExpensiveDebug,
85
+ ForestTypeReference,
58
86
  } from "./shared-tree/index.js";
59
87
 
60
88
  export {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.13.0";
9
+ export const pkgVersion = "2.20.0";
@@ -9,7 +9,7 @@ export {
9
9
  type SharedTreeOptions,
10
10
  SharedTree,
11
11
  getBranch,
12
- ForestType,
12
+ type ForestType,
13
13
  type SharedTreeContentSnapshot,
14
14
  type SharedTreeFormatOptions,
15
15
  SharedTreeFormatVersion,
@@ -17,6 +17,9 @@ export {
17
17
  defaultSharedTreeOptions,
18
18
  type ForestOptions,
19
19
  type ITreeInternal,
20
+ ForestTypeOptimized,
21
+ ForestTypeExpensiveDebug,
22
+ ForestTypeReference,
20
23
  } from "./sharedTree.js";
21
24
 
22
25
  export {
@@ -3,8 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
7
- import type { IFluidHandle } from "@fluidframework/core-interfaces/internal";
6
+ import { assert } from "@fluidframework/core-utils/internal";
7
+ import type { ErasedType, IFluidHandle } from "@fluidframework/core-interfaces/internal";
8
8
  import type {
9
9
  IChannelAttributes,
10
10
  IChannelFactory,
@@ -186,30 +186,6 @@ function getCodecVersions(formatVersion: number): ExplicitCodecVersions {
186
186
  return versions;
187
187
  }
188
188
 
189
- /**
190
- * Build and return a forest of the requested type.
191
- */
192
- export function buildConfiguredForest(
193
- type: ForestType,
194
- schema: TreeStoredSchemaSubscription,
195
- idCompressor: IIdCompressor,
196
- ): IEditableForest {
197
- switch (type) {
198
- case ForestType.Optimized:
199
- return buildChunkedForest(
200
- makeTreeChunker(schema, defaultSchemaPolicy),
201
- undefined,
202
- idCompressor,
203
- );
204
- case ForestType.Reference:
205
- return buildForest();
206
- case ForestType.Expensive:
207
- return buildForest(undefined, true);
208
- default:
209
- unreachableCase(type);
210
- }
211
- }
212
-
213
189
  /**
214
190
  * Shared tree, configured with a good set of indexes and field kinds which will maintain compatibility over time.
215
191
  *
@@ -596,26 +572,70 @@ export interface SharedTreeFormatOptions {
596
572
 
597
573
  /**
598
574
  * Used to distinguish between different forest types.
575
+ * @remarks
576
+ * Current options are {@link ForestTypeReference}, {@link ForestTypeOptimized} and {@link ForestTypeExpensiveDebug}.
577
+ * @sealed @alpha
578
+ */
579
+ export interface ForestType extends ErasedType<"ForestType"> {}
580
+
581
+ /**
582
+ * Reference implementation of forest.
583
+ * @remarks
584
+ * A simple implementation with minimal complexity and moderate debuggability, validation and performance.
585
+ * @privateRemarks
586
+ * The "ObjectForest" forest type.
599
587
  * @alpha
600
588
  */
601
- export enum ForestType {
602
- /**
603
- * The "ObjectForest" forest type.
604
- */
605
- Reference = 0,
606
- /**
607
- * The "ChunkedForest" forest type.
608
- */
609
- Optimized = 1,
610
- /**
611
- * The "ObjectForest" forest type with expensive asserts for debugging.
612
- */
613
- Expensive = 2,
589
+ export const ForestTypeReference = toForestType(() => buildForest());
590
+
591
+ /**
592
+ * Optimized implementation of forest.
593
+ * @remarks
594
+ * A complex optimized forest implementation, which has minimal validation and debuggability to optimize for performance.
595
+ * Uses an internal representation optimized for size designed to scale to larger datasets with reduced overhead.
596
+ * @privateRemarks
597
+ * The "ChunkedForest" forest type.
598
+ * @alpha
599
+ */
600
+ export const ForestTypeOptimized = toForestType(
601
+ (schema: TreeStoredSchemaSubscription, idCompressor: IIdCompressor) =>
602
+ buildChunkedForest(makeTreeChunker(schema, defaultSchemaPolicy), undefined, idCompressor),
603
+ );
604
+
605
+ /**
606
+ * Slow implementation of forest intended only for debugging.
607
+ * @remarks
608
+ * Includes validation with scales poorly.
609
+ * May be asymptotically slower than {@link ForestTypeReference}, and may perform very badly with larger data sizes.
610
+ * @privateRemarks
611
+ * The "ObjectForest" forest type with expensive asserts for debugging.
612
+ * @alpha
613
+ */
614
+ export const ForestTypeExpensiveDebug = toForestType(() => buildForest(undefined, true));
615
+
616
+ type ForestFactory = (
617
+ schema: TreeStoredSchemaSubscription,
618
+ idCompressor: IIdCompressor,
619
+ ) => IEditableForest;
620
+
621
+ function toForestType(factory: ForestFactory): ForestType {
622
+ return factory as unknown as ForestType;
623
+ }
624
+
625
+ /**
626
+ * Build and return a forest of the requested type.
627
+ */
628
+ export function buildConfiguredForest(
629
+ factory: ForestType,
630
+ schema: TreeStoredSchemaSubscription,
631
+ idCompressor: IIdCompressor,
632
+ ): IEditableForest {
633
+ return (factory as unknown as ForestFactory)(schema, idCompressor);
614
634
  }
615
635
 
616
636
  export const defaultSharedTreeOptions: Required<SharedTreeOptionsInternal> = {
617
637
  jsonValidator: noopValidator,
618
- forest: ForestType.Reference,
638
+ forest: ForestTypeReference,
619
639
  treeEncodeType: TreeCompressionStrategy.Compressed,
620
640
  formatVersion: SharedTreeFormatVersion.v3,
621
641
  disposeForksAfterTransaction: true,
@@ -41,6 +41,7 @@ import {
41
41
  type RevertibleAlphaFactory,
42
42
  type RevertibleAlpha,
43
43
  type GraphCommit,
44
+ isAncestor,
44
45
  } from "../core/index.js";
45
46
  import {
46
47
  type FieldBatchCodec,
@@ -605,21 +606,27 @@ export class TreeCheckout implements ITreeCheckoutFork {
605
606
  revertible.dispose();
606
607
  }
607
608
  },
608
- clone: (forkedBranch: TreeBranch) => {
609
- if (forkedBranch === undefined) {
610
- return this.createRevertible(revision, kind, checkout, onRevertibleDisposed);
611
- }
612
-
609
+ clone: (targetBranch: TreeBranch) => {
613
610
  // TODO:#23442: When a revertible is cloned for a forked branch, optimize to create a fork of a revertible branch once per revision NOT once per revision per checkout.
614
- const forkedCheckout = getCheckout(forkedBranch);
611
+ const targetCheckout = getCheckout(targetBranch);
612
+
615
613
  const revertibleBranch = this.revertibleCommitBranches.get(revision);
616
- assert(
617
- revertibleBranch !== undefined,
618
- 0xa82 /* change to revert does not exist on the given forked branch */,
619
- );
620
- forkedCheckout.revertibleCommitBranches.set(revision, revertibleBranch.fork());
614
+ if (revertibleBranch === undefined) {
615
+ throw new UsageError("Unable to clone a revertible that has been disposed.");
616
+ }
617
+
618
+ const commitToRevert = revertibleBranch.getHead();
619
+ const activeBranchHead = targetCheckout.#transaction.activeBranch.getHead();
620
+
621
+ if (isAncestor(commitToRevert, activeBranchHead, true) === false) {
622
+ throw new UsageError(
623
+ "Cannot clone revertible for a commit that is not present on the given branch.",
624
+ );
625
+ }
626
+
627
+ targetCheckout.revertibleCommitBranches.set(revision, revertibleBranch.fork());
621
628
 
622
- return this.createRevertible(revision, kind, forkedCheckout, onRevertibleDisposed);
629
+ return this.createRevertible(revision, kind, targetCheckout, onRevertibleDisposed);
623
630
  },
624
631
  dispose: () => {
625
632
  if (revertible.status === RevertibleStatus.Disposed) {
@@ -174,7 +174,7 @@ export const treeNodeApi: TreeNodeApi = {
174
174
  changedFields,
175
175
  (field) =>
176
176
  nodeSchema.storedKeyToPropertyKey.get(field) ??
177
- fail(`Could not find stored key '${field}' in schema.`),
177
+ fail("Could not find stored key in schema."),
178
178
  ),
179
179
  );
180
180
  listener({ changedProperties });
@@ -993,7 +993,7 @@ abstract class CustomArrayNodeBase<const T extends ImplicitAllowedTypes>
993
993
  if (!destinationField.context.isHydrated()) {
994
994
  if (!(sourceField instanceof UnhydratedTreeSequenceField)) {
995
995
  throw new UsageError(
996
- "Cannot move elements from an unhydrated array to a hydrated array.",
996
+ "Cannot move elements from a hydrated array to an unhydrated array.",
997
997
  );
998
998
  }
999
999
 
@@ -196,7 +196,7 @@ function nodeDataToMapTree(
196
196
  result = objectToMapTree(data, schema);
197
197
  break;
198
198
  default:
199
- fail(`Unrecognized schema kind: ${schema.kind}.`);
199
+ fail("Unrecognized schema kind");
200
200
  }
201
201
 
202
202
  return result;
@@ -0,0 +1,60 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { BTree } from "@tylerbu/sorted-btree-es6";
7
+ import { brand, type Brand } from "./brand.js";
8
+
9
+ export type TupleBTree<K, V> = Brand<BTree<K, V>, "TupleBTree">;
10
+
11
+ export function newTupleBTree<K extends readonly unknown[], V>(
12
+ entries?: [K, V][],
13
+ ): TupleBTree<K, V> {
14
+ return brand(new BTree<K, V>(entries, compareTuples));
15
+ }
16
+
17
+ // This assumes that the arrays are the same length.
18
+ function compareTuples(arrayA: readonly unknown[], arrayB: readonly unknown[]): number {
19
+ for (let i = 0; i < arrayA.length; i++) {
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const a = arrayA[i] as any;
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ const b = arrayB[i] as any;
24
+
25
+ // Less-than and greater-than always return false if either value is undefined,
26
+ // so we handle undefined separately, treating it as less than all other values.
27
+ if (a === undefined && b !== undefined) {
28
+ return -1;
29
+ } else if (b === undefined && a !== undefined) {
30
+ return 1;
31
+ } else if (a < b) {
32
+ return -1;
33
+ } else if (a > b) {
34
+ return 1;
35
+ }
36
+ }
37
+
38
+ return 0;
39
+ }
40
+
41
+ export function mergeTupleBTrees<K extends readonly unknown[], V>(
42
+ tree1: TupleBTree<K, V> | undefined,
43
+ tree2: TupleBTree<K, V> | undefined,
44
+ preferLeft = true,
45
+ ): TupleBTree<K, V> {
46
+ if (tree1 === undefined) {
47
+ return tree2 !== undefined ? brand(tree2.clone()) : newTupleBTree<K, V>();
48
+ }
49
+
50
+ const result: TupleBTree<K, V> = brand(tree1.clone());
51
+ if (tree2 === undefined) {
52
+ return result;
53
+ }
54
+
55
+ for (const [key, value] of tree2.entries()) {
56
+ result.set(key, value, !preferLeft);
57
+ }
58
+
59
+ return result;
60
+ }
@@ -26,8 +26,6 @@ export interface IdAllocationState {
26
26
  maxId: number;
27
27
  }
28
28
 
29
- /**
30
- */
31
29
  export function idAllocatorFromMaxId(maxId: number | undefined = undefined): IdAllocator {
32
30
  return idAllocatorFromState({ maxId: maxId ?? -1 });
33
31
  }
package/src/util/index.ts CHANGED
@@ -123,6 +123,7 @@ export {
123
123
  export {
124
124
  RangeMap,
125
125
  type RangeQueryResult,
126
+ newIntegerRangeMap,
126
127
  } from "./rangeMap.js";
127
128
 
128
129
  export {
@@ -140,3 +141,5 @@ export {
140
141
  throwIfBroken,
141
142
  breakingClass,
142
143
  } from "./breakable.js";
144
+
145
+ export { type TupleBTree, newTupleBTree, mergeTupleBTrees } from "./bTreeUtils.js";