@fluidframework/tree 2.12.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 (496) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/api-report/tree.alpha.api.md +108 -22
  3. package/api-report/tree.beta.api.md +31 -15
  4. package/api-report/tree.legacy.alpha.api.md +31 -15
  5. package/api-report/tree.legacy.public.api.md +31 -15
  6. package/api-report/tree.public.api.md +31 -15
  7. package/assertTagging.config.mjs +14 -0
  8. package/dist/alpha.d.ts +14 -0
  9. package/dist/beta.d.ts +2 -0
  10. package/dist/core/index.d.ts +2 -2
  11. package/dist/core/index.d.ts.map +1 -1
  12. package/dist/core/index.js +6 -4
  13. package/dist/core/index.js.map +1 -1
  14. package/dist/core/rebase/index.d.ts +2 -2
  15. package/dist/core/rebase/index.d.ts.map +1 -1
  16. package/dist/core/rebase/index.js +5 -1
  17. package/dist/core/rebase/index.js.map +1 -1
  18. package/dist/core/rebase/types.d.ts +5 -4
  19. package/dist/core/rebase/types.d.ts.map +1 -1
  20. package/dist/core/rebase/types.js +29 -1
  21. package/dist/core/rebase/types.js.map +1 -1
  22. package/dist/core/rebase/utils.d.ts +10 -0
  23. package/dist/core/rebase/utils.d.ts.map +1 -1
  24. package/dist/core/rebase/utils.js +22 -1
  25. package/dist/core/rebase/utils.js.map +1 -1
  26. package/dist/core/tree/delta.d.ts +21 -26
  27. package/dist/core/tree/delta.d.ts.map +1 -1
  28. package/dist/core/tree/delta.js.map +1 -1
  29. package/dist/core/tree/deltaUtil.d.ts +1 -3
  30. package/dist/core/tree/deltaUtil.d.ts.map +1 -1
  31. package/dist/core/tree/deltaUtil.js +2 -14
  32. package/dist/core/tree/deltaUtil.js.map +1 -1
  33. package/dist/core/tree/index.d.ts +1 -1
  34. package/dist/core/tree/index.d.ts.map +1 -1
  35. package/dist/core/tree/index.js +1 -3
  36. package/dist/core/tree/index.js.map +1 -1
  37. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  38. package/dist/core/tree/visitDelta.js +82 -80
  39. package/dist/core/tree/visitDelta.js.map +1 -1
  40. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +10 -0
  41. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  42. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +3 -0
  43. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  44. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  45. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  46. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  47. package/dist/feature-libraries/deltaUtils.js +13 -0
  48. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  49. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  50. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  51. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  52. package/dist/feature-libraries/index.d.ts +0 -1
  53. package/dist/feature-libraries/index.d.ts.map +1 -1
  54. package/dist/feature-libraries/index.js +2 -4
  55. package/dist/feature-libraries/index.js.map +1 -1
  56. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  57. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  58. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +2 -3
  59. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  60. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +30 -6
  61. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  62. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  63. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  64. package/dist/feature-libraries/modular-schema/genericFieldKind.js +2 -1
  65. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  66. package/dist/feature-libraries/modular-schema/index.d.ts +2 -2
  67. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  68. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  69. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  70. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  71. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -8
  72. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  73. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +5 -4
  74. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  75. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +186 -216
  76. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  77. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +23 -20
  78. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  79. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +20 -0
  80. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  81. package/dist/feature-libraries/optional-field/optionalField.d.ts +3 -3
  82. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  83. package/dist/feature-libraries/optional-field/optionalField.js +24 -4
  84. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  85. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  86. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  87. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  88. package/dist/feature-libraries/sequence-field/rebase.js +4 -4
  89. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  90. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  91. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  92. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  93. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  94. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  95. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  96. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  97. package/dist/feature-libraries/sequence-field/utils.d.ts +2 -2
  98. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  99. package/dist/feature-libraries/sequence-field/utils.js +50 -9
  100. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  101. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  102. package/dist/feature-libraries/treeCursorUtils.js +4 -1
  103. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  104. package/dist/index.d.ts +27 -3
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +5 -2
  107. package/dist/index.js.map +1 -1
  108. package/dist/legacy.d.ts +2 -0
  109. package/dist/package.json +2 -1
  110. package/dist/packageVersion.d.ts +1 -1
  111. package/dist/packageVersion.js +1 -1
  112. package/dist/packageVersion.js.map +1 -1
  113. package/dist/public.d.ts +2 -0
  114. package/dist/shared-tree/index.d.ts +3 -2
  115. package/dist/shared-tree/index.d.ts.map +1 -1
  116. package/dist/shared-tree/index.js +6 -3
  117. package/dist/shared-tree/index.js.map +1 -1
  118. package/dist/shared-tree/schematizingTreeView.d.ts +10 -1
  119. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  120. package/dist/shared-tree/schematizingTreeView.js +43 -0
  121. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  122. package/dist/shared-tree/sharedTree.d.ts +44 -21
  123. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  124. package/dist/shared-tree/sharedTree.js +41 -35
  125. package/dist/shared-tree/sharedTree.js.map +1 -1
  126. package/dist/shared-tree/transactionTypes.d.ts +105 -0
  127. package/dist/shared-tree/transactionTypes.d.ts.map +1 -0
  128. package/dist/shared-tree/transactionTypes.js +13 -0
  129. package/dist/shared-tree/transactionTypes.js.map +1 -0
  130. package/dist/shared-tree/treeApi.d.ts +1 -25
  131. package/dist/shared-tree/treeApi.d.ts.map +1 -1
  132. package/dist/shared-tree/treeApi.js +4 -8
  133. package/dist/shared-tree/treeApi.js.map +1 -1
  134. package/dist/shared-tree/treeCheckout.d.ts +4 -1
  135. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  136. package/dist/shared-tree/treeCheckout.js +142 -23
  137. package/dist/shared-tree/treeCheckout.js.map +1 -1
  138. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  139. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  140. package/dist/simple-tree/api/index.d.ts +1 -0
  141. package/dist/simple-tree/api/index.d.ts.map +1 -1
  142. package/dist/simple-tree/api/index.js +3 -1
  143. package/dist/simple-tree/api/index.js.map +1 -1
  144. package/dist/simple-tree/api/jsonSchema.d.ts +6 -0
  145. package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
  146. package/dist/simple-tree/api/jsonSchema.js.map +1 -1
  147. package/dist/simple-tree/api/schemaFactory.d.ts +21 -12
  148. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  149. package/dist/simple-tree/api/schemaFactory.js +5 -2
  150. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  151. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +83 -0
  152. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -0
  153. package/dist/simple-tree/api/schemaFactoryAlpha.js +90 -0
  154. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -0
  155. package/dist/simple-tree/api/simpleSchema.d.ts +5 -1
  156. package/dist/simple-tree/api/simpleSchema.d.ts.map +1 -1
  157. package/dist/simple-tree/api/simpleSchema.js.map +1 -1
  158. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +13 -10
  159. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  160. package/dist/simple-tree/api/testRecursiveDomain.d.ts +5 -5
  161. package/dist/simple-tree/api/tree.d.ts +60 -0
  162. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  163. package/dist/simple-tree/api/tree.js.map +1 -1
  164. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  165. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  166. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  167. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +11 -11
  168. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  169. package/dist/simple-tree/arrayNode.d.ts +2 -2
  170. package/dist/simple-tree/arrayNode.d.ts.map +1 -1
  171. package/dist/simple-tree/arrayNode.js +3 -2
  172. package/dist/simple-tree/arrayNode.js.map +1 -1
  173. package/dist/simple-tree/core/treeNodeSchema.d.ts +10 -6
  174. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  175. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  176. package/dist/simple-tree/index.d.ts +2 -2
  177. package/dist/simple-tree/index.d.ts.map +1 -1
  178. package/dist/simple-tree/index.js +3 -2
  179. package/dist/simple-tree/index.js.map +1 -1
  180. package/dist/simple-tree/leafNodeSchema.d.ts +5 -5
  181. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  182. package/dist/simple-tree/mapNode.d.ts +2 -2
  183. package/dist/simple-tree/mapNode.d.ts.map +1 -1
  184. package/dist/simple-tree/mapNode.js +2 -1
  185. package/dist/simple-tree/mapNode.js.map +1 -1
  186. package/dist/simple-tree/objectNode.d.ts +2 -2
  187. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  188. package/dist/simple-tree/objectNode.js +2 -1
  189. package/dist/simple-tree/objectNode.js.map +1 -1
  190. package/dist/simple-tree/objectNodeTypes.d.ts +2 -2
  191. package/dist/simple-tree/objectNodeTypes.d.ts.map +1 -1
  192. package/dist/simple-tree/objectNodeTypes.js.map +1 -1
  193. package/dist/simple-tree/schemaTypes.d.ts +47 -1
  194. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  195. package/dist/simple-tree/schemaTypes.js.map +1 -1
  196. package/dist/simple-tree/toMapTree.js +1 -1
  197. package/dist/simple-tree/toMapTree.js.map +1 -1
  198. package/dist/util/bTreeUtils.d.ts +10 -0
  199. package/dist/util/bTreeUtils.d.ts.map +1 -0
  200. package/dist/util/bTreeUtils.js +52 -0
  201. package/dist/util/bTreeUtils.js.map +1 -0
  202. package/dist/util/idAllocator.d.ts +0 -2
  203. package/dist/util/idAllocator.d.ts.map +1 -1
  204. package/dist/util/idAllocator.js +0 -2
  205. package/dist/util/idAllocator.js.map +1 -1
  206. package/dist/util/index.d.ts +3 -2
  207. package/dist/util/index.d.ts.map +1 -1
  208. package/dist/util/index.js +7 -5
  209. package/dist/util/index.js.map +1 -1
  210. package/dist/util/rangeMap.d.ts +95 -43
  211. package/dist/util/rangeMap.d.ts.map +1 -1
  212. package/dist/util/rangeMap.js +202 -148
  213. package/dist/util/rangeMap.js.map +1 -1
  214. package/dist/util/utils.d.ts +26 -2
  215. package/dist/util/utils.d.ts.map +1 -1
  216. package/dist/util/utils.js +17 -2
  217. package/dist/util/utils.js.map +1 -1
  218. package/lib/alpha.d.ts +14 -0
  219. package/lib/beta.d.ts +2 -0
  220. package/lib/core/index.d.ts +2 -2
  221. package/lib/core/index.d.ts.map +1 -1
  222. package/lib/core/index.js +2 -2
  223. package/lib/core/index.js.map +1 -1
  224. package/lib/core/rebase/index.d.ts +2 -2
  225. package/lib/core/rebase/index.d.ts.map +1 -1
  226. package/lib/core/rebase/index.js +2 -2
  227. package/lib/core/rebase/index.js.map +1 -1
  228. package/lib/core/rebase/types.d.ts +5 -4
  229. package/lib/core/rebase/types.d.ts.map +1 -1
  230. package/lib/core/rebase/types.js +26 -1
  231. package/lib/core/rebase/types.js.map +1 -1
  232. package/lib/core/rebase/utils.d.ts +10 -0
  233. package/lib/core/rebase/utils.d.ts.map +1 -1
  234. package/lib/core/rebase/utils.js +20 -0
  235. package/lib/core/rebase/utils.js.map +1 -1
  236. package/lib/core/tree/delta.d.ts +21 -26
  237. package/lib/core/tree/delta.d.ts.map +1 -1
  238. package/lib/core/tree/delta.js.map +1 -1
  239. package/lib/core/tree/deltaUtil.d.ts +1 -3
  240. package/lib/core/tree/deltaUtil.d.ts.map +1 -1
  241. package/lib/core/tree/deltaUtil.js +1 -12
  242. package/lib/core/tree/deltaUtil.js.map +1 -1
  243. package/lib/core/tree/index.d.ts +1 -1
  244. package/lib/core/tree/index.d.ts.map +1 -1
  245. package/lib/core/tree/index.js +1 -1
  246. package/lib/core/tree/index.js.map +1 -1
  247. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  248. package/lib/core/tree/visitDelta.js +82 -80
  249. package/lib/core/tree/visitDelta.js.map +1 -1
  250. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +10 -0
  251. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  252. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +3 -0
  253. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  254. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  255. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  256. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  257. package/lib/feature-libraries/deltaUtils.js +13 -0
  258. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  259. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  260. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  261. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  262. package/lib/feature-libraries/index.d.ts +0 -1
  263. package/lib/feature-libraries/index.d.ts.map +1 -1
  264. package/lib/feature-libraries/index.js +0 -1
  265. package/lib/feature-libraries/index.js.map +1 -1
  266. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  267. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  268. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +2 -3
  269. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  270. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +30 -6
  271. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  272. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  273. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  274. package/lib/feature-libraries/modular-schema/genericFieldKind.js +2 -1
  275. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  276. package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
  277. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  278. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  279. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  280. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  281. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  282. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  283. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +5 -4
  284. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  285. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +158 -186
  286. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  287. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +23 -20
  288. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  289. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +18 -1
  290. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  291. package/lib/feature-libraries/optional-field/optionalField.d.ts +3 -3
  292. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  293. package/lib/feature-libraries/optional-field/optionalField.js +24 -4
  294. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  295. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  296. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  297. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  298. package/lib/feature-libraries/sequence-field/rebase.js +4 -4
  299. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  300. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  301. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  302. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  303. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  304. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  305. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  306. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  307. package/lib/feature-libraries/sequence-field/utils.d.ts +2 -2
  308. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  309. package/lib/feature-libraries/sequence-field/utils.js +50 -9
  310. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  311. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  312. package/lib/feature-libraries/treeCursorUtils.js +4 -1
  313. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  314. package/lib/index.d.ts +27 -3
  315. package/lib/index.d.ts.map +1 -1
  316. package/lib/index.js +2 -2
  317. package/lib/index.js.map +1 -1
  318. package/lib/legacy.d.ts +2 -0
  319. package/lib/packageVersion.d.ts +1 -1
  320. package/lib/packageVersion.js +1 -1
  321. package/lib/packageVersion.js.map +1 -1
  322. package/lib/public.d.ts +2 -0
  323. package/lib/shared-tree/index.d.ts +3 -2
  324. package/lib/shared-tree/index.d.ts.map +1 -1
  325. package/lib/shared-tree/index.js +3 -2
  326. package/lib/shared-tree/index.js.map +1 -1
  327. package/lib/shared-tree/schematizingTreeView.d.ts +10 -1
  328. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  329. package/lib/shared-tree/schematizingTreeView.js +46 -3
  330. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  331. package/lib/shared-tree/sharedTree.d.ts +44 -21
  332. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  333. package/lib/shared-tree/sharedTree.js +40 -34
  334. package/lib/shared-tree/sharedTree.js.map +1 -1
  335. package/lib/shared-tree/transactionTypes.d.ts +105 -0
  336. package/lib/shared-tree/transactionTypes.d.ts.map +1 -0
  337. package/lib/shared-tree/transactionTypes.js +10 -0
  338. package/lib/shared-tree/transactionTypes.js.map +1 -0
  339. package/lib/shared-tree/treeApi.d.ts +1 -25
  340. package/lib/shared-tree/treeApi.d.ts.map +1 -1
  341. package/lib/shared-tree/treeApi.js +1 -5
  342. package/lib/shared-tree/treeApi.js.map +1 -1
  343. package/lib/shared-tree/treeCheckout.d.ts +4 -1
  344. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  345. package/lib/shared-tree/treeCheckout.js +143 -24
  346. package/lib/shared-tree/treeCheckout.js.map +1 -1
  347. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  348. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  349. package/lib/simple-tree/api/index.d.ts +1 -0
  350. package/lib/simple-tree/api/index.d.ts.map +1 -1
  351. package/lib/simple-tree/api/index.js +1 -0
  352. package/lib/simple-tree/api/index.js.map +1 -1
  353. package/lib/simple-tree/api/jsonSchema.d.ts +6 -0
  354. package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
  355. package/lib/simple-tree/api/jsonSchema.js.map +1 -1
  356. package/lib/simple-tree/api/schemaFactory.d.ts +21 -12
  357. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  358. package/lib/simple-tree/api/schemaFactory.js +5 -2
  359. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  360. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +83 -0
  361. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -0
  362. package/lib/simple-tree/api/schemaFactoryAlpha.js +86 -0
  363. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -0
  364. package/lib/simple-tree/api/simpleSchema.d.ts +5 -1
  365. package/lib/simple-tree/api/simpleSchema.d.ts.map +1 -1
  366. package/lib/simple-tree/api/simpleSchema.js.map +1 -1
  367. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +14 -11
  368. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  369. package/lib/simple-tree/api/testRecursiveDomain.d.ts +5 -5
  370. package/lib/simple-tree/api/tree.d.ts +60 -0
  371. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  372. package/lib/simple-tree/api/tree.js.map +1 -1
  373. package/lib/simple-tree/api/treeNodeApi.js +1 -1
  374. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  375. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  376. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +12 -12
  377. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  378. package/lib/simple-tree/arrayNode.d.ts +2 -2
  379. package/lib/simple-tree/arrayNode.d.ts.map +1 -1
  380. package/lib/simple-tree/arrayNode.js +3 -2
  381. package/lib/simple-tree/arrayNode.js.map +1 -1
  382. package/lib/simple-tree/core/treeNodeSchema.d.ts +10 -6
  383. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  384. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  385. package/lib/simple-tree/index.d.ts +2 -2
  386. package/lib/simple-tree/index.d.ts.map +1 -1
  387. package/lib/simple-tree/index.js +1 -1
  388. package/lib/simple-tree/index.js.map +1 -1
  389. package/lib/simple-tree/leafNodeSchema.d.ts +5 -5
  390. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  391. package/lib/simple-tree/mapNode.d.ts +2 -2
  392. package/lib/simple-tree/mapNode.d.ts.map +1 -1
  393. package/lib/simple-tree/mapNode.js +2 -1
  394. package/lib/simple-tree/mapNode.js.map +1 -1
  395. package/lib/simple-tree/objectNode.d.ts +2 -2
  396. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  397. package/lib/simple-tree/objectNode.js +2 -1
  398. package/lib/simple-tree/objectNode.js.map +1 -1
  399. package/lib/simple-tree/objectNodeTypes.d.ts +2 -2
  400. package/lib/simple-tree/objectNodeTypes.d.ts.map +1 -1
  401. package/lib/simple-tree/objectNodeTypes.js.map +1 -1
  402. package/lib/simple-tree/schemaTypes.d.ts +47 -1
  403. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  404. package/lib/simple-tree/schemaTypes.js.map +1 -1
  405. package/lib/simple-tree/toMapTree.js +1 -1
  406. package/lib/simple-tree/toMapTree.js.map +1 -1
  407. package/lib/util/bTreeUtils.d.ts +10 -0
  408. package/lib/util/bTreeUtils.d.ts.map +1 -0
  409. package/lib/util/bTreeUtils.js +47 -0
  410. package/lib/util/bTreeUtils.js.map +1 -0
  411. package/lib/util/idAllocator.d.ts +0 -2
  412. package/lib/util/idAllocator.d.ts.map +1 -1
  413. package/lib/util/idAllocator.js +0 -2
  414. package/lib/util/idAllocator.js.map +1 -1
  415. package/lib/util/index.d.ts +3 -2
  416. package/lib/util/index.d.ts.map +1 -1
  417. package/lib/util/index.js +3 -2
  418. package/lib/util/index.js.map +1 -1
  419. package/lib/util/rangeMap.d.ts +95 -43
  420. package/lib/util/rangeMap.d.ts.map +1 -1
  421. package/lib/util/rangeMap.js +200 -144
  422. package/lib/util/rangeMap.js.map +1 -1
  423. package/lib/util/utils.d.ts +26 -2
  424. package/lib/util/utils.d.ts.map +1 -1
  425. package/lib/util/utils.js +15 -1
  426. package/lib/util/utils.js.map +1 -1
  427. package/package.json +24 -24
  428. package/src/core/index.ts +5 -2
  429. package/src/core/rebase/index.ts +5 -0
  430. package/src/core/rebase/types.ts +33 -5
  431. package/src/core/rebase/utils.ts +27 -0
  432. package/src/core/tree/delta.ts +21 -26
  433. package/src/core/tree/deltaUtil.ts +1 -16
  434. package/src/core/tree/index.ts +0 -2
  435. package/src/core/tree/visitDelta.ts +108 -97
  436. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +14 -1
  437. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +2 -2
  438. package/src/feature-libraries/deltaUtils.ts +13 -0
  439. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -6
  440. package/src/feature-libraries/index.ts +0 -1
  441. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +12 -13
  442. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +33 -9
  443. package/src/feature-libraries/modular-schema/genericFieldKind.ts +6 -4
  444. package/src/feature-libraries/modular-schema/index.ts +3 -0
  445. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +12 -11
  446. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +254 -248
  447. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +51 -26
  448. package/src/feature-libraries/optional-field/optionalField.ts +37 -8
  449. package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
  450. package/src/feature-libraries/sequence-field/rebase.ts +9 -3
  451. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
  452. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
  453. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +3 -4
  454. package/src/feature-libraries/sequence-field/utils.ts +54 -11
  455. package/src/feature-libraries/treeCursorUtils.ts +6 -1
  456. package/src/index.ts +45 -6
  457. package/src/packageVersion.ts +1 -1
  458. package/src/shared-tree/index.ts +16 -3
  459. package/src/shared-tree/schematizingTreeView.ts +91 -2
  460. package/src/shared-tree/sharedTree.ts +69 -44
  461. package/src/shared-tree/transactionTypes.ts +125 -0
  462. package/src/shared-tree/treeApi.ts +1 -28
  463. package/src/shared-tree/treeCheckout.ts +166 -25
  464. package/src/shared-tree-core/sharedTreeCore.ts +1 -1
  465. package/src/simple-tree/api/index.ts +1 -0
  466. package/src/simple-tree/api/jsonSchema.ts +7 -0
  467. package/src/simple-tree/api/schemaFactory.ts +33 -6
  468. package/src/simple-tree/api/schemaFactoryAlpha.ts +253 -0
  469. package/src/simple-tree/api/simpleSchema.ts +6 -1
  470. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +22 -12
  471. package/src/simple-tree/api/tree.ts +76 -4
  472. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  473. package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +19 -13
  474. package/src/simple-tree/arrayNode.ts +8 -2
  475. package/src/simple-tree/core/treeNodeSchema.ts +51 -7
  476. package/src/simple-tree/index.ts +3 -0
  477. package/src/simple-tree/mapNode.ts +7 -1
  478. package/src/simple-tree/objectNode.ts +7 -1
  479. package/src/simple-tree/objectNodeTypes.ts +4 -1
  480. package/src/simple-tree/schemaTypes.ts +50 -1
  481. package/src/simple-tree/toMapTree.ts +1 -1
  482. package/src/util/bTreeUtils.ts +60 -0
  483. package/src/util/idAllocator.ts +0 -2
  484. package/src/util/index.ts +5 -6
  485. package/src/util/rangeMap.ts +259 -184
  486. package/src/util/utils.ts +57 -4
  487. package/dist/feature-libraries/memoizedIdRangeAllocator.d.ts +0 -38
  488. package/dist/feature-libraries/memoizedIdRangeAllocator.d.ts.map +0 -1
  489. package/dist/feature-libraries/memoizedIdRangeAllocator.js +0 -74
  490. package/dist/feature-libraries/memoizedIdRangeAllocator.js.map +0 -1
  491. package/lib/feature-libraries/memoizedIdRangeAllocator.d.ts +0 -38
  492. package/lib/feature-libraries/memoizedIdRangeAllocator.d.ts.map +0 -1
  493. package/lib/feature-libraries/memoizedIdRangeAllocator.js +0 -71
  494. package/lib/feature-libraries/memoizedIdRangeAllocator.js.map +0 -1
  495. package/lib/package.json +0 -3
  496. package/src/feature-libraries/memoizedIdRangeAllocator.ts +0 -112
@@ -3,16 +3,16 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { BTree } from "@tylerbu/sorted-btree-es6";
7
- import type {
8
- ChangeAtomId,
9
- ChangesetLocalId,
10
- FieldKey,
11
- FieldKindIdentifier,
12
- RevisionInfo,
13
- RevisionTag,
6
+ import {
7
+ subtractChangeAtomIds,
8
+ type ChangeAtomId,
9
+ type ChangesetLocalId,
10
+ type FieldKey,
11
+ type FieldKindIdentifier,
12
+ type RevisionInfo,
13
+ type RevisionTag,
14
14
  } from "../../core/index.js";
15
- import type { Brand } from "../../util/index.js";
15
+ import { brand, RangeMap, type Brand, type TupleBTree } from "../../util/index.js";
16
16
  import type { TreeChunk } from "../chunked-forest/index.js";
17
17
  import type { CrossFieldTarget } from "./crossFieldQueries.js";
18
18
 
@@ -56,31 +56,53 @@ export interface ModularChangeset extends HasFieldChanges {
56
56
  */
57
57
  readonly nodeAliases: ChangeAtomIdBTree<NodeId>;
58
58
  readonly crossFieldKeys: CrossFieldKeyTable;
59
+ /**
60
+ * The number of constraint violations that apply to the input context of the changeset, i.e., before this change is applied.
61
+ * If this count is greater than 0, it will prevent the changeset from being applied.
62
+ */
59
63
  readonly constraintViolationCount?: number;
64
+ /**
65
+ * The number of constraint violations that apply to the revert of the changeset. If this count is greater than 0, it will
66
+ * prevent the changeset from being reverted or undone.
67
+ */
68
+ readonly constraintViolationCountOnRevert?: number;
60
69
  readonly builds?: ChangeAtomIdBTree<TreeChunk>;
61
70
  readonly destroys?: ChangeAtomIdBTree<number>;
62
71
  readonly refreshers?: ChangeAtomIdBTree<TreeChunk>;
63
72
  }
64
73
 
65
- export type TupleBTree<K, V> = Brand<BTree<K, V>, "TupleBTree">;
66
74
  export type ChangeAtomIdBTree<V> = TupleBTree<[RevisionTag | undefined, ChangesetLocalId], V>;
67
- export type CrossFieldKeyTable = TupleBTree<CrossFieldKeyRange, FieldId>;
68
- export type CrossFieldKeyRange = readonly [
69
- CrossFieldTarget,
70
- RevisionTag | undefined,
71
- ChangesetLocalId,
72
- /**
73
- * The length of this range.
74
- * TODO: This does not need to be part of the key and could be part of the value instead.
75
- */
76
- number,
77
- ];
78
75
 
79
- export type CrossFieldKey = readonly [
80
- CrossFieldTarget,
81
- RevisionTag | undefined,
82
- ChangesetLocalId,
83
- ];
76
+ export type CrossFieldKeyTable = RangeMap<CrossFieldKey, FieldId>;
77
+
78
+ export function newCrossFieldKeyTable(): CrossFieldKeyTable {
79
+ return new RangeMap(offsetCrossFieldKey, subtractCrossFieldKeys);
80
+ }
81
+
82
+ function offsetCrossFieldKey(key: CrossFieldKey, offset: number): CrossFieldKey {
83
+ return {
84
+ ...key,
85
+ localId: brand(key.localId + offset),
86
+ };
87
+ }
88
+
89
+ function subtractCrossFieldKeys(a: CrossFieldKey, b: CrossFieldKey): number {
90
+ const cmpTarget = a.target - b.target;
91
+ if (cmpTarget !== 0) {
92
+ return cmpTarget * Number.POSITIVE_INFINITY;
93
+ }
94
+
95
+ return subtractChangeAtomIds(a, b);
96
+ }
97
+
98
+ export interface CrossFieldKey extends ChangeAtomId {
99
+ readonly target: CrossFieldTarget;
100
+ }
101
+
102
+ export interface CrossFieldKeyRange {
103
+ key: CrossFieldKey;
104
+ count: number;
105
+ }
84
106
 
85
107
  export interface FieldId {
86
108
  readonly nodeId: NodeId | undefined;
@@ -97,7 +119,10 @@ export interface NodeExistsConstraint {
97
119
  * Changeset for a subtree rooted at a specific node.
98
120
  */
99
121
  export interface NodeChangeset extends HasFieldChanges {
122
+ /** Keeps track of whether node exists constraint has been violated by this change */
100
123
  nodeExistsConstraint?: NodeExistsConstraint;
124
+ /** Keeps track of whether node exists constraint will be violated when this change is reverted */
125
+ nodeExistsConstraintOnRevert?: NodeExistsConstraint;
101
126
  }
102
127
 
103
128
  export type NodeId = ChangeAtomId;
@@ -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,
@@ -39,6 +38,8 @@ import {
39
38
  type NodeId,
40
39
  type RelevantRemovedRootsFromChild,
41
40
  type ToDelta,
41
+ type NestedChangesIndices,
42
+ type FieldChangeDelta,
42
43
  } from "../modular-schema/index.js";
43
44
 
44
45
  import type {
@@ -536,6 +537,16 @@ function areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {
536
537
  return id1 === "self" || id2 === "self" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);
537
538
  }
538
539
 
540
+ function areEqualRegisterIdsOpt(
541
+ id1: RegisterId | undefined,
542
+ id2: RegisterId | undefined,
543
+ ): boolean {
544
+ if (id1 === undefined || id2 === undefined) {
545
+ return id1 === id2;
546
+ }
547
+ return areEqualRegisterIds(id1, id2);
548
+ }
549
+
539
550
  function getBidirectionalMaps(moves: OptionalChangeset["moves"]): {
540
551
  srcToDst: ChangeAtomIdMap<ChangeAtomId>;
541
552
  dstToSrc: ChangeAtomIdMap<ChangeAtomId>;
@@ -646,8 +657,8 @@ export const optionalFieldEditor: OptionalFieldEditor = {
646
657
  export function optionalFieldIntoDelta(
647
658
  change: OptionalChangeset,
648
659
  deltaFromChild: ToDelta,
649
- ): DeltaFieldChanges {
650
- const delta: Mutable<DeltaFieldChanges> = {};
660
+ ): FieldChangeDelta {
661
+ const delta: Mutable<FieldChangeDelta> = {};
651
662
 
652
663
  let markIsANoop = true;
653
664
  const mark: Mutable<DeltaMark> = { count: 1 };
@@ -720,11 +731,29 @@ export const optionalChangeHandler: FieldChangeHandler<
720
731
  getCrossFieldKeys: (_change) => [],
721
732
  };
722
733
 
723
- function getNestedChanges(change: OptionalChangeset): [NodeId, number | undefined][] {
724
- return change.childChanges.map(([register, nodeId]) => [
725
- nodeId,
726
- register === "self" ? 0 : undefined,
727
- ]);
734
+ function getNestedChanges(change: OptionalChangeset): NestedChangesIndices {
735
+ // True iff the content of the field changes in some way
736
+ const isFieldContentChanged =
737
+ change.valueReplace !== undefined && change.valueReplace.src !== "self";
738
+
739
+ // The node that is moved into the field (if any).
740
+ const nodeMovedIntoField = change.valueReplace?.src;
741
+
742
+ return change.childChanges.map(([register, nodeId]) => {
743
+ // The node is removed in the input context iif register is not self.
744
+ const inputIndex = register === "self" ? 0 : undefined;
745
+ const outputIndex =
746
+ register === "self"
747
+ ? // If the node starts out as not-removed, it is removed in the output context iff the field content is changed
748
+ isFieldContentChanged
749
+ ? undefined
750
+ : 0
751
+ : // If the node starts out as removed, then it remains removed in the output context iff it is not the node that is moved into the field
752
+ !areEqualRegisterIdsOpt(register, nodeMovedIntoField)
753
+ ? undefined
754
+ : 0;
755
+ return [nodeId, inputIndex, outputIndex];
756
+ });
728
757
  }
729
758
 
730
759
  function* relevantRemovedRoots(
@@ -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
  }
@@ -19,6 +19,7 @@ import {
19
19
  CrossFieldTarget,
20
20
  type NodeId,
21
21
  type CrossFieldKeyRange,
22
+ type NestedChangesIndices,
22
23
  } from "../modular-schema/index.js";
23
24
 
24
25
  import type {
@@ -61,15 +62,25 @@ export function createEmpty(): Changeset {
61
62
  return [];
62
63
  }
63
64
 
64
- export function getNestedChanges(change: Changeset): [NodeId, number | undefined][] {
65
- const output: [NodeId, number | undefined][] = [];
66
- let index = 0;
67
- for (const { changes, cellId, count } of change) {
65
+ export function getNestedChanges(change: Changeset): NestedChangesIndices {
66
+ const output: NestedChangesIndices = [];
67
+ let inputIndex = 0;
68
+ let outputIndex = 0;
69
+ for (const mark of change) {
70
+ const { changes, count } = mark;
68
71
  if (changes !== undefined) {
69
- output.push([changes, cellId === undefined ? index : undefined]);
72
+ output.push([
73
+ changes,
74
+ !areInputCellsEmpty(mark) ? inputIndex : undefined /* inputIndex */,
75
+ !areOutputCellsEmpty(mark) ? outputIndex : undefined /* outputIndex */,
76
+ ]);
77
+ }
78
+ if (!areInputCellsEmpty(mark)) {
79
+ inputIndex += count;
70
80
  }
71
- if (cellId === undefined) {
72
- index += count;
81
+
82
+ if (!areOutputCellsEmpty(mark)) {
83
+ outputIndex += count;
73
84
  }
74
85
  }
75
86
  return output;
@@ -931,13 +942,45 @@ function getCrossFieldKeysForMarkEffect(
931
942
  // An insert behaves like a move where the source and destination are at the same location.
932
943
  // An insert can become a move when after rebasing.
933
944
  return [
934
- [CrossFieldTarget.Source, effect.revision, effect.id, count],
935
- [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
+ },
936
961
  ];
937
962
  case "MoveOut":
938
- 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
+ ];
939
973
  case "MoveIn":
940
- 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
+ ];
941
984
  case "AttachAndDetach":
942
985
  return [
943
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,
@@ -48,6 +73,16 @@ export {
48
73
  type ViewContent,
49
74
  TreeAlpha,
50
75
  independentView,
76
+ type RunTransactionParams,
77
+ type VoidTransactionCallbackStatus,
78
+ type TransactionCallbackStatus,
79
+ type TransactionResult,
80
+ type TransactionResultExt,
81
+ type TransactionResultSuccess,
82
+ type TransactionResultFailed,
83
+ ForestTypeOptimized,
84
+ ForestTypeExpensiveDebug,
85
+ ForestTypeReference,
51
86
  } from "./shared-tree/index.js";
52
87
 
53
88
  export {
@@ -64,6 +99,8 @@ export {
64
99
  type TreeView,
65
100
  type TreeViewEvents,
66
101
  SchemaFactory,
102
+ SchemaFactoryAlpha,
103
+ type SchemaFactoryObjectOptions,
67
104
  type ImplicitFieldSchema,
68
105
  type TreeFieldFromImplicitField,
69
106
  type TreeChangeEvents,
@@ -175,6 +212,8 @@ export {
175
212
  type TreeBranch,
176
213
  type TreeBranchEvents,
177
214
  asTreeViewAlpha,
215
+ type NodeSchemaOptions,
216
+ type NodeSchemaMetadata,
178
217
  } from "./simple-tree/index.js";
179
218
  export {
180
219
  SharedTree,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.12.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 {
@@ -40,11 +43,21 @@ export type { ISharedTreeEditor, ISchemaEditor } from "./sharedTreeEditBuilder.j
40
43
  export {
41
44
  treeApi as Tree,
42
45
  type TreeApi,
46
+ type RunTransaction,
47
+ } from "./treeApi.js";
48
+
49
+ export {
43
50
  type TransactionConstraint,
44
51
  type NodeInDocumentConstraint,
45
- type RunTransaction,
52
+ type RunTransactionParams,
53
+ type VoidTransactionCallbackStatus,
54
+ type TransactionCallbackStatus,
55
+ type TransactionResult,
56
+ type TransactionResultExt,
57
+ type TransactionResultSuccess,
58
+ type TransactionResultFailed,
46
59
  rollback,
47
- } from "./treeApi.js";
60
+ } from "./transactionTypes.js";
48
61
 
49
62
  export { TreeAlpha } from "./treeApiAlpha.js";
50
63
 
@@ -9,7 +9,7 @@ import type {
9
9
  Listenable,
10
10
  } from "@fluidframework/core-interfaces/internal";
11
11
  import { createEmitter } from "@fluid-internal/client-utils";
12
- import { assert } from "@fluidframework/core-utils/internal";
12
+ import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
13
13
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
14
14
 
15
15
  import { AllowedUpdateType, anchorSlot, type SchemaPolicy } from "../core/index.js";
@@ -19,6 +19,7 @@ import {
19
19
  ContextSlot,
20
20
  cursorForMapTreeNode,
21
21
  type FullSchemaPolicy,
22
+ TreeStatus,
22
23
  } from "../feature-libraries/index.js";
23
24
  import {
24
25
  type FieldSchema,
@@ -43,6 +44,8 @@ import {
43
44
  type UnsafeUnknownSchema,
44
45
  type TreeBranch,
45
46
  type TreeBranchEvents,
47
+ getOrCreateInnerNode,
48
+ getKernel,
46
49
  } from "../simple-tree/index.js";
47
50
  import { Breakable, breakingClass, disposeSymbol, type WithBreakable } from "../util/index.js";
48
51
 
@@ -55,6 +58,14 @@ import {
55
58
  areImplicitFieldSchemaEqual,
56
59
  createUnknownOptionalFieldPolicy,
57
60
  } from "../simple-tree/index.js";
61
+ import type {
62
+ VoidTransactionCallbackStatus,
63
+ TransactionCallbackStatus,
64
+ TransactionResult,
65
+ TransactionResultExt,
66
+ RunTransactionParams,
67
+ TransactionConstraint,
68
+ } from "./transactionTypes.js";
58
69
 
59
70
  /**
60
71
  * Creating multiple tree views from the same checkout is not supported. This slot is used to detect if one already
@@ -213,6 +224,84 @@ export class SchematizingSimpleTreeView<
213
224
  return this.view;
214
225
  }
215
226
 
227
+ /**
228
+ * {@inheritDoc @fluidframework/shared-tree#TreeViewAlpha.runTransaction}
229
+ */
230
+ public runTransaction<TSuccessValue, TFailureValue>(
231
+ transaction: () => TransactionCallbackStatus<TSuccessValue, TFailureValue>,
232
+ params?: RunTransactionParams,
233
+ ): TransactionResultExt<TSuccessValue, TFailureValue>;
234
+ /**
235
+ * {@inheritDoc @fluidframework/shared-tree#TreeViewAlpha.runTransaction}
236
+ */
237
+ public runTransaction(
238
+ transaction: () => VoidTransactionCallbackStatus | void,
239
+ params?: RunTransactionParams,
240
+ ): TransactionResult;
241
+ public runTransaction<TSuccessValue, TFailureValue>(
242
+ transaction: () =>
243
+ | TransactionCallbackStatus<TSuccessValue, TFailureValue>
244
+ | VoidTransactionCallbackStatus
245
+ | void,
246
+ params?: RunTransactionParams,
247
+ ): TransactionResultExt<TSuccessValue, TFailureValue> | TransactionResult {
248
+ const addConstraints = (
249
+ constraintsOnRevert: boolean,
250
+ constraints: readonly TransactionConstraint[] = [],
251
+ ): void => {
252
+ for (const constraint of constraints) {
253
+ switch (constraint.type) {
254
+ case "nodeInDocument": {
255
+ const node = getOrCreateInnerNode(constraint.node);
256
+ const nodeStatus = getKernel(constraint.node).getStatus();
257
+ if (nodeStatus !== TreeStatus.InDocument) {
258
+ const revertText = constraintsOnRevert ? " on revert" : "";
259
+ throw new UsageError(
260
+ `Attempted to add a "nodeInDocument" constraint${revertText}, but the node is not currently in the document. Node status: ${nodeStatus}`,
261
+ );
262
+ }
263
+ if (constraintsOnRevert) {
264
+ this.checkout.editor.addNodeExistsConstraintOnRevert(node.anchorNode);
265
+ } else {
266
+ this.checkout.editor.addNodeExistsConstraint(node.anchorNode);
267
+ }
268
+ break;
269
+ }
270
+ default:
271
+ unreachableCase(constraint.type);
272
+ }
273
+ }
274
+ };
275
+
276
+ this.checkout.transaction.start();
277
+
278
+ // Validate preconditions before running the transaction callback.
279
+ addConstraints(false /* constraintsOnRevert */, params?.preconditions);
280
+ const transactionCallbackStatus = transaction();
281
+ const rollback = transactionCallbackStatus?.rollback;
282
+ const value = (
283
+ transactionCallbackStatus as TransactionCallbackStatus<TSuccessValue, TFailureValue>
284
+ )?.value;
285
+
286
+ if (rollback === true) {
287
+ this.checkout.transaction.abort();
288
+ return value !== undefined
289
+ ? { success: false, value: value as TFailureValue }
290
+ : { success: false };
291
+ }
292
+
293
+ // Validate preconditions on revert after running the transaction callback and was successful.
294
+ addConstraints(
295
+ true /* constraintsOnRevert */,
296
+ transactionCallbackStatus?.preconditionsOnRevert,
297
+ );
298
+
299
+ this.checkout.transaction.commit();
300
+ return value !== undefined
301
+ ? { success: true, value: value as TSuccessValue }
302
+ : { success: true };
303
+ }
304
+
216
305
  private ensureUndisposed(): void {
217
306
  if (this.disposed) {
218
307
  this.failDisposed();
@@ -383,7 +472,7 @@ export class SchematizingSimpleTreeView<
383
472
 
384
473
  // #region Branching
385
474
 
386
- public fork(): ReturnType<TreeBranch["fork"]> & TreeViewAlpha<TRootSchema> {
475
+ public fork(): ReturnType<TreeBranch["fork"]> & SchematizingSimpleTreeView<TRootSchema> {
387
476
  return this.checkout.branch().viewWith(this.config);
388
477
  }
389
478