@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
@@ -1 +1 @@
1
- {"version":3,"file":"messageTypes.js","sourceRoot":"","sources":["../../src/shared-tree-core/messageTypes.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { SessionId } from \"@fluidframework/id-compressor\";\n\nimport type { GraphCommit } from \"../core/index.js\";\n\nexport interface DecodedMessage<TChange> {\n\tcommit: GraphCommit<TChange>;\n\tsessionId: SessionId;\n}\n"]}
1
+ {"version":3,"file":"messageTypes.js","sourceRoot":"","sources":["../../src/shared-tree-core/messageTypes.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { SessionId } from \"@fluidframework/id-compressor\";\n\nimport type { GraphCommit } from \"../core/index.js\";\nimport type { BranchId } from \"./branch.js\";\n\nexport type DecodedMessage<TChange> = CommitMessage<TChange> | BranchMessage;\n\nexport interface MessageBase {\n\tsessionId: SessionId;\n}\n\nexport interface CommitMessage<TChange> extends MessageBase {\n\ttype: \"commit\";\n\tcommit: GraphCommit<TChange>;\n\tbranchId: BranchId;\n}\n\nexport interface BranchMessage extends MessageBase {\n\ttype: \"branch\";\n\tbranchId: BranchId;\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import type { SequenceId } from "./editManagerFormat.js";
5
+ import type { SequenceId } from "./editManagerFormatCommons.js";
6
6
  /**
7
7
  * Compares two sequenceIds. Returns a negative number if a \< b, a positive number if a \> b, and 0 if a === b.
8
8
  * Note that this handles cases where indexInBatch is Number.POSITIVE_INFINITY.
@@ -1 +1 @@
1
- {"version":3,"file":"sequenceIdUtils.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/sequenceIdUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,MAAO,UAAU,KAAK,UAAU,KAAG,MAKlB,CAAC;AACnD,eAAO,MAAM,gBAAgB,MAAO,UAAU,KAAK,UAAU,KAAG,OAC/B,CAAC;AAClC,eAAO,MAAM,aAAa,MAAO,UAAU,KAAK,UAAU,KAAG,UACtB,CAAC;AACxC,eAAO,MAAM,aAAa,MAAO,UAAU,KAAK,UAAU,KAAG,UACtB,CAAC;AACxC;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,eAAgB,UAAU,KAAG,UAc1E,CAAC"}
1
+ {"version":3,"file":"sequenceIdUtils.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/sequenceIdUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,MAAO,UAAU,KAAK,UAAU,KAAG,MAKlB,CAAC;AACnD,eAAO,MAAM,gBAAgB,MAAO,UAAU,KAAK,UAAU,KAAG,OAC/B,CAAC;AAClC,eAAO,MAAM,aAAa,MAAO,UAAU,KAAK,UAAU,KAAG,UACtB,CAAC;AACxC,eAAO,MAAM,aAAa,MAAO,UAAU,KAAK,UAAU,KAAG,UACtB,CAAC;AACxC;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,eAAgB,UAAU,KAAG,UAc1E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sequenceIdUtils.js","sourceRoot":"","sources":["../../src/shared-tree-core/sequenceIdUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,+CAAyC;AAIzC;;;GAGG;AACI,MAAM,oBAAoB,GAAG,CAAC,CAAa,EAAE,CAAa,EAAU,EAAE,CAC5E,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,cAAc;IACpC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc;IACrC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;QAClC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;AALtC,QAAA,oBAAoB,wBAKkB;AAC5C,MAAM,gBAAgB,GAAG,CAAC,CAAa,EAAE,CAAa,EAAW,EAAE,CACzE,IAAA,4BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AADrB,QAAA,gBAAgB,oBACK;AAC3B,MAAM,aAAa,GAAG,CAAC,CAAa,EAAE,CAAa,EAAc,EAAE,CACzE,IAAA,4BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAD3B,QAAA,aAAa,iBACc;AACjC,MAAM,aAAa,GAAG,CAAC,CAAa,EAAE,CAAa,EAAc,EAAE,CACzE,IAAA,4BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAD3B,QAAA,aAAa,iBACc;AACxC;;;;;;GAMG;AACI,MAAM,iCAAiC,GAAG,CAAC,UAAsB,EAAc,EAAE;IACvF,IAAA,iBAAM,EACL,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EACjF,KAAK,CAAC,uCAAuC,CAC7C,CAAC;IACF,OAAO,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,UAAU,CAAC,YAAY,KAAK,CAAC;QAC5E,CAAC,CAAC;YACA,cAAc,EAAE,IAAA,gBAAK,EAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC;YACpD,YAAY,EAAE,MAAM,CAAC,iBAAiB;SACtC;QACF,CAAC,CAAC;YACA,cAAc,EAAE,IAAA,gBAAK,EAAC,UAAU,CAAC,cAAc,CAAC;YAChD,YAAY,EAAE,UAAU,CAAC,YAAY,GAAG,CAAC;SACzC,CAAC;AACL,CAAC,CAAC;AAdW,QAAA,iCAAiC,qCAc5C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { brand } from \"../util/index.js\";\n\nimport type { SequenceId } from \"./editManagerFormat.js\";\n\n/**\n * Compares two sequenceIds. Returns a negative number if a \\< b, a positive number if a \\> b, and 0 if a === b.\n * Note that this handles cases where indexInBatch is Number.POSITIVE_INFINITY.\n */\nexport const sequenceIdComparator = (a: SequenceId, b: SequenceId): number =>\n\ta.sequenceNumber !== b.sequenceNumber\n\t\t? a.sequenceNumber - b.sequenceNumber\n\t\t: a.indexInBatch === b.indexInBatch\n\t\t\t? 0\n\t\t\t: (a.indexInBatch ?? 0) - (b.indexInBatch ?? 0);\nexport const equalSequenceIds = (a: SequenceId, b: SequenceId): boolean =>\n\tsequenceIdComparator(a, b) === 0;\nexport const minSequenceId = (a: SequenceId, b: SequenceId): SequenceId =>\n\tsequenceIdComparator(a, b) < 0 ? a : b;\nexport const maxSequenceId = (a: SequenceId, b: SequenceId): SequenceId =>\n\tsequenceIdComparator(a, b) > 0 ? a : b;\n/**\n * Returns the upper bound (maximum possible) sequenceId that can occur just before the given sequenceId.\n * Some examples:\n * 1. sequenceId = \\{ sequenceNumber: 1, indexInBatch: 2 \\}. The upper bound is \\{ sequenceNumber: 1, indexInBatch: 1 \\}.\n * 2. sequenceId = \\{ sequenceNumber: 2 \\}. The upper bound is \\{ sequenceNumber: 1, indexInBatch: Number.POSITIVE_INFINITY \\}.\n * The indexInBatch value of the previous commit will depend on how many ops were in the previous batch of messages received.\n */\nexport const getUpperBoundOfPreviousSequenceId = (sequenceId: SequenceId): SequenceId => {\n\tassert(\n\t\tsequenceId.indexInBatch === undefined || Number.isFinite(sequenceId.indexInBatch),\n\t\t0xabc /* indexInBatch must not be infinity */,\n\t);\n\treturn sequenceId.indexInBatch === undefined || sequenceId.indexInBatch === 0\n\t\t? {\n\t\t\t\tsequenceNumber: brand(sequenceId.sequenceNumber - 1),\n\t\t\t\tindexInBatch: Number.POSITIVE_INFINITY,\n\t\t\t}\n\t\t: {\n\t\t\t\tsequenceNumber: brand(sequenceId.sequenceNumber),\n\t\t\t\tindexInBatch: sequenceId.indexInBatch - 1,\n\t\t\t};\n};\n"]}
1
+ {"version":3,"file":"sequenceIdUtils.js","sourceRoot":"","sources":["../../src/shared-tree-core/sequenceIdUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,+CAAyC;AAIzC;;;GAGG;AACI,MAAM,oBAAoB,GAAG,CAAC,CAAa,EAAE,CAAa,EAAU,EAAE,CAC5E,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,cAAc;IACpC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc;IACrC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;QAClC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;AALtC,QAAA,oBAAoB,wBAKkB;AAC5C,MAAM,gBAAgB,GAAG,CAAC,CAAa,EAAE,CAAa,EAAW,EAAE,CACzE,IAAA,4BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AADrB,QAAA,gBAAgB,oBACK;AAC3B,MAAM,aAAa,GAAG,CAAC,CAAa,EAAE,CAAa,EAAc,EAAE,CACzE,IAAA,4BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAD3B,QAAA,aAAa,iBACc;AACjC,MAAM,aAAa,GAAG,CAAC,CAAa,EAAE,CAAa,EAAc,EAAE,CACzE,IAAA,4BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAD3B,QAAA,aAAa,iBACc;AACxC;;;;;;GAMG;AACI,MAAM,iCAAiC,GAAG,CAAC,UAAsB,EAAc,EAAE;IACvF,IAAA,iBAAM,EACL,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EACjF,KAAK,CAAC,uCAAuC,CAC7C,CAAC;IACF,OAAO,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,UAAU,CAAC,YAAY,KAAK,CAAC;QAC5E,CAAC,CAAC;YACA,cAAc,EAAE,IAAA,gBAAK,EAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC;YACpD,YAAY,EAAE,MAAM,CAAC,iBAAiB;SACtC;QACF,CAAC,CAAC;YACA,cAAc,EAAE,IAAA,gBAAK,EAAC,UAAU,CAAC,cAAc,CAAC;YAChD,YAAY,EAAE,UAAU,CAAC,YAAY,GAAG,CAAC;SACzC,CAAC;AACL,CAAC,CAAC;AAdW,QAAA,iCAAiC,qCAc5C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { brand } from \"../util/index.js\";\n\nimport type { SequenceId } from \"./editManagerFormatCommons.js\";\n\n/**\n * Compares two sequenceIds. Returns a negative number if a \\< b, a positive number if a \\> b, and 0 if a === b.\n * Note that this handles cases where indexInBatch is Number.POSITIVE_INFINITY.\n */\nexport const sequenceIdComparator = (a: SequenceId, b: SequenceId): number =>\n\ta.sequenceNumber !== b.sequenceNumber\n\t\t? a.sequenceNumber - b.sequenceNumber\n\t\t: a.indexInBatch === b.indexInBatch\n\t\t\t? 0\n\t\t\t: (a.indexInBatch ?? 0) - (b.indexInBatch ?? 0);\nexport const equalSequenceIds = (a: SequenceId, b: SequenceId): boolean =>\n\tsequenceIdComparator(a, b) === 0;\nexport const minSequenceId = (a: SequenceId, b: SequenceId): SequenceId =>\n\tsequenceIdComparator(a, b) < 0 ? a : b;\nexport const maxSequenceId = (a: SequenceId, b: SequenceId): SequenceId =>\n\tsequenceIdComparator(a, b) > 0 ? a : b;\n/**\n * Returns the upper bound (maximum possible) sequenceId that can occur just before the given sequenceId.\n * Some examples:\n * 1. sequenceId = \\{ sequenceNumber: 1, indexInBatch: 2 \\}. The upper bound is \\{ sequenceNumber: 1, indexInBatch: 1 \\}.\n * 2. sequenceId = \\{ sequenceNumber: 2 \\}. The upper bound is \\{ sequenceNumber: 1, indexInBatch: Number.POSITIVE_INFINITY \\}.\n * The indexInBatch value of the previous commit will depend on how many ops were in the previous batch of messages received.\n */\nexport const getUpperBoundOfPreviousSequenceId = (sequenceId: SequenceId): SequenceId => {\n\tassert(\n\t\tsequenceId.indexInBatch === undefined || Number.isFinite(sequenceId.indexInBatch),\n\t\t0xabc /* indexInBatch must not be infinity */,\n\t);\n\treturn sequenceId.indexInBatch === undefined || sequenceId.indexInBatch === 0\n\t\t? {\n\t\t\t\tsequenceNumber: brand(sequenceId.sequenceNumber - 1),\n\t\t\t\tindexInBatch: Number.POSITIVE_INFINITY,\n\t\t\t}\n\t\t: {\n\t\t\t\tsequenceNumber: brand(sequenceId.sequenceNumber),\n\t\t\t\tindexInBatch: sequenceId.indexInBatch - 1,\n\t\t\t};\n};\n"]}
@@ -10,7 +10,7 @@ import type { IChannelView, IFluidSerializer } from "@fluidframework/shared-obje
10
10
  import type { ICodecOptions } from "../codec/index.js";
11
11
  import { type ChangeFamily, type ChangeFamilyEditor, type GraphCommit, type RevisionTag, type SchemaAndPolicy, type SchemaPolicy, type TreeStoredSchemaRepository } from "../core/index.js";
12
12
  import { type JsonCompatibleReadOnly, type Breakable, type WithBreakable } from "../util/index.js";
13
- import type { SharedTreeBranch } from "./branch.js";
13
+ import type { BranchId, SharedTreeBranch } from "./branch.js";
14
14
  import { BranchCommitEnricher } from "./branchCommitEnricher.js";
15
15
  import { type ChangeEnricherReadonlyCheckout } from "./changeEnricher.js";
16
16
  import type { ResubmitMachine } from "./resubmitMachine.js";
@@ -29,7 +29,8 @@ export declare class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange>
29
29
  readonly sharedObject: IChannelView & IFluidLoadable;
30
30
  readonly serializer: IFluidSerializer;
31
31
  readonly submitLocalMessage: (content: unknown, localOpMetadata?: unknown) => void;
32
- private readonly idCompressor;
32
+ protected readonly changeFamily: ChangeFamily<TEditor, TChange>;
33
+ protected readonly idCompressor: IIdCompressor;
33
34
  readonly getEditor: () => TEditor;
34
35
  private readonly editManager;
35
36
  private readonly summarizables;
@@ -49,8 +50,7 @@ export declare class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange>
49
50
  * and an op needs to be interpreted which isn't written with the current configuration).
50
51
  */
51
52
  private readonly messageCodec;
52
- private readonly resubmitMachine;
53
- readonly commitEnricher: BranchCommitEnricher<TChange>;
53
+ private readonly enrichers;
54
54
  readonly mintRevisionTag: () => RevisionTag;
55
55
  private readonly schemaAndPolicy;
56
56
  /**
@@ -64,6 +64,7 @@ export declare class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange>
64
64
  constructor(breaker: Breakable, sharedObject: IChannelView & IFluidLoadable, serializer: IFluidSerializer, submitLocalMessage: (content: unknown, localOpMetadata?: unknown) => void, logger: ITelemetryBaseLogger | undefined, summarizables: readonly Summarizable[], changeFamily: ChangeFamily<TEditor, TChange>, options: ICodecOptions, formatOptions: ExplicitCoreCodecVersions, idCompressor: IIdCompressor, schema: TreeStoredSchemaRepository, schemaPolicy: SchemaPolicy, resubmitMachine?: ResubmitMachine<TChange>, enricher?: ChangeEnricherReadonlyCheckout<TChange>, getEditor?: () => TEditor);
65
65
  summarizeCore(serializer: IFluidSerializer, telemetryContext?: ITelemetryContext, incrementalSummaryContext?: IExperimentalIncrementalSummaryContext, fullTree?: boolean): ISummaryTreeWithStats;
66
66
  loadCore(services: IChannelStorageService): Promise<void>;
67
+ private registerSharedBranch;
67
68
  private loadSummarizable;
68
69
  /**
69
70
  * Submits an op to the Fluid runtime containing the given commit
@@ -71,16 +72,29 @@ export declare class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange>
71
72
  * @returns the submitted commit. This is undefined if the underlying `SharedObject` is not attached,
72
73
  * and may differ from `commit` due to enrichments like detached tree refreshers.
73
74
  */
74
- protected submitCommit(commit: GraphCommit<TChange>, schemaAndPolicy: ClonableSchemaAndPolicy, isResubmit: boolean): void;
75
+ protected submitCommit(branchId: BranchId, commit: GraphCommit<TChange>, schemaAndPolicy: ClonableSchemaAndPolicy, isResubmit: boolean): void;
76
+ protected submitBranchCreation(branchId: BranchId): void;
77
+ private submitMessage;
75
78
  /**
76
79
  * Process a bunch of messages from the runtime. SharedObject will call this method with a bunch of messages.
77
80
  */
78
81
  processMessagesCore(messagesCollection: IRuntimeMessageCollection): void;
82
+ private processCommits;
79
83
  getLocalBranch(): SharedTreeBranch<TEditor, TChange>;
84
+ getSharedBranchIds(): string[];
85
+ createSharedBranch(): string;
86
+ protected addBranch(branchId: BranchId): void;
87
+ getSharedBranch(branchId: BranchId): SharedTreeBranch<TEditor, TChange>;
80
88
  didAttach(): void;
81
89
  reSubmitCore(content: JsonCompatibleReadOnly, localOpMetadata: unknown): void;
82
90
  rollback(content: JsonCompatibleReadOnly, localOpMetadata: unknown): void;
83
91
  applyStashedOp(content: JsonCompatibleReadOnly): void;
92
+ protected registerSharedBranchForEditing(branchId: BranchId, enricher: ChangeEnricherReadonlyCheckout<TChange>, resubmitMachine?: ResubmitMachine<TChange>): void;
93
+ private getResubmitMachine;
94
+ private tryGetResubmitMachine;
95
+ getCommitEnricher(branchId: BranchId): BranchCommitEnricher<TChange>;
96
+ private getEnricherState;
97
+ private tryGetEnricherState;
84
98
  }
85
99
  /**
86
100
  * Specifies the behavior of a component that puts data in a summary.
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTreeCore.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/sharedTreeCore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sharedTreeCore.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/sharedTreeCore.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,7 @@ let SharedTreeCore = (() => {
81
81
  this.sharedObject = sharedObject;
82
82
  this.serializer = serializer;
83
83
  this.submitLocalMessage = submitLocalMessage;
84
+ this.changeFamily = changeFamily;
84
85
  this.idCompressor = idCompressor;
85
86
  this.getEditor = getEditor;
86
87
  /**
@@ -89,6 +90,7 @@ let SharedTreeCore = (() => {
89
90
  * Is `undefined` after (and only after) this instance is attached.
90
91
  */
91
92
  this.detachedRevision = editManager_js_1.minimumPossibleSequenceNumber;
93
+ this.enrichers = new Map();
92
94
  this.schemaAndPolicy = {
93
95
  schema,
94
96
  policy: schemaPolicy,
@@ -104,18 +106,8 @@ let SharedTreeCore = (() => {
104
106
  * This is used rather than the Fluid client ID because the Fluid client ID is not stable across reconnections.
105
107
  */
106
108
  const localSessionId = idCompressor.localSessionId;
107
- this.editManager = new editManager_js_1.EditManager(changeFamily, localSessionId, this.mintRevisionTag, rebaseLogger);
108
- this.editManager.localBranch.events.on("beforeChange", (change) => {
109
- if (this.detachedRevision === undefined) {
110
- // Commit enrichment is only necessary for changes that will be submitted as ops, and changes issued while detached are not submitted.
111
- this.commitEnricher.processChange(change);
112
- }
113
- if (change.type === "append") {
114
- for (const commit of change.newCommits) {
115
- this.submitCommit(commit, this.schemaAndPolicy, false);
116
- }
117
- }
118
- });
109
+ this.editManager = new editManager_js_1.EditManager(changeFamily, localSessionId, this.mintRevisionTag, (branchId) => this.registerSharedBranch(branchId), rebaseLogger);
110
+ this.registerSharedBranch("main");
119
111
  const revisionTagCodec = new index_js_1.RevisionTagCodec(idCompressor);
120
112
  const editManagerCodec = (0, editManagerCodecs_js_1.makeEditManagerCodec)(this.editManager.changeFamily.codecs, revisionTagCodec, options, formatOptions.editManager);
121
113
  this.summarizables = [
@@ -124,11 +116,7 @@ let SharedTreeCore = (() => {
124
116
  ];
125
117
  (0, internal_1.assert)(new Set(this.summarizables.map((e) => e.key)).size === this.summarizables.length, 0x350 /* Index summary element keys must be unique */);
126
118
  this.messageCodec = (0, messageCodecs_js_1.makeMessageCodec)(changeFamily.codecs, new index_js_1.RevisionTagCodec(idCompressor), options, formatOptions.message);
127
- const changeEnricher = enricher ?? new changeEnricher_js_1.NoOpChangeEnricher();
128
- this.resubmitMachine =
129
- resubmitMachine ??
130
- new defaultResubmitMachine_js_1.DefaultResubmitMachine((change) => changeFamily.rebaser.invert(change, true, this.mintRevisionTag()), changeEnricher);
131
- this.commitEnricher = new branchCommitEnricher_js_1.BranchCommitEnricher(changeFamily.rebaser, changeEnricher);
119
+ this.registerSharedBranchForEditing("main", enricher ?? new changeEnricher_js_1.NoOpChangeEnricher(), resubmitMachine);
132
120
  }
133
121
  // TODO: SharedObject's merging of the two summary methods into summarizeCore is not what we want here:
134
122
  // We might want to not subclass it, or override/reimplement most of its functionality.
@@ -156,7 +144,7 @@ let SharedTreeCore = (() => {
156
144
  return builder.getSummaryTree();
157
145
  }
158
146
  async loadCore(services) {
159
- (0, internal_1.assert)(this.editManager.localBranch.getHead() === this.editManager.getTrunkHead(), 0xaaa /* All local changes should be applied to the trunk before loading from summary */);
147
+ (0, internal_1.assert)(this.getLocalBranch().getHead() === this.editManager.getTrunkHead("main"), 0xaaa /* All local changes should be applied to the trunk before loading from summary */);
160
148
  const [editManagerSummarizer, ...summarizables] = this.summarizables;
161
149
  const loadEditManager = this.loadSummarizable(editManagerSummarizer, services);
162
150
  const loadSummarizables = summarizables.map(async (s) => this.loadSummarizable(s, services));
@@ -164,8 +152,7 @@ let SharedTreeCore = (() => {
164
152
  // If we are detached but loading from a summary, then we need to update our detached revision to ensure that it is ahead of all detached revisions in the summary.
165
153
  // First, finish loading the edit manager so that we can inspect the sequence numbers of the commits on the trunk.
166
154
  await loadEditManager;
167
- const head = this.editManager.getTrunkHead();
168
- const latestDetachedSequenceNumber = this.editManager.getSequenceNumber(head);
155
+ const latestDetachedSequenceNumber = this.editManager.getLatestSequenceNumber();
169
156
  // When we load a summary for a tree that was never attached,
170
157
  // latestDetachedSequenceNumber is either undefined (no commits in summary) or negative (all commits in summary were made while detached).
171
158
  // We only need to update `this.detachedRevision` in the latter case.
@@ -178,6 +165,19 @@ let SharedTreeCore = (() => {
178
165
  await Promise.all([loadEditManager, ...loadSummarizables]);
179
166
  }
180
167
  }
168
+ registerSharedBranch(branchId) {
169
+ this.editManager.getLocalBranch(branchId).events.on("beforeChange", (change) => {
170
+ if (change.type === "append") {
171
+ if (this.detachedRevision === undefined) {
172
+ // Commit enrichment is only necessary for changes that will be submitted as ops, and changes issued while detached are not submitted.
173
+ this.getCommitEnricher(branchId).processChange(change);
174
+ }
175
+ for (const commit of change.newCommits) {
176
+ this.submitCommit(branchId, commit, this.schemaAndPolicy, false);
177
+ }
178
+ }
179
+ });
180
+ }
181
181
  async loadSummarizable(summarizable, services) {
182
182
  return summarizable.load(scopeStorageService(services, summarizablesTreeKey, summarizable.key), (contents) => this.serializer.parse(contents));
183
183
  }
@@ -187,10 +187,10 @@ let SharedTreeCore = (() => {
187
187
  * @returns the submitted commit. This is undefined if the underlying `SharedObject` is not attached,
188
188
  * and may differ from `commit` due to enrichments like detached tree refreshers.
189
189
  */
190
- submitCommit(commit, schemaAndPolicy, isResubmit) {
190
+ submitCommit(branchId, commit, schemaAndPolicy, isResubmit) {
191
191
  (0, internal_1.assert)(this.sharedObject.isAttached() === (this.detachedRevision === undefined), 0x95a /* Detached revision should only be set when not attached */);
192
192
  const enrichedCommit = this.detachedRevision === undefined && !isResubmit
193
- ? this.commitEnricher.enrich(commit)
193
+ ? this.getCommitEnricher(branchId).enrich(commit)
194
194
  : commit;
195
195
  // Edits submitted before the first attach are treated as sequenced because they will be included
196
196
  // in the attach summary that is uploaded to the service.
@@ -198,23 +198,31 @@ let SharedTreeCore = (() => {
198
198
  if (this.detachedRevision !== undefined) {
199
199
  const newRevision = (0, index_js_2.brand)(this.detachedRevision + 1);
200
200
  this.detachedRevision = newRevision;
201
- this.editManager.addSequencedChanges([enrichedCommit], this.editManager.localSessionId, newRevision, this.detachedRevision);
201
+ this.editManager.addSequencedChanges([enrichedCommit], this.editManager.localSessionId, newRevision, this.detachedRevision, branchId);
202
202
  this.editManager.advanceMinimumSequenceNumber(newRevision, false);
203
203
  return undefined;
204
204
  }
205
- const message = this.messageCodec.encode({
205
+ this.submitMessage({
206
+ type: "commit",
206
207
  commit: enrichedCommit,
207
208
  sessionId: this.editManager.localSessionId,
208
- }, {
209
+ branchId,
210
+ }, schemaAndPolicy);
211
+ this.getResubmitMachine(branchId).onCommitSubmitted(enrichedCommit);
212
+ }
213
+ submitBranchCreation(branchId) {
214
+ this.submitMessage({ type: "branch", sessionId: this.editManager.localSessionId, branchId }, this.schemaAndPolicy);
215
+ }
216
+ submitMessage(message, schemaAndPolicy) {
217
+ const encodedMessage = this.messageCodec.encode(message, {
209
218
  idCompressor: this.idCompressor,
210
219
  schema: schemaAndPolicy,
211
220
  });
212
- this.submitLocalMessage(message, {
221
+ this.submitLocalMessage(encodedMessage, {
213
222
  // Clone the schema to ensure that during resubmit the schema has not been mutated by later changes
214
223
  schema: schemaAndPolicy.schema.clone(),
215
224
  policy: schemaAndPolicy.policy,
216
225
  });
217
- this.resubmitMachine.onCommitSubmitted(enrichedCommit);
218
226
  }
219
227
  /**
220
228
  * Process a bunch of messages from the runtime. SharedObject will call this method with a bunch of messages.
@@ -223,66 +231,182 @@ let SharedTreeCore = (() => {
223
231
  const { envelope, local, messagesContent } = messagesCollection;
224
232
  const commits = [];
225
233
  let messagesSessionId;
234
+ let branchId;
235
+ const processBunch = (branch) => {
236
+ (0, internal_1.assert)(messagesSessionId !== undefined, 0xada /* Messages must have a session ID */);
237
+ this.processCommits(messagesSessionId, (0, index_js_2.brand)(envelope.sequenceNumber), (0, index_js_2.brand)(envelope.referenceSequenceNumber), local, branch, commits);
238
+ commits.length = 0;
239
+ branchId = undefined;
240
+ };
226
241
  // Get a list of all the commits from the messages.
227
242
  for (const messageContent of messagesContent) {
228
243
  // Empty context object is passed in, as our decode function is schema-agnostic.
229
- const { commit, sessionId } = this.messageCodec.decode(messageContent.contents, {
244
+ const message = this.messageCodec.decode(messageContent.contents, {
230
245
  idCompressor: this.idCompressor,
231
246
  });
232
- commits.push(commit);
233
247
  if (messagesSessionId !== undefined) {
234
- (0, internal_1.assert)(messagesSessionId === sessionId, 0xad9 /* All messages in a bunch must have the same session ID */);
248
+ (0, internal_1.assert)(messagesSessionId === message.sessionId, 0xad9 /* All messages in a bunch must have the same session ID */);
249
+ }
250
+ messagesSessionId = message.sessionId;
251
+ const type = message.type;
252
+ switch (type) {
253
+ case "commit": {
254
+ if (branchId !== undefined && message.branchId !== branchId) {
255
+ processBunch(branchId);
256
+ }
257
+ branchId = message.branchId;
258
+ commits.push(message.commit);
259
+ break;
260
+ }
261
+ case "branch": {
262
+ if (branchId !== undefined) {
263
+ processBunch(branchId);
264
+ }
265
+ this.editManager.sequenceBranchCreation(messagesSessionId, (0, index_js_2.brand)(envelope.referenceSequenceNumber), message.branchId);
266
+ break;
267
+ }
268
+ default:
269
+ (0, internal_1.unreachableCase)(type);
235
270
  }
236
- messagesSessionId = sessionId;
237
271
  }
238
- (0, internal_1.assert)(messagesSessionId !== undefined, 0xada /* Messages must have a session ID */);
239
- this.editManager.addSequencedChanges(commits, messagesSessionId, (0, index_js_2.brand)(envelope.sequenceNumber), (0, index_js_2.brand)(envelope.referenceSequenceNumber));
240
- // Update the resubmit machine for each commit applied.
241
- for (const _ of messagesContent) {
242
- this.resubmitMachine.onSequencedCommitApplied(local);
272
+ if (branchId !== undefined) {
273
+ processBunch(branchId);
243
274
  }
244
275
  this.editManager.advanceMinimumSequenceNumber((0, index_js_2.brand)(envelope.minimumSequenceNumber));
245
276
  }
277
+ processCommits(sessionId, sequenceNumber, referenceSequenceNumber, isLocal, branchId, commits) {
278
+ this.editManager.addSequencedChanges(commits, sessionId, sequenceNumber, referenceSequenceNumber, branchId);
279
+ // Update the resubmit machine for each commit applied.
280
+ for (const _ of commits) {
281
+ this.tryGetResubmitMachine(branchId)?.onSequencedCommitApplied(isLocal);
282
+ }
283
+ }
246
284
  getLocalBranch() {
247
- return this.editManager.localBranch;
285
+ return this.editManager.getLocalBranch("main");
286
+ }
287
+ getSharedBranchIds() {
288
+ return this.editManager
289
+ .getSharedBranchIds()
290
+ .filter((id) => id !== "main")
291
+ .map((id) => this.idCompressor.decompress(id));
292
+ }
293
+ createSharedBranch() {
294
+ const branchId = this.idCompressor.generateCompressedId();
295
+ this.addBranch(branchId);
296
+ this.submitBranchCreation(branchId);
297
+ return this.idCompressor.decompress(branchId);
298
+ }
299
+ addBranch(branchId) {
300
+ this.editManager.addNewBranch(branchId);
301
+ }
302
+ getSharedBranch(branchId) {
303
+ return this.editManager.getLocalBranch(branchId);
248
304
  }
249
305
  didAttach() {
250
306
  this.detachedRevision = undefined;
251
307
  }
252
308
  reSubmitCore(content, localOpMetadata) {
253
309
  // Empty context object is passed in, as our decode function is schema-agnostic.
254
- const { commit: { revision }, } = this.messageCodec.decode(this.serializer.decode(content), {
310
+ const message = this.messageCodec.decode(this.serializer.decode(content), {
255
311
  idCompressor: this.idCompressor,
256
312
  });
257
- // If a resubmit phase is not already in progress, then this must be the first commit of a new resubmit phase.
258
- if (this.resubmitMachine.isInResubmitPhase === false) {
259
- const localCommits = this.editManager.getLocalCommits();
260
- const revisionIndex = localCommits.findIndex((c) => c.revision === revision);
261
- (0, internal_1.assert)(revisionIndex >= 0, 0xbdb /* revision must exist in local commits */);
262
- const toResubmit = localCommits.slice(revisionIndex);
263
- this.resubmitMachine.prepareForResubmit(toResubmit);
313
+ const type = message.type;
314
+ switch (type) {
315
+ case "commit": {
316
+ const { commit: { revision }, branchId, } = message;
317
+ const resubmitMachine = this.getResubmitMachine(branchId);
318
+ // If a resubmit phase is not already in progress, then this must be the first commit of a new resubmit phase.
319
+ if (resubmitMachine.isInResubmitPhase === false) {
320
+ const localCommits = this.editManager.getLocalCommits(branchId);
321
+ const revisionIndex = localCommits.findIndex((c) => c.revision === revision);
322
+ (0, internal_1.assert)(revisionIndex >= 0, 0xbdb /* revision must exist in local commits */);
323
+ const toResubmit = localCommits.slice(revisionIndex);
324
+ resubmitMachine.prepareForResubmit(toResubmit);
325
+ }
326
+ (0, internal_1.assert)(isClonableSchemaPolicy(localOpMetadata), 0x95e /* Local metadata must contain schema and policy. */);
327
+ (0, internal_1.assert)(resubmitMachine.isInResubmitPhase !== false, 0x984 /* Invalid resubmit outside of resubmit phase */);
328
+ const enrichedCommit = resubmitMachine.peekNextCommit();
329
+ this.submitCommit(branchId, enrichedCommit, localOpMetadata, true);
330
+ break;
331
+ }
332
+ case "branch": {
333
+ this.submitBranchCreation(message.branchId);
334
+ break;
335
+ }
336
+ default:
337
+ (0, internal_1.unreachableCase)(type);
264
338
  }
265
- (0, internal_1.assert)(isClonableSchemaPolicy(localOpMetadata), 0x95e /* Local metadata must contain schema and policy. */);
266
- (0, internal_1.assert)(this.resubmitMachine.isInResubmitPhase !== false, 0x984 /* Invalid resubmit outside of resubmit phase */);
267
- const enrichedCommit = this.resubmitMachine.peekNextCommit();
268
- this.submitCommit(enrichedCommit, localOpMetadata, true);
269
339
  }
270
340
  rollback(content, localOpMetadata) {
271
341
  // Empty context object is passed in, as our decode function is schema-agnostic.
272
- const { commit: { revision }, } = this.messageCodec.decode(this.serializer.decode(content), {
342
+ const message = this.messageCodec.decode(this.serializer.decode(content), {
273
343
  idCompressor: this.idCompressor,
274
344
  });
275
- const [commit] = this.editManager.findLocalCommit(revision);
276
- const { parent } = commit;
277
- (0, internal_1.assert)(parent !== undefined, 0xbdc /* must have parent */);
278
- const [precedingCommit] = this.editManager.findLocalCommit(parent.revision);
279
- this.editManager.localBranch.removeAfter(precedingCommit);
280
- this.resubmitMachine.onCommitRollback(commit);
345
+ const type = message.type;
346
+ switch (type) {
347
+ case "commit": {
348
+ const { commit: { revision }, branchId, } = message;
349
+ const branch = this.editManager.getLocalBranch(branchId);
350
+ const head = branch.getHead();
351
+ (0, internal_1.assert)(head.revision === revision, 0xc6b /* Can only rollback latest commit */);
352
+ const newHead = head.parent ?? (0, internal_1.fail)(0xc6c /* must have parent */);
353
+ branch.removeAfter(newHead);
354
+ this.getResubmitMachine(branchId).onCommitRollback(head);
355
+ break;
356
+ }
357
+ case "branch": {
358
+ this.editManager.removeBranch(message.branchId);
359
+ break;
360
+ }
361
+ default:
362
+ (0, internal_1.unreachableCase)(type);
363
+ }
281
364
  }
282
365
  applyStashedOp(content) {
283
366
  // Empty context object is passed in, as our decode function is schema-agnostic.
284
- const { commit: { revision, change }, } = this.messageCodec.decode(content, { idCompressor: this.idCompressor });
285
- this.editManager.localBranch.apply({ change, revision });
367
+ const message = this.messageCodec.decode(this.serializer.decode(content), {
368
+ idCompressor: this.idCompressor,
369
+ });
370
+ const type = message.type;
371
+ switch (type) {
372
+ case "commit": {
373
+ const { commit: { revision, change }, branchId, } = message;
374
+ this.editManager.getLocalBranch(branchId).apply({ change, revision });
375
+ break;
376
+ }
377
+ case "branch": {
378
+ this.editManager.addNewBranch(message.branchId);
379
+ break;
380
+ }
381
+ default:
382
+ (0, internal_1.unreachableCase)(type);
383
+ }
384
+ }
385
+ registerSharedBranchForEditing(branchId, enricher, resubmitMachine) {
386
+ const changeEnricher = enricher ?? new changeEnricher_js_1.NoOpChangeEnricher();
387
+ const commitEnricher = new branchCommitEnricher_js_1.BranchCommitEnricher(this.changeFamily.rebaser, changeEnricher);
388
+ (0, internal_1.assert)(!this.enrichers.has(branchId), 0xc6d /* Branch already registered */);
389
+ this.enrichers.set(branchId, {
390
+ enricher: commitEnricher,
391
+ resubmitMachine: resubmitMachine ??
392
+ new defaultResubmitMachine_js_1.DefaultResubmitMachine((change) => this.changeFamily.rebaser.invert(change, true, this.mintRevisionTag()), changeEnricher),
393
+ });
394
+ }
395
+ getResubmitMachine(branchId) {
396
+ return this.getEnricherState(branchId).resubmitMachine;
397
+ }
398
+ tryGetResubmitMachine(branchId) {
399
+ return this.tryGetEnricherState(branchId)?.resubmitMachine;
400
+ }
401
+ getCommitEnricher(branchId) {
402
+ return this.getEnricherState(branchId).enricher;
403
+ }
404
+ getEnricherState(branchId) {
405
+ return (this.tryGetEnricherState(branchId) ??
406
+ (0, internal_1.fail)(0xc6e /* Expected to have a resubmit machine for this branch */));
407
+ }
408
+ tryGetEnricherState(branchId) {
409
+ return this.enrichers.get(branchId);
286
410
  }
287
411
  };
288
412
  __setFunctionName(_classThis, "SharedTreeCore");