@fluidframework/tree 2.61.0 → 2.62.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 (388) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/api-report/tree.alpha.api.md +26 -21
  3. package/api-report/tree.beta.api.md +15 -0
  4. package/api-report/tree.legacy.beta.api.md +18 -0
  5. package/dist/alpha.d.ts +8 -8
  6. package/dist/api.d.ts +17 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +24 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/beta.d.ts +5 -0
  11. package/dist/codec/codec.d.ts +3 -5
  12. package/dist/codec/codec.d.ts.map +1 -1
  13. package/dist/codec/codec.js +9 -2
  14. package/dist/codec/codec.js.map +1 -1
  15. package/dist/codec/index.d.ts +0 -1
  16. package/dist/codec/index.d.ts.map +1 -1
  17. package/dist/codec/index.js +1 -3
  18. package/dist/codec/index.js.map +1 -1
  19. package/dist/core/index.d.ts +1 -1
  20. package/dist/core/index.d.ts.map +1 -1
  21. package/dist/core/index.js +2 -1
  22. package/dist/core/index.js.map +1 -1
  23. package/dist/core/rebase/index.d.ts +1 -1
  24. package/dist/core/rebase/index.d.ts.map +1 -1
  25. package/dist/core/rebase/index.js +2 -1
  26. package/dist/core/rebase/index.js.map +1 -1
  27. package/dist/core/rebase/utils.d.ts +10 -0
  28. package/dist/core/rebase/utils.d.ts.map +1 -1
  29. package/dist/core/rebase/utils.js +20 -1
  30. package/dist/core/rebase/utils.js.map +1 -1
  31. package/dist/core/tree/detachedFieldIndex.js +1 -1
  32. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  33. package/dist/external-utilities/index.d.ts +1 -1
  34. package/dist/external-utilities/index.d.ts.map +1 -1
  35. package/dist/external-utilities/index.js +1 -2
  36. package/dist/external-utilities/index.js.map +1 -1
  37. package/dist/external-utilities/typeboxValidator.d.ts +0 -13
  38. package/dist/external-utilities/typeboxValidator.d.ts.map +1 -1
  39. package/dist/external-utilities/typeboxValidator.js +3 -5
  40. package/dist/external-utilities/typeboxValidator.js.map +1 -1
  41. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +2 -0
  42. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  43. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  44. package/dist/feature-libraries/flex-tree/index.d.ts +1 -0
  45. package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
  46. package/dist/feature-libraries/flex-tree/index.js +4 -1
  47. package/dist/feature-libraries/flex-tree/index.js.map +1 -1
  48. package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  49. package/dist/feature-libraries/flex-tree/lazyNode.js +15 -8
  50. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  51. package/dist/feature-libraries/flex-tree/observer.d.ts +32 -0
  52. package/dist/feature-libraries/flex-tree/observer.d.ts.map +1 -0
  53. package/dist/feature-libraries/flex-tree/observer.js +33 -0
  54. package/dist/feature-libraries/flex-tree/observer.js.map +1 -0
  55. package/dist/feature-libraries/index.d.ts +1 -1
  56. package/dist/feature-libraries/index.d.ts.map +1 -1
  57. package/dist/feature-libraries/index.js +3 -1
  58. package/dist/feature-libraries/index.js.map +1 -1
  59. package/dist/index.d.ts +5 -5
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +9 -8
  62. package/dist/index.js.map +1 -1
  63. package/dist/legacy.d.ts +7 -1
  64. package/dist/packageVersion.d.ts +1 -1
  65. package/dist/packageVersion.js +1 -1
  66. package/dist/packageVersion.js.map +1 -1
  67. package/dist/shared-tree/index.d.ts +2 -2
  68. package/dist/shared-tree/index.d.ts.map +1 -1
  69. package/dist/shared-tree/index.js.map +1 -1
  70. package/dist/shared-tree/schematizingTreeView.js +2 -2
  71. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  72. package/dist/shared-tree/sharedTree.d.ts +21 -6
  73. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  74. package/dist/shared-tree/sharedTree.js +76 -37
  75. package/dist/shared-tree/sharedTree.js.map +1 -1
  76. package/dist/shared-tree/treeAlpha.d.ts +114 -1
  77. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  78. package/dist/shared-tree/treeAlpha.js +140 -1
  79. package/dist/shared-tree/treeAlpha.js.map +1 -1
  80. package/dist/shared-tree/treeCheckout.d.ts +13 -7
  81. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  82. package/dist/shared-tree/treeCheckout.js +115 -85
  83. package/dist/shared-tree/treeCheckout.js.map +1 -1
  84. package/dist/shared-tree-core/branch.d.ts +3 -0
  85. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  86. package/dist/shared-tree-core/branch.js.map +1 -1
  87. package/dist/shared-tree-core/branchIdCodec.d.ts +11 -0
  88. package/dist/shared-tree-core/branchIdCodec.d.ts.map +1 -0
  89. package/dist/shared-tree-core/branchIdCodec.js +18 -0
  90. package/dist/shared-tree-core/branchIdCodec.js.map +1 -0
  91. package/dist/shared-tree-core/editManager.d.ts +39 -64
  92. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  93. package/dist/shared-tree-core/editManager.js +455 -295
  94. package/dist/shared-tree-core/editManager.js.map +1 -1
  95. package/dist/shared-tree-core/editManagerCodecs.d.ts +1 -1
  96. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  97. package/dist/shared-tree-core/editManagerCodecs.js +7 -96
  98. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  99. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts +17 -0
  100. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -0
  101. package/dist/shared-tree-core/editManagerCodecsCommons.js +139 -0
  102. package/dist/shared-tree-core/editManagerCodecsCommons.js.map +1 -0
  103. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts +16 -0
  104. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -0
  105. package/dist/shared-tree-core/editManagerCodecsV1toV4.js +39 -0
  106. package/dist/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -0
  107. package/dist/shared-tree-core/editManagerCodecsV5.d.ts +16 -0
  108. package/dist/shared-tree-core/editManagerCodecsV5.d.ts.map +1 -0
  109. package/dist/shared-tree-core/editManagerCodecsV5.js +58 -0
  110. package/dist/shared-tree-core/editManagerCodecsV5.js.map +1 -0
  111. package/dist/shared-tree-core/{editManagerFormat.d.ts → editManagerFormatCommons.d.ts} +31 -7
  112. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -0
  113. package/dist/shared-tree-core/{editManagerFormat.js → editManagerFormatCommons.js} +13 -12
  114. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -0
  115. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +31 -0
  116. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -0
  117. package/dist/shared-tree-core/editManagerFormatV1toV4.js +24 -0
  118. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -0
  119. package/dist/shared-tree-core/editManagerFormatV5.d.ts +62 -0
  120. package/dist/shared-tree-core/editManagerFormatV5.d.ts.map +1 -0
  121. package/dist/shared-tree-core/editManagerFormatV5.js +20 -0
  122. package/dist/shared-tree-core/editManagerFormatV5.js.map +1 -0
  123. package/dist/shared-tree-core/index.d.ts +3 -3
  124. package/dist/shared-tree-core/index.d.ts.map +1 -1
  125. package/dist/shared-tree-core/index.js.map +1 -1
  126. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +11 -0
  127. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -0
  128. package/dist/shared-tree-core/messageCodecV1ToV4.js +59 -0
  129. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -0
  130. package/dist/shared-tree-core/messageCodecV5.d.ts +11 -0
  131. package/dist/shared-tree-core/messageCodecV5.d.ts.map +1 -0
  132. package/dist/shared-tree-core/messageCodecV5.js +78 -0
  133. package/dist/shared-tree-core/messageCodecV5.js.map +1 -0
  134. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  135. package/dist/shared-tree-core/messageCodecs.js +16 -47
  136. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  137. package/dist/shared-tree-core/{messageFormat.d.ts → messageFormatV1ToV4.d.ts} +1 -1
  138. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -0
  139. package/dist/shared-tree-core/{messageFormat.js → messageFormatV1ToV4.js} +1 -1
  140. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -0
  141. package/dist/shared-tree-core/messageFormatV5.d.ts +42 -0
  142. package/dist/shared-tree-core/messageFormatV5.d.ts.map +1 -0
  143. package/dist/shared-tree-core/messageFormatV5.js +20 -0
  144. package/dist/shared-tree-core/messageFormatV5.js.map +1 -0
  145. package/dist/shared-tree-core/messageTypes.d.ts +12 -2
  146. package/dist/shared-tree-core/messageTypes.d.ts.map +1 -1
  147. package/dist/shared-tree-core/messageTypes.js.map +1 -1
  148. package/dist/shared-tree-core/sequenceIdUtils.d.ts +1 -1
  149. package/dist/shared-tree-core/sequenceIdUtils.d.ts.map +1 -1
  150. package/dist/shared-tree-core/sequenceIdUtils.js.map +1 -1
  151. package/dist/shared-tree-core/sharedTreeCore.d.ts +19 -5
  152. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  153. package/dist/shared-tree-core/sharedTreeCore.js +182 -58
  154. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  155. package/dist/simple-tree/api/tree.d.ts +17 -0
  156. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  157. package/dist/simple-tree/api/tree.js +2 -0
  158. package/dist/simple-tree/api/tree.js.map +1 -1
  159. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  160. package/dist/simple-tree/core/unhydratedFlexTree.js +7 -1
  161. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  162. package/dist/treeFactory.d.ts +38 -9
  163. package/dist/treeFactory.d.ts.map +1 -1
  164. package/dist/treeFactory.js +44 -9
  165. package/dist/treeFactory.js.map +1 -1
  166. package/lib/alpha.d.ts +8 -8
  167. package/lib/api.d.ts +17 -0
  168. package/lib/api.d.ts.map +1 -0
  169. package/lib/api.js +22 -0
  170. package/lib/api.js.map +1 -0
  171. package/lib/beta.d.ts +5 -0
  172. package/lib/codec/codec.d.ts +3 -5
  173. package/lib/codec/codec.d.ts.map +1 -1
  174. package/lib/codec/codec.js +8 -1
  175. package/lib/codec/codec.js.map +1 -1
  176. package/lib/codec/index.d.ts +0 -1
  177. package/lib/codec/index.d.ts.map +1 -1
  178. package/lib/codec/index.js +0 -1
  179. package/lib/codec/index.js.map +1 -1
  180. package/lib/core/index.d.ts +1 -1
  181. package/lib/core/index.d.ts.map +1 -1
  182. package/lib/core/index.js +1 -1
  183. package/lib/core/index.js.map +1 -1
  184. package/lib/core/rebase/index.d.ts +1 -1
  185. package/lib/core/rebase/index.d.ts.map +1 -1
  186. package/lib/core/rebase/index.js +1 -1
  187. package/lib/core/rebase/index.js.map +1 -1
  188. package/lib/core/rebase/utils.d.ts +10 -0
  189. package/lib/core/rebase/utils.d.ts.map +1 -1
  190. package/lib/core/rebase/utils.js +18 -0
  191. package/lib/core/rebase/utils.js.map +1 -1
  192. package/lib/core/tree/detachedFieldIndex.js +2 -2
  193. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  194. package/lib/external-utilities/index.d.ts +1 -1
  195. package/lib/external-utilities/index.d.ts.map +1 -1
  196. package/lib/external-utilities/index.js +1 -1
  197. package/lib/external-utilities/index.js.map +1 -1
  198. package/lib/external-utilities/typeboxValidator.d.ts +0 -13
  199. package/lib/external-utilities/typeboxValidator.d.ts.map +1 -1
  200. package/lib/external-utilities/typeboxValidator.js +1 -3
  201. package/lib/external-utilities/typeboxValidator.js.map +1 -1
  202. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +2 -0
  203. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  204. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  205. package/lib/feature-libraries/flex-tree/index.d.ts +1 -0
  206. package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
  207. package/lib/feature-libraries/flex-tree/index.js +1 -0
  208. package/lib/feature-libraries/flex-tree/index.js.map +1 -1
  209. package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  210. package/lib/feature-libraries/flex-tree/lazyNode.js +15 -8
  211. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  212. package/lib/feature-libraries/flex-tree/observer.d.ts +32 -0
  213. package/lib/feature-libraries/flex-tree/observer.d.ts.map +1 -0
  214. package/lib/feature-libraries/flex-tree/observer.js +40 -0
  215. package/lib/feature-libraries/flex-tree/observer.js.map +1 -0
  216. package/lib/feature-libraries/index.d.ts +1 -1
  217. package/lib/feature-libraries/index.d.ts.map +1 -1
  218. package/lib/feature-libraries/index.js +1 -1
  219. package/lib/feature-libraries/index.js.map +1 -1
  220. package/lib/index.d.ts +5 -5
  221. package/lib/index.d.ts.map +1 -1
  222. package/lib/index.js +3 -3
  223. package/lib/index.js.map +1 -1
  224. package/lib/legacy.d.ts +7 -1
  225. package/lib/packageVersion.d.ts +1 -1
  226. package/lib/packageVersion.js +1 -1
  227. package/lib/packageVersion.js.map +1 -1
  228. package/lib/shared-tree/index.d.ts +2 -2
  229. package/lib/shared-tree/index.d.ts.map +1 -1
  230. package/lib/shared-tree/index.js.map +1 -1
  231. package/lib/shared-tree/schematizingTreeView.js +2 -2
  232. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  233. package/lib/shared-tree/sharedTree.d.ts +21 -6
  234. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  235. package/lib/shared-tree/sharedTree.js +78 -39
  236. package/lib/shared-tree/sharedTree.js.map +1 -1
  237. package/lib/shared-tree/treeAlpha.d.ts +114 -1
  238. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  239. package/lib/shared-tree/treeAlpha.js +143 -4
  240. package/lib/shared-tree/treeAlpha.js.map +1 -1
  241. package/lib/shared-tree/treeCheckout.d.ts +13 -7
  242. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  243. package/lib/shared-tree/treeCheckout.js +117 -87
  244. package/lib/shared-tree/treeCheckout.js.map +1 -1
  245. package/lib/shared-tree-core/branch.d.ts +3 -0
  246. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  247. package/lib/shared-tree-core/branch.js.map +1 -1
  248. package/lib/shared-tree-core/branchIdCodec.d.ts +11 -0
  249. package/lib/shared-tree-core/branchIdCodec.d.ts.map +1 -0
  250. package/lib/shared-tree-core/branchIdCodec.js +13 -0
  251. package/lib/shared-tree-core/branchIdCodec.js.map +1 -0
  252. package/lib/shared-tree-core/editManager.d.ts +39 -64
  253. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  254. package/lib/shared-tree-core/editManager.js +455 -295
  255. package/lib/shared-tree-core/editManager.js.map +1 -1
  256. package/lib/shared-tree-core/editManagerCodecs.d.ts +1 -1
  257. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  258. package/lib/shared-tree-core/editManagerCodecs.js +4 -93
  259. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  260. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts +17 -0
  261. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -0
  262. package/lib/shared-tree-core/editManagerCodecsCommons.js +134 -0
  263. package/lib/shared-tree-core/editManagerCodecsCommons.js.map +1 -0
  264. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts +16 -0
  265. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -0
  266. package/lib/shared-tree-core/editManagerCodecsV1toV4.js +35 -0
  267. package/lib/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -0
  268. package/lib/shared-tree-core/editManagerCodecsV5.d.ts +16 -0
  269. package/lib/shared-tree-core/editManagerCodecsV5.d.ts.map +1 -0
  270. package/lib/shared-tree-core/editManagerCodecsV5.js +54 -0
  271. package/lib/shared-tree-core/editManagerCodecsV5.js.map +1 -0
  272. package/lib/shared-tree-core/{editManagerFormat.d.ts → editManagerFormatCommons.d.ts} +31 -7
  273. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -0
  274. package/lib/shared-tree-core/{editManagerFormat.js → editManagerFormatCommons.js} +10 -11
  275. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -0
  276. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +31 -0
  277. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -0
  278. package/lib/shared-tree-core/editManagerFormatV1toV4.js +20 -0
  279. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -0
  280. package/lib/shared-tree-core/editManagerFormatV5.d.ts +62 -0
  281. package/lib/shared-tree-core/editManagerFormatV5.d.ts.map +1 -0
  282. package/lib/shared-tree-core/editManagerFormatV5.js +16 -0
  283. package/lib/shared-tree-core/editManagerFormatV5.js.map +1 -0
  284. package/lib/shared-tree-core/index.d.ts +3 -3
  285. package/lib/shared-tree-core/index.d.ts.map +1 -1
  286. package/lib/shared-tree-core/index.js.map +1 -1
  287. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +11 -0
  288. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -0
  289. package/lib/shared-tree-core/messageCodecV1ToV4.js +55 -0
  290. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -0
  291. package/lib/shared-tree-core/messageCodecV5.d.ts +11 -0
  292. package/lib/shared-tree-core/messageCodecV5.d.ts.map +1 -0
  293. package/lib/shared-tree-core/messageCodecV5.js +74 -0
  294. package/lib/shared-tree-core/messageCodecV5.js.map +1 -0
  295. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  296. package/lib/shared-tree-core/messageCodecs.js +17 -48
  297. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  298. package/lib/shared-tree-core/{messageFormat.d.ts → messageFormatV1ToV4.d.ts} +1 -1
  299. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -0
  300. package/lib/shared-tree-core/{messageFormat.js → messageFormatV1ToV4.js} +1 -1
  301. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -0
  302. package/lib/shared-tree-core/messageFormatV5.d.ts +42 -0
  303. package/lib/shared-tree-core/messageFormatV5.d.ts.map +1 -0
  304. package/lib/shared-tree-core/messageFormatV5.js +16 -0
  305. package/lib/shared-tree-core/messageFormatV5.js.map +1 -0
  306. package/lib/shared-tree-core/messageTypes.d.ts +12 -2
  307. package/lib/shared-tree-core/messageTypes.d.ts.map +1 -1
  308. package/lib/shared-tree-core/messageTypes.js.map +1 -1
  309. package/lib/shared-tree-core/sequenceIdUtils.d.ts +1 -1
  310. package/lib/shared-tree-core/sequenceIdUtils.d.ts.map +1 -1
  311. package/lib/shared-tree-core/sequenceIdUtils.js.map +1 -1
  312. package/lib/shared-tree-core/sharedTreeCore.d.ts +19 -5
  313. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  314. package/lib/shared-tree-core/sharedTreeCore.js +183 -59
  315. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  316. package/lib/simple-tree/api/tree.d.ts +17 -0
  317. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  318. package/lib/simple-tree/api/tree.js +2 -0
  319. package/lib/simple-tree/api/tree.js.map +1 -1
  320. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  321. package/lib/simple-tree/core/unhydratedFlexTree.js +8 -2
  322. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  323. package/lib/treeFactory.d.ts +38 -9
  324. package/lib/treeFactory.d.ts.map +1 -1
  325. package/lib/treeFactory.js +41 -8
  326. package/lib/treeFactory.js.map +1 -1
  327. package/package.json +25 -25
  328. package/src/api.ts +30 -0
  329. package/src/codec/codec.ts +12 -6
  330. package/src/codec/index.ts +0 -1
  331. package/src/core/index.ts +1 -0
  332. package/src/core/rebase/index.ts +1 -0
  333. package/src/core/rebase/utils.ts +27 -0
  334. package/src/core/tree/detachedFieldIndex.ts +2 -2
  335. package/src/external-utilities/index.ts +1 -1
  336. package/src/external-utilities/typeboxValidator.ts +1 -3
  337. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +2 -0
  338. package/src/feature-libraries/flex-tree/index.ts +2 -0
  339. package/src/feature-libraries/flex-tree/lazyNode.ts +13 -3
  340. package/src/feature-libraries/flex-tree/observer.ts +64 -0
  341. package/src/feature-libraries/index.ts +3 -0
  342. package/src/index.ts +6 -4
  343. package/src/packageVersion.ts +1 -1
  344. package/src/shared-tree/index.ts +2 -0
  345. package/src/shared-tree/schematizingTreeView.ts +2 -2
  346. package/src/shared-tree/sharedTree.ts +116 -52
  347. package/src/shared-tree/treeAlpha.ts +309 -4
  348. package/src/shared-tree/treeCheckout.ts +152 -100
  349. package/src/shared-tree-core/branch.ts +7 -0
  350. package/src/shared-tree-core/branchIdCodec.ts +28 -0
  351. package/src/shared-tree-core/editManager.ts +729 -430
  352. package/src/shared-tree-core/editManagerCodecs.ts +4 -164
  353. package/src/shared-tree-core/editManagerCodecsCommons.ts +245 -0
  354. package/src/shared-tree-core/editManagerCodecsV1toV4.ts +108 -0
  355. package/src/shared-tree-core/editManagerCodecsV5.ts +156 -0
  356. package/src/shared-tree-core/{editManagerFormat.ts → editManagerFormatCommons.ts} +17 -13
  357. package/src/shared-tree-core/editManagerFormatV1toV4.ts +42 -0
  358. package/src/shared-tree-core/editManagerFormatV5.ts +35 -0
  359. package/src/shared-tree-core/index.ts +3 -1
  360. package/src/shared-tree-core/messageCodecV1ToV4.ts +104 -0
  361. package/src/shared-tree-core/messageCodecV5.ts +131 -0
  362. package/src/shared-tree-core/messageCodecs.ts +16 -85
  363. package/src/shared-tree-core/messageFormatV5.ts +50 -0
  364. package/src/shared-tree-core/messageTypes.ts +15 -2
  365. package/src/shared-tree-core/sequenceIdUtils.ts +1 -1
  366. package/src/shared-tree-core/sharedTreeCore.ts +281 -85
  367. package/src/simple-tree/api/tree.ts +23 -0
  368. package/src/simple-tree/core/unhydratedFlexTree.ts +11 -2
  369. package/src/treeFactory.ts +48 -8
  370. package/dist/codec/noopValidator.d.ts +0 -13
  371. package/dist/codec/noopValidator.d.ts.map +0 -1
  372. package/dist/codec/noopValidator.js +0 -17
  373. package/dist/codec/noopValidator.js.map +0 -1
  374. package/dist/shared-tree-core/editManagerFormat.d.ts.map +0 -1
  375. package/dist/shared-tree-core/editManagerFormat.js.map +0 -1
  376. package/dist/shared-tree-core/messageFormat.d.ts.map +0 -1
  377. package/dist/shared-tree-core/messageFormat.js.map +0 -1
  378. package/docs/user-facing/schema-evolution.md +0 -309
  379. package/lib/codec/noopValidator.d.ts +0 -13
  380. package/lib/codec/noopValidator.d.ts.map +0 -1
  381. package/lib/codec/noopValidator.js +0 -14
  382. package/lib/codec/noopValidator.js.map +0 -1
  383. package/lib/shared-tree-core/editManagerFormat.d.ts.map +0 -1
  384. package/lib/shared-tree-core/editManagerFormat.js.map +0 -1
  385. package/lib/shared-tree-core/messageFormat.d.ts.map +0 -1
  386. package/lib/shared-tree-core/messageFormat.js.map +0 -1
  387. package/src/codec/noopValidator.ts +0 -18
  388. /package/src/shared-tree-core/{messageFormat.ts → messageFormatV1ToV4.ts} +0 -0
@@ -11,7 +11,7 @@ import {
11
11
  UsageError,
12
12
  type ITelemetryLoggerExt,
13
13
  } from "@fluidframework/telemetry-utils/internal";
14
- import { FluidClientVersion, noopValidator } from "../codec/index.js";
14
+ import { FluidClientVersion, FormatValidatorNoOp } from "../codec/index.js";
15
15
  import {
16
16
  type Anchor,
17
17
  type AnchorLocator,
@@ -47,6 +47,7 @@ import {
47
47
  type TreeNodeSchemaIdentifier,
48
48
  type TreeNodeStoredSchema,
49
49
  LeafNodeStoredSchema,
50
+ diffHistories,
50
51
  } from "../core/index.js";
51
52
  import {
52
53
  type FieldBatchCodec,
@@ -296,7 +297,7 @@ export function createTreeCheckout(
296
297
  const schema = args?.schema ?? new TreeStoredSchemaRepository();
297
298
  const forest = args?.forest ?? buildForest(breaker, schema);
298
299
  const defaultCodecOptions = {
299
- jsonValidator: noopValidator,
300
+ jsonValidator: FormatValidatorNoOp,
300
301
  oldestCompatibleClient: FluidClientVersion.v2_0,
301
302
  };
302
303
  const defaultFieldBatchVersion = 1;
@@ -310,6 +311,9 @@ export function createTreeCheckout(
310
311
  args?.chunkCompressionStrategy,
311
312
  idCompressor,
312
313
  );
314
+
315
+ // TODO: If a branch is passed in, is it supposed to be local main?
316
+ // Otherwise shouldn't we set `isSharedBranch` to false?
313
317
  const branch =
314
318
  args?.branch ??
315
319
  new SharedTreeBranch(
@@ -323,7 +327,7 @@ export function createTreeCheckout(
323
327
 
324
328
  return new TreeCheckout(
325
329
  branch,
326
- false,
330
+ true,
327
331
  changeFamily,
328
332
  schema,
329
333
  forest,
@@ -366,7 +370,7 @@ export interface RevertMetrics {
366
370
  export class TreeCheckout implements ITreeCheckoutFork {
367
371
  public disposed = false;
368
372
 
369
- private readonly editLock: EditLock;
373
+ private editLock: EditLock;
370
374
 
371
375
  private readonly views = new Set<TreeView<ImplicitFieldSchema>>();
372
376
 
@@ -396,15 +400,15 @@ export class TreeCheckout implements ITreeCheckoutFork {
396
400
 
397
401
  public constructor(
398
402
  branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
399
- /** True if and only if this checkout is for a forked branch and not the "main branch" of the tree. */
400
- public readonly isBranch: boolean,
403
+ /** True if and only if this checkout is for a branch which is persisted and shared with other clients. */
404
+ public readonly isSharedBranch: boolean,
401
405
  private readonly changeFamily: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,
402
406
  public readonly storedSchema: TreeStoredSchemaRepository,
403
407
  public readonly forest: IEditableForest,
404
408
  private readonly mintRevisionTag: () => RevisionTag,
405
409
  private readonly revisionTagCodec: RevisionTagCodec,
406
410
  private readonly idCompressor: IIdCompressor,
407
- private removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(
411
+ public removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(
408
412
  "repair",
409
413
  revisionTagCodec,
410
414
  idCompressor,
@@ -412,9 +416,29 @@ export class TreeCheckout implements ITreeCheckoutFork {
412
416
  /** Optional logger for telemetry. */
413
417
  private readonly logger?: ITelemetryLoggerExt,
414
418
  public readonly breaker: Breakable = new Breakable("TreeCheckout"),
415
- private readonly disposeForksAfterTransaction = true,
419
+ public readonly disposeForksAfterTransaction = true,
416
420
  ) {
417
- this.#transaction = new SquashingTransactionStack(
421
+ this.#transaction = this.createTransactionStack(branch);
422
+ this.editLock = new EditLock(this.#transaction.activeBranchEditor);
423
+ this.registerForBranchEvents();
424
+ }
425
+
426
+ private registerForBranchEvents(): void {
427
+ this.#transaction.branch.events.on("afterChange", this.onAfterBranchChange);
428
+ this.#transaction.activeBranchEvents.on("afterChange", this.onAfterChange);
429
+ this.#transaction.activeBranchEvents.on("ancestryTrimmed", this.onAncestryTrimmed);
430
+ }
431
+
432
+ private unregisterFromBranchEvents(): void {
433
+ this.#transaction.branch.events.off("afterChange", this.onAfterBranchChange);
434
+ this.#transaction.activeBranchEvents.off("afterChange", this.onAfterChange);
435
+ this.#transaction.activeBranchEvents.off("ancestryTrimmed", this.onAncestryTrimmed);
436
+ }
437
+
438
+ private createTransactionStack(
439
+ branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
440
+ ): SquashingTransactionStack<SharedTreeEditBuilder, SharedTreeChange> {
441
+ return new SquashingTransactionStack(
418
442
  branch,
419
443
  (commits) => {
420
444
  const revision = this.mintRevisionTag();
@@ -450,58 +474,6 @@ export class TreeCheckout implements ITreeCheckoutFork {
450
474
  };
451
475
  },
452
476
  );
453
-
454
- this.editLock = new EditLock(this.#transaction.activeBranchEditor);
455
-
456
- branch.events.on("afterChange", (event) => {
457
- // The following logic allows revertibles to be generated for the change.
458
- // Currently only appends (including merges and transaction commits) are supported.
459
- if (event.type === "append") {
460
- // TODO:#20949: When the SharedTree is detached, these commits will already have been garbage collected.
461
- // Figure out a way to generate revertibles before the commits are garbage collected.
462
- for (const commit of event.newCommits) {
463
- const kind = event.type === "append" ? event.kind : CommitKind.Default;
464
- const { change, revision } = commit;
465
-
466
- const getRevertible = hasSchemaChange(change)
467
- ? undefined
468
- : (onRevertibleDisposed?: (revertible: RevertibleAlpha) => void) => {
469
- if (!withinEventContext) {
470
- throw new UsageError(
471
- "Cannot get a revertible outside of the context of a changed event.",
472
- );
473
- }
474
- if (this.revertibleCommitBranches.get(revision) !== undefined) {
475
- throw new UsageError(
476
- "Cannot generate the same revertible more than once. Note that this can happen when multiple changed event listeners are registered.",
477
- );
478
- }
479
- const revertible = this.createRevertible(
480
- revision,
481
- kind,
482
- this,
483
- onRevertibleDisposed,
484
- );
485
- this.revertibleCommitBranches.set(
486
- revision,
487
- this.#transaction.activeBranch.fork(commit),
488
- );
489
- this.revertibles.add(revertible);
490
- return revertible;
491
- };
492
-
493
- let withinEventContext = true;
494
- this.#events.emit("changed", { isLocal: true, kind }, getRevertible);
495
- withinEventContext = false;
496
- }
497
- } else if (this.isRemoteChangeEvent(event)) {
498
- // TODO: figure out how to plumb through commit kind info for remote changes
499
- this.#events.emit("changed", { isLocal: false, kind: CommitKind.Default });
500
- }
501
- });
502
-
503
- this.#transaction.activeBranchEvents.on("afterChange", this.onAfterChange);
504
- this.#transaction.activeBranchEvents.on("ancestryTrimmed", this.onAncestryTrimmed);
505
477
  }
506
478
 
507
479
  public exportVerbose(): VerboseTree | undefined {
@@ -522,6 +494,55 @@ export class TreeCheckout implements ITreeCheckoutFork {
522
494
  }
523
495
  }
524
496
 
497
+ private readonly onAfterBranchChange = (
498
+ event: SharedTreeBranchChange<SharedTreeChange>,
499
+ ): void => {
500
+ // The following logic allows revertibles to be generated for the change.
501
+ // Currently only appends (including merges and transaction commits) are supported.
502
+ if (event.type === "append") {
503
+ // TODO:#20949: When the SharedTree is detached, these commits will already have been garbage collected.
504
+ // Figure out a way to generate revertibles before the commits are garbage collected.
505
+ for (const commit of event.newCommits) {
506
+ const kind = event.type === "append" ? event.kind : CommitKind.Default;
507
+ const { change, revision } = commit;
508
+
509
+ const getRevertible = hasSchemaChange(change)
510
+ ? undefined
511
+ : (onRevertibleDisposed?: (revertible: RevertibleAlpha) => void) => {
512
+ if (!withinEventContext) {
513
+ throw new UsageError(
514
+ "Cannot get a revertible outside of the context of a changed event.",
515
+ );
516
+ }
517
+ if (this.revertibleCommitBranches.get(revision) !== undefined) {
518
+ throw new UsageError(
519
+ "Cannot generate the same revertible more than once. Note that this can happen when multiple changed event listeners are registered.",
520
+ );
521
+ }
522
+ const revertible = this.createRevertible(
523
+ revision,
524
+ kind,
525
+ this,
526
+ onRevertibleDisposed,
527
+ );
528
+ this.revertibleCommitBranches.set(
529
+ revision,
530
+ this.#transaction.activeBranch.fork(commit),
531
+ );
532
+ this.revertibles.add(revertible);
533
+ return revertible;
534
+ };
535
+
536
+ let withinEventContext = true;
537
+ this.#events.emit("changed", { isLocal: true, kind }, getRevertible);
538
+ withinEventContext = false;
539
+ }
540
+ } else if (this.isRemoteChangeEvent(event)) {
541
+ // TODO: figure out how to plumb through commit kind info for remote changes
542
+ this.#events.emit("changed", { isLocal: false, kind: CommitKind.Default });
543
+ }
544
+ };
545
+
525
546
  private readonly onAfterChange = (event: SharedTreeBranchChange<SharedTreeChange>): void => {
526
547
  this.editLock.lock();
527
548
  this.#events.emit("beforeBatch", event);
@@ -531,34 +552,7 @@ export class TreeCheckout implements ITreeCheckoutFork {
531
552
  ? this.#transaction.activeBranch.getHead().revision
532
553
  : event.change.revision;
533
554
 
534
- // Conflicts due to schema will be empty and thus are not applied.
535
- for (const change of event.change.change.changes) {
536
- if (change.type === "data") {
537
- const delta = intoDelta(tagChange(change.innerChange, revision));
538
- this.withCombinedVisitor((visitor) => {
539
- visitDelta(delta, visitor, this.removedRoots, revision);
540
- });
541
- } else if (change.type === "schema") {
542
- // Schema changes from a current to a new schema are expected to be backwards compatible.
543
- // This guarantees that all data in the forest (which is valid before the schema change)
544
- // is also valid under the new schema.
545
- // Note however, that such schema changes may in some cases be rolled back:
546
- // Case 1: A transaction with a schema change may be aborted.
547
- // The transaction may have made some data changes that would render some trees invalid
548
- // under the old schema, but these changes will also be rolled back, thereby putting the forest
549
- // back in the state before the transaction, which is valid under the original (reinstated) schema.
550
- // Case 2: A branch with a schema change may be rebased such that the schema change (because
551
- // of a constraint) is no longer applied.
552
- // Such a branch may contain data changes that would render some trees invalid under the
553
- // original schema. These data changes may not necessarily be rolled back.
554
- // They will however be rebased over the rollback of the schema change. This rebasing will
555
- // ensure that these data changes are muted if they would render some trees invalid under the
556
- // original (reinstated) schema.
557
- this.storedSchema.apply(change.innerChange.schema.new);
558
- } else {
559
- fail(0xad1 /* Unknown Shared Tree change type. */);
560
- }
561
- }
555
+ this.applyChange(event.change.change, revision);
562
556
  }
563
557
  this.#events.emit("afterBatch");
564
558
  this.editLock.unlock();
@@ -567,6 +561,38 @@ export class TreeCheckout implements ITreeCheckoutFork {
567
561
  }
568
562
  };
569
563
 
564
+ // Revision is the revision of the commit, if any, which caused this change.
565
+ private applyChange(change: SharedTreeChange, revision?: RevisionTag): void {
566
+ // Conflicts due to schema will be empty and thus are not applied.
567
+ for (const innerChange of change.changes) {
568
+ if (innerChange.type === "data") {
569
+ const delta = intoDelta(tagChange(innerChange.innerChange, revision));
570
+ this.withCombinedVisitor((visitor) => {
571
+ visitDelta(delta, visitor, this.removedRoots, revision);
572
+ });
573
+ } else if (innerChange.type === "schema") {
574
+ // Schema changes from a current to a new schema are expected to be backwards compatible.
575
+ // This guarantees that all data in the forest (which is valid before the schema change)
576
+ // is also valid under the new schema.
577
+ // Note however, that such schema changes may in some cases be rolled back:
578
+ // Case 1: A transaction with a schema change may be aborted.
579
+ // The transaction may have made some data changes that would render some trees invalid
580
+ // under the old schema, but these changes will also be rolled back, thereby putting the forest
581
+ // back in the state before the transaction, which is valid under the original (reinstated) schema.
582
+ // Case 2: A branch with a schema change may be rebased such that the schema change (because
583
+ // of a constraint) is no longer applied.
584
+ // Such a branch may contain data changes that would render some trees invalid under the
585
+ // original schema. These data changes may not necessarily be rolled back.
586
+ // They will however be rebased over the rollback of the schema change. This rebasing will
587
+ // ensure that these data changes are muted if they would render some trees invalid under the
588
+ // original (reinstated) schema.
589
+ this.storedSchema.apply(innerChange.innerChange.schema.new);
590
+ } else {
591
+ fail(0xad1 /* Unknown Shared Tree change type. */);
592
+ }
593
+ }
594
+ }
595
+
570
596
  private readonly onAncestryTrimmed = (revisions: RevisionTag[]): void => {
571
597
  // When the branch is trimmed, we can garbage collect any repair data whose latest relevant revision is one of the
572
598
  // trimmed revisions.
@@ -730,7 +756,7 @@ export class TreeCheckout implements ITreeCheckoutFork {
730
756
  * To avoid updating observers of the view state with intermediate results during a transaction,
731
757
  * use {@link ITreeCheckout#branch} and {@link ISharedTreeFork#merge}.
732
758
  */
733
- readonly #transaction: SquashingTransactionStack<SharedTreeEditBuilder, SharedTreeChange>;
759
+ #transaction: SquashingTransactionStack<SharedTreeEditBuilder, SharedTreeChange>;
734
760
 
735
761
  public branch(): TreeCheckout {
736
762
  this.checkNotDisposed(
@@ -743,7 +769,7 @@ export class TreeCheckout implements ITreeCheckoutFork {
743
769
  const forest = this.forest.clone(storedSchema, anchors);
744
770
  const checkout = new TreeCheckout(
745
771
  branch,
746
- true,
772
+ false,
747
773
  this.changeFamily,
748
774
  storedSchema,
749
775
  forest,
@@ -759,6 +785,32 @@ export class TreeCheckout implements ITreeCheckoutFork {
759
785
  return checkout;
760
786
  }
761
787
 
788
+ public switchBranch(
789
+ branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
790
+ ): void {
791
+ // TODO: Dispose old branch, if necessary
792
+ assert(
793
+ !this.#transaction.isInProgress(),
794
+ 0xc55 /* Cannot switch branches during a transaction */,
795
+ );
796
+ const diff = diffHistories(
797
+ this.changeFamily.rebaser,
798
+ this.#transaction.branch.getHead(),
799
+ branch.getHead(),
800
+ this.mintRevisionTag,
801
+ );
802
+
803
+ this.unregisterFromBranchEvents();
804
+
805
+ this.#transaction = this.createTransactionStack(branch);
806
+ this.editLock = new EditLock(this.#transaction.activeBranchEditor);
807
+ this.registerForBranchEvents();
808
+
809
+ // TODO: Rework eventing
810
+ this.applyChange(diff);
811
+ this.#events.emit("afterBatch");
812
+ }
813
+
762
814
  public rebase(checkout: TreeCheckout): void {
763
815
  this.checkNotDisposed(
764
816
  "The target of the branch rebase has been disposed and cannot be rebased.",
@@ -772,8 +824,8 @@ export class TreeCheckout implements ITreeCheckoutFork {
772
824
  0x9af /* A view cannot be rebased while it has a pending transaction */,
773
825
  );
774
826
  assert(
775
- checkout.isBranch,
776
- 0xa5d /* The main branch cannot be rebased onto another branch. */,
827
+ !checkout.isSharedBranch,
828
+ 0xa5d /* Shared branches cannot be rebased onto another branch. */,
777
829
  );
778
830
 
779
831
  checkout.#transaction.activeBranch.rebaseOnto(this.#transaction.activeBranch);
@@ -804,8 +856,8 @@ export class TreeCheckout implements ITreeCheckoutFork {
804
856
  checkout.transaction.commit();
805
857
  }
806
858
  this.#transaction.activeBranch.merge(checkout.#transaction.activeBranch);
807
- if (disposeMerged && checkout.isBranch) {
808
- // Dispose the merged checkout unless it is the main branch.
859
+ if (disposeMerged && !checkout.isSharedBranch) {
860
+ // Dispose the merged checkout unless it is a shared branch.
809
861
  checkout[disposeSymbol]();
810
862
  }
811
863
  }
@@ -961,10 +1013,10 @@ export class TreeCheckout implements ITreeCheckoutFork {
961
1013
  */
962
1014
  private isRemoteChangeEvent(event: SharedTreeBranchChange<SharedTreeChange>): boolean {
963
1015
  return (
964
- // Remote changes are only ever applied to the main branch
965
- !this.isBranch &&
966
- // Remote changes are applied to the main branch by rebasing it onto the trunk.
967
- // No other rebases are allowed on the main branch, so we can use this to detect remote changes.
1016
+ // Remote changes are only ever applied to shared branches
1017
+ this.isSharedBranch &&
1018
+ // Remote changes are applied to the branch by rebasing it onto the trunk.
1019
+ // No other rebases are allowed on shared branches, so we can use this to detect remote changes.
968
1020
  event.type === "rebase"
969
1021
  );
970
1022
  }
@@ -1020,7 +1072,7 @@ class EditLock {
1020
1072
  * Edits the tree by calling the methods of the editor passed into the {@link EditLock} constructor.
1021
1073
  * @remarks Edits will throw an error if the lock is currently locked.
1022
1074
  */
1023
- public editor: ISharedTreeEditor;
1075
+ public readonly editor: ISharedTreeEditor;
1024
1076
  private locked = false;
1025
1077
 
1026
1078
  /**
@@ -24,6 +24,13 @@ import {
24
24
  type RebaseStatsWithDuration,
25
25
  } from "../core/index.js";
26
26
  import { hasSome, defineLazyCachedProperty } from "../util/index.js";
27
+ import type {
28
+ OpSpaceCompressedId,
29
+ SessionSpaceCompressedId,
30
+ } from "@fluidframework/id-compressor";
31
+
32
+ export type BranchId = SessionSpaceCompressedId | "main";
33
+ export type EncodedBranchId = OpSpaceCompressedId;
27
34
 
28
35
  /**
29
36
  * Describes a change to a `SharedTreeBranch`. Each of the following event types provides a `change` which contains the net change to the branch (or is undefined if there was no net change):
@@ -0,0 +1,28 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type {
7
+ IIdCompressor,
8
+ OpSpaceCompressedId,
9
+ SessionId,
10
+ } from "@fluidframework/id-compressor";
11
+ import type { BranchId } from "./branch.js";
12
+
13
+ export function encodeBranchId(
14
+ idCompressor: IIdCompressor,
15
+ branchId: BranchId,
16
+ ): OpSpaceCompressedId | undefined {
17
+ return branchId === "main" ? undefined : idCompressor.normalizeToOpSpace(branchId);
18
+ }
19
+
20
+ export function decodeBranchId(
21
+ idCompressor: IIdCompressor,
22
+ encoded: OpSpaceCompressedId | undefined,
23
+ context: { readonly originatorId: SessionId },
24
+ ): BranchId {
25
+ return encoded === undefined
26
+ ? "main"
27
+ : idCompressor.normalizeToSessionSpace(encoded, context.originatorId);
28
+ }