@fluidframework/tree 2.13.0 → 2.21.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 (360) hide show
  1. package/CHANGELOG.md +22 -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 +15 -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 +5 -2
  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 +6 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/legacy.d.ts +3 -1
  96. package/dist/package.json +2 -1
  97. package/dist/packageVersion.d.ts +1 -1
  98. package/dist/packageVersion.js +1 -1
  99. package/dist/packageVersion.js.map +1 -1
  100. package/dist/shared-tree/index.d.ts +2 -1
  101. package/dist/shared-tree/index.d.ts.map +1 -1
  102. package/dist/shared-tree/index.js +7 -2
  103. package/dist/shared-tree/index.js.map +1 -1
  104. package/dist/shared-tree/publicContracts.d.ts +18 -0
  105. package/dist/shared-tree/publicContracts.d.ts.map +1 -0
  106. package/dist/shared-tree/publicContracts.js +24 -0
  107. package/dist/shared-tree/publicContracts.js.map +1 -0
  108. package/dist/shared-tree/sharedTree.d.ts +38 -18
  109. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  110. package/dist/shared-tree/sharedTree.js +41 -40
  111. package/dist/shared-tree/sharedTree.js.map +1 -1
  112. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  113. package/dist/shared-tree/treeCheckout.js +12 -8
  114. package/dist/shared-tree/treeCheckout.js.map +1 -1
  115. package/dist/simple-tree/api/schemaFactory.d.ts +2 -0
  116. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  117. package/dist/simple-tree/api/schemaFactory.js +2 -0
  118. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  119. package/dist/simple-tree/api/tree.d.ts +4 -0
  120. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  121. package/dist/simple-tree/api/tree.js.map +1 -1
  122. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  123. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  124. package/dist/simple-tree/arrayNode.js +1 -1
  125. package/dist/simple-tree/arrayNode.js.map +1 -1
  126. package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  127. package/dist/simple-tree/core/getOrCreateNode.js +1 -1
  128. package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
  129. package/dist/simple-tree/core/index.d.ts +1 -1
  130. package/dist/simple-tree/core/index.d.ts.map +1 -1
  131. package/dist/simple-tree/core/index.js +2 -2
  132. package/dist/simple-tree/core/index.js.map +1 -1
  133. package/dist/simple-tree/core/treeNodeKernel.d.ts +2 -6
  134. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  135. package/dist/simple-tree/core/treeNodeKernel.js +10 -13
  136. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  137. package/dist/simple-tree/proxies.js +1 -1
  138. package/dist/simple-tree/proxies.js.map +1 -1
  139. package/dist/simple-tree/toMapTree.js +1 -1
  140. package/dist/simple-tree/toMapTree.js.map +1 -1
  141. package/dist/util/bTreeUtils.d.ts +10 -0
  142. package/dist/util/bTreeUtils.d.ts.map +1 -0
  143. package/dist/util/bTreeUtils.js +52 -0
  144. package/dist/util/bTreeUtils.js.map +1 -0
  145. package/dist/util/idAllocator.d.ts +0 -2
  146. package/dist/util/idAllocator.d.ts.map +1 -1
  147. package/dist/util/idAllocator.js +0 -2
  148. package/dist/util/idAllocator.js.map +1 -1
  149. package/dist/util/index.d.ts +2 -1
  150. package/dist/util/index.d.ts.map +1 -1
  151. package/dist/util/index.js +5 -1
  152. package/dist/util/index.js.map +1 -1
  153. package/dist/util/rangeMap.d.ts +61 -30
  154. package/dist/util/rangeMap.d.ts.map +1 -1
  155. package/dist/util/rangeMap.js +189 -117
  156. package/dist/util/rangeMap.js.map +1 -1
  157. package/dist/util/utils.d.ts +4 -1
  158. package/dist/util/utils.d.ts.map +1 -1
  159. package/dist/util/utils.js +7 -1
  160. package/dist/util/utils.js.map +1 -1
  161. package/lib/alpha.d.ts +3 -0
  162. package/lib/core/index.d.ts +2 -2
  163. package/lib/core/index.d.ts.map +1 -1
  164. package/lib/core/index.js +2 -2
  165. package/lib/core/index.js.map +1 -1
  166. package/lib/core/rebase/index.d.ts +2 -2
  167. package/lib/core/rebase/index.d.ts.map +1 -1
  168. package/lib/core/rebase/index.js +2 -2
  169. package/lib/core/rebase/index.js.map +1 -1
  170. package/lib/core/rebase/types.d.ts +5 -4
  171. package/lib/core/rebase/types.d.ts.map +1 -1
  172. package/lib/core/rebase/types.js +26 -1
  173. package/lib/core/rebase/types.js.map +1 -1
  174. package/lib/core/rebase/utils.d.ts +10 -0
  175. package/lib/core/rebase/utils.d.ts.map +1 -1
  176. package/lib/core/rebase/utils.js +20 -0
  177. package/lib/core/rebase/utils.js.map +1 -1
  178. package/lib/core/tree/delta.d.ts +21 -26
  179. package/lib/core/tree/delta.d.ts.map +1 -1
  180. package/lib/core/tree/delta.js.map +1 -1
  181. package/lib/core/tree/deltaUtil.d.ts +1 -3
  182. package/lib/core/tree/deltaUtil.d.ts.map +1 -1
  183. package/lib/core/tree/deltaUtil.js +1 -12
  184. package/lib/core/tree/deltaUtil.js.map +1 -1
  185. package/lib/core/tree/index.d.ts +1 -1
  186. package/lib/core/tree/index.d.ts.map +1 -1
  187. package/lib/core/tree/index.js +1 -1
  188. package/lib/core/tree/index.js.map +1 -1
  189. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  190. package/lib/core/tree/visitDelta.js +82 -80
  191. package/lib/core/tree/visitDelta.js.map +1 -1
  192. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  193. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  194. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  195. package/lib/feature-libraries/deltaUtils.js +13 -0
  196. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  197. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  198. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  199. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  200. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  201. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  202. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  203. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  204. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  205. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  206. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  207. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  208. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  209. package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
  210. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  211. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  212. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  213. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  214. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  215. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  216. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  217. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  218. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +74 -166
  219. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  220. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  221. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  222. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +18 -1
  223. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  224. package/lib/feature-libraries/optional-field/optionalField.d.ts +3 -3
  225. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  226. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  227. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  228. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  229. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  230. package/lib/feature-libraries/sequence-field/rebase.js +4 -4
  231. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  232. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  233. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  234. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  235. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  236. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  237. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  238. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  239. package/lib/feature-libraries/sequence-field/utils.js +36 -4
  240. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  241. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  242. package/lib/feature-libraries/treeCursorUtils.js +6 -3
  243. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  244. package/lib/index.d.ts +26 -2
  245. package/lib/index.d.ts.map +1 -1
  246. package/lib/index.js +1 -1
  247. package/lib/index.js.map +1 -1
  248. package/lib/legacy.d.ts +3 -1
  249. package/lib/packageVersion.d.ts +1 -1
  250. package/lib/packageVersion.js +1 -1
  251. package/lib/packageVersion.js.map +1 -1
  252. package/lib/shared-tree/index.d.ts +2 -1
  253. package/lib/shared-tree/index.d.ts.map +1 -1
  254. package/lib/shared-tree/index.js +2 -1
  255. package/lib/shared-tree/index.js.map +1 -1
  256. package/lib/shared-tree/publicContracts.d.ts +18 -0
  257. package/lib/shared-tree/publicContracts.d.ts.map +1 -0
  258. package/lib/shared-tree/publicContracts.js +21 -0
  259. package/lib/shared-tree/publicContracts.js.map +1 -0
  260. package/lib/shared-tree/sharedTree.d.ts +38 -18
  261. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  262. package/lib/shared-tree/sharedTree.js +40 -39
  263. package/lib/shared-tree/sharedTree.js.map +1 -1
  264. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  265. package/lib/shared-tree/treeCheckout.js +13 -9
  266. package/lib/shared-tree/treeCheckout.js.map +1 -1
  267. package/lib/simple-tree/api/schemaFactory.d.ts +2 -0
  268. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  269. package/lib/simple-tree/api/schemaFactory.js +2 -0
  270. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  271. package/lib/simple-tree/api/tree.d.ts +4 -0
  272. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  273. package/lib/simple-tree/api/tree.js.map +1 -1
  274. package/lib/simple-tree/api/treeNodeApi.js +1 -1
  275. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  276. package/lib/simple-tree/arrayNode.js +1 -1
  277. package/lib/simple-tree/arrayNode.js.map +1 -1
  278. package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  279. package/lib/simple-tree/core/getOrCreateNode.js +2 -2
  280. package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
  281. package/lib/simple-tree/core/index.d.ts +1 -1
  282. package/lib/simple-tree/core/index.d.ts.map +1 -1
  283. package/lib/simple-tree/core/index.js +1 -1
  284. package/lib/simple-tree/core/index.js.map +1 -1
  285. package/lib/simple-tree/core/treeNodeKernel.d.ts +2 -6
  286. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  287. package/lib/simple-tree/core/treeNodeKernel.js +9 -11
  288. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  289. package/lib/simple-tree/proxies.js +2 -2
  290. package/lib/simple-tree/proxies.js.map +1 -1
  291. package/lib/simple-tree/toMapTree.js +1 -1
  292. package/lib/simple-tree/toMapTree.js.map +1 -1
  293. package/lib/util/bTreeUtils.d.ts +10 -0
  294. package/lib/util/bTreeUtils.d.ts.map +1 -0
  295. package/lib/util/bTreeUtils.js +47 -0
  296. package/lib/util/bTreeUtils.js.map +1 -0
  297. package/lib/util/idAllocator.d.ts +0 -2
  298. package/lib/util/idAllocator.d.ts.map +1 -1
  299. package/lib/util/idAllocator.js +0 -2
  300. package/lib/util/idAllocator.js.map +1 -1
  301. package/lib/util/index.d.ts +2 -1
  302. package/lib/util/index.d.ts.map +1 -1
  303. package/lib/util/index.js +2 -1
  304. package/lib/util/index.js.map +1 -1
  305. package/lib/util/rangeMap.d.ts +61 -30
  306. package/lib/util/rangeMap.d.ts.map +1 -1
  307. package/lib/util/rangeMap.js +188 -117
  308. package/lib/util/rangeMap.js.map +1 -1
  309. package/lib/util/utils.d.ts +4 -1
  310. package/lib/util/utils.d.ts.map +1 -1
  311. package/lib/util/utils.js +7 -1
  312. package/lib/util/utils.js.map +1 -1
  313. package/package.json +25 -25
  314. package/src/core/index.ts +5 -2
  315. package/src/core/rebase/index.ts +5 -0
  316. package/src/core/rebase/types.ts +33 -5
  317. package/src/core/rebase/utils.ts +27 -0
  318. package/src/core/tree/delta.ts +21 -26
  319. package/src/core/tree/deltaUtil.ts +1 -16
  320. package/src/core/tree/index.ts +0 -2
  321. package/src/core/tree/visitDelta.ts +108 -97
  322. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +2 -2
  323. package/src/feature-libraries/deltaUtils.ts +13 -0
  324. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -6
  325. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +12 -13
  326. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +21 -1
  327. package/src/feature-libraries/modular-schema/genericFieldKind.ts +2 -2
  328. package/src/feature-libraries/modular-schema/index.ts +2 -0
  329. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +12 -11
  330. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +138 -225
  331. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +40 -27
  332. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  333. package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
  334. package/src/feature-libraries/sequence-field/rebase.ts +9 -3
  335. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
  336. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
  337. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +3 -4
  338. package/src/feature-libraries/sequence-field/utils.ts +36 -4
  339. package/src/feature-libraries/treeCursorUtils.ts +10 -3
  340. package/src/index.ts +36 -6
  341. package/src/packageVersion.ts +1 -1
  342. package/src/shared-tree/index.ts +9 -1
  343. package/src/shared-tree/publicContracts.ts +24 -0
  344. package/src/shared-tree/sharedTree.ts +63 -46
  345. package/src/shared-tree/treeCheckout.ts +19 -12
  346. package/src/simple-tree/api/schemaFactory.ts +2 -0
  347. package/src/simple-tree/api/tree.ts +4 -0
  348. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  349. package/src/simple-tree/arrayNode.ts +1 -1
  350. package/src/simple-tree/core/getOrCreateNode.ts +6 -2
  351. package/src/simple-tree/core/index.ts +1 -1
  352. package/src/simple-tree/core/treeNodeKernel.ts +16 -14
  353. package/src/simple-tree/proxies.ts +2 -2
  354. package/src/simple-tree/toMapTree.ts +1 -1
  355. package/src/util/bTreeUtils.ts +60 -0
  356. package/src/util/idAllocator.ts +0 -2
  357. package/src/util/index.ts +3 -0
  358. package/src/util/rangeMap.ts +237 -143
  359. package/src/util/utils.ts +10 -3
  360. package/lib/package.json +0 -3
@@ -4,14 +4,15 @@
4
4
  */
5
5
  import { assert } from "@fluidframework/core-utils/internal";
6
6
  import { BTree } from "@tylerbu/sorted-btree-es6";
7
- import { EditBuilder, isEmptyFieldChanges, makeDetachedNodeId, mapCursorField, replaceAtomRevisions, revisionMetadataSourceFromInfo, areEqualChangeAtomIds, areEqualChangeAtomIdOpts, tagChange, makeAnonChange, } from "../../core/index.js";
8
- import { brand, fail, idAllocatorFromMaxId, idAllocatorFromState, getOrAddInMapLazy, } from "../../util/index.js";
7
+ import { EditBuilder, makeDetachedNodeId, mapCursorField, replaceAtomRevisions, revisionMetadataSourceFromInfo, areEqualChangeAtomIds, areEqualChangeAtomIdOpts, tagChange, makeAnonChange, newChangeAtomIdRangeMap, } from "../../core/index.js";
8
+ import { brand, fail, idAllocatorFromMaxId, idAllocatorFromState, getOrAddInMapLazy, newTupleBTree, mergeTupleBTrees, RangeMap, } from "../../util/index.js";
9
9
  import { chunkFieldSingle, chunkTree, defaultChunkPolicy, } from "../chunked-forest/index.js";
10
10
  import { cursorForMapTreeNode, mapTreeFromCursor } from "../mapTreeCursor.js";
11
11
  import { CrossFieldTarget, getFirstFromCrossFieldMap, setInCrossFieldMap, } from "./crossFieldQueries.js";
12
12
  import { NodeAttachState, } from "./fieldChangeHandler.js";
13
13
  import { withEditor } from "./fieldKindWithEditor.js";
14
14
  import { convertGenericChange, genericFieldKind } from "./genericFieldKind.js";
15
+ import { newCrossFieldKeyTable, } from "./modularChangeTypes.js";
15
16
  /**
16
17
  * Implementation of ChangeFamily which delegates work in a given field to the appropriate FieldKind
17
18
  * as determined by the schema.
@@ -101,7 +102,7 @@ export class ModularChangeFamily {
101
102
  nodeChanges: newTupleBTree(),
102
103
  nodeToParent: newTupleBTree(),
103
104
  nodeAliases: newTupleBTree(),
104
- crossFieldKeys: newTupleBTree(),
105
+ crossFieldKeys: newCrossFieldKeyTable(),
105
106
  };
106
107
  }
107
108
  else if (hasConflicts(change1)) {
@@ -120,20 +121,20 @@ export class ModularChangeFamily {
120
121
  // A collision for a node ID means that that node is referenced in both changesets
121
122
  // (since we assume that if two changesets use the same node ID they are referring to the same node),
122
123
  // therefore all collisions will be addressed when processing the intersection of the changesets.
123
- const composedNodeChanges = brand(mergeBTrees(change1.nodeChanges, change2.nodeChanges));
124
- const composedNodeToParent = brand(mergeBTrees(change1.nodeToParent, change2.nodeToParent));
125
- const composedNodeAliases = brand(mergeBTrees(change1.nodeAliases, change2.nodeAliases));
124
+ const composedNodeChanges = brand(mergeTupleBTrees(change1.nodeChanges, change2.nodeChanges));
125
+ const composedNodeToParent = brand(mergeTupleBTrees(change1.nodeToParent, change2.nodeToParent));
126
+ const composedNodeAliases = brand(mergeTupleBTrees(change1.nodeAliases, change2.nodeAliases));
126
127
  const crossFieldTable = newComposeTable(change1, change2, composedNodeToParent);
127
128
  const composedFields = this.composeFieldMaps(change1.fieldChanges, change2.fieldChanges, undefined, genId, crossFieldTable, revisionMetadata);
128
129
  this.composeInvalidatedElements(crossFieldTable, composedFields, composedNodeChanges, composedNodeToParent, composedNodeAliases, genId, revisionMetadata);
129
130
  // Currently no field kinds require making changes to cross-field keys during composition, so we can just merge the two tables.
130
- const composedCrossFieldKeys = mergeBTrees(change1.crossFieldKeys, change2.crossFieldKeys);
131
+ const composedCrossFieldKeys = RangeMap.union(change1.crossFieldKeys, change2.crossFieldKeys);
131
132
  return {
132
133
  fieldChanges: composedFields,
133
134
  nodeChanges: composedNodeChanges,
134
135
  nodeToParent: composedNodeToParent,
135
136
  nodeAliases: composedNodeAliases,
136
- crossFieldKeys: brand(composedCrossFieldKeys),
137
+ crossFieldKeys: composedCrossFieldKeys,
137
138
  };
138
139
  }
139
140
  composeInvalidatedField(fieldChange, crossFieldTable, genId, revisionMetadata) {
@@ -436,7 +437,7 @@ export class ModularChangeFamily {
436
437
  baseToRebasedNodeId: newTupleBTree(),
437
438
  rebasedFields: new Set(),
438
439
  rebasedNodeToParent: brand(change.nodeToParent.clone()),
439
- rebasedCrossFieldKeys: brand(change.crossFieldKeys.clone()),
440
+ rebasedCrossFieldKeys: change.crossFieldKeys.clone(),
440
441
  nodeIdPairs: [],
441
442
  affectedBaseFields: newTupleBTree(),
442
443
  fieldsWithUnattachedChild: new Set(),
@@ -821,8 +822,8 @@ export class ModularChangeFamily {
821
822
  populateCrossFieldKeyTableForFieldMap(table, fields, parent) {
822
823
  for (const [fieldKey, fieldChange] of fields) {
823
824
  const keys = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).getCrossFieldKeys(fieldChange.change);
824
- for (const key of keys) {
825
- table.set(key, { nodeId: parent, field: fieldKey });
825
+ for (const { key, count } of keys) {
826
+ table.set(key, count, { nodeId: parent, field: fieldKey });
826
827
  }
827
828
  }
828
829
  }
@@ -861,7 +862,7 @@ export class ModularChangeFamily {
861
862
  numChildren += 1;
862
863
  }
863
864
  for (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {
864
- const fields = getFieldsForCrossFieldKey(change, keyRange);
865
+ const fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);
865
866
  assert(fields.length === 1 &&
866
867
  fields[0] !== undefined &&
867
868
  areEqualFieldIds(fields[0], fieldId), 0xa4f /* Inconsistent cross field keys */);
@@ -872,14 +873,15 @@ export class ModularChangeFamily {
872
873
  }
873
874
  ModularChangeFamily.emptyChange = makeModularChangeset();
874
875
  function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, nodeAliases) {
875
- const updated = newTupleBTree();
876
- table.forEachPair(([target, revision, id, count], field) => {
877
- const updatedKey = [
878
- target,
879
- replaceRevision(revision, oldRevisions, newRevision),
880
- id,
881
- count,
882
- ];
876
+ const updated = newCrossFieldKeyTable();
877
+ for (const entry of table.entries()) {
878
+ const key = entry.start;
879
+ const updatedKey = {
880
+ target: key.target,
881
+ revision: replaceRevision(key.revision, oldRevisions, newRevision),
882
+ localId: key.localId,
883
+ };
884
+ const field = entry.value;
883
885
  const normalizedFieldId = normalizeFieldId(field, nodeAliases);
884
886
  const updatedNodeId = normalizedFieldId.nodeId !== undefined
885
887
  ? replaceAtomRevisions(normalizedFieldId.nodeId, oldRevisions, newRevision)
@@ -888,8 +890,8 @@ function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, no
888
890
  ...normalizedFieldId,
889
891
  nodeId: updatedNodeId,
890
892
  };
891
- updated.set(updatedKey, updatedValue);
892
- });
893
+ updated.set(updatedKey, entry.length, updatedValue);
894
+ }
893
895
  return updated;
894
896
  }
895
897
  function replaceRevision(revision, oldRevisions, newRevision) {
@@ -913,9 +915,9 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
913
915
  // Note that it would in principle be possible to adopt the later build and exclude from the
914
916
  // composition all the changes already reflected on the tree, but that is not something we
915
917
  // care to support at this time.
916
- const allBuilds = brand(mergeBTrees(change1.builds ?? newTupleBTree(), change2.builds ?? newTupleBTree(), true));
917
- const allDestroys = brand(mergeBTrees(change1.destroys ?? newTupleBTree(), change2.destroys ?? newTupleBTree()));
918
- const allRefreshers = brand(mergeBTrees(change1.refreshers ?? newTupleBTree(), change2.refreshers ?? newTupleBTree(), true));
918
+ const allBuilds = brand(mergeTupleBTrees(change1.builds ?? newTupleBTree(), change2.builds ?? newTupleBTree(), true));
919
+ const allDestroys = brand(mergeTupleBTrees(change1.destroys ?? newTupleBTree(), change2.destroys ?? newTupleBTree()));
920
+ const allRefreshers = brand(mergeTupleBTrees(change1.refreshers ?? newTupleBTree(), change2.refreshers ?? newTupleBTree(), true));
919
921
  if (change1.destroys !== undefined && change2.builds !== undefined) {
920
922
  for (const [key, chunk] of change2.builds.entries()) {
921
923
  const destroyCount = change1.destroys.get(key);
@@ -1034,18 +1036,28 @@ export function updateRefreshers(change, getDetachedNode, removedRoots, requireR
1034
1036
  });
1035
1037
  }
1036
1038
  /**
1039
+ * Converts a change into the delta format.
1040
+ *
1037
1041
  * @param change - The change to convert into a delta.
1038
1042
  * @param fieldKinds - The field kinds to delegate to.
1039
1043
  */
1040
1044
  export function intoDelta(taggedChange, fieldKinds) {
1041
1045
  const change = taggedChange.change;
1042
1046
  const rootDelta = {};
1047
+ const global = [];
1048
+ const rename = [];
1043
1049
  if (!hasConflicts(change)) {
1044
1050
  // If there are no constraint violations, then tree changes apply.
1045
- const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds);
1051
+ const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds, global, rename);
1046
1052
  if (fieldDeltas.size > 0) {
1047
1053
  rootDelta.fields = fieldDeltas;
1048
1054
  }
1055
+ if (global.length > 0) {
1056
+ rootDelta.global = global;
1057
+ }
1058
+ if (rename.length > 0) {
1059
+ rootDelta.rename = rename;
1060
+ }
1049
1061
  }
1050
1062
  // Constraint violations should not prevent nodes from being built
1051
1063
  if (change.builds && change.builds.size > 0) {
@@ -1082,22 +1094,24 @@ function copyDetachedNodes(detachedNodes) {
1082
1094
  /**
1083
1095
  * @param change - The change to convert into a delta.
1084
1096
  */
1085
- function intoDeltaImpl(change, nodeChanges, fieldKinds) {
1097
+ function intoDeltaImpl(change, nodeChanges, fieldKinds, global, rename) {
1086
1098
  const delta = new Map();
1087
1099
  for (const [field, fieldChange] of change) {
1088
- const deltaField = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
1100
+ const { local: fieldChanges, global: fieldGlobal, rename: fieldRename, } = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
1089
1101
  const nodeChange = nodeChangeFromId(nodeChanges, childChange);
1090
- return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds);
1102
+ return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds, global, rename);
1091
1103
  });
1092
- if (!isEmptyFieldChanges(deltaField)) {
1093
- delta.set(field, deltaField);
1104
+ if (fieldChanges !== undefined && fieldChanges.length > 0) {
1105
+ delta.set(field, fieldChanges);
1094
1106
  }
1107
+ fieldGlobal?.forEach((c) => global.push(c));
1108
+ fieldRename?.forEach((r) => rename.push(r));
1095
1109
  }
1096
1110
  return delta;
1097
1111
  }
1098
- function deltaFromNodeChange(change, nodeChanges, fieldKinds) {
1112
+ function deltaFromNodeChange(change, nodeChanges, fieldKinds, global, rename) {
1099
1113
  if (change.fieldChanges !== undefined) {
1100
- return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds);
1114
+ return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds, global, rename);
1101
1115
  }
1102
1116
  // TODO: update the API to allow undefined to be returned here
1103
1117
  return new Map();
@@ -1163,10 +1177,10 @@ function newComposeTable(baseChange, newChange, composedNodeToParent) {
1163
1177
  }
1164
1178
  function newCrossFieldTable() {
1165
1179
  return {
1166
- srcTable: new Map(),
1167
- dstTable: new Map(),
1168
- srcDependents: new Map(),
1169
- dstDependents: new Map(),
1180
+ srcTable: newChangeAtomIdRangeMap(),
1181
+ dstTable: newChangeAtomIdRangeMap(),
1182
+ srcDependents: newChangeAtomIdRangeMap(),
1183
+ dstDependents: newChangeAtomIdRangeMap(),
1170
1184
  invalidatedFields: new Set(),
1171
1185
  };
1172
1186
  }
@@ -1237,19 +1251,17 @@ class RebaseManager extends CrossFieldManagerI {
1237
1251
  }
1238
1252
  set(target, revision, id, count, newValue, invalidateDependents) {
1239
1253
  if (invalidateDependents && this.allowInval) {
1240
- const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, [
1254
+ const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
1241
1255
  target,
1242
1256
  revision,
1243
- id,
1244
- count,
1245
- ]);
1257
+ localId: id,
1258
+ }, count);
1246
1259
  assert(newFieldIds.length === 0, 0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */);
1247
- const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, [
1260
+ const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
1248
1261
  target,
1249
1262
  revision,
1250
- id,
1251
- count,
1252
- ]);
1263
+ localId: id,
1264
+ }, count);
1253
1265
  assert(baseFieldIds.length > 0, 0x9c7 /* Cross field key not registered in base or new change */);
1254
1266
  for (const baseFieldId of baseFieldIds) {
1255
1267
  this.table.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
@@ -1261,7 +1273,7 @@ class RebaseManager extends CrossFieldManagerI {
1261
1273
  setInChangeAtomIdMap(this.table.rebasedNodeToParent, id, this.fieldId);
1262
1274
  }
1263
1275
  moveKey(target, revision, id, count) {
1264
- setInCrossFieldKeyTable(this.table.rebasedCrossFieldKeys, target, revision, id, count, this.fieldId);
1276
+ this.table.rebasedCrossFieldKeys.set({ target, revision, localId: id }, count, this.fieldId);
1265
1277
  }
1266
1278
  get table() {
1267
1279
  return this.crossFieldTable;
@@ -1275,24 +1287,22 @@ class ComposeManager extends CrossFieldManagerI {
1275
1287
  }
1276
1288
  set(target, revision, id, count, newValue, invalidateDependents) {
1277
1289
  if (invalidateDependents && this.allowInval) {
1278
- const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, [
1290
+ const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
1279
1291
  target,
1280
1292
  revision,
1281
- id,
1282
- count,
1283
- ]);
1293
+ localId: id,
1294
+ }, count);
1284
1295
  if (newFieldIds.length > 0) {
1285
1296
  for (const newFieldId of newFieldIds) {
1286
1297
  this.table.pendingCompositions.affectedNewFields.set([newFieldId.nodeId?.revision, newFieldId.nodeId?.localId, newFieldId.field], true);
1287
1298
  }
1288
1299
  }
1289
1300
  else {
1290
- const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, [
1301
+ const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
1291
1302
  target,
1292
1303
  revision,
1293
- id,
1294
- count,
1295
- ]);
1304
+ localId: id,
1305
+ }, count);
1296
1306
  assert(baseFieldIds.length > 0, 0x9c8 /* Cross field key not registered in base or new change */);
1297
1307
  for (const baseFieldId of baseFieldIds) {
1298
1308
  this.table.pendingCompositions.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
@@ -1486,8 +1496,8 @@ function buildModularChangesetFromField(props) {
1486
1496
  const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = idAllocatorFromMaxId(), localCrossFieldKeys = [], childId, revision, } = props;
1487
1497
  const fieldChanges = new Map([[path.field, fieldChange]]);
1488
1498
  if (path.parent === undefined) {
1489
- for (const key of localCrossFieldKeys) {
1490
- crossFieldKeys.set(key, { nodeId: undefined, field: path.field });
1499
+ for (const { key, count } of localCrossFieldKeys) {
1500
+ crossFieldKeys.set(key, count, { nodeId: undefined, field: path.field });
1491
1501
  }
1492
1502
  if (childId !== undefined) {
1493
1503
  setInChangeAtomIdMap(nodeToParent, childId, {
@@ -1508,8 +1518,8 @@ function buildModularChangesetFromField(props) {
1508
1518
  fieldChanges,
1509
1519
  };
1510
1520
  const parentId = { localId: brand(idAllocator.allocate()), revision };
1511
- for (const key of localCrossFieldKeys) {
1512
- crossFieldKeys.set(key, { nodeId: parentId, field: path.field });
1521
+ for (const { key, count } of localCrossFieldKeys) {
1522
+ crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
1513
1523
  }
1514
1524
  if (childId !== undefined) {
1515
1525
  setInChangeAtomIdMap(nodeToParent, childId, {
@@ -1582,19 +1592,6 @@ function revisionInfoFromTaggedChange(taggedChange) {
1582
1592
  }
1583
1593
  return revInfos;
1584
1594
  }
1585
- function mergeBTrees(tree1, tree2, preferLeft = true) {
1586
- if (tree1 === undefined) {
1587
- return tree2 !== undefined ? brand(tree2.clone()) : newTupleBTree();
1588
- }
1589
- const result = brand(tree1.clone());
1590
- if (tree2 === undefined) {
1591
- return result;
1592
- }
1593
- for (const [key, value] of tree2.entries()) {
1594
- result.set(key, value, !preferLeft);
1595
- }
1596
- return result;
1597
- }
1598
1595
  function fieldChangeFromId(fields, nodes, id) {
1599
1596
  const fieldMap = fieldMapFromNodeId(fields, nodes, id.nodeId);
1600
1597
  return fieldMap.get(id.field) ?? fail("No field exists for the given ID");
@@ -1645,72 +1642,13 @@ export function getParentFieldId(changeset, nodeId) {
1645
1642
  assert(parentId !== undefined, 0x9cb /* Parent field should be defined */);
1646
1643
  return normalizeFieldId(parentId, changeset.nodeAliases);
1647
1644
  }
1648
- export function getFieldsForCrossFieldKey(changeset, [target, revision, id, count]) {
1649
- let firstLocalId = id;
1650
- const lastLocalId = id + count - 1;
1651
- const fields = [];
1652
- // eslint-disable-next-line no-constant-condition
1653
- while (true) {
1654
- const entry = getFirstIntersectingCrossFieldEntry(changeset.crossFieldKeys, [
1655
- target,
1656
- revision,
1657
- brand(firstLocalId),
1658
- count,
1659
- ]);
1660
- if (entry === undefined) {
1661
- return fields;
1662
- }
1663
- const [[_target, _revision, entryId, entryCount], fieldId] = entry;
1664
- fields.push(normalizeFieldId(fieldId, changeset.nodeAliases));
1665
- const entryLastId = entryId + entryCount - 1;
1666
- if (entryLastId >= lastLocalId) {
1667
- return fields;
1668
- }
1669
- firstLocalId = entryLastId + 1;
1670
- }
1671
- }
1672
- function getFirstIntersectingCrossFieldEntry(table, [target, revision, id, count]) {
1673
- const entry = table.nextLowerPair([target, revision, id, Number.POSITIVE_INFINITY]);
1674
- if (entry === undefined) {
1675
- return undefined;
1676
- }
1677
- const [entryTarget, entryRevision, entryId, entryCount] = entry[0];
1678
- if (entryTarget !== target || entryRevision !== revision) {
1679
- return undefined;
1680
- }
1681
- const lastQueryId = id + count - 1;
1682
- const entryLastId = entryId + entryCount - 1;
1683
- if (entryId > lastQueryId || entryLastId < id) {
1684
- return undefined;
1685
- }
1686
- return entry;
1687
- }
1688
- function setInCrossFieldKeyTable(table, target, revision, id, count, value) {
1689
- let entry = getFirstIntersectingCrossFieldEntry(table, [target, revision, id, count]);
1690
- const lastQueryId = id + count - 1;
1691
- while (entry !== undefined) {
1692
- const [entryKey, entryValue] = entry;
1693
- table.delete(entryKey);
1694
- const [_target, _revision, entryId, entryCount] = entryKey;
1695
- if (entryId < id) {
1696
- table.set([target, revision, entryId, id - entryId], entryValue);
1697
- }
1698
- const lastEntryId = entryId + entryCount - 1;
1699
- if (lastEntryId > lastQueryId) {
1700
- table.set([target, revision, brand(lastQueryId + 1), lastEntryId - lastQueryId], entryValue);
1701
- break;
1702
- }
1703
- const nextId = brand(lastEntryId + 1);
1704
- entry = getFirstIntersectingCrossFieldEntry(table, [
1705
- target,
1706
- revision,
1707
- nextId,
1708
- lastQueryId - nextId + 1,
1709
- ]);
1710
- }
1711
- table.set([target, revision, id, count], value);
1645
+ function getFieldsForCrossFieldKey(changeset, key, count) {
1646
+ return changeset.crossFieldKeys
1647
+ .getAll(key, count)
1648
+ .map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
1712
1649
  }
1713
- function normalizeFieldId(fieldId, nodeAliases) {
1650
+ // This is only exported for use in test utilities.
1651
+ export function normalizeFieldId(fieldId, nodeAliases) {
1714
1652
  return fieldId.nodeId !== undefined
1715
1653
  ? { ...fieldId, nodeId: normalizeNodeId(fieldId.nodeId, nodeAliases) }
1716
1654
  : fieldId;
@@ -1732,36 +1670,6 @@ function normalizeNodeId(nodeId, nodeAliases) {
1732
1670
  function hasConflicts(change) {
1733
1671
  return (change.constraintViolationCount ?? 0) > 0;
1734
1672
  }
1735
- export function newCrossFieldKeyTable() {
1736
- return newTupleBTree();
1737
- }
1738
- export function newTupleBTree(entries) {
1739
- return brand(new BTree(entries, compareTuples));
1740
- }
1741
- // This assumes that the arrays are the same length.
1742
- function compareTuples(arrayA, arrayB) {
1743
- for (let i = 0; i < arrayA.length; i++) {
1744
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1745
- const a = arrayA[i];
1746
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1747
- const b = arrayB[i];
1748
- // Less-than and greater-than always return false if either value is undefined,
1749
- // so we handle undefined separately, treating it as less than all other values.
1750
- if (a === undefined && b !== undefined) {
1751
- return -1;
1752
- }
1753
- else if (b === undefined && a !== undefined) {
1754
- return 1;
1755
- }
1756
- else if (a < b) {
1757
- return -1;
1758
- }
1759
- else if (a > b) {
1760
- return 1;
1761
- }
1762
- }
1763
- return 0;
1764
- }
1765
1673
  function getFromChangeAtomIdMap(map, id) {
1766
1674
  return map.get([id.revision, id.localId]);
1767
1675
  }