@fluidframework/tree 2.116.1 → 2.117.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 (362) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/api-report/tree.alpha.api.md +78 -30
  3. package/api-report/tree.beta.api.md +12 -9
  4. package/api-report/tree.legacy.beta.api.md +12 -9
  5. package/dist/codec/codec.d.ts +18 -0
  6. package/dist/codec/codec.d.ts.map +1 -1
  7. package/dist/codec/codec.js +18 -0
  8. package/dist/codec/codec.js.map +1 -1
  9. package/dist/core/index.d.ts +2 -2
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +3 -2
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/index.d.ts +1 -1
  14. package/dist/core/rebase/index.d.ts.map +1 -1
  15. package/dist/core/rebase/index.js +2 -1
  16. package/dist/core/rebase/index.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +39 -2
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js +37 -2
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/rebase/utils.d.ts.map +1 -1
  22. package/dist/core/rebase/utils.js +1 -0
  23. package/dist/core/rebase/utils.js.map +1 -1
  24. package/dist/core/revertible.d.ts +62 -6
  25. package/dist/core/revertible.d.ts.map +1 -1
  26. package/dist/core/revertible.js.map +1 -1
  27. package/dist/entrypoints/alpha.d.ts +1 -1
  28. package/dist/entrypoints/alpha.d.ts.map +1 -1
  29. package/dist/entrypoints/alpha.js.map +1 -1
  30. package/dist/entrypoints/beta.d.ts +1 -1
  31. package/dist/entrypoints/beta.d.ts.map +1 -1
  32. package/dist/entrypoints/beta.js.map +1 -1
  33. package/dist/entrypoints/legacy.d.ts +1 -1
  34. package/dist/entrypoints/legacy.d.ts.map +1 -1
  35. package/dist/entrypoints/legacy.js.map +1 -1
  36. package/dist/feature-libraries/indexing/types.d.ts +1 -1
  37. package/dist/feature-libraries/indexing/types.js.map +1 -1
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/packageVersion.d.ts +1 -1
  42. package/dist/packageVersion.js +1 -1
  43. package/dist/packageVersion.js.map +1 -1
  44. package/dist/shared-tree/history.d.ts +22 -0
  45. package/dist/shared-tree/history.d.ts.map +1 -0
  46. package/dist/shared-tree/history.js +66 -0
  47. package/dist/shared-tree/history.js.map +1 -0
  48. package/dist/shared-tree/schematizingTreeView.d.ts +12 -7
  49. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  50. package/dist/shared-tree/schematizingTreeView.js +13 -0
  51. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  52. package/dist/shared-tree/sharedTree.d.ts +3 -2
  53. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  54. package/dist/shared-tree/sharedTree.js +2 -0
  55. package/dist/shared-tree/sharedTree.js.map +1 -1
  56. package/dist/shared-tree/tree.js +1 -1
  57. package/dist/shared-tree/tree.js.map +1 -1
  58. package/dist/shared-tree/treeAlpha.d.ts +8 -20
  59. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  60. package/dist/shared-tree/treeAlpha.js +9 -12
  61. package/dist/shared-tree/treeAlpha.js.map +1 -1
  62. package/dist/shared-tree/treeCheckout.d.ts +16 -9
  63. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  64. package/dist/shared-tree/treeCheckout.js +122 -25
  65. package/dist/shared-tree/treeCheckout.js.map +1 -1
  66. package/dist/shared-tree/unhydratedTreeContext.d.ts +3 -2
  67. package/dist/shared-tree/unhydratedTreeContext.d.ts.map +1 -1
  68. package/dist/shared-tree/unhydratedTreeContext.js +3 -0
  69. package/dist/shared-tree/unhydratedTreeContext.js.map +1 -1
  70. package/dist/shared-tree-core/branch.d.ts +16 -2
  71. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  72. package/dist/shared-tree-core/branch.js +20 -2
  73. package/dist/shared-tree-core/branch.js.map +1 -1
  74. package/dist/shared-tree-core/branchCommitCounter.d.ts +31 -0
  75. package/dist/shared-tree-core/branchCommitCounter.d.ts.map +1 -0
  76. package/dist/shared-tree-core/branchCommitCounter.js +79 -0
  77. package/dist/shared-tree-core/branchCommitCounter.js.map +1 -0
  78. package/dist/shared-tree-core/customMetadataCodec.d.ts +9 -0
  79. package/dist/shared-tree-core/customMetadataCodec.d.ts.map +1 -0
  80. package/dist/shared-tree-core/customMetadataCodec.js +37 -0
  81. package/dist/shared-tree-core/customMetadataCodec.js.map +1 -0
  82. package/dist/shared-tree-core/customMetadataFormat.d.ts +18 -0
  83. package/dist/shared-tree-core/customMetadataFormat.d.ts.map +1 -0
  84. package/dist/shared-tree-core/customMetadataFormat.js +15 -0
  85. package/dist/shared-tree-core/customMetadataFormat.js.map +1 -0
  86. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  87. package/dist/shared-tree-core/editManager.js +15 -3
  88. package/dist/shared-tree-core/editManager.js.map +1 -1
  89. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  90. package/dist/shared-tree-core/editManagerCodecs.js +5 -0
  91. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  92. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts +1 -1
  93. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  94. package/dist/shared-tree-core/editManagerCodecsCommons.js +17 -5
  95. package/dist/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  96. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  97. package/dist/shared-tree-core/editManagerCodecsV1toV4.js +4 -2
  98. package/dist/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  99. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  100. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js +2 -2
  101. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  102. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +17 -6
  103. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  104. package/dist/shared-tree-core/editManagerFormatCommons.js +18 -8
  105. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  106. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +7 -5
  107. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  108. package/dist/shared-tree-core/editManagerFormatV1toV4.js +4 -3
  109. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  110. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts +4 -0
  111. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -1
  112. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js +2 -2
  113. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -1
  114. package/dist/shared-tree-core/index.d.ts +2 -1
  115. package/dist/shared-tree-core/index.d.ts.map +1 -1
  116. package/dist/shared-tree-core/index.js +3 -1
  117. package/dist/shared-tree-core/index.js.map +1 -1
  118. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +2 -2
  119. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  120. package/dist/shared-tree-core/messageCodecV1ToV4.js +12 -3
  121. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  122. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  123. package/dist/shared-tree-core/messageCodecVSharedBranches.js +8 -2
  124. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  125. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  126. package/dist/shared-tree-core/messageCodecs.js +5 -0
  127. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  128. package/dist/shared-tree-core/messageFormat.d.ts +1 -0
  129. package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
  130. package/dist/shared-tree-core/messageFormat.js +6 -0
  131. package/dist/shared-tree-core/messageFormat.js.map +1 -1
  132. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +10 -3
  133. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  134. package/dist/shared-tree-core/messageFormatV1ToV4.js +10 -2
  135. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  136. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts +7 -0
  137. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  138. package/dist/shared-tree-core/messageFormatVSharedBranches.js +2 -0
  139. package/dist/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  140. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  141. package/dist/shared-tree-core/sharedTreeCore.js +4 -2
  142. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  143. package/dist/shared-tree-core/transaction.d.ts +9 -0
  144. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  145. package/dist/shared-tree-core/transaction.js +26 -4
  146. package/dist/shared-tree-core/transaction.js.map +1 -1
  147. package/dist/simple-tree/api/index.d.ts +1 -1
  148. package/dist/simple-tree/api/index.d.ts.map +1 -1
  149. package/dist/simple-tree/api/index.js.map +1 -1
  150. package/dist/simple-tree/api/transactionTypes.d.ts +28 -2
  151. package/dist/simple-tree/api/transactionTypes.d.ts.map +1 -1
  152. package/dist/simple-tree/api/transactionTypes.js.map +1 -1
  153. package/dist/simple-tree/api/tree.d.ts +180 -61
  154. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  155. package/dist/simple-tree/api/tree.js.map +1 -1
  156. package/dist/simple-tree/index.d.ts +1 -1
  157. package/dist/simple-tree/index.d.ts.map +1 -1
  158. package/dist/simple-tree/index.js.map +1 -1
  159. package/dist/tableSchema.js +10 -10
  160. package/dist/tableSchema.js.map +1 -1
  161. package/lib/codec/codec.d.ts +18 -0
  162. package/lib/codec/codec.d.ts.map +1 -1
  163. package/lib/codec/codec.js +18 -0
  164. package/lib/codec/codec.js.map +1 -1
  165. package/lib/core/index.d.ts +2 -2
  166. package/lib/core/index.d.ts.map +1 -1
  167. package/lib/core/index.js +1 -1
  168. package/lib/core/index.js.map +1 -1
  169. package/lib/core/rebase/index.d.ts +1 -1
  170. package/lib/core/rebase/index.d.ts.map +1 -1
  171. package/lib/core/rebase/index.js +1 -1
  172. package/lib/core/rebase/index.js.map +1 -1
  173. package/lib/core/rebase/types.d.ts +39 -2
  174. package/lib/core/rebase/types.d.ts.map +1 -1
  175. package/lib/core/rebase/types.js +35 -1
  176. package/lib/core/rebase/types.js.map +1 -1
  177. package/lib/core/rebase/utils.d.ts.map +1 -1
  178. package/lib/core/rebase/utils.js +1 -0
  179. package/lib/core/rebase/utils.js.map +1 -1
  180. package/lib/core/revertible.d.ts +62 -6
  181. package/lib/core/revertible.d.ts.map +1 -1
  182. package/lib/core/revertible.js.map +1 -1
  183. package/lib/entrypoints/alpha.d.ts +1 -1
  184. package/lib/entrypoints/alpha.d.ts.map +1 -1
  185. package/lib/entrypoints/alpha.js.map +1 -1
  186. package/lib/entrypoints/beta.d.ts +1 -1
  187. package/lib/entrypoints/beta.d.ts.map +1 -1
  188. package/lib/entrypoints/beta.js.map +1 -1
  189. package/lib/entrypoints/legacy.d.ts +1 -1
  190. package/lib/entrypoints/legacy.d.ts.map +1 -1
  191. package/lib/entrypoints/legacy.js.map +1 -1
  192. package/lib/feature-libraries/indexing/types.d.ts +1 -1
  193. package/lib/feature-libraries/indexing/types.js.map +1 -1
  194. package/lib/index.d.ts +2 -2
  195. package/lib/index.d.ts.map +1 -1
  196. package/lib/index.js.map +1 -1
  197. package/lib/packageVersion.d.ts +1 -1
  198. package/lib/packageVersion.js +1 -1
  199. package/lib/packageVersion.js.map +1 -1
  200. package/lib/shared-tree/history.d.ts +22 -0
  201. package/lib/shared-tree/history.d.ts.map +1 -0
  202. package/lib/shared-tree/history.js +62 -0
  203. package/lib/shared-tree/history.js.map +1 -0
  204. package/lib/shared-tree/schematizingTreeView.d.ts +12 -7
  205. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  206. package/lib/shared-tree/schematizingTreeView.js +13 -0
  207. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  208. package/lib/shared-tree/sharedTree.d.ts +3 -2
  209. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  210. package/lib/shared-tree/sharedTree.js +2 -0
  211. package/lib/shared-tree/sharedTree.js.map +1 -1
  212. package/lib/shared-tree/tree.js +1 -1
  213. package/lib/shared-tree/tree.js.map +1 -1
  214. package/lib/shared-tree/treeAlpha.d.ts +8 -20
  215. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  216. package/lib/shared-tree/treeAlpha.js +9 -12
  217. package/lib/shared-tree/treeAlpha.js.map +1 -1
  218. package/lib/shared-tree/treeCheckout.d.ts +16 -9
  219. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  220. package/lib/shared-tree/treeCheckout.js +123 -26
  221. package/lib/shared-tree/treeCheckout.js.map +1 -1
  222. package/lib/shared-tree/unhydratedTreeContext.d.ts +3 -2
  223. package/lib/shared-tree/unhydratedTreeContext.d.ts.map +1 -1
  224. package/lib/shared-tree/unhydratedTreeContext.js +3 -0
  225. package/lib/shared-tree/unhydratedTreeContext.js.map +1 -1
  226. package/lib/shared-tree-core/branch.d.ts +16 -2
  227. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  228. package/lib/shared-tree-core/branch.js +20 -2
  229. package/lib/shared-tree-core/branch.js.map +1 -1
  230. package/lib/shared-tree-core/branchCommitCounter.d.ts +31 -0
  231. package/lib/shared-tree-core/branchCommitCounter.d.ts.map +1 -0
  232. package/lib/shared-tree-core/branchCommitCounter.js +75 -0
  233. package/lib/shared-tree-core/branchCommitCounter.js.map +1 -0
  234. package/lib/shared-tree-core/customMetadataCodec.d.ts +9 -0
  235. package/lib/shared-tree-core/customMetadataCodec.d.ts.map +1 -0
  236. package/lib/shared-tree-core/customMetadataCodec.js +32 -0
  237. package/lib/shared-tree-core/customMetadataCodec.js.map +1 -0
  238. package/lib/shared-tree-core/customMetadataFormat.d.ts +18 -0
  239. package/lib/shared-tree-core/customMetadataFormat.d.ts.map +1 -0
  240. package/lib/shared-tree-core/customMetadataFormat.js +11 -0
  241. package/lib/shared-tree-core/customMetadataFormat.js.map +1 -0
  242. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  243. package/lib/shared-tree-core/editManager.js +16 -4
  244. package/lib/shared-tree-core/editManager.js.map +1 -1
  245. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  246. package/lib/shared-tree-core/editManagerCodecs.js +5 -0
  247. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  248. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts +1 -1
  249. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  250. package/lib/shared-tree-core/editManagerCodecsCommons.js +17 -5
  251. package/lib/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  252. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  253. package/lib/shared-tree-core/editManagerCodecsV1toV4.js +4 -2
  254. package/lib/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  255. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  256. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js +2 -2
  257. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  258. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +17 -6
  259. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  260. package/lib/shared-tree-core/editManagerFormatCommons.js +18 -8
  261. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  262. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +7 -5
  263. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  264. package/lib/shared-tree-core/editManagerFormatV1toV4.js +4 -3
  265. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  266. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts +4 -0
  267. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -1
  268. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js +2 -2
  269. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -1
  270. package/lib/shared-tree-core/index.d.ts +2 -1
  271. package/lib/shared-tree-core/index.d.ts.map +1 -1
  272. package/lib/shared-tree-core/index.js +1 -0
  273. package/lib/shared-tree-core/index.js.map +1 -1
  274. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +2 -2
  275. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  276. package/lib/shared-tree-core/messageCodecV1ToV4.js +12 -3
  277. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  278. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  279. package/lib/shared-tree-core/messageCodecVSharedBranches.js +8 -2
  280. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  281. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  282. package/lib/shared-tree-core/messageCodecs.js +5 -0
  283. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  284. package/lib/shared-tree-core/messageFormat.d.ts +1 -0
  285. package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
  286. package/lib/shared-tree-core/messageFormat.js +6 -0
  287. package/lib/shared-tree-core/messageFormat.js.map +1 -1
  288. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +10 -3
  289. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  290. package/lib/shared-tree-core/messageFormatV1ToV4.js +10 -2
  291. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  292. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts +7 -0
  293. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  294. package/lib/shared-tree-core/messageFormatVSharedBranches.js +2 -0
  295. package/lib/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  296. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  297. package/lib/shared-tree-core/sharedTreeCore.js +5 -3
  298. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  299. package/lib/shared-tree-core/transaction.d.ts +9 -0
  300. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  301. package/lib/shared-tree-core/transaction.js +27 -5
  302. package/lib/shared-tree-core/transaction.js.map +1 -1
  303. package/lib/simple-tree/api/index.d.ts +1 -1
  304. package/lib/simple-tree/api/index.d.ts.map +1 -1
  305. package/lib/simple-tree/api/index.js.map +1 -1
  306. package/lib/simple-tree/api/transactionTypes.d.ts +28 -2
  307. package/lib/simple-tree/api/transactionTypes.d.ts.map +1 -1
  308. package/lib/simple-tree/api/transactionTypes.js.map +1 -1
  309. package/lib/simple-tree/api/tree.d.ts +180 -61
  310. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  311. package/lib/simple-tree/api/tree.js.map +1 -1
  312. package/lib/simple-tree/index.d.ts +1 -1
  313. package/lib/simple-tree/index.d.ts.map +1 -1
  314. package/lib/simple-tree/index.js.map +1 -1
  315. package/lib/tableSchema.js +10 -10
  316. package/lib/tableSchema.js.map +1 -1
  317. package/package.json +22 -22
  318. package/src/codec/codec.ts +19 -0
  319. package/src/core/index.ts +4 -0
  320. package/src/core/rebase/index.ts +2 -0
  321. package/src/core/rebase/types.ts +72 -2
  322. package/src/core/rebase/utils.ts +1 -0
  323. package/src/core/revertible.ts +67 -6
  324. package/src/entrypoints/alpha.ts +8 -0
  325. package/src/entrypoints/beta.ts +1 -0
  326. package/src/entrypoints/legacy.ts +1 -0
  327. package/src/feature-libraries/indexing/types.ts +1 -1
  328. package/src/index.ts +8 -0
  329. package/src/packageVersion.ts +1 -1
  330. package/src/shared-tree/history.ts +99 -0
  331. package/src/shared-tree/schematizingTreeView.ts +25 -8
  332. package/src/shared-tree/sharedTree.ts +5 -2
  333. package/src/shared-tree/tree.ts +1 -1
  334. package/src/shared-tree/treeAlpha.ts +17 -35
  335. package/src/shared-tree/treeCheckout.ts +170 -31
  336. package/src/shared-tree/unhydratedTreeContext.ts +6 -2
  337. package/src/shared-tree-core/branch.ts +34 -2
  338. package/src/shared-tree-core/branchCommitCounter.ts +103 -0
  339. package/src/shared-tree-core/customMetadataCodec.ts +42 -0
  340. package/src/shared-tree-core/customMetadataFormat.ts +39 -0
  341. package/src/shared-tree-core/editManager.ts +22 -3
  342. package/src/shared-tree-core/editManagerCodecs.ts +12 -0
  343. package/src/shared-tree-core/editManagerCodecsCommons.ts +41 -15
  344. package/src/shared-tree-core/editManagerCodecsV1toV4.ts +7 -1
  345. package/src/shared-tree-core/editManagerCodecsVSharedBranches.ts +2 -0
  346. package/src/shared-tree-core/editManagerFormatCommons.ts +46 -12
  347. package/src/shared-tree-core/editManagerFormatV1toV4.ts +13 -5
  348. package/src/shared-tree-core/editManagerFormatVSharedBranches.ts +2 -2
  349. package/src/shared-tree-core/index.ts +3 -0
  350. package/src/shared-tree-core/messageCodecV1ToV4.ts +18 -5
  351. package/src/shared-tree-core/messageCodecVSharedBranches.ts +9 -2
  352. package/src/shared-tree-core/messageCodecs.ts +12 -0
  353. package/src/shared-tree-core/messageFormat.ts +6 -0
  354. package/src/shared-tree-core/messageFormatV1ToV4.ts +21 -3
  355. package/src/shared-tree-core/messageFormatVSharedBranches.ts +8 -0
  356. package/src/shared-tree-core/sharedTreeCore.ts +5 -2
  357. package/src/shared-tree-core/transaction.ts +56 -4
  358. package/src/simple-tree/api/index.ts +5 -0
  359. package/src/simple-tree/api/transactionTypes.ts +29 -2
  360. package/src/simple-tree/api/tree.ts +199 -60
  361. package/src/simple-tree/index.ts +5 -0
  362. package/src/tableSchema.ts +9 -9
@@ -7,16 +7,50 @@ import { createEmitter } from "@fluid-internal/client-utils";
7
7
  import { assert, unreachableCase, fail } from "@fluidframework/core-utils/internal";
8
8
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
9
9
  import { FluidClientVersion, FormatValidatorNoOp, } from "../codec/index.js";
10
- import { CommitKind, CommitOutcome, RevertibleStatus, TreeStoredSchemaRepository, combineVisitors, makeDetachedFieldIndex, rebaseChange, rootFieldKey, tagChange, visitDelta, isAncestor, moveToDetachedField, LeafNodeStoredSchema, diffHistories, makeAnonChange, deltaFieldMapHasVisibleChanges, findCommonAncestor, rebaseBranch, } from "../core/index.js";
10
+ import { CommitKind, CommitOutcome, RevertibleStatus, TreeStoredSchemaRepository, combineVisitors, makeDetachedFieldIndex, rebaseChange, rootFieldKey, tagChange, visitDelta, isAncestor, moveToDetachedField, LeafNodeStoredSchema, diffHistories, makeAnonChange, deltaFieldMapHasVisibleChanges, findCommonAncestor, rebaseBranch, findAncestor, } from "../core/index.js";
11
11
  import { allowsRepoSuperset, buildForest, createNodeIdentifierManager, defaultSchemaPolicy, fieldBatchCodecBuilder, TreeStatus, intoDelta, jsonableTreeFromCursor, } from "../feature-libraries/index.js";
12
12
  import { SquashingTransactionStack, SharedTreeBranch, TransactionResult as InternalTransactionResult, } from "../shared-tree-core/index.js";
13
13
  import { getInnerNode, getKernel, customFromCursorStored, } from "../simple-tree/index.js";
14
14
  import { Breakable, breakingMethod, disposeSymbol, getOrCreate, hasSome, throwIfBroken, } from "../util/index.js";
15
15
  import { SchematizingSimpleTreeView } from "./schematizingTreeView.js";
16
+ import { DefaultTreeBranchHistory } from "./history.js";
16
17
  import { SharedTreeChangeEnricher } from "./sharedTreeChangeEnricher.js";
17
18
  import { ConstraintStatus, SharedTreeChangeFamily, getConstraintStatus, hasSchemaChange, } from "./sharedTreeChangeFamily.js";
18
19
  import { extractTransactionChangeProcessor } from "./transactionPostProcessor.js";
19
20
  import { SerializedChange } from "./serializedChange.js";
21
+ /**
22
+ * Returns a defensive copy of the given metadata, validating that it can be persisted.
23
+ * @remarks
24
+ * The round-trip through JSON ensures that the value read back locally is exactly the value that peers and
25
+ * future summaries will see, and that later mutation of the caller's object cannot affect an existing commit.
26
+ * @throws A `UsageError` if the value cannot be represented as a JSON object.
27
+ */
28
+ function snapshotCustomMetadata(customMetadata) {
29
+ if (customMetadata === undefined) {
30
+ return undefined;
31
+ }
32
+ let serialized;
33
+ try {
34
+ serialized = JSON.stringify(customMetadata);
35
+ }
36
+ catch (error) {
37
+ throw new UsageError(`"customMetadata" must be JSON-serializable: ${error instanceof Error ? error.message : String(error)}`);
38
+ }
39
+ if (serialized === undefined) {
40
+ throw new UsageError(`"customMetadata" must be JSON-serializable.`);
41
+ }
42
+ const snapshot = JSON.parse(serialized);
43
+ if (typeof snapshot !== "object" || snapshot === null || Array.isArray(snapshot)) {
44
+ throw new UsageError(`"customMetadata" must be a JSON object.`);
45
+ }
46
+ return snapshot;
47
+ }
48
+ /**
49
+ * Wraps metadata for an operation which produces a single commit.
50
+ */
51
+ function toMetadataTree(customMetadata) {
52
+ return customMetadata === undefined ? undefined : { metadata: customMetadata, children: [] };
53
+ }
20
54
  /**
21
55
  * Yields all defined (non-`undefined`) labels from a {@link LabelTree}, depth-first.
22
56
  */
@@ -81,11 +115,12 @@ export function createTreeCheckout(idCompressor, mintRevisionTag, revisionTagCod
81
115
  new SharedTreeBranch({
82
116
  change: changeFamily.rebaser.compose([]),
83
117
  revision: "root",
118
+ customMetadata: undefined,
84
119
  }, changeFamily, () => idCompressor.generateCompressedId());
85
120
  return new TreeCheckout(branch, true, changeFamily, schema, forest, mintRevisionTag, revisionTagCodec, idCompressor, args?.removedRoots);
86
121
  }
87
122
  /**
88
- * Get the {@link TreeCheckout} associated with a given {@link TreeBranch}.
123
+ * Get the {@link TreeCheckout} associated with a given {@link UntypedTreeView}.
89
124
  */
90
125
  function getCheckout(context) {
91
126
  if (context instanceof TreeCheckout) {
@@ -199,7 +234,8 @@ let TreeCheckout = (() => {
199
234
  constructor(branch,
200
235
  /** True if and only if this checkout is for a branch which is persisted and shared with other clients. */
201
236
  isSharedBranch, changeFamily, storedSchema, forest, mintRevisionTag, revisionTagCodec, idCompressor, _removedRoots = makeDetachedFieldIndex("repair"), disposeForksAfterTransaction = true) {
202
- this.isSharedBranch = (__runInitializers(this, _instanceExtraInitializers), isSharedBranch);
237
+ this.branch = (__runInitializers(this, _instanceExtraInitializers), branch);
238
+ this.isSharedBranch = isSharedBranch;
203
239
  this.changeFamily = changeFamily;
204
240
  this.storedSchema = storedSchema;
205
241
  this.forest = forest;
@@ -381,6 +417,10 @@ let TreeCheckout = (() => {
381
417
  this.editLock = new EditLock(__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranchEditor);
382
418
  this.registerForBranchEvents();
383
419
  }
420
+ get branchHistory() {
421
+ this._branchHistory ??= new DefaultTreeBranchHistory(this.branch, this.idCompressor);
422
+ return this._branchHistory;
423
+ }
384
424
  /**
385
425
  * Pushes a new label node for a transaction nesting level.
386
426
  *
@@ -579,13 +619,16 @@ let TreeCheckout = (() => {
579
619
  applySerializedChange(serializedChange) {
580
620
  const change = SerializedChange.V1.decode(this.idCompressor, this.changeFamily, serializedChange);
581
621
  // Apply the change to the branch, but _not_ the `activeBranch` - we do not support squashing serialized commits in a transaction.
582
- __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.apply(change);
622
+ __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.apply(change, CommitKind.Default, undefined);
583
623
  }
584
- // #region TreeBranchAlpha
624
+ // #region UntypedTreeViewAlpha
585
625
  applyChange(change) {
586
626
  this.applySerializedChange(change);
587
627
  }
588
628
  isBranch() {
629
+ return this.isView();
630
+ }
631
+ isView() {
589
632
  return true;
590
633
  }
591
634
  hasRootSchema(_schema) {
@@ -618,6 +661,9 @@ let TreeCheckout = (() => {
618
661
  this.pushLabelFrame(params?.label);
619
662
  this.transaction.start({
620
663
  postProcessor: extractTransactionChangeProcessor(params?.postProcessor),
664
+ // Like the validation described above, rejecting malformed metadata breaks the checkout rather
665
+ // than being recoverable. Tracked by https://github.com/microsoft/FluidFramework/issues/28085.
666
+ customMetadata: snapshotCustomMetadata(params?.customMetadata),
621
667
  });
622
668
  addConstraintsToTransaction(this, false, params?.preconditions);
623
669
  }
@@ -641,7 +687,7 @@ let TreeCheckout = (() => {
641
687
  ? { success: true }
642
688
  : { success: true, value: value };
643
689
  }
644
- // #endregion TreeBranchAlpha
690
+ // #endregion UntypedTreeViewAlpha
645
691
  // Revision is the revision of the commit, if any, which caused this change.
646
692
  applyInternalChange(change, revision) {
647
693
  // Conflicts due to schema will be empty and thus are not applied.
@@ -711,22 +757,25 @@ let TreeCheckout = (() => {
711
757
  ? RevertibleStatus.Disposed
712
758
  : RevertibleStatus.Valid;
713
759
  },
714
- revert: (release = true) => {
760
+ revert: (releaseOrOptions = true) => {
715
761
  if (revertible.status === RevertibleStatus.Disposed) {
716
762
  throw new UsageError("Unable to revert a revertible that has been disposed.");
717
763
  }
718
- const revertMetrics = checkout.revertRevertible(revision, kind, labelTree);
764
+ const options = typeof releaseOrOptions === "boolean"
765
+ ? { dispose: releaseOrOptions }
766
+ : releaseOrOptions;
767
+ const revertMetrics = checkout.revertRevertible(revision, kind, labelTree, snapshotCustomMetadata(options.customMetadata));
719
768
  checkout.logger?.sendTelemetryEvent({
720
769
  eventName: _a.revertTelemetryEventName,
721
770
  ...revertMetrics,
722
771
  });
723
- if (release) {
772
+ if (options.dispose ?? true) {
724
773
  revertible.dispose();
725
774
  }
726
775
  },
727
- clone: (targetBranch) => {
776
+ clone: (targetView) => {
728
777
  // TODO:#23442: When a revertible is cloned for a forked branch, optimize to create a fork of a revertible branch once per revision NOT once per revision per checkout.
729
- const targetCheckout = getCheckout(targetBranch);
778
+ const targetCheckout = getCheckout(targetView);
730
779
  const revertibleBranch = this.revertibleCommitBranches.get(revision);
731
780
  if (revertibleBranch === undefined) {
732
781
  throw new UsageError("Unable to clone a revertible that has been disposed.");
@@ -785,19 +834,65 @@ let TreeCheckout = (() => {
785
834
  return checkout;
786
835
  }
787
836
  switchBranch(branch) {
788
- // TODO: Dispose old branch, if necessary
789
837
  assert(__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").size === 0, 0xc55 /* Cannot switch branches during a transaction */);
838
+ if (this.isSharedBranch) {
839
+ throw new UsageError("Cannot switch a view away from a shared branch. Consider forking first.");
840
+ }
790
841
  const diff = diffHistories(this.changeFamily.rebaser, __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.getHead(), branch.getHead(), this.mintRevisionTag);
791
842
  this.unregisterFromBranchEvents();
792
843
  __classPrivateFieldSet(this, _TreeCheckout_transaction, this.createTransactionStack(branch), "f");
844
+ this.branch = branch;
845
+ this._branchHistory?.dispose();
846
+ this._branchHistory = undefined;
793
847
  this.editLock = new EditLock(__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranchEditor);
794
848
  this.registerForBranchEvents();
795
849
  // TODO: Rework eventing
796
850
  this.applyInternalChange(diff);
797
851
  __classPrivateFieldGet(this, _TreeCheckout_events, "f").emit("afterBatch");
798
852
  }
799
- rebase(branch) {
800
- const checkout = getCheckout(branch);
853
+ rewindTo(revisionString) {
854
+ this.checkNotDisposed("The branch has already been disposed and cannot be rewound.");
855
+ if (__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").size > 0) {
856
+ throw new UsageError("Rewinding is not supported during transactions.");
857
+ }
858
+ const revision = this.idCompressor.tryRecompress(revisionString);
859
+ if (revision === undefined) {
860
+ throw new UsageError(`Unrecognized revision id: ${revisionString}`);
861
+ }
862
+ const targetCommit = findAncestor(__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.getHead(), (commit) => commit.revision === revision);
863
+ if (targetCommit === undefined) {
864
+ throw new UsageError(`No commit found with revision: ${revisionString}`);
865
+ }
866
+ this.switchBranch(__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.fork(targetCommit));
867
+ }
868
+ revertTo(revisionString, options) {
869
+ this.checkNotDisposed("The branch has already been disposed and prior revisions cannot be reverted to.");
870
+ this.editLock.checkUnlocked("Reverting to a revision");
871
+ if (__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").size > 0) {
872
+ throw new UsageError("Reverting to a revision is not supported during transactions.");
873
+ }
874
+ const customMetadata = snapshotCustomMetadata(options?.customMetadata);
875
+ const revision = this.idCompressor.tryRecompress(revisionString);
876
+ if (revision === undefined) {
877
+ throw new UsageError(`Unrecognized revision id: ${revisionString}`);
878
+ }
879
+ // Populated with the commits that came after the target commit, from oldest to newest.
880
+ const commitsToUndo = [];
881
+ const targetCommit = findAncestor([__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranch.getHead(), commitsToUndo], (commit) => commit.revision === revision);
882
+ if (targetCommit === undefined) {
883
+ throw new UsageError(`No commit found with revision: ${revisionString}`);
884
+ }
885
+ if (!hasSome(commitsToUndo)) {
886
+ // The target commit is already the head of the branch, so there is nothing to revert.
887
+ return;
888
+ }
889
+ const revisionForInvert = this.mintRevisionTag();
890
+ const toUndo = this.changeFamily.rebaser.compose(commitsToUndo);
891
+ const inverse = this.changeFamily.rebaser.invert(makeAnonChange(toUndo), false, revisionForInvert);
892
+ __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.apply(tagChange(inverse, revisionForInvert), CommitKind.Default, toMetadataTree(customMetadata));
893
+ }
894
+ rebase(view) {
895
+ const checkout = getCheckout(view);
801
896
  this.checkNotDisposed("The target branch of the rebase has been disposed and cannot be rebased.");
802
897
  checkout.checkNotDisposed("The source branch of the rebase has been disposed and cannot be rebased.");
803
898
  this.editLock.checkUnlocked("Rebasing");
@@ -810,14 +905,14 @@ let TreeCheckout = (() => {
810
905
  assert(!checkout.isSharedBranch, 0xa5d /* Shared branches cannot be rebased onto another branch. */);
811
906
  __classPrivateFieldGet(checkout, _TreeCheckout_transaction, "f").branch.rebaseOnto(__classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch);
812
907
  }
813
- rebaseOnto(branch) {
814
- getCheckout(branch).rebase(this);
908
+ rebaseOnto(view) {
909
+ getCheckout(view).rebase(this);
815
910
  }
816
- isMissingEditsFrom(branch) {
817
- const branchCheckout = getCheckout(branch);
911
+ isMissingEditsFrom(view) {
912
+ const viewCheckout = getCheckout(view);
818
913
  const targetPath = [];
819
914
  const ancestor = findCommonAncestor(this.mainBranch.getHead(), [
820
- branchCheckout.mainBranch.getHead(),
915
+ viewCheckout.mainBranch.getHead(),
821
916
  targetPath,
822
917
  ]);
823
918
  if (ancestor === undefined) {
@@ -825,17 +920,17 @@ let TreeCheckout = (() => {
825
920
  }
826
921
  return targetPath.length > 0;
827
922
  }
828
- computeNetChangeIfRebasedOnto(branch) {
829
- const branchCheckout = getCheckout(branch);
830
- const rebased = rebaseBranch(this.mintRevisionTag, this.changeFamily.rebaser, __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.getHead(), __classPrivateFieldGet(branchCheckout, _TreeCheckout_transaction, "f").branch.getHead());
923
+ computeNetChangeIfRebasedOnto(view) {
924
+ const viewCheckout = getCheckout(view);
925
+ const rebased = rebaseBranch(this.mintRevisionTag, this.changeFamily.rebaser, __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.getHead(), __classPrivateFieldGet(viewCheckout, _TreeCheckout_transaction, "f").branch.getHead());
831
926
  if (rebased.sourceChange === undefined) {
832
927
  return undefined;
833
928
  }
834
929
  const revision = this.mintRevisionTag();
835
930
  return SerializedChange.V1.encode(this.idCompressor, this.changeFamily, rebased.sourceChange, revision, undefined);
836
931
  }
837
- merge(branch, disposeMerged = true) {
838
- const checkout = getCheckout(branch);
932
+ merge(view, disposeMerged = true) {
933
+ const checkout = getCheckout(view);
839
934
  this.checkNotDisposed("The target branch of the merge has been disposed and cannot be merged.");
840
935
  checkout.checkNotDisposed("The source branch of the merge has been disposed and cannot be merged.");
841
936
  this.editLock.checkUnlocked("Merging");
@@ -872,6 +967,8 @@ let TreeCheckout = (() => {
872
967
  view.dispose();
873
968
  }
874
969
  __classPrivateFieldGet(this, _TreeCheckout_events, "f").emit("dispose");
970
+ this._branchHistory?.dispose();
971
+ this._branchHistory = undefined;
875
972
  }
876
973
  getRemovedRoots() {
877
974
  this.assertNoUntrackedRoots();
@@ -911,7 +1008,7 @@ let TreeCheckout = (() => {
911
1008
  this.revertibleCommitBranches.delete(revision);
912
1009
  this.revertibles.delete(revision);
913
1010
  }
914
- revertRevertible(revision, kind, labelTree) {
1011
+ revertRevertible(revision, kind, labelTree, customMetadata) {
915
1012
  this.editLock.checkUnlocked("Reverting a commit");
916
1013
  if (this.transaction.size > 0) {
917
1014
  throw new UsageError("Undo is not yet supported during transactions.");
@@ -939,7 +1036,7 @@ let TreeCheckout = (() => {
939
1036
  try {
940
1037
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.apply(change, kind === CommitKind.Default || kind === CommitKind.Redo
941
1038
  ? CommitKind.Undo
942
- : CommitKind.Redo);
1039
+ : CommitKind.Redo, toMetadataTree(customMetadata));
943
1040
  }
944
1041
  finally {
945
1042
  this.labelTreeNode = previousLabelTreeNode;