@fluidframework/tree 2.0.0-dev-rc.5.0.0.271262 → 2.0.0-dev-rc.5.0.0.272251

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 (458) hide show
  1. package/api-extractor/api-extractor-lint-beta.cjs.json +5 -0
  2. package/api-extractor/api-extractor-lint-beta.esm.json +5 -0
  3. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  4. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  5. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  6. package/api-report/tree.alpha.api.md +2 -13
  7. package/api-report/tree.beta.api.md +2 -13
  8. package/api-report/tree.public.api.md +2 -13
  9. package/dist/beta.d.ts +0 -1
  10. package/dist/codec/codec.js +0 -1
  11. package/dist/codec/codec.js.map +1 -1
  12. package/dist/codec/discriminatedUnions.js +0 -1
  13. package/dist/codec/discriminatedUnions.js.map +1 -1
  14. package/dist/core/change-family/editBuilder.js +0 -2
  15. package/dist/core/change-family/editBuilder.js.map +1 -1
  16. package/dist/core/rebase/revisionTagCodec.js +0 -2
  17. package/dist/core/rebase/revisionTagCodec.js.map +1 -1
  18. package/dist/core/schema-stored/schema.js +0 -4
  19. package/dist/core/schema-stored/schema.js.map +1 -1
  20. package/dist/core/schema-stored/storedSchemaRepository.js +1 -3
  21. package/dist/core/schema-stored/storedSchemaRepository.js.map +1 -1
  22. package/dist/core/schema-view/view.js +0 -2
  23. package/dist/core/schema-view/view.js.map +1 -1
  24. package/dist/core/tree/anchorSet.js +46 -51
  25. package/dist/core/tree/anchorSet.js.map +1 -1
  26. package/dist/core/tree/detachedFieldIndex.js +2 -8
  27. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  28. package/dist/core/tree/detachedFieldIndexCodec.js +0 -3
  29. package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
  30. package/dist/core/tree/sparseTree.js +11 -15
  31. package/dist/core/tree/sparseTree.js.map +1 -1
  32. package/dist/domains/schemaBuilder.js +70 -70
  33. package/dist/domains/schemaBuilder.js.map +1 -1
  34. package/dist/events/events.js +1 -2
  35. package/dist/events/events.js.map +1 -1
  36. package/dist/feature-libraries/chunked-forest/basicChunk.js +1 -14
  37. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  38. package/dist/feature-libraries/chunked-forest/chunkTree.js +6 -13
  39. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  40. package/dist/feature-libraries/chunked-forest/chunkedForest.js +2 -9
  41. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  42. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js +3 -1
  43. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -3
  45. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +6 -11
  47. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +3 -3
  49. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +2 -5
  51. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +0 -1
  53. package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -1
  55. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/codec/codecs.js +4 -1
  57. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +13 -25
  59. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +1 -1
  61. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js +5 -8
  62. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/sequenceChunk.js +0 -1
  64. package/dist/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  65. package/dist/feature-libraries/chunked-forest/uniformChunk.js +5 -40
  66. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  67. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +0 -2
  68. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  69. package/dist/feature-libraries/detachedFieldIndexSummarizer.js +1 -2
  70. package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  71. package/dist/feature-libraries/editableTreeBinder.js +12 -13
  72. package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
  73. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +11 -12
  74. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  75. package/dist/feature-libraries/flex-tree/context.js +3 -7
  76. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  77. package/dist/feature-libraries/flex-tree/lazyEntity.js +22 -13
  78. package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  79. package/dist/feature-libraries/flex-tree/lazyField.js +0 -6
  80. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  81. package/dist/feature-libraries/flex-tree/lazyNode.js +17 -10
  82. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  83. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  84. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  85. package/dist/feature-libraries/index.d.ts +1 -1
  86. package/dist/feature-libraries/index.d.ts.map +1 -1
  87. package/dist/feature-libraries/index.js +2 -3
  88. package/dist/feature-libraries/index.js.map +1 -1
  89. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -7
  90. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  91. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +6 -6
  92. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  93. package/dist/feature-libraries/modular-schema/fieldKind.js +0 -2
  94. package/dist/feature-libraries/modular-schema/fieldKind.js.map +1 -1
  95. package/dist/feature-libraries/modular-schema/fieldKindWithEditor.js +0 -3
  96. package/dist/feature-libraries/modular-schema/fieldKindWithEditor.js.map +1 -1
  97. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  98. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  99. package/dist/feature-libraries/modular-schema/index.js +2 -2
  100. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  101. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +2 -0
  102. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  103. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +2 -0
  104. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  105. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +39 -24
  106. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  107. package/dist/feature-libraries/node-key/mockNodeKeyManager.js +4 -2
  108. package/dist/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
  109. package/dist/feature-libraries/node-key/nodeKeyIndex.js +0 -3
  110. package/dist/feature-libraries/node-key/nodeKeyIndex.js.map +1 -1
  111. package/dist/feature-libraries/object-forest/objectForest.js +28 -23
  112. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  113. package/dist/feature-libraries/optional-field/optionalField.js +5 -3
  114. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  115. package/dist/feature-libraries/schema-index/schemaSummarizer.js +1 -5
  116. package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  117. package/dist/feature-libraries/schemaBuilderBase.js +3 -14
  118. package/dist/feature-libraries/schemaBuilderBase.js.map +1 -1
  119. package/dist/feature-libraries/sequence-field/compose.js +0 -6
  120. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  121. package/dist/feature-libraries/sequence-field/markListFactory.js +4 -3
  122. package/dist/feature-libraries/sequence-field/markListFactory.js.map +1 -1
  123. package/dist/feature-libraries/sequence-field/markQueue.js +2 -4
  124. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  125. package/dist/feature-libraries/sequence-field/rebase.d.ts +2 -2
  126. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  127. package/dist/feature-libraries/sequence-field/rebase.js +20 -20
  128. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  129. package/dist/feature-libraries/treeCursorUtils.js +9 -13
  130. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  131. package/dist/feature-libraries/typed-schema/typedTreeSchema.js +4 -23
  132. package/dist/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
  133. package/dist/feature-libraries/typed-schema/view.js +0 -7
  134. package/dist/feature-libraries/typed-schema/view.js.map +1 -1
  135. package/dist/index.d.ts +1 -1
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +1 -2
  138. package/dist/index.js.map +1 -1
  139. package/dist/packageVersion.d.ts +1 -1
  140. package/dist/packageVersion.js +1 -1
  141. package/dist/packageVersion.js.map +1 -1
  142. package/dist/public.d.ts +0 -1
  143. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  144. package/dist/shared-tree/schematizingTreeView.js +10 -27
  145. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  146. package/dist/shared-tree/sharedTree.d.ts +4 -0
  147. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  148. package/dist/shared-tree/sharedTree.js +13 -10
  149. package/dist/shared-tree/sharedTree.js.map +1 -1
  150. package/dist/shared-tree/sharedTreeChangeEnricher.js +11 -14
  151. package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  152. package/dist/shared-tree/sharedTreeChangeFamily.js +3 -5
  153. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  154. package/dist/shared-tree/sharedTreeEditBuilder.js +0 -2
  155. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  156. package/dist/shared-tree/treeCheckout.js +11 -22
  157. package/dist/shared-tree/treeCheckout.js.map +1 -1
  158. package/dist/shared-tree/treeView.js +0 -6
  159. package/dist/shared-tree/treeView.js.map +1 -1
  160. package/dist/shared-tree-core/branch.d.ts +18 -0
  161. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  162. package/dist/shared-tree-core/branch.js +28 -31
  163. package/dist/shared-tree-core/branch.js.map +1 -1
  164. package/dist/shared-tree-core/branchCommitEnricher.d.ts +4 -2
  165. package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  166. package/dist/shared-tree-core/branchCommitEnricher.js +19 -15
  167. package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
  168. package/dist/shared-tree-core/defaultResubmitMachine.js +19 -21
  169. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  170. package/dist/shared-tree-core/editManager.js +37 -53
  171. package/dist/shared-tree-core/editManager.js.map +1 -1
  172. package/dist/shared-tree-core/editManagerSummarizer.js +1 -5
  173. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  174. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  175. package/dist/shared-tree-core/sharedTreeCore.js +16 -24
  176. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  177. package/dist/shared-tree-core/transactionEnricher.d.ts +11 -1
  178. package/dist/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  179. package/dist/shared-tree-core/transactionEnricher.js +25 -4
  180. package/dist/shared-tree-core/transactionEnricher.js.map +1 -1
  181. package/dist/shared-tree-core/transactionStack.js +3 -1
  182. package/dist/shared-tree-core/transactionStack.js.map +1 -1
  183. package/dist/simple-tree/arrayNode.js +34 -26
  184. package/dist/simple-tree/arrayNode.js.map +1 -1
  185. package/dist/simple-tree/leafNodeSchema.js +2 -4
  186. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  187. package/dist/simple-tree/mapNode.js +5 -5
  188. package/dist/simple-tree/mapNode.js.map +1 -1
  189. package/dist/simple-tree/objectNode.js +6 -6
  190. package/dist/simple-tree/objectNode.js.map +1 -1
  191. package/dist/simple-tree/schemaFactory.d.ts +18 -5
  192. package/dist/simple-tree/schemaFactory.d.ts.map +1 -1
  193. package/dist/simple-tree/schemaFactory.js +65 -53
  194. package/dist/simple-tree/schemaFactory.js.map +1 -1
  195. package/dist/simple-tree/schemaTypes.js +3 -12
  196. package/dist/simple-tree/schemaTypes.js.map +1 -1
  197. package/dist/simple-tree/tree.d.ts +1 -22
  198. package/dist/simple-tree/tree.d.ts.map +1 -1
  199. package/dist/simple-tree/tree.js +0 -21
  200. package/dist/simple-tree/tree.js.map +1 -1
  201. package/dist/simple-tree/treeNodeApi.d.ts +13 -4
  202. package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
  203. package/dist/simple-tree/treeNodeApi.js +8 -3
  204. package/dist/simple-tree/treeNodeApi.js.map +1 -1
  205. package/dist/simple-tree/types.d.ts +26 -6
  206. package/dist/simple-tree/types.d.ts.map +1 -1
  207. package/dist/simple-tree/types.js +79 -54
  208. package/dist/simple-tree/types.js.map +1 -1
  209. package/dist/treeFactory.js +10 -9
  210. package/dist/treeFactory.js.map +1 -1
  211. package/dist/util/brand.js +0 -1
  212. package/dist/util/brand.js.map +1 -1
  213. package/dist/util/nestedMap.js +4 -2
  214. package/dist/util/nestedMap.js.map +1 -1
  215. package/dist/util/offsetList.js +4 -2
  216. package/dist/util/offsetList.js.map +1 -1
  217. package/dist/util/referenceCounting.js +0 -1
  218. package/dist/util/referenceCounting.js.map +1 -1
  219. package/dist/util/stackyIterator.js +2 -3
  220. package/dist/util/stackyIterator.js.map +1 -1
  221. package/lib/beta.d.ts +0 -1
  222. package/lib/codec/codec.js +0 -1
  223. package/lib/codec/codec.js.map +1 -1
  224. package/lib/codec/discriminatedUnions.js +0 -1
  225. package/lib/codec/discriminatedUnions.js.map +1 -1
  226. package/lib/core/change-family/editBuilder.js +0 -2
  227. package/lib/core/change-family/editBuilder.js.map +1 -1
  228. package/lib/core/rebase/revisionTagCodec.js +0 -2
  229. package/lib/core/rebase/revisionTagCodec.js.map +1 -1
  230. package/lib/core/schema-stored/schema.js +0 -4
  231. package/lib/core/schema-stored/schema.js.map +1 -1
  232. package/lib/core/schema-stored/storedSchemaRepository.js +1 -3
  233. package/lib/core/schema-stored/storedSchemaRepository.js.map +1 -1
  234. package/lib/core/schema-view/view.js +0 -2
  235. package/lib/core/schema-view/view.js.map +1 -1
  236. package/lib/core/tree/anchorSet.js +46 -51
  237. package/lib/core/tree/anchorSet.js.map +1 -1
  238. package/lib/core/tree/detachedFieldIndex.js +2 -8
  239. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  240. package/lib/core/tree/detachedFieldIndexCodec.js +0 -3
  241. package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
  242. package/lib/core/tree/sparseTree.js +11 -15
  243. package/lib/core/tree/sparseTree.js.map +1 -1
  244. package/lib/domains/schemaBuilder.js +70 -70
  245. package/lib/domains/schemaBuilder.js.map +1 -1
  246. package/lib/events/events.js +1 -2
  247. package/lib/events/events.js.map +1 -1
  248. package/lib/feature-libraries/chunked-forest/basicChunk.js +1 -14
  249. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  250. package/lib/feature-libraries/chunked-forest/chunkTree.js +6 -13
  251. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  252. package/lib/feature-libraries/chunked-forest/chunkedForest.js +2 -9
  253. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  254. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js +3 -1
  255. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  256. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -3
  257. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  258. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +6 -11
  259. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  260. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +3 -3
  261. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  262. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +2 -5
  263. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  264. package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +0 -1
  265. package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
  266. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -1
  267. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  268. package/lib/feature-libraries/chunked-forest/codec/codecs.js +4 -1
  269. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  270. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +13 -25
  271. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  272. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +1 -1
  273. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js +5 -8
  274. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  275. package/lib/feature-libraries/chunked-forest/sequenceChunk.js +0 -1
  276. package/lib/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  277. package/lib/feature-libraries/chunked-forest/uniformChunk.js +5 -40
  278. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  279. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +0 -2
  280. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  281. package/lib/feature-libraries/detachedFieldIndexSummarizer.js +1 -2
  282. package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  283. package/lib/feature-libraries/editableTreeBinder.js +12 -13
  284. package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
  285. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +11 -12
  286. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  287. package/lib/feature-libraries/flex-tree/context.js +3 -7
  288. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  289. package/lib/feature-libraries/flex-tree/lazyEntity.js +22 -13
  290. package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  291. package/lib/feature-libraries/flex-tree/lazyField.js +0 -6
  292. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  293. package/lib/feature-libraries/flex-tree/lazyNode.js +17 -10
  294. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  295. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  296. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  297. package/lib/feature-libraries/index.d.ts +1 -1
  298. package/lib/feature-libraries/index.d.ts.map +1 -1
  299. package/lib/feature-libraries/index.js +1 -1
  300. package/lib/feature-libraries/index.js.map +1 -1
  301. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -7
  302. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  303. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +5 -5
  304. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  305. package/lib/feature-libraries/modular-schema/fieldKind.js +0 -2
  306. package/lib/feature-libraries/modular-schema/fieldKind.js.map +1 -1
  307. package/lib/feature-libraries/modular-schema/fieldKindWithEditor.js +0 -3
  308. package/lib/feature-libraries/modular-schema/fieldKindWithEditor.js.map +1 -1
  309. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  310. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  311. package/lib/feature-libraries/modular-schema/index.js +1 -1
  312. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  313. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +2 -0
  314. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  315. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +2 -0
  316. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  317. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +40 -25
  318. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  319. package/lib/feature-libraries/node-key/mockNodeKeyManager.js +4 -2
  320. package/lib/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
  321. package/lib/feature-libraries/node-key/nodeKeyIndex.js +0 -3
  322. package/lib/feature-libraries/node-key/nodeKeyIndex.js.map +1 -1
  323. package/lib/feature-libraries/object-forest/objectForest.js +28 -23
  324. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  325. package/lib/feature-libraries/optional-field/optionalField.js +6 -4
  326. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  327. package/lib/feature-libraries/schema-index/schemaSummarizer.js +1 -5
  328. package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  329. package/lib/feature-libraries/schemaBuilderBase.js +3 -14
  330. package/lib/feature-libraries/schemaBuilderBase.js.map +1 -1
  331. package/lib/feature-libraries/sequence-field/compose.js +0 -6
  332. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  333. package/lib/feature-libraries/sequence-field/markListFactory.js +4 -3
  334. package/lib/feature-libraries/sequence-field/markListFactory.js.map +1 -1
  335. package/lib/feature-libraries/sequence-field/markQueue.js +2 -4
  336. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  337. package/lib/feature-libraries/sequence-field/rebase.d.ts +2 -2
  338. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  339. package/lib/feature-libraries/sequence-field/rebase.js +21 -21
  340. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  341. package/lib/feature-libraries/treeCursorUtils.js +9 -13
  342. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  343. package/lib/feature-libraries/typed-schema/typedTreeSchema.js +4 -23
  344. package/lib/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
  345. package/lib/feature-libraries/typed-schema/view.js +0 -7
  346. package/lib/feature-libraries/typed-schema/view.js.map +1 -1
  347. package/lib/index.d.ts +1 -1
  348. package/lib/index.d.ts.map +1 -1
  349. package/lib/index.js +1 -1
  350. package/lib/index.js.map +1 -1
  351. package/lib/packageVersion.d.ts +1 -1
  352. package/lib/packageVersion.js +1 -1
  353. package/lib/packageVersion.js.map +1 -1
  354. package/lib/public.d.ts +0 -1
  355. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  356. package/lib/shared-tree/schematizingTreeView.js +10 -27
  357. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  358. package/lib/shared-tree/sharedTree.d.ts +4 -0
  359. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  360. package/lib/shared-tree/sharedTree.js +13 -10
  361. package/lib/shared-tree/sharedTree.js.map +1 -1
  362. package/lib/shared-tree/sharedTreeChangeEnricher.js +11 -14
  363. package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  364. package/lib/shared-tree/sharedTreeChangeFamily.js +3 -5
  365. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  366. package/lib/shared-tree/sharedTreeEditBuilder.js +0 -2
  367. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  368. package/lib/shared-tree/treeCheckout.js +11 -22
  369. package/lib/shared-tree/treeCheckout.js.map +1 -1
  370. package/lib/shared-tree/treeView.js +0 -6
  371. package/lib/shared-tree/treeView.js.map +1 -1
  372. package/lib/shared-tree-core/branch.d.ts +18 -0
  373. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  374. package/lib/shared-tree-core/branch.js +28 -31
  375. package/lib/shared-tree-core/branch.js.map +1 -1
  376. package/lib/shared-tree-core/branchCommitEnricher.d.ts +4 -2
  377. package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  378. package/lib/shared-tree-core/branchCommitEnricher.js +19 -15
  379. package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
  380. package/lib/shared-tree-core/defaultResubmitMachine.js +19 -21
  381. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  382. package/lib/shared-tree-core/editManager.js +37 -53
  383. package/lib/shared-tree-core/editManager.js.map +1 -1
  384. package/lib/shared-tree-core/editManagerSummarizer.js +1 -5
  385. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  386. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  387. package/lib/shared-tree-core/sharedTreeCore.js +16 -24
  388. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  389. package/lib/shared-tree-core/transactionEnricher.d.ts +11 -1
  390. package/lib/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  391. package/lib/shared-tree-core/transactionEnricher.js +25 -4
  392. package/lib/shared-tree-core/transactionEnricher.js.map +1 -1
  393. package/lib/shared-tree-core/transactionStack.js +3 -1
  394. package/lib/shared-tree-core/transactionStack.js.map +1 -1
  395. package/lib/simple-tree/arrayNode.js +34 -26
  396. package/lib/simple-tree/arrayNode.js.map +1 -1
  397. package/lib/simple-tree/leafNodeSchema.js +2 -4
  398. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  399. package/lib/simple-tree/mapNode.js +5 -5
  400. package/lib/simple-tree/mapNode.js.map +1 -1
  401. package/lib/simple-tree/objectNode.js +6 -6
  402. package/lib/simple-tree/objectNode.js.map +1 -1
  403. package/lib/simple-tree/schemaFactory.d.ts +18 -5
  404. package/lib/simple-tree/schemaFactory.d.ts.map +1 -1
  405. package/lib/simple-tree/schemaFactory.js +65 -53
  406. package/lib/simple-tree/schemaFactory.js.map +1 -1
  407. package/lib/simple-tree/schemaTypes.js +3 -12
  408. package/lib/simple-tree/schemaTypes.js.map +1 -1
  409. package/lib/simple-tree/tree.d.ts +1 -22
  410. package/lib/simple-tree/tree.d.ts.map +1 -1
  411. package/lib/simple-tree/tree.js +0 -21
  412. package/lib/simple-tree/tree.js.map +1 -1
  413. package/lib/simple-tree/treeNodeApi.d.ts +13 -4
  414. package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
  415. package/lib/simple-tree/treeNodeApi.js +8 -3
  416. package/lib/simple-tree/treeNodeApi.js.map +1 -1
  417. package/lib/simple-tree/types.d.ts +26 -6
  418. package/lib/simple-tree/types.d.ts.map +1 -1
  419. package/lib/simple-tree/types.js +78 -54
  420. package/lib/simple-tree/types.js.map +1 -1
  421. package/lib/treeFactory.js +10 -9
  422. package/lib/treeFactory.js.map +1 -1
  423. package/lib/util/brand.js +0 -1
  424. package/lib/util/brand.js.map +1 -1
  425. package/lib/util/nestedMap.js +4 -2
  426. package/lib/util/nestedMap.js.map +1 -1
  427. package/lib/util/offsetList.js +4 -2
  428. package/lib/util/offsetList.js.map +1 -1
  429. package/lib/util/referenceCounting.js +0 -1
  430. package/lib/util/referenceCounting.js.map +1 -1
  431. package/lib/util/stackyIterator.js +2 -3
  432. package/lib/util/stackyIterator.js.map +1 -1
  433. package/package.json +27 -24
  434. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +22 -6
  435. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +2 -2
  436. package/src/feature-libraries/chunked-forest/codec/codecs.ts +6 -2
  437. package/src/feature-libraries/chunked-forest/codec/nodeShape.ts +8 -3
  438. package/src/feature-libraries/index.ts +0 -1
  439. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +6 -7
  440. package/src/feature-libraries/modular-schema/index.ts +1 -1
  441. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +2 -0
  442. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +55 -23
  443. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  444. package/src/feature-libraries/sequence-field/rebase.ts +15 -33
  445. package/src/index.ts +0 -1
  446. package/src/packageVersion.ts +1 -1
  447. package/src/shared-tree/schematizingTreeView.ts +0 -2
  448. package/src/shared-tree/sharedTree.ts +8 -1
  449. package/src/shared-tree-core/branch.ts +24 -0
  450. package/src/shared-tree-core/branchCommitEnricher.ts +15 -6
  451. package/src/shared-tree-core/sharedTreeCore.ts +9 -0
  452. package/src/shared-tree-core/transactionEnricher.ts +27 -1
  453. package/src/simple-tree/arrayNode.ts +17 -17
  454. package/src/simple-tree/schemaFactory.ts +18 -5
  455. package/src/simple-tree/tree.ts +1 -26
  456. package/src/simple-tree/treeNodeApi.ts +25 -7
  457. package/src/simple-tree/types.ts +57 -9
  458. package/tsdoc.json +4 -0
@@ -11,9 +11,6 @@ const index_js_2 = require("../feature-libraries/index.js");
11
11
  const index_js_3 = require("../util/index.js");
12
12
  const sharedTreeChangeFamily_js_1 = require("./sharedTreeChangeFamily.js");
13
13
  class SharedTreeReadonlyChangeEnricher {
14
- forest;
15
- schema;
16
- removedRoots;
17
14
  /**
18
15
  * @param forest - The state based on which to enrich changes.
19
16
  * Exclusively owned by the constructed instance.
@@ -25,6 +22,17 @@ class SharedTreeReadonlyChangeEnricher {
25
22
  this.forest = forest;
26
23
  this.schema = schema;
27
24
  this.removedRoots = removedRoots;
25
+ this.getDetachedRoot = (id) => {
26
+ const root = this.removedRoots.tryGetEntry(id);
27
+ if (root !== undefined) {
28
+ const cursor = this.forest.getCursorAboveDetachedFields();
29
+ const parentField = this.removedRoots.toFieldKey(root);
30
+ cursor.enterField(parentField);
31
+ cursor.enterNode(0);
32
+ return (0, index_js_2.chunkTree)(cursor, index_js_2.defaultChunkPolicy);
33
+ }
34
+ return undefined;
35
+ };
28
36
  }
29
37
  fork() {
30
38
  return new SharedTreeMutableChangeEnricher(this.forest.clone(this.schema, new index_js_1.AnchorSet()), this.schema, this.removedRoots.clone());
@@ -32,17 +40,6 @@ class SharedTreeReadonlyChangeEnricher {
32
40
  updateChangeEnrichments(change) {
33
41
  return (0, sharedTreeChangeFamily_js_1.updateRefreshers)(change, this.getDetachedRoot, index_js_2.relevantRemovedRoots, index_js_2.updateRefreshers);
34
42
  }
35
- getDetachedRoot = (id) => {
36
- const root = this.removedRoots.tryGetEntry(id);
37
- if (root !== undefined) {
38
- const cursor = this.forest.getCursorAboveDetachedFields();
39
- const parentField = this.removedRoots.toFieldKey(root);
40
- cursor.enterField(parentField);
41
- cursor.enterNode(0);
42
- return (0, index_js_2.chunkTree)(cursor, index_js_2.defaultChunkPolicy);
43
- }
44
- return undefined;
45
- };
46
43
  }
47
44
  exports.SharedTreeReadonlyChangeEnricher = SharedTreeReadonlyChangeEnricher;
48
45
  class SharedTreeMutableChangeEnricher extends SharedTreeReadonlyChangeEnricher {
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTreeChangeEnricher.js","sourceRoot":"","sources":["../../src/shared-tree/sharedTreeChangeEnricher.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAsE;AACtE,+CAS0B;AAC1B,4DAOuC;AACvC,+CAAiD;AACjD,2EAA+D;AAO/D,MAAa,gCAAgC;IAWxB;IACF;IACE;IAVpB;;;;;;OAMG;IACH,YACoB,MAAuB,EACzB,MAAkC,EAChC,YAAgC;QAFhC,WAAM,GAAN,MAAM,CAAiB;QACzB,WAAM,GAAN,MAAM,CAA4B;QAChC,iBAAY,GAAZ,YAAY,CAAoB;IACjD,CAAC;IAEG,IAAI;QACV,OAAO,IAAI,+BAA+B,CACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,oBAAS,EAAE,CAAC,EAC/C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CACzB,CAAC;IACH,CAAC;IAEM,uBAAuB,CAAC,MAAwB;QACtD,OAAO,IAAA,4CAAgB,EACtB,MAAM,EACN,IAAI,CAAC,eAAe,EACpB,+BAAoB,EACpB,2BAA0B,CAC1B,CAAC;IACH,CAAC;IAEgB,eAAe,GAAG,CAAC,EAAuB,EAAyB,EAAE;QACrF,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;YAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpB,OAAO,IAAA,oBAAS,EAAC,MAAM,EAAE,6BAAkB,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC;CACF;AA5CD,4EA4CC;AAED,MAAa,+BACZ,SAAQ,gCAAgC;IAGjC,cAAc,CAAC,MAAwB,EAAE,QAAsB;QACrE,KAAK,MAAM,kBAAkB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;YACrC,QAAQ,IAAI,EAAE,CAAC;gBACd,KAAK,MAAM,CAAC,CAAC,CAAC;oBACb,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,IAAA,oBAAS,EAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBAC7C,IAAA,qBAAU,EAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC9C,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,MAAM;gBACP,CAAC;gBACD,KAAK,QAAQ;oBACZ,6DAA6D;oBAC7D,mGAAmG;oBACnG,+FAA+F;oBAC/F,wDAAwD;oBACxD,MAAM;gBACP;oBACC,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC;IAEM,CAAC,wBAAa,CAAC;QACrB,yEAAyE;IAC1E,CAAC;CACD;AA9BD,0EA8BC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tAnchorSet,\n\ttype DeltaDetachedNodeId,\n\ttype DetachedFieldIndex,\n\ttype IEditableForest,\n\ttype RevisionTag,\n\ttype TreeStoredSchemaRepository,\n\ttagChange,\n\tvisitDelta,\n} from \"../core/index.js\";\nimport {\n\ttype TreeChunk,\n\tchunkTree,\n\tdefaultChunkPolicy,\n\tintoDelta,\n\trelevantRemovedRoots,\n\tupdateRefreshers as updateDataChangeRefreshers,\n} from \"../feature-libraries/index.js\";\nimport { disposeSymbol } from \"../util/index.js\";\nimport { updateRefreshers } from \"./sharedTreeChangeFamily.js\";\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\nimport type {\n\tChangeEnricherMutableCheckout,\n\tChangeEnricherReadonlyCheckout,\n} from \"../shared-tree-core/index.js\";\n\nexport class SharedTreeReadonlyChangeEnricher\n\timplements ChangeEnricherReadonlyCheckout<SharedTreeChange>\n{\n\t/**\n\t * @param forest - The state based on which to enrich changes.\n\t * Exclusively owned by the constructed instance.\n\t * @param schema - The schema that corresponds to the forest.\n\t * @param removedRoots - The set of removed roots based on which to enrich changes.\n\t * Exclusively owned by the constructed instance.\n\t */\n\tpublic constructor(\n\t\tprotected readonly forest: IEditableForest,\n\t\tprivate readonly schema: TreeStoredSchemaRepository,\n\t\tprotected readonly removedRoots: DetachedFieldIndex,\n\t) {}\n\n\tpublic fork(): ChangeEnricherMutableCheckout<SharedTreeChange> {\n\t\treturn new SharedTreeMutableChangeEnricher(\n\t\t\tthis.forest.clone(this.schema, new AnchorSet()),\n\t\t\tthis.schema,\n\t\t\tthis.removedRoots.clone(),\n\t\t);\n\t}\n\n\tpublic updateChangeEnrichments(change: SharedTreeChange): SharedTreeChange {\n\t\treturn updateRefreshers(\n\t\t\tchange,\n\t\t\tthis.getDetachedRoot,\n\t\t\trelevantRemovedRoots,\n\t\t\tupdateDataChangeRefreshers,\n\t\t);\n\t}\n\n\tprivate readonly getDetachedRoot = (id: DeltaDetachedNodeId): TreeChunk | undefined => {\n\t\tconst root = this.removedRoots.tryGetEntry(id);\n\t\tif (root !== undefined) {\n\t\t\tconst cursor = this.forest.getCursorAboveDetachedFields();\n\t\t\tconst parentField = this.removedRoots.toFieldKey(root);\n\t\t\tcursor.enterField(parentField);\n\t\t\tcursor.enterNode(0);\n\t\t\treturn chunkTree(cursor, defaultChunkPolicy);\n\t\t}\n\t\treturn undefined;\n\t};\n}\n\nexport class SharedTreeMutableChangeEnricher\n\textends SharedTreeReadonlyChangeEnricher\n\timplements ChangeEnricherMutableCheckout<SharedTreeChange>\n{\n\tpublic applyTipChange(change: SharedTreeChange, revision?: RevisionTag): void {\n\t\tfor (const dataOrSchemaChange of change.changes) {\n\t\t\tconst type = dataOrSchemaChange.type;\n\t\t\tswitch (type) {\n\t\t\t\tcase \"data\": {\n\t\t\t\t\tconst delta = intoDelta(tagChange(dataOrSchemaChange.innerChange, revision));\n\t\t\t\t\tconst visitor = this.forest.acquireVisitor();\n\t\t\t\t\tvisitDelta(delta, visitor, this.removedRoots);\n\t\t\t\t\tvisitor.free();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"schema\":\n\t\t\t\t\t// This enricher doesn't need to maintain schema information.\n\t\t\t\t\t// Note that the refreshers being generated through `updateChangeEnrichments` will be encoded using\n\t\t\t\t\t// the schema that was used in the input context of the data changeset these refreshers are on.\n\t\t\t\t\t// See the encoding logic in SharedTreeCore for details.\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(type);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic [disposeSymbol](): void {\n\t\t// TODO: in the future, forest and/or its AnchorSet may require disposal.\n\t}\n}\n"]}
1
+ {"version":3,"file":"sharedTreeChangeEnricher.js","sourceRoot":"","sources":["../../src/shared-tree/sharedTreeChangeEnricher.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAsE;AACtE,+CAS0B;AAC1B,4DAOuC;AACvC,+CAAiD;AACjD,2EAA+D;AAO/D,MAAa,gCAAgC;IAG5C;;;;;;OAMG;IACH,YACoB,MAAuB,EACzB,MAAkC,EAChC,YAAgC;QAFhC,WAAM,GAAN,MAAM,CAAiB;QACzB,WAAM,GAAN,MAAM,CAA4B;QAChC,iBAAY,GAAZ,YAAY,CAAoB;QAoBnC,oBAAe,GAAG,CAAC,EAAuB,EAAyB,EAAE;YACrF,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;gBAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC/B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACpB,OAAO,IAAA,oBAAS,EAAC,MAAM,EAAE,6BAAkB,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;IA7BC,CAAC;IAEG,IAAI;QACV,OAAO,IAAI,+BAA+B,CACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,oBAAS,EAAE,CAAC,EAC/C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CACzB,CAAC;IACH,CAAC;IAEM,uBAAuB,CAAC,MAAwB;QACtD,OAAO,IAAA,4CAAgB,EACtB,MAAM,EACN,IAAI,CAAC,eAAe,EACpB,+BAAoB,EACpB,2BAA0B,CAC1B,CAAC;IACH,CAAC;CAaD;AA5CD,4EA4CC;AAED,MAAa,+BACZ,SAAQ,gCAAgC;IAGjC,cAAc,CAAC,MAAwB,EAAE,QAAsB;QACrE,KAAK,MAAM,kBAAkB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;YACrC,QAAQ,IAAI,EAAE,CAAC;gBACd,KAAK,MAAM,CAAC,CAAC,CAAC;oBACb,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,IAAA,oBAAS,EAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBAC7C,IAAA,qBAAU,EAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC9C,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,MAAM;gBACP,CAAC;gBACD,KAAK,QAAQ;oBACZ,6DAA6D;oBAC7D,mGAAmG;oBACnG,+FAA+F;oBAC/F,wDAAwD;oBACxD,MAAM;gBACP;oBACC,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC;IAEM,CAAC,wBAAa,CAAC;QACrB,yEAAyE;IAC1E,CAAC;CACD;AA9BD,0EA8BC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport {\n\tAnchorSet,\n\ttype DeltaDetachedNodeId,\n\ttype DetachedFieldIndex,\n\ttype IEditableForest,\n\ttype RevisionTag,\n\ttype TreeStoredSchemaRepository,\n\ttagChange,\n\tvisitDelta,\n} from \"../core/index.js\";\nimport {\n\ttype TreeChunk,\n\tchunkTree,\n\tdefaultChunkPolicy,\n\tintoDelta,\n\trelevantRemovedRoots,\n\tupdateRefreshers as updateDataChangeRefreshers,\n} from \"../feature-libraries/index.js\";\nimport { disposeSymbol } from \"../util/index.js\";\nimport { updateRefreshers } from \"./sharedTreeChangeFamily.js\";\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\nimport type {\n\tChangeEnricherMutableCheckout,\n\tChangeEnricherReadonlyCheckout,\n} from \"../shared-tree-core/index.js\";\n\nexport class SharedTreeReadonlyChangeEnricher\n\timplements ChangeEnricherReadonlyCheckout<SharedTreeChange>\n{\n\t/**\n\t * @param forest - The state based on which to enrich changes.\n\t * Exclusively owned by the constructed instance.\n\t * @param schema - The schema that corresponds to the forest.\n\t * @param removedRoots - The set of removed roots based on which to enrich changes.\n\t * Exclusively owned by the constructed instance.\n\t */\n\tpublic constructor(\n\t\tprotected readonly forest: IEditableForest,\n\t\tprivate readonly schema: TreeStoredSchemaRepository,\n\t\tprotected readonly removedRoots: DetachedFieldIndex,\n\t) {}\n\n\tpublic fork(): ChangeEnricherMutableCheckout<SharedTreeChange> {\n\t\treturn new SharedTreeMutableChangeEnricher(\n\t\t\tthis.forest.clone(this.schema, new AnchorSet()),\n\t\t\tthis.schema,\n\t\t\tthis.removedRoots.clone(),\n\t\t);\n\t}\n\n\tpublic updateChangeEnrichments(change: SharedTreeChange): SharedTreeChange {\n\t\treturn updateRefreshers(\n\t\t\tchange,\n\t\t\tthis.getDetachedRoot,\n\t\t\trelevantRemovedRoots,\n\t\t\tupdateDataChangeRefreshers,\n\t\t);\n\t}\n\n\tprivate readonly getDetachedRoot = (id: DeltaDetachedNodeId): TreeChunk | undefined => {\n\t\tconst root = this.removedRoots.tryGetEntry(id);\n\t\tif (root !== undefined) {\n\t\t\tconst cursor = this.forest.getCursorAboveDetachedFields();\n\t\t\tconst parentField = this.removedRoots.toFieldKey(root);\n\t\t\tcursor.enterField(parentField);\n\t\t\tcursor.enterNode(0);\n\t\t\treturn chunkTree(cursor, defaultChunkPolicy);\n\t\t}\n\t\treturn undefined;\n\t};\n}\n\nexport class SharedTreeMutableChangeEnricher\n\textends SharedTreeReadonlyChangeEnricher\n\timplements ChangeEnricherMutableCheckout<SharedTreeChange>\n{\n\tpublic applyTipChange(change: SharedTreeChange, revision?: RevisionTag): void {\n\t\tfor (const dataOrSchemaChange of change.changes) {\n\t\t\tconst type = dataOrSchemaChange.type;\n\t\t\tswitch (type) {\n\t\t\t\tcase \"data\": {\n\t\t\t\t\tconst delta = intoDelta(tagChange(dataOrSchemaChange.innerChange, revision));\n\t\t\t\t\tconst visitor = this.forest.acquireVisitor();\n\t\t\t\t\tvisitDelta(delta, visitor, this.removedRoots);\n\t\t\t\t\tvisitor.free();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"schema\":\n\t\t\t\t\t// This enricher doesn't need to maintain schema information.\n\t\t\t\t\t// Note that the refreshers being generated through `updateChangeEnrichments` will be encoded using\n\t\t\t\t\t// the schema that was used in the input context of the data changeset these refreshers are on.\n\t\t\t\t\t// See the encoding logic in SharedTreeCore for details.\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(type);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic [disposeSymbol](): void {\n\t\t// TODO: in the future, forest and/or its AnchorSet may require disposal.\n\t}\n}\n"]}
@@ -17,11 +17,6 @@ const sharedTreeEditBuilder_js_1 = require("./sharedTreeEditBuilder.js");
17
17
  * @sealed
18
18
  */
19
19
  class SharedTreeChangeFamily {
20
- static emptyChange = {
21
- changes: [],
22
- };
23
- codecs;
24
- modularChangeFamily;
25
20
  constructor(revisionTagCodec, fieldBatchCodec, codecOptions, chunkCompressionStrategy) {
26
21
  const modularChangeCodec = (0, index_js_2.makeModularChangeCodecFamily)(index_js_2.fieldKindConfigurations, revisionTagCodec, fieldBatchCodec, codecOptions, chunkCompressionStrategy);
27
22
  this.modularChangeFamily = new index_js_2.ModularChangeFamily(index_js_2.fieldKinds, modularChangeCodec);
@@ -129,6 +124,9 @@ class SharedTreeChangeFamily {
129
124
  }
130
125
  }
131
126
  exports.SharedTreeChangeFamily = SharedTreeChangeFamily;
127
+ SharedTreeChangeFamily.emptyChange = {
128
+ changes: [],
129
+ };
132
130
  function hasSchemaChange(change) {
133
131
  return change.changes.some((innerChange) => innerChange.type === "schema");
134
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTreeChangeFamily.js","sourceRoot":"","sources":["../../src/shared-tree/sharedTreeChangeFamily.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAG7D,+CAU0B;AAC1B,4DASuC;AACvC,+CAM0B;AAE1B,2EAA8E;AAE9E,yEAAmE;AAEnE;;;;GAIG;AACH,MAAa,sBAAsB;IAK3B,MAAM,CAAU,WAAW,GAAqB;QACtD,OAAO,EAAE,EAAE;KACX,CAAC;IAEc,MAAM,CAAwD;IAC7D,mBAAmB,CAAsB;IAE1D,YACC,gBAAkC,EAClC,eAAgC,EAChC,YAA2B,EAC3B,wBAAkD;QAElD,MAAM,kBAAkB,GAAG,IAAA,uCAA4B,EACtD,kCAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,wBAAwB,CACxB,CAAC;QACF,IAAI,CAAC,mBAAmB,GAAG,IAAI,8BAAmB,CAAC,qBAAU,EAAE,kBAAkB,CAAC,CAAC;QACnF,IAAI,CAAC,MAAM,GAAG,IAAA,2DAA+B,EAC5C,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAC/B,YAAY,CACZ,CAAC;IACH,CAAC;IAEM,WAAW,CAAC,cAAkD;QACpE,OAAO,IAAI,gDAAqB,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAC5E,CAAC;IAEM,OAAO,CAAC,OAAyC;QACvD,MAAM,UAAU,GAAyC,EAAE,CAAC;QAC5D,MAAM,aAAa,GAAqC,EAAE,CAAC;QAE3D,MAAM,kBAAkB,GAAG,GAAS,EAAE;YACrC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,UAAU,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC;iBAC5D,CAAC,CAAC;gBACH,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YACjC,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC9B,kBAAkB,EAAE,CAAC;oBACrB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACP,aAAa,CAAC,IAAI,CAAC,IAAA,0BAAe,EAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpE,CAAC;YACF,CAAC;QACF,CAAC;QAED,kBAAkB,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,MAAsC,EAAE,UAAmB;QACxE,MAAM,iBAAiB,GAEoB,CAAC,WAAW,EAAE,EAAE;YAC1D,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,MAAM;oBACV,OAAO;wBACN,IAAI,EAAE,MAAM;wBACZ,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAC3C,IAAA,0BAAe,EAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,EAChD,UAAU,CACV;qBACD,CAAC;gBACH,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACf,OAAO;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE;4BACZ,MAAM,EAAE;gCACP,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG;gCACvC,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG;6BACvC;4BACD,SAAS,EAAE,IAAI;yBACf;qBACD,CAAC;gBACH,CAAC;gBACD;oBACC,IAAA,eAAI,EAAC,iCAAiC,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC,CAAC;QACF,OAAO;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;SAC/D,CAAC;IACH,CAAC;IAEM,MAAM,CACZ,MAAsC,EACtC,IAAoC,EACpC,gBAAwC;QAExC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5E,OAAO,MAAM,CAAC,MAAM,CAAC;QACtB,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,qIAAqI;YACrI,kGAAkG;YAClG,8EAA8E;YAC9E,sIAAsI;YACtI,kIAAkI;YAClI,4IAA4I;YAC5I,qIAAqI;YACrI,4CAA4C;YAC5C,OAAO,sBAAsB,CAAC,WAAW,CAAC;QAC3C,CAAC;QACD,IAAA,iBAAM,EACL,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EACtE,KAAK,CAAC,2FAA2F,CACjG,CAAC;QAEF,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAA,iBAAM,EACL,mBAAmB,CAAC,IAAI,KAAK,MAAM,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EACrE,KAAK,CAAC,oCAAoC,CAC1C,CAAC;QAEF,OAAO;YACN,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAC3C,IAAA,0BAAe,EAAC,MAAM,EAAE,mBAAmB,CAAC,WAAW,CAAC,EACxD,IAAA,0BAAe,EAAC,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,EACjD,gBAAgB,CAChB;iBACD;aACD;SACD,CAAC;IACH,CAAC;IAEM,cAAc,CACpB,MAAwB,EACxB,WAAoC,EACpC,UAAwB;QAExB,OAAO;YACN,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrC,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM;oBAC3B,CAAC,CAAC;wBACA,GAAG,KAAK;wBACR,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAC3D,KAAK,CAAC,WAAW,EACjB,WAAW,EACX,UAAU,CACV;qBACA;oBACH,CAAC,CAAC,KAAK,CAAC;YACV,CAAC,CAAC;SACF,CAAC;IACH,CAAC;IAED,IAAW,OAAO;QACjB,OAAO,IAAI,CAAC;IACb,CAAC;;AAxKF,wDAyKC;AAED,SAAgB,eAAe,CAAC,MAAwB;IACvD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC5E,CAAC;AAFD,0CAEC;AAED,SAAS,cAAc,CACtB,MAAwB,EACxB,GAAmD;IAEnD,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE;YAClD,IAAI,kBAAkB,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxC,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,GAAG,CAAC,kBAAkB,CAAC,WAAW,CAAC;iBAChD,CAAC;YACH,CAAC;YACD,OAAO,kBAAkB,CAAC;QAC3B,CAAC,CAAC;KACF,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC/B,MAAwB,EACxB,eAAmE,EACnE,kCAEkC,EAClC,0BAKqB;IAErB,6GAA6G;IAC7G,gHAAgH;IAChH,8DAA8D;IAC9D,wEAAwE;IACxE,wFAAwF;IACxF,2CAA2C;IAC3C,+GAA+G;IAC/G,6FAA6F;IAC7F,mHAAmH;IACnH,8EAA8E;IAC9E,uDAAuD;IACvD,mEAAmE;IACnE,kHAAkH;IAClH,4CAA4C;IAC5C,sGAAsG;IACtG,mHAAmH;IACnH,mGAAmG;IAEnG,kFAAkF;IAClF,MAAM,aAAa,GAA+C,IAAI,GAAG,EAAE,CAAC;IAC5E,SAAS,0BAA0B,CAAC,EAAuB;QAC1D,IAAA,yBAAc,EAAC,aAAa,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,QAAQ,CAAC,CAAC,mBAAmB,CAC5B,QAAuC;QAEvC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAA,4BAAiB,EAAC,aAAa,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,EAAE,CAAC;YACV,CAAC;QACF,CAAC;IACF,CAAC;IACD,IAAI,iBAAiB,GAAG,IAAI,CAAC;IAC7B,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE;QAC5C,MAAM,YAAY,GAAG,kCAAkC,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,iBAAiB,EAAE,CAAC;YACvB,iBAAiB,GAAG,KAAK,CAAC;YAC1B,OAAO,0BAA0B,CAChC,UAAU,EACV,0BAA0B,EAC1B,YAAY,EACZ,IAAI,CACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACP,OAAO,0BAA0B,CAChC,UAAU,EACV,0BAA0B,EAC1B,mBAAmB,CAAC,YAAY,CAAC,EACjC,KAAK,CACL,CAAC;QACH,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAlED,4CAkEC","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 type { ICodecFamily, ICodecOptions } from \"../codec/index.js\";\nimport {\n\ttype ChangeEncodingContext,\n\ttype ChangeFamily,\n\ttype ChangeRebaser,\n\ttype DeltaDetachedNodeId,\n\ttype RevisionMetadataSource,\n\ttype RevisionTag,\n\ttype RevisionTagCodec,\n\ttype TaggedChange,\n\tmapTaggedChange,\n} from \"../core/index.js\";\nimport {\n\ttype FieldBatchCodec,\n\tModularChangeFamily,\n\ttype ModularChangeset,\n\ttype TreeChunk,\n\ttype TreeCompressionStrategy,\n\tfieldKindConfigurations,\n\tfieldKinds,\n\tmakeModularChangeCodecFamily,\n} from \"../feature-libraries/index.js\";\nimport {\n\ttype Mutable,\n\ttype NestedSet,\n\taddToNestedSet,\n\tfail,\n\tnestedSetContains,\n} from \"../util/index.js\";\n\nimport { makeSharedTreeChangeCodecFamily } from \"./sharedTreeChangeCodecs.js\";\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\nimport { SharedTreeEditBuilder } from \"./sharedTreeEditBuilder.js\";\n\n/**\n * Implementation of {@link ChangeFamily} that combines edits to fields and schema changes.\n *\n * @sealed\n */\nexport class SharedTreeChangeFamily\n\timplements\n\t\tChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,\n\t\tChangeRebaser<SharedTreeChange>\n{\n\tpublic static readonly emptyChange: SharedTreeChange = {\n\t\tchanges: [],\n\t};\n\n\tpublic readonly codecs: ICodecFamily<SharedTreeChange, ChangeEncodingContext>;\n\tprivate readonly modularChangeFamily: ModularChangeFamily;\n\n\tpublic constructor(\n\t\trevisionTagCodec: RevisionTagCodec,\n\t\tfieldBatchCodec: FieldBatchCodec,\n\t\tcodecOptions: ICodecOptions,\n\t\tchunkCompressionStrategy?: TreeCompressionStrategy,\n\t) {\n\t\tconst modularChangeCodec = makeModularChangeCodecFamily(\n\t\t\tfieldKindConfigurations,\n\t\t\trevisionTagCodec,\n\t\t\tfieldBatchCodec,\n\t\t\tcodecOptions,\n\t\t\tchunkCompressionStrategy,\n\t\t);\n\t\tthis.modularChangeFamily = new ModularChangeFamily(fieldKinds, modularChangeCodec);\n\t\tthis.codecs = makeSharedTreeChangeCodecFamily(\n\t\t\tthis.modularChangeFamily.codecs,\n\t\t\tcodecOptions,\n\t\t);\n\t}\n\n\tpublic buildEditor(changeReceiver: (change: SharedTreeChange) => void): SharedTreeEditBuilder {\n\t\treturn new SharedTreeEditBuilder(this.modularChangeFamily, changeReceiver);\n\t}\n\n\tpublic compose(changes: TaggedChange<SharedTreeChange>[]): SharedTreeChange {\n\t\tconst newChanges: Mutable<SharedTreeChange[\"changes\"]> = [];\n\t\tconst dataChangeRun: TaggedChange<ModularChangeset>[] = [];\n\n\t\tconst flushDataChangeRun = (): void => {\n\t\t\tif (dataChangeRun.length > 0) {\n\t\t\t\tnewChanges.push({\n\t\t\t\t\ttype: \"data\",\n\t\t\t\t\tinnerChange: this.modularChangeFamily.compose(dataChangeRun),\n\t\t\t\t});\n\t\t\t\tdataChangeRun.length = 0;\n\t\t\t}\n\t\t};\n\n\t\tfor (const topChange of changes) {\n\t\t\tfor (const change of topChange.change.changes) {\n\t\t\t\tif (change.type === \"schema\") {\n\t\t\t\t\tflushDataChangeRun();\n\t\t\t\t\tnewChanges.push(change);\n\t\t\t\t} else {\n\t\t\t\t\tdataChangeRun.push(mapTaggedChange(topChange, change.innerChange));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tflushDataChangeRun();\n\t\treturn { changes: newChanges };\n\t}\n\n\tpublic invert(change: TaggedChange<SharedTreeChange>, isRollback: boolean): SharedTreeChange {\n\t\tconst invertInnerChange: (\n\t\t\tinnerChange: SharedTreeChange[\"changes\"][number],\n\t\t) => SharedTreeChange[\"changes\"][number] = (innerChange) => {\n\t\t\tswitch (innerChange.type) {\n\t\t\t\tcase \"data\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"data\",\n\t\t\t\t\t\tinnerChange: this.modularChangeFamily.invert(\n\t\t\t\t\t\t\tmapTaggedChange(change, innerChange.innerChange),\n\t\t\t\t\t\t\tisRollback,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\tcase \"schema\": {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"schema\",\n\t\t\t\t\t\tinnerChange: {\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\tnew: innerChange.innerChange.schema.old,\n\t\t\t\t\t\t\t\told: innerChange.innerChange.schema.new,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tisInverse: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tfail(\"Unknown SharedTree change type.\");\n\t\t\t}\n\t\t};\n\t\treturn {\n\t\t\tchanges: change.change.changes.map(invertInnerChange).reverse(),\n\t\t};\n\t}\n\n\tpublic rebase(\n\t\tchange: TaggedChange<SharedTreeChange>,\n\t\tover: TaggedChange<SharedTreeChange>,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): SharedTreeChange {\n\t\tif (change.change.changes.length === 0 || over.change.changes.length === 0) {\n\t\t\treturn change.change;\n\t\t}\n\n\t\tif (hasSchemaChange(change.change) || hasSchemaChange(over.change)) {\n\t\t\t// Any SharedTreeChange (a list of sub-changes) that contains a schema change will cause ANY change that rebases over it to conflict.\n\t\t\t// Similarly, any SharedTreeChange containing a schema change will fail to rebase over ANY change.\n\t\t\t// Those two combine to mean: no concurrency with schema changes is supported.\n\t\t\t// This is fine because it's an open problem. Example: a tree with an A at the root and a schema that allows an A | B at the root will\n\t\t\t// become out of schema if a schema changes to restrict root types to just A is concurrent with a data change that sets it to a B.\n\t\t\t// We don't have an efficient way to detect this document-wide and there are varying opinions on restricting schema changes to prevent this.\n\t\t\t// A SharedTreeChange containing a schema change will NOT conflict in a non-concurrency case, as the \"meatless sandwich\" optimization\n\t\t\t// will result in rebase never being called.\n\t\t\treturn SharedTreeChangeFamily.emptyChange;\n\t\t}\n\t\tassert(\n\t\t\tchange.change.changes.length === 1 && over.change.changes.length === 1,\n\t\t\t0x884 /* SharedTreeChange should have exactly one inner change if no schema change is present. */,\n\t\t);\n\n\t\tconst dataChangeIntention = change.change.changes[0];\n\t\tconst dataChangeOver = over.change.changes[0];\n\t\tassert(\n\t\t\tdataChangeIntention.type === \"data\" && dataChangeOver.type === \"data\",\n\t\t\t0x885 /* Data change should be present. */,\n\t\t);\n\n\t\treturn {\n\t\t\tchanges: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"data\",\n\t\t\t\t\tinnerChange: this.modularChangeFamily.rebase(\n\t\t\t\t\t\tmapTaggedChange(change, dataChangeIntention.innerChange),\n\t\t\t\t\t\tmapTaggedChange(over, dataChangeOver.innerChange),\n\t\t\t\t\t\trevisionMetadata,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\tpublic changeRevision(\n\t\tchange: SharedTreeChange,\n\t\tnewRevision: RevisionTag | undefined,\n\t\trollbackOf?: RevisionTag,\n\t): SharedTreeChange {\n\t\treturn {\n\t\t\tchanges: change.changes.map((inner) => {\n\t\t\t\treturn inner.type === \"data\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...inner,\n\t\t\t\t\t\t\tinnerChange: this.modularChangeFamily.rebaser.changeRevision(\n\t\t\t\t\t\t\t\tinner.innerChange,\n\t\t\t\t\t\t\t\tnewRevision,\n\t\t\t\t\t\t\t\trollbackOf,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t }\n\t\t\t\t\t: inner;\n\t\t\t}),\n\t\t};\n\t}\n\n\tpublic get rebaser(): ChangeRebaser<SharedTreeChange> {\n\t\treturn this;\n\t}\n}\n\nexport function hasSchemaChange(change: SharedTreeChange): boolean {\n\treturn change.changes.some((innerChange) => innerChange.type === \"schema\");\n}\n\nfunction mapDataChanges(\n\tchange: SharedTreeChange,\n\tmap: (change: ModularChangeset) => ModularChangeset,\n): SharedTreeChange {\n\treturn {\n\t\tchanges: change.changes.map((dataOrSchemaChange) => {\n\t\t\tif (dataOrSchemaChange.type === \"data\") {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"data\",\n\t\t\t\t\tinnerChange: map(dataOrSchemaChange.innerChange),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn dataOrSchemaChange;\n\t\t}),\n\t};\n}\n\n/**\n * Produces an equivalent change with an updated set of appropriate refreshers.\n * @param change - The change to compute refreshers for. Not mutated.\n * @param getDetachedNode - retrieves a {@link TreeChunk} for the corresponding detached node id.\n * Is expected to read from a forest in a state that corresponds to the input context of the given change.\n * @returns An equivalent change with an updated set of appropriate refreshers.\n */\nexport function updateRefreshers(\n\tchange: SharedTreeChange,\n\tgetDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,\n\trelevantRemovedRootsFromDataChange: (\n\t\ttaggedChange: ModularChangeset,\n\t) => Iterable<DeltaDetachedNodeId>,\n\tupdateDataChangeRefreshers: (\n\t\tchange: ModularChangeset,\n\t\tgetDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,\n\t\tremovedRoots: Iterable<DeltaDetachedNodeId>,\n\t\trequireRefreshers: boolean,\n\t) => ModularChangeset,\n): SharedTreeChange {\n\t// Adding refreshers to a SharedTreeChange is not as simple as adding refreshers to each of its data changes.\n\t// This is because earlier data changes affect the state of the forest in ways that can influence the refreshers\n\t// needed for later data changes. This can happen in two ways:\n\t// 1. By removing a tree that is a relevant root to a later data change.\n\t// 2. By changing the contents of a tree that is a relevant root to a later data change.\n\t// (Note that these two cases can compound)\n\t// Thankfully, in both of these cases, refreshers can be omitted from the later data changes because the forest\n\t// applying those data changes is guaranteed to still have have the relevant trees in memory.\n\t// This means that for the first data change, all required refreshers should be added (and none should be missing).\n\t// While for later data changes, we should not include refreshers that either:\n\t// A) were already included in the earlier data changes\n\t// B) correspond to trees that were removed by earlier data changes\n\t// Set A is excluded by tracking which roots have already been included in the earlier data changes, and filtering\n\t// them out from the relevant removed roots.\n\t// Set B is excluded because the `getDetachedNode` is bound to return `undefined` for them, which tell\n\t// `defaultUpdateRefreshers` to ignore. One downside of this approach is that it prevents `defaultUpdateRefreshers`\n\t// from detecting cases where a detached node is missing for another reason (which would be a bug).\n\n\t// The roots that have been included as refreshers across all data changes so far.\n\tconst includedRoots: NestedSet<RevisionTag | undefined, number> = new Map();\n\tfunction getAndRememberDetachedNode(id: DeltaDetachedNodeId): TreeChunk | undefined {\n\t\taddToNestedSet(includedRoots, id.major, id.minor);\n\t\treturn getDetachedNode(id);\n\t}\n\tfunction* filterIncludedRoots(\n\t\ttoFilter: Iterable<DeltaDetachedNodeId>,\n\t): Iterable<DeltaDetachedNodeId> {\n\t\tfor (const id of toFilter) {\n\t\t\tif (!nestedSetContains(includedRoots, id.major, id.minor)) {\n\t\t\t\tyield id;\n\t\t\t}\n\t\t}\n\t}\n\tlet isFirstDataChange = true;\n\treturn mapDataChanges(change, (dataChange) => {\n\t\tconst removedRoots = relevantRemovedRootsFromDataChange(dataChange);\n\t\tif (isFirstDataChange) {\n\t\t\tisFirstDataChange = false;\n\t\t\treturn updateDataChangeRefreshers(\n\t\t\t\tdataChange,\n\t\t\t\tgetAndRememberDetachedNode,\n\t\t\t\tremovedRoots,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t} else {\n\t\t\treturn updateDataChangeRefreshers(\n\t\t\t\tdataChange,\n\t\t\t\tgetAndRememberDetachedNode,\n\t\t\t\tfilterIncludedRoots(removedRoots),\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"sharedTreeChangeFamily.js","sourceRoot":"","sources":["../../src/shared-tree/sharedTreeChangeFamily.ts"],"names":[],"mappings":"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","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 type { ICodecFamily, ICodecOptions } from \"../codec/index.js\";\nimport {\n\ttype ChangeEncodingContext,\n\ttype ChangeFamily,\n\ttype ChangeRebaser,\n\ttype DeltaDetachedNodeId,\n\ttype RevisionMetadataSource,\n\ttype RevisionTag,\n\ttype RevisionTagCodec,\n\ttype TaggedChange,\n\tmapTaggedChange,\n} from \"../core/index.js\";\nimport {\n\ttype FieldBatchCodec,\n\tModularChangeFamily,\n\ttype ModularChangeset,\n\ttype TreeChunk,\n\ttype TreeCompressionStrategy,\n\tfieldKindConfigurations,\n\tfieldKinds,\n\tmakeModularChangeCodecFamily,\n} from \"../feature-libraries/index.js\";\nimport {\n\ttype Mutable,\n\ttype NestedSet,\n\taddToNestedSet,\n\tfail,\n\tnestedSetContains,\n} from \"../util/index.js\";\n\nimport { makeSharedTreeChangeCodecFamily } from \"./sharedTreeChangeCodecs.js\";\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\nimport { SharedTreeEditBuilder } from \"./sharedTreeEditBuilder.js\";\n\n/**\n * Implementation of {@link ChangeFamily} that combines edits to fields and schema changes.\n *\n * @sealed\n */\nexport class SharedTreeChangeFamily\n\timplements\n\t\tChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,\n\t\tChangeRebaser<SharedTreeChange>\n{\n\tpublic static readonly emptyChange: SharedTreeChange = {\n\t\tchanges: [],\n\t};\n\n\tpublic readonly codecs: ICodecFamily<SharedTreeChange, ChangeEncodingContext>;\n\tprivate readonly modularChangeFamily: ModularChangeFamily;\n\n\tpublic constructor(\n\t\trevisionTagCodec: RevisionTagCodec,\n\t\tfieldBatchCodec: FieldBatchCodec,\n\t\tcodecOptions: ICodecOptions,\n\t\tchunkCompressionStrategy?: TreeCompressionStrategy,\n\t) {\n\t\tconst modularChangeCodec = makeModularChangeCodecFamily(\n\t\t\tfieldKindConfigurations,\n\t\t\trevisionTagCodec,\n\t\t\tfieldBatchCodec,\n\t\t\tcodecOptions,\n\t\t\tchunkCompressionStrategy,\n\t\t);\n\t\tthis.modularChangeFamily = new ModularChangeFamily(fieldKinds, modularChangeCodec);\n\t\tthis.codecs = makeSharedTreeChangeCodecFamily(\n\t\t\tthis.modularChangeFamily.codecs,\n\t\t\tcodecOptions,\n\t\t);\n\t}\n\n\tpublic buildEditor(changeReceiver: (change: SharedTreeChange) => void): SharedTreeEditBuilder {\n\t\treturn new SharedTreeEditBuilder(this.modularChangeFamily, changeReceiver);\n\t}\n\n\tpublic compose(changes: TaggedChange<SharedTreeChange>[]): SharedTreeChange {\n\t\tconst newChanges: Mutable<SharedTreeChange[\"changes\"]> = [];\n\t\tconst dataChangeRun: TaggedChange<ModularChangeset>[] = [];\n\n\t\tconst flushDataChangeRun = (): void => {\n\t\t\tif (dataChangeRun.length > 0) {\n\t\t\t\tnewChanges.push({\n\t\t\t\t\ttype: \"data\",\n\t\t\t\t\tinnerChange: this.modularChangeFamily.compose(dataChangeRun),\n\t\t\t\t});\n\t\t\t\tdataChangeRun.length = 0;\n\t\t\t}\n\t\t};\n\n\t\tfor (const topChange of changes) {\n\t\t\tfor (const change of topChange.change.changes) {\n\t\t\t\tif (change.type === \"schema\") {\n\t\t\t\t\tflushDataChangeRun();\n\t\t\t\t\tnewChanges.push(change);\n\t\t\t\t} else {\n\t\t\t\t\tdataChangeRun.push(mapTaggedChange(topChange, change.innerChange));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tflushDataChangeRun();\n\t\treturn { changes: newChanges };\n\t}\n\n\tpublic invert(change: TaggedChange<SharedTreeChange>, isRollback: boolean): SharedTreeChange {\n\t\tconst invertInnerChange: (\n\t\t\tinnerChange: SharedTreeChange[\"changes\"][number],\n\t\t) => SharedTreeChange[\"changes\"][number] = (innerChange) => {\n\t\t\tswitch (innerChange.type) {\n\t\t\t\tcase \"data\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"data\",\n\t\t\t\t\t\tinnerChange: this.modularChangeFamily.invert(\n\t\t\t\t\t\t\tmapTaggedChange(change, innerChange.innerChange),\n\t\t\t\t\t\t\tisRollback,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\tcase \"schema\": {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"schema\",\n\t\t\t\t\t\tinnerChange: {\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\tnew: innerChange.innerChange.schema.old,\n\t\t\t\t\t\t\t\told: innerChange.innerChange.schema.new,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tisInverse: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tfail(\"Unknown SharedTree change type.\");\n\t\t\t}\n\t\t};\n\t\treturn {\n\t\t\tchanges: change.change.changes.map(invertInnerChange).reverse(),\n\t\t};\n\t}\n\n\tpublic rebase(\n\t\tchange: TaggedChange<SharedTreeChange>,\n\t\tover: TaggedChange<SharedTreeChange>,\n\t\trevisionMetadata: RevisionMetadataSource,\n\t): SharedTreeChange {\n\t\tif (change.change.changes.length === 0 || over.change.changes.length === 0) {\n\t\t\treturn change.change;\n\t\t}\n\n\t\tif (hasSchemaChange(change.change) || hasSchemaChange(over.change)) {\n\t\t\t// Any SharedTreeChange (a list of sub-changes) that contains a schema change will cause ANY change that rebases over it to conflict.\n\t\t\t// Similarly, any SharedTreeChange containing a schema change will fail to rebase over ANY change.\n\t\t\t// Those two combine to mean: no concurrency with schema changes is supported.\n\t\t\t// This is fine because it's an open problem. Example: a tree with an A at the root and a schema that allows an A | B at the root will\n\t\t\t// become out of schema if a schema changes to restrict root types to just A is concurrent with a data change that sets it to a B.\n\t\t\t// We don't have an efficient way to detect this document-wide and there are varying opinions on restricting schema changes to prevent this.\n\t\t\t// A SharedTreeChange containing a schema change will NOT conflict in a non-concurrency case, as the \"meatless sandwich\" optimization\n\t\t\t// will result in rebase never being called.\n\t\t\treturn SharedTreeChangeFamily.emptyChange;\n\t\t}\n\t\tassert(\n\t\t\tchange.change.changes.length === 1 && over.change.changes.length === 1,\n\t\t\t0x884 /* SharedTreeChange should have exactly one inner change if no schema change is present. */,\n\t\t);\n\n\t\tconst dataChangeIntention = change.change.changes[0];\n\t\tconst dataChangeOver = over.change.changes[0];\n\t\tassert(\n\t\t\tdataChangeIntention.type === \"data\" && dataChangeOver.type === \"data\",\n\t\t\t0x885 /* Data change should be present. */,\n\t\t);\n\n\t\treturn {\n\t\t\tchanges: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"data\",\n\t\t\t\t\tinnerChange: this.modularChangeFamily.rebase(\n\t\t\t\t\t\tmapTaggedChange(change, dataChangeIntention.innerChange),\n\t\t\t\t\t\tmapTaggedChange(over, dataChangeOver.innerChange),\n\t\t\t\t\t\trevisionMetadata,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\tpublic changeRevision(\n\t\tchange: SharedTreeChange,\n\t\tnewRevision: RevisionTag | undefined,\n\t\trollbackOf?: RevisionTag,\n\t): SharedTreeChange {\n\t\treturn {\n\t\t\tchanges: change.changes.map((inner) => {\n\t\t\t\treturn inner.type === \"data\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...inner,\n\t\t\t\t\t\t\tinnerChange: this.modularChangeFamily.rebaser.changeRevision(\n\t\t\t\t\t\t\t\tinner.innerChange,\n\t\t\t\t\t\t\t\tnewRevision,\n\t\t\t\t\t\t\t\trollbackOf,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t }\n\t\t\t\t\t: inner;\n\t\t\t}),\n\t\t};\n\t}\n\n\tpublic get rebaser(): ChangeRebaser<SharedTreeChange> {\n\t\treturn this;\n\t}\n}\n\nexport function hasSchemaChange(change: SharedTreeChange): boolean {\n\treturn change.changes.some((innerChange) => innerChange.type === \"schema\");\n}\n\nfunction mapDataChanges(\n\tchange: SharedTreeChange,\n\tmap: (change: ModularChangeset) => ModularChangeset,\n): SharedTreeChange {\n\treturn {\n\t\tchanges: change.changes.map((dataOrSchemaChange) => {\n\t\t\tif (dataOrSchemaChange.type === \"data\") {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"data\",\n\t\t\t\t\tinnerChange: map(dataOrSchemaChange.innerChange),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn dataOrSchemaChange;\n\t\t}),\n\t};\n}\n\n/**\n * Produces an equivalent change with an updated set of appropriate refreshers.\n * @param change - The change to compute refreshers for. Not mutated.\n * @param getDetachedNode - retrieves a {@link TreeChunk} for the corresponding detached node id.\n * Is expected to read from a forest in a state that corresponds to the input context of the given change.\n * @returns An equivalent change with an updated set of appropriate refreshers.\n */\nexport function updateRefreshers(\n\tchange: SharedTreeChange,\n\tgetDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,\n\trelevantRemovedRootsFromDataChange: (\n\t\ttaggedChange: ModularChangeset,\n\t) => Iterable<DeltaDetachedNodeId>,\n\tupdateDataChangeRefreshers: (\n\t\tchange: ModularChangeset,\n\t\tgetDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,\n\t\tremovedRoots: Iterable<DeltaDetachedNodeId>,\n\t\trequireRefreshers: boolean,\n\t) => ModularChangeset,\n): SharedTreeChange {\n\t// Adding refreshers to a SharedTreeChange is not as simple as adding refreshers to each of its data changes.\n\t// This is because earlier data changes affect the state of the forest in ways that can influence the refreshers\n\t// needed for later data changes. This can happen in two ways:\n\t// 1. By removing a tree that is a relevant root to a later data change.\n\t// 2. By changing the contents of a tree that is a relevant root to a later data change.\n\t// (Note that these two cases can compound)\n\t// Thankfully, in both of these cases, refreshers can be omitted from the later data changes because the forest\n\t// applying those data changes is guaranteed to still have have the relevant trees in memory.\n\t// This means that for the first data change, all required refreshers should be added (and none should be missing).\n\t// While for later data changes, we should not include refreshers that either:\n\t// A) were already included in the earlier data changes\n\t// B) correspond to trees that were removed by earlier data changes\n\t// Set A is excluded by tracking which roots have already been included in the earlier data changes, and filtering\n\t// them out from the relevant removed roots.\n\t// Set B is excluded because the `getDetachedNode` is bound to return `undefined` for them, which tell\n\t// `defaultUpdateRefreshers` to ignore. One downside of this approach is that it prevents `defaultUpdateRefreshers`\n\t// from detecting cases where a detached node is missing for another reason (which would be a bug).\n\n\t// The roots that have been included as refreshers across all data changes so far.\n\tconst includedRoots: NestedSet<RevisionTag | undefined, number> = new Map();\n\tfunction getAndRememberDetachedNode(id: DeltaDetachedNodeId): TreeChunk | undefined {\n\t\taddToNestedSet(includedRoots, id.major, id.minor);\n\t\treturn getDetachedNode(id);\n\t}\n\tfunction* filterIncludedRoots(\n\t\ttoFilter: Iterable<DeltaDetachedNodeId>,\n\t): Iterable<DeltaDetachedNodeId> {\n\t\tfor (const id of toFilter) {\n\t\t\tif (!nestedSetContains(includedRoots, id.major, id.minor)) {\n\t\t\t\tyield id;\n\t\t\t}\n\t\t}\n\t}\n\tlet isFirstDataChange = true;\n\treturn mapDataChanges(change, (dataChange) => {\n\t\tconst removedRoots = relevantRemovedRootsFromDataChange(dataChange);\n\t\tif (isFirstDataChange) {\n\t\t\tisFirstDataChange = false;\n\t\t\treturn updateDataChangeRefreshers(\n\t\t\t\tdataChange,\n\t\t\t\tgetAndRememberDetachedNode,\n\t\t\t\tremovedRoots,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t} else {\n\t\t\treturn updateDataChangeRefreshers(\n\t\t\t\tdataChange,\n\t\t\t\tgetAndRememberDetachedNode,\n\t\t\t\tfilterIncludedRoots(removedRoots),\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t});\n}\n"]}
@@ -11,8 +11,6 @@ const index_js_1 = require("../feature-libraries/index.js");
11
11
  * @sealed
12
12
  */
13
13
  class SharedTreeEditBuilder extends index_js_1.DefaultEditBuilder {
14
- changeReceiver;
15
- schema;
16
14
  constructor(modularChangeFamily, changeReceiver) {
17
15
  super(modularChangeFamily, (change) => changeReceiver({
18
16
  changes: [{ type: "data", innerChange: change }],
@@ -1 +1 @@
1
- {"version":3,"file":"sharedTreeEditBuilder.js","sourceRoot":"","sources":["../../src/shared-tree/sharedTreeEditBuilder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,4DAIuC;AA6BvC;;;GAGG;AACH,MAAa,qBACZ,SAAQ,6BAAkB;IAOR;IAJF,MAAM,CAAgB;IAEtC,YACC,mBAAwC,EACvB,cAAkD;QAEnE,KAAK,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE,CACrC,cAAc,CAAC;YACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;SAChD,CAAC,CACF,CAAC;QANe,mBAAc,GAAd,cAAc,CAAoC;QAQnE,IAAI,CAAC,MAAM,GAAG;YACb,eAAe,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;gBACzC,IAAI,CAAC,cAAc,CAAC;oBACnB,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE;gCACZ,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE;gCAC1C,SAAS,EAAE,KAAK;6BAChB;yBACD;qBACD;iBACD,CAAC,CAAC;YACJ,CAAC;SACD,CAAC;IACH,CAAC;CACD;AAhCD,sDAgCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ChangeFamilyEditor, TreeStoredSchema } from \"../core/index.js\";\nimport {\n\tDefaultEditBuilder,\n\ttype IDefaultEditBuilder,\n\ttype ModularChangeFamily,\n} from \"../feature-libraries/index.js\";\n\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\n\n/**\n * Editor for schema changes.\n * The only currently supported operation is to replace the stored schema.\n * @internal\n */\nexport interface ISchemaEditor {\n\t/**\n\t * Updates the stored schema.\n\t * @param oldSchema - The schema being overwritten.\n\t * @param newSchema - The new schema to apply.\n\t */\n\tsetStoredSchema(oldSchema: TreeStoredSchema, newSchema: TreeStoredSchema): void;\n}\n\n/**\n * SharedTree editor for transactional tree data and schema changes.\n * @internal\n */\nexport interface ISharedTreeEditor extends IDefaultEditBuilder {\n\t/**\n\t * Editor for schema changes.\n\t */\n\tschema: ISchemaEditor;\n}\n\n/**\n * Implementation of {@link IDefaultEditBuilder} based on the default set of supported field kinds.\n * @sealed\n */\nexport class SharedTreeEditBuilder\n\textends DefaultEditBuilder\n\timplements ChangeFamilyEditor, ISharedTreeEditor\n{\n\tpublic readonly schema: ISchemaEditor;\n\n\tpublic constructor(\n\t\tmodularChangeFamily: ModularChangeFamily,\n\t\tprivate readonly changeReceiver: (change: SharedTreeChange) => void,\n\t) {\n\t\tsuper(modularChangeFamily, (change) =>\n\t\t\tchangeReceiver({\n\t\t\t\tchanges: [{ type: \"data\", innerChange: change }],\n\t\t\t}),\n\t\t);\n\n\t\tthis.schema = {\n\t\t\tsetStoredSchema: (oldSchema, newSchema) => {\n\t\t\t\tthis.changeReceiver({\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"schema\",\n\t\t\t\t\t\t\tinnerChange: {\n\t\t\t\t\t\t\t\tschema: { new: newSchema, old: oldSchema },\n\t\t\t\t\t\t\t\tisInverse: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"sharedTreeEditBuilder.js","sourceRoot":"","sources":["../../src/shared-tree/sharedTreeEditBuilder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,4DAIuC;AA6BvC;;;GAGG;AACH,MAAa,qBACZ,SAAQ,6BAAkB;IAK1B,YACC,mBAAwC,EACvB,cAAkD;QAEnE,KAAK,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE,CACrC,cAAc,CAAC;YACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;SAChD,CAAC,CACF,CAAC;QANe,mBAAc,GAAd,cAAc,CAAoC;QAQnE,IAAI,CAAC,MAAM,GAAG;YACb,eAAe,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;gBACzC,IAAI,CAAC,cAAc,CAAC;oBACnB,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE;gCACZ,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE;gCAC1C,SAAS,EAAE,KAAK;6BAChB;yBACD;qBACD;iBACD,CAAC,CAAC;YACJ,CAAC;SACD,CAAC;IACH,CAAC;CACD;AAhCD,sDAgCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ChangeFamilyEditor, TreeStoredSchema } from \"../core/index.js\";\nimport {\n\tDefaultEditBuilder,\n\ttype IDefaultEditBuilder,\n\ttype ModularChangeFamily,\n} from \"../feature-libraries/index.js\";\n\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\n\n/**\n * Editor for schema changes.\n * The only currently supported operation is to replace the stored schema.\n * @internal\n */\nexport interface ISchemaEditor {\n\t/**\n\t * Updates the stored schema.\n\t * @param oldSchema - The schema being overwritten.\n\t * @param newSchema - The new schema to apply.\n\t */\n\tsetStoredSchema(oldSchema: TreeStoredSchema, newSchema: TreeStoredSchema): void;\n}\n\n/**\n * SharedTree editor for transactional tree data and schema changes.\n * @internal\n */\nexport interface ISharedTreeEditor extends IDefaultEditBuilder {\n\t/**\n\t * Editor for schema changes.\n\t */\n\tschema: ISchemaEditor;\n}\n\n/**\n * Implementation of {@link IDefaultEditBuilder} based on the default set of supported field kinds.\n * @sealed\n */\nexport class SharedTreeEditBuilder\n\textends DefaultEditBuilder\n\timplements ChangeFamilyEditor, ISharedTreeEditor\n{\n\tpublic readonly schema: ISchemaEditor;\n\n\tpublic constructor(\n\t\tmodularChangeFamily: ModularChangeFamily,\n\t\tprivate readonly changeReceiver: (change: SharedTreeChange) => void,\n\t) {\n\t\tsuper(modularChangeFamily, (change) =>\n\t\t\tchangeReceiver({\n\t\t\t\tchanges: [{ type: \"data\", innerChange: change }],\n\t\t\t}),\n\t\t);\n\n\t\tthis.schema = {\n\t\t\tsetStoredSchema: (oldSchema, newSchema) => {\n\t\t\t\tthis.changeReceiver({\n\t\t\t\t\tchanges: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"schema\",\n\t\t\t\t\t\t\tinnerChange: {\n\t\t\t\t\t\t\t\tschema: { new: newSchema, old: oldSchema },\n\t\t\t\t\t\t\t\tisInverse: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
@@ -40,7 +40,6 @@ function createTreeCheckout(idCompressor, mintRevisionTag, revisionTagCodec, arg
40
40
  }
41
41
  exports.createTreeCheckout = createTreeCheckout;
42
42
  class Transaction {
43
- branch;
44
43
  constructor(branch) {
45
44
  this.branch = branch;
46
45
  }
@@ -66,27 +65,6 @@ class Transaction {
66
65
  * An implementation of {@link ITreeCheckoutFork}.
67
66
  */
68
67
  class TreeCheckout {
69
- transaction;
70
- branch;
71
- changeFamily;
72
- storedSchema;
73
- forest;
74
- events;
75
- mintRevisionTag;
76
- revisionTagCodec;
77
- idCompressor;
78
- removedRoots;
79
- isDisposed = false;
80
- /**
81
- * Set of revertibles maintained for automatic disposal
82
- */
83
- revertibles = new Set();
84
- /**
85
- * Each branch's head commit corresponds to a revertible commit.
86
- * Maintaining a whole branch ensures the commit graph is not pruned in a way that would prevent the commit from
87
- * being reverted.
88
- */
89
- revertibleCommitBranches = new Map();
90
68
  constructor(transaction, branch, changeFamily, storedSchema, forest, events, mintRevisionTag, revisionTagCodec, idCompressor, removedRoots = (0, index_js_2.makeDetachedFieldIndex)("repair", revisionTagCodec, idCompressor)) {
91
69
  this.transaction = transaction;
92
70
  this.branch = branch;
@@ -98,6 +76,17 @@ class TreeCheckout {
98
76
  this.revisionTagCodec = revisionTagCodec;
99
77
  this.idCompressor = idCompressor;
100
78
  this.removedRoots = removedRoots;
79
+ this.isDisposed = false;
80
+ /**
81
+ * Set of revertibles maintained for automatic disposal
82
+ */
83
+ this.revertibles = new Set();
84
+ /**
85
+ * Each branch's head commit corresponds to a revertible commit.
86
+ * Maintaining a whole branch ensures the commit graph is not pruned in a way that would prevent the commit from
87
+ * being reverted.
88
+ */
89
+ this.revertibleCommitBranches = new Map();
101
90
  // We subscribe to `beforeChange` rather than `afterChange` here because it's possible that the change is invalid WRT our forest.
102
91
  // For example, a bug in the editor might produce a malformed change object and thus applying the change to the forest will throw an error.
103
92
  // In such a case we will crash here, preventing the change from being added to the commit graph, and preventing `afterChange` from firing.
@@ -1 +1 @@
1
- {"version":3,"file":"treeCheckout.js","sourceRoot":"","sources":["../../src/shared-tree/treeCheckout.ts"],"names":[],"mappings":"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","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\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { noopValidator } from \"../codec/index.js\";\nimport {\n\ttype Anchor,\n\ttype AnchorLocator,\n\ttype AnchorNode,\n\tAnchorSet,\n\ttype AnchorSetRootEvents,\n\ttype ChangeFamily,\n\tCommitKind,\n\ttype CommitMetadata,\n\ttype DeltaVisitor,\n\ttype DetachedFieldIndex,\n\ttype IEditableForest,\n\ttype IForestSubscription,\n\ttype JsonableTree,\n\ttype Revertible,\n\tRevertibleStatus,\n\ttype RevisionTag,\n\ttype RevisionTagCodec,\n\ttype TreeStoredSchema,\n\tTreeStoredSchemaRepository,\n\ttype TreeStoredSchemaSubscription,\n\tcombineVisitors,\n\tmakeAnonChange,\n\tmakeDetachedFieldIndex,\n\trebaseChange,\n\ttagChange,\n\tvisitDelta,\n} from \"../core/index.js\";\nimport {\n\ttype HasListeners,\n\ttype IEmitter,\n\ttype Listenable,\n\tcreateEmitter,\n} from \"../events/index.js\";\nimport {\n\ttype FieldBatchCodec,\n\ttype TreeCompressionStrategy,\n\tbuildForest,\n\tintoDelta,\n\tjsonableTreeFromCursor,\n\tmakeFieldBatchCodec,\n} from \"../feature-libraries/index.js\";\nimport { SharedTreeBranch, getChangeReplaceType } from \"../shared-tree-core/index.js\";\nimport { type IDisposable, TransactionResult, disposeSymbol, fail } from \"../util/index.js\";\n\nimport { SharedTreeChangeFamily, hasSchemaChange } from \"./sharedTreeChangeFamily.js\";\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\nimport type { ISharedTreeEditor, SharedTreeEditBuilder } from \"./sharedTreeEditBuilder.js\";\n\n/**\n * Events for {@link ITreeCheckout}.\n * @internal\n */\nexport interface CheckoutEvents {\n\t/**\n\t * A batch of changes has finished processing and the view is in a consistent state.\n\t * It is once again safe to access the FlexTree, Forest and AnchorSet.\n\t *\n\t * @remarks\n\t * This is mainly useful for knowing when to do followup work scheduled during events from Anchors.\n\t */\n\tafterBatch(): void;\n\n\t/**\n\t * Fired when a revertible change has been made to this view.\n\t *\n\t * Applications which subscribe to this event are expected to revert or discard revertibles they acquire (failure to do so will leak memory).\n\t * The provided revertible is inherently bound to the view that raised the event, calling `revert` won't apply to forked views.\n\t *\n\t * @param revertible - The revertible that can be used to revert the change.\n\t */\n\n\t/**\n\t * {@inheritdoc TreeViewEvents.commitApplied}\n\t */\n\tcommitApplied(data: CommitMetadata, getRevertible?: RevertibleFactory): void;\n}\n\n/**\n * Factory for creating a {@link Revertible}.\n * Will error if invoked outside the scope of the `commitApplied` event that provides it, or if invoked multiple times.\n *\n * @param onRevertibleDisposed - A callback that will be invoked when the `Revertible` generated by this factory is disposed.\n * This happens when the `Revertible` is disposed manually, or when the `TreeView` that the `Revertible` belongs to is disposed,\n * whichever happens first.\n * This is typically used to clean up any resources associated with the `Revertible` in the host application.\n *\n * @public\n */\nexport type RevertibleFactory = (\n\tonRevertibleDisposed?: (revertible: Revertible) => void,\n) => Revertible;\n\n/**\n * Provides a means for interacting with a SharedTree.\n * This includes reading data from the tree and running transactions to mutate the tree.\n * @remarks This interface should not have any implementations other than those provided by the SharedTree package libraries.\n * @privateRemarks\n * API for interacting with a {@link SharedTreeBranch}.\n * Implementations of this interface must implement the {@link branchKey} property.\n * @internal\n */\nexport interface ITreeCheckout extends AnchorLocator {\n\t/**\n\t * Read and Write access for schema stored in the document.\n\t *\n\t * These APIs are temporary and will be replaced with different abstractions (View Schema based) in a different place later.\n\t *\n\t * TODO:\n\t * Editing of this should be moved into transactions with the rest of tree editing to they can be intermixed.\n\t * This will be done after the relations between views, branches and Indexes are figured out.\n\t *\n\t * TODO:\n\t * Public APIs for dealing with schema should be in terms of View Schema, and schema update policies.\n\t * The actual stored schema should be hidden (or ar least not be the most prominent way to interact with schema).\n\t *\n\t * TODO:\n\t * Something should ensure the document contents are always in schema.\n\t */\n\treadonly storedSchema: TreeStoredSchemaSubscription;\n\t/**\n\t * Current contents.\n\t * Updated by edits (local and remote).\n\t * Use `editor` to create a local edit.\n\t */\n\treadonly forest: IForestSubscription;\n\n\t/**\n\t * Used to edit the state of the tree. Edits will be immediately applied locally to the tree.\n\t * If there is no transaction currently ongoing, then the edits will be submitted to Fluid immediately as well.\n\t */\n\treadonly editor: ISharedTreeEditor;\n\n\t/**\n\t * A collection of functions for managing transactions.\n\t */\n\treadonly transaction: ITransaction;\n\n\t/**\n\t * Spawn a new view which is based off of the current state of this view.\n\t * Any mutations of the new view will not apply to this view until the new view is merged back into this view via `merge()`.\n\t */\n\tfork(): ITreeCheckoutFork;\n\n\t/**\n\t * Apply all the new changes on the given view to this view.\n\t * @param view - a view which was created by a call to `fork()`.\n\t * It is automatically disposed after the merge completes.\n\t * @remarks All ongoing transactions (if any) in `view` will be committed before the merge.\n\t */\n\tmerge(view: ITreeCheckoutFork): void;\n\n\t/**\n\t * Apply all the new changes on the given view to this view.\n\t * @param view - a view which was created by a call to `fork()`.\n\t * @param disposeView - whether or not to dispose `view` after the merge completes.\n\t * @remarks All ongoing transactions (if any) in `view` will be committed before the merge.\n\t */\n\tmerge(view: ITreeCheckoutFork, disposeView: boolean): void;\n\n\t/**\n\t * Rebase the given view onto this view.\n\t * @param view - a view which was created by a call to `fork()`. It is modified by this operation.\n\t */\n\trebase(view: ITreeCheckoutFork): void;\n\n\t/**\n\t * Replaces all schema with the provided schema.\n\t * Can over-write preexisting schema, and removes unmentioned schema.\n\t */\n\tupdateSchema(newSchema: TreeStoredSchema): void;\n\n\t/**\n\t * Events about this view.\n\t */\n\treadonly events: Listenable<CheckoutEvents>;\n\n\t/**\n\t * Events about the root of the tree in this view.\n\t */\n\treadonly rootEvents: Listenable<AnchorSetRootEvents>;\n\n\t/**\n\t * Returns a JsonableTree for each tree that was removed from (and not restored to) the document.\n\t * This list is guaranteed to contain all nodes that are recoverable through undo/redo on this checkout.\n\t * The list may also contain additional nodes.\n\t *\n\t * This is only intended for use in testing and exceptional code paths: it is not performant.\n\t */\n\tgetRemovedRoots(): [string | number | undefined, number, JsonableTree][];\n}\n\n/**\n * Creates a {@link TreeCheckout}.\n * @param args - an object containing optional components that will be used to build the view.\n * Any components not provided will be created by default.\n * @remarks This does not create a {@link SharedTree}, but rather a view with the minimal state\n * and functionality required to implement {@link ITreeCheckout}.\n */\nexport function createTreeCheckout(\n\tidCompressor: IIdCompressor,\n\tmintRevisionTag: () => RevisionTag,\n\trevisionTagCodec: RevisionTagCodec,\n\targs?: {\n\t\tbranch?: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>;\n\t\tchangeFamily?: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>;\n\t\tschema?: TreeStoredSchemaRepository;\n\t\tforest?: IEditableForest;\n\t\tfieldBatchCodec?: FieldBatchCodec;\n\t\tevents?: Listenable<CheckoutEvents> &\n\t\t\tIEmitter<CheckoutEvents> &\n\t\t\tHasListeners<CheckoutEvents>;\n\t\tremovedRoots?: DetachedFieldIndex;\n\t\tchunkCompressionStrategy?: TreeCompressionStrategy;\n\t},\n): TreeCheckout {\n\tconst forest = args?.forest ?? buildForest();\n\tconst schema = args?.schema ?? new TreeStoredSchemaRepository();\n\tconst defaultCodecOptions = { jsonValidator: noopValidator };\n\tconst defaultFieldBatchVersion = 1;\n\tconst changeFamily =\n\t\targs?.changeFamily ??\n\t\tnew SharedTreeChangeFamily(\n\t\t\trevisionTagCodec,\n\t\t\targs?.fieldBatchCodec ??\n\t\t\t\tmakeFieldBatchCodec(defaultCodecOptions, defaultFieldBatchVersion),\n\t\t\t{ jsonValidator: noopValidator },\n\t\t\targs?.chunkCompressionStrategy,\n\t\t);\n\tconst branch =\n\t\targs?.branch ??\n\t\tnew SharedTreeBranch(\n\t\t\t{\n\t\t\t\tchange: changeFamily.rebaser.compose([]),\n\t\t\t\trevision: \"root\",\n\t\t\t},\n\t\t\tchangeFamily,\n\t\t\t() => idCompressor.generateCompressedId(),\n\t\t);\n\tconst events = args?.events ?? createEmitter();\n\n\tconst transaction = new Transaction(branch);\n\n\treturn new TreeCheckout(\n\t\ttransaction,\n\t\tbranch,\n\t\tchangeFamily,\n\t\tschema,\n\t\tforest,\n\t\tevents,\n\t\tmintRevisionTag,\n\t\trevisionTagCodec,\n\t\tidCompressor,\n\t\targs?.removedRoots,\n\t);\n}\n\n/**\n * A collection of functions for managing transactions.\n * Transactions allow edits to be batched into atomic units.\n * Edits made during a transaction will update the local state of the tree immediately, but will be squashed into a single edit when the transaction is committed.\n * If the transaction is aborted, the local state will be reset to what it was before the transaction began.\n * Transactions may nest, meaning that a transaction may be started while a transaction is already ongoing.\n *\n * To avoid updating observers of the view state with intermediate results during a transaction,\n * use {@link ITreeCheckout#fork} and {@link ISharedTreeFork#merge}.\n * @internal\n */\nexport interface ITransaction {\n\t/**\n\t * Start a new transaction.\n\t * If a transaction is already in progress when this new transaction starts, then this transaction will be \"nested\" inside of it,\n\t * i.e. the outer transaction will still be in progress after this new transaction is committed or aborted.\n\t *\n\t * @remarks - Asynchronous transactions are not supported on the root checkout,\n\t * since it is always kept up-to-date with the latest remote edits and the results of this rebasing (which might invalidate\n\t * the transaction) is not visible to the application author.\n\t * Instead,\n\t *\n\t * 1. fork the root checkout\n\t * 2. run the transaction on the fork\n\t * 3. merge the fork back into the root checkout\n\t *\n\t * @privateRemarks - There is currently no enforcement that asynchronous transactions don't happen on the root checkout.\n\t * AB#6488 tracks adding some enforcement to make it more clear to application authors that this is not supported.\n\t */\n\tstart(): void;\n\t/**\n\t * Close this transaction by squashing its edits and committing them as a single edit.\n\t * If this is the root checkout and there are no ongoing transactions remaining, the squashed edit will be submitted to Fluid.\n\t */\n\tcommit(): TransactionResult.Commit;\n\t/**\n\t * Close this transaction and revert the state of the tree to what it was before this transaction began.\n\t */\n\tabort(): TransactionResult.Abort;\n\t/**\n\t * True if there is at least one transaction currently in progress on this view, otherwise false.\n\t */\n\tinProgress(): boolean;\n}\n\nclass Transaction implements ITransaction {\n\tpublic constructor(\n\t\tprivate readonly branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,\n\t) {}\n\n\tpublic start(): void {\n\t\tthis.branch.startTransaction();\n\t\tthis.branch.editor.enterTransaction();\n\t}\n\tpublic commit(): TransactionResult.Commit {\n\t\tthis.branch.commitTransaction();\n\t\tthis.branch.editor.exitTransaction();\n\t\treturn TransactionResult.Commit;\n\t}\n\tpublic abort(): TransactionResult.Abort {\n\t\tthis.branch.abortTransaction();\n\t\tthis.branch.editor.exitTransaction();\n\t\treturn TransactionResult.Abort;\n\t}\n\tpublic inProgress(): boolean {\n\t\treturn this.branch.isTransacting();\n\t}\n}\n\n/**\n * Branch (like in a version control system) of SharedTree.\n *\n * {@link ITreeCheckout} that has forked off of the main trunk/branch.\n * @internal\n */\nexport interface ITreeCheckoutFork extends ITreeCheckout, IDisposable {\n\t/**\n\t * Rebase the changes that have been applied to this view over all the new changes in the given view.\n\t * @param view - Either the root view or a view that was created by a call to `fork()`. It is not modified by this operation.\n\t */\n\trebaseOnto(view: ITreeCheckout): void;\n}\n\n/**\n * An implementation of {@link ITreeCheckoutFork}.\n */\nexport class TreeCheckout implements ITreeCheckoutFork {\n\tprivate isDisposed = false;\n\n\t/**\n\t * Set of revertibles maintained for automatic disposal\n\t */\n\tprivate readonly revertibles = new Set<DisposableRevertible>();\n\n\t/**\n\t * Each branch's head commit corresponds to a revertible commit.\n\t * Maintaining a whole branch ensures the commit graph is not pruned in a way that would prevent the commit from\n\t * being reverted.\n\t */\n\tprivate readonly revertibleCommitBranches = new Map<\n\t\tRevisionTag,\n\t\tSharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>\n\t>();\n\n\tpublic constructor(\n\t\tpublic readonly transaction: ITransaction,\n\t\tprivate readonly branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,\n\t\tprivate readonly changeFamily: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,\n\t\tpublic readonly storedSchema: TreeStoredSchemaRepository,\n\t\tpublic readonly forest: IEditableForest,\n\t\tpublic readonly events: Listenable<CheckoutEvents> &\n\t\t\tIEmitter<CheckoutEvents> &\n\t\t\tHasListeners<CheckoutEvents>,\n\t\tprivate readonly mintRevisionTag: () => RevisionTag,\n\t\tprivate readonly revisionTagCodec: RevisionTagCodec,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t\tprivate readonly removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(\n\t\t\t\"repair\",\n\t\t\trevisionTagCodec,\n\t\t\tidCompressor,\n\t\t),\n\t) {\n\t\t// We subscribe to `beforeChange` rather than `afterChange` here because it's possible that the change is invalid WRT our forest.\n\t\t// For example, a bug in the editor might produce a malformed change object and thus applying the change to the forest will throw an error.\n\t\t// In such a case we will crash here, preventing the change from being added to the commit graph, and preventing `afterChange` from firing.\n\t\t// One important consequence of this is that we will not submit the op containing the invalid change, since op submissions happens in response to `afterChange`.\n\t\tbranch.on(\"beforeChange\", (event) => {\n\t\t\tif (event.change !== undefined) {\n\t\t\t\t// Conflicts due to schema will be empty and thus are not applied.\n\t\t\t\tfor (const change of event.change.change.changes) {\n\t\t\t\t\tif (change.type === \"data\") {\n\t\t\t\t\t\tconst delta = intoDelta(\n\t\t\t\t\t\t\ttagChange(change.innerChange, event.change.revision),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.withCombinedVisitor((visitor) => {\n\t\t\t\t\t\t\tvisitDelta(delta, visitor, this.removedRoots);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (change.type === \"schema\") {\n\t\t\t\t\t\t// Schema changes from a current to a new schema are expected to be backwards compatible.\n\t\t\t\t\t\t// This guarantees that all data in the forest (which is valid before the schema change)\n\t\t\t\t\t\t// is also valid under the new schema.\n\t\t\t\t\t\t// Note however, that such schema changes may in some cases be rolled back:\n\t\t\t\t\t\t// Case 1: A transaction with a schema change may be aborted.\n\t\t\t\t\t\t// The transaction may have made some data changes that would render some trees invalid\n\t\t\t\t\t\t// under the old schema, but these changes will also be rolled back, thereby putting the forest\n\t\t\t\t\t\t// back in the state before the transaction, which is valid under the original (reinstated) schema.\n\t\t\t\t\t\t// Case 2: A branch with a schema change may be rebased such that the schema change (because\n\t\t\t\t\t\t// of a constraint) is no longer applied.\n\t\t\t\t\t\t// Such a branch may contain data changes that would render some trees invalid under the\n\t\t\t\t\t\t// original schema. These data changes may not necessarily be rolled back.\n\t\t\t\t\t\t// They will however be rebased over the rollback of the schema change. This rebasing will\n\t\t\t\t\t\t// ensure that these data changes are muted if they would render some trees invalid under the\n\t\t\t\t\t\t// original (reinstated) schema.\n\t\t\t\t\t\tstoredSchema.apply(change.innerChange.schema.new);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfail(\"Unknown Shared Tree change type.\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.events.emit(\"afterBatch\");\n\t\t\t}\n\t\t\tif (event.type === \"replace\" && getChangeReplaceType(event) === \"transactionCommit\") {\n\t\t\t\tconst transactionRevision = event.newCommits[0].revision;\n\t\t\t\tfor (const transactionStep of event.removedCommits) {\n\t\t\t\t\tthis.removedRoots.updateMajor(transactionStep.revision, transactionRevision);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbranch.on(\"commitApplied\", (data) => {\n\t\t\tconst commit = branch.getHead();\n\t\t\tconst { change, revision } = commit;\n\t\t\tlet withinEventContext = true;\n\n\t\t\tconst getRevertible = hasSchemaChange(change)\n\t\t\t\t? undefined\n\t\t\t\t: (onRevertibleDisposed?: (revertible: Revertible) => void) => {\n\t\t\t\t\t\tif (!withinEventContext) {\n\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\"Cannot get a revertible outside of the context of a commitApplied event.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.revertibleCommitBranches.get(revision) !== undefined) {\n\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\"Cannot generate the same revertible more than once. Note that this can happen when multiple commitApplied event listeners are registered.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst revertibleCommits = this.revertibleCommitBranches;\n\t\t\t\t\t\tconst revertible: DisposableRevertible = {\n\t\t\t\t\t\t\tget status(): RevertibleStatus {\n\t\t\t\t\t\t\t\tconst revertibleCommit = revertibleCommits.get(revision);\n\t\t\t\t\t\t\t\treturn revertibleCommit === undefined\n\t\t\t\t\t\t\t\t\t? RevertibleStatus.Disposed\n\t\t\t\t\t\t\t\t\t: RevertibleStatus.Valid;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trevert: (release: boolean = true) => {\n\t\t\t\t\t\t\t\tif (revertible.status === RevertibleStatus.Disposed) {\n\t\t\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\t\t\"Unable to revert a revertible that has been disposed.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.revertRevertible(revision, data.kind);\n\t\t\t\t\t\t\t\tif (release) {\n\t\t\t\t\t\t\t\t\trevertible.dispose();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdispose: () => {\n\t\t\t\t\t\t\t\tif (revertible.status === RevertibleStatus.Disposed) {\n\t\t\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\t\t\"Unable to dispose a revertible that has already been disposed.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.disposeRevertible(revertible, revision);\n\t\t\t\t\t\t\t\tonRevertibleDisposed?.(revertible);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.revertibleCommitBranches.set(revision, branch.fork());\n\t\t\t\t\t\tthis.revertibles.add(revertible);\n\t\t\t\t\t\treturn revertible;\n\t\t\t\t };\n\n\t\t\tthis.events.emit(\"commitApplied\", data, getRevertible);\n\t\t\twithinEventContext = false;\n\t\t});\n\t}\n\n\tprivate withCombinedVisitor(fn: (visitor: DeltaVisitor) => void): void {\n\t\tconst anchorVisitor = this.forest.anchors.acquireVisitor();\n\t\tconst combinedVisitor = combineVisitors(\n\t\t\t[this.forest.acquireVisitor(), anchorVisitor],\n\t\t\t[anchorVisitor],\n\t\t);\n\t\tfn(combinedVisitor);\n\t\tcombinedVisitor.free();\n\t}\n\n\tprivate checkNotDisposed(): void {\n\t\tassert(!this.isDisposed, 0x911 /* Invalid operation on a disposed TreeCheckout */);\n\t}\n\n\tpublic get rootEvents(): Listenable<AnchorSetRootEvents> {\n\t\treturn this.forest.anchors;\n\t}\n\n\tpublic get editor(): ISharedTreeEditor {\n\t\tthis.checkNotDisposed();\n\t\treturn this.branch.editor;\n\t}\n\n\tpublic locate(anchor: Anchor): AnchorNode | undefined {\n\t\tthis.checkNotDisposed();\n\t\treturn this.forest.anchors.locate(anchor);\n\t}\n\n\tpublic fork(): TreeCheckout {\n\t\tthis.checkNotDisposed();\n\t\tconst anchors = new AnchorSet();\n\t\tconst branch = this.branch.fork();\n\t\tconst storedSchema = this.storedSchema.clone();\n\t\tconst forest = this.forest.clone(storedSchema, anchors);\n\t\tconst transaction = new Transaction(branch);\n\t\treturn new TreeCheckout(\n\t\t\ttransaction,\n\t\t\tbranch,\n\t\t\tthis.changeFamily,\n\t\t\tstoredSchema,\n\t\t\tforest,\n\t\t\tcreateEmitter(),\n\t\t\tthis.mintRevisionTag,\n\t\t\tthis.revisionTagCodec,\n\t\t\tthis.idCompressor,\n\t\t\tthis.removedRoots.clone(),\n\t\t);\n\t}\n\n\tpublic rebase(view: TreeCheckout): void {\n\t\tthis.checkNotDisposed();\n\t\tview.branch.rebaseOnto(this.branch);\n\t}\n\n\tpublic rebaseOnto(view: ITreeCheckout): void {\n\t\tthis.checkNotDisposed();\n\t\tview.rebase(this);\n\t}\n\n\tpublic merge(view: TreeCheckout): void;\n\tpublic merge(view: TreeCheckout, disposeView: boolean): void;\n\tpublic merge(view: TreeCheckout, disposeView = true): void {\n\t\tthis.checkNotDisposed();\n\t\tassert(\n\t\t\t!this.transaction.inProgress() || disposeView,\n\t\t\t0x710 /* A view that is merged into an in-progress transaction must be disposed */,\n\t\t);\n\t\twhile (view.transaction.inProgress()) {\n\t\t\tview.transaction.commit();\n\t\t}\n\t\tthis.branch.merge(view.branch);\n\t\tif (disposeView) {\n\t\t\tview[disposeSymbol]();\n\t\t}\n\t}\n\n\tpublic updateSchema(newSchema: TreeStoredSchema): void {\n\t\tthis.checkNotDisposed();\n\t\tthis.editor.schema.setStoredSchema(this.storedSchema.clone(), newSchema);\n\t}\n\n\tpublic [disposeSymbol](): void {\n\t\tthis.checkNotDisposed();\n\t\tthis.isDisposed = true;\n\t\tthis.purgeRevertibles();\n\t\tthis.branch.dispose();\n\t}\n\n\tpublic getRemovedRoots(): [string | number | undefined, number, JsonableTree][] {\n\t\tconst trees: [string | number | undefined, number, JsonableTree][] = [];\n\t\tconst cursor = this.forest.allocateCursor(\"getRemovedRoots\");\n\t\tfor (const { id, root } of this.removedRoots.entries()) {\n\t\t\tconst parentField = this.removedRoots.toFieldKey(root);\n\t\t\tthis.forest.moveCursorToPath(\n\t\t\t\t{ parent: undefined, parentField, parentIndex: 0 },\n\t\t\t\tcursor,\n\t\t\t);\n\t\t\tconst tree = jsonableTreeFromCursor(cursor);\n\t\t\t// This method is used for tree consistency comparison.\n\t\t\tconst { major, minor } = id;\n\t\t\tconst finalizedMajor =\n\t\t\t\tmajor !== undefined ? this.revisionTagCodec.encode(major) : major;\n\t\t\ttrees.push([finalizedMajor, minor, tree]);\n\t\t}\n\t\tcursor.free();\n\t\treturn trees;\n\t}\n\n\tprivate purgeRevertibles(): void {\n\t\tfor (const revertible of this.revertibles) {\n\t\t\trevertible.dispose();\n\t\t}\n\t}\n\n\tprivate disposeRevertible(revertible: DisposableRevertible, revision: RevisionTag): void {\n\t\tthis.revertibleCommitBranches.get(revision)?.dispose();\n\t\tthis.revertibleCommitBranches.delete(revision);\n\t\tthis.revertibles.delete(revertible);\n\t}\n\n\tprivate revertRevertible(revision: RevisionTag, kind: CommitKind): void {\n\t\tif (this.branch.isTransacting()) {\n\t\t\tthrow new UsageError(\"Undo is not yet supported during transactions.\");\n\t\t}\n\n\t\tconst revertibleBranch = this.revertibleCommitBranches.get(revision);\n\t\tassert(revertibleBranch !== undefined, 0x7cc /* expected to find a revertible commit */);\n\t\tconst commitToRevert = revertibleBranch.getHead();\n\n\t\tlet change = makeAnonChange(\n\t\t\tthis.changeFamily.rebaser.invert(tagChange(commitToRevert.change, revision), false),\n\t\t);\n\n\t\tconst headCommit = this.branch.getHead();\n\t\t// Rebase the inverted change onto any commits that occurred after the undoable commits.\n\t\tif (commitToRevert !== headCommit) {\n\t\t\tchange = makeAnonChange(\n\t\t\t\trebaseChange(\n\t\t\t\t\tthis.changeFamily.rebaser,\n\t\t\t\t\tchange,\n\t\t\t\t\tcommitToRevert,\n\t\t\t\t\theadCommit,\n\t\t\t\t\tthis.mintRevisionTag,\n\t\t\t\t).change,\n\t\t\t);\n\t\t}\n\n\t\tthis.branch.apply(\n\t\t\tchange.change,\n\t\t\tthis.mintRevisionTag(),\n\t\t\tkind === CommitKind.Default || kind === CommitKind.Redo\n\t\t\t\t? CommitKind.Undo\n\t\t\t\t: CommitKind.Redo,\n\t\t);\n\t}\n}\n\n/**\n * Run a synchronous transaction on the given shared tree view.\n * This is a convenience helper around the {@link SharedTreeFork#transaction} APIs.\n * @param view - the view on which to run the transaction\n * @param transaction - the transaction function. This will be executed immediately. It is passed `view` as an argument for convenience.\n * If this function returns an `Abort` result then the transaction will be aborted. Otherwise, it will be committed.\n * @returns whether or not the transaction was committed or aborted\n * @internal\n */\nexport function runSynchronous(\n\tview: ITreeCheckout,\n\ttransaction: (view: ITreeCheckout) => TransactionResult | void,\n): TransactionResult {\n\tview.transaction.start();\n\tconst result = transaction(view);\n\treturn result === TransactionResult.Abort\n\t\t? view.transaction.abort()\n\t\t: view.transaction.commit();\n}\n\ninterface DisposableRevertible extends Revertible {\n\tdispose: () => void;\n}\n"]}
1
+ {"version":3,"file":"treeCheckout.js","sourceRoot":"","sources":["../../src/shared-tree/treeCheckout.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,uEAAsE;AACtE,gDAAkD;AAClD,+CA2B0B;AAC1B,iDAK4B;AAC5B,4DAOuC;AACvC,2DAAsF;AACtF,+CAA4F;AAE5F,2EAAsF;AAmJtF;;;;;;GAMG;AACH,SAAgB,kBAAkB,CACjC,YAA2B,EAC3B,eAAkC,EAClC,gBAAkC,EAClC,IAWC;IAED,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,IAAA,sBAAW,GAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,qCAA0B,EAAE,CAAC;IAChE,MAAM,mBAAmB,GAAG,EAAE,aAAa,EAAE,wBAAa,EAAE,CAAC;IAC7D,MAAM,wBAAwB,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GACjB,IAAI,EAAE,YAAY;QAClB,IAAI,kDAAsB,CACzB,gBAAgB,EAChB,IAAI,EAAE,eAAe;YACpB,IAAA,8BAAmB,EAAC,mBAAmB,EAAE,wBAAwB,CAAC,EACnE,EAAE,aAAa,EAAE,wBAAa,EAAE,EAChC,IAAI,EAAE,wBAAwB,CAC9B,CAAC;IACH,MAAM,MAAM,GACX,IAAI,EAAE,MAAM;QACZ,IAAI,2BAAgB,CACnB;YACC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,QAAQ,EAAE,MAAM;SAChB,EACD,YAAY,EACZ,GAAG,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,CACzC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,IAAA,wBAAa,GAAE,CAAC;IAE/C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,IAAI,YAAY,CACtB,WAAW,EACX,MAAM,EACN,YAAY,EACZ,MAAM,EACN,MAAM,EACN,MAAM,EACN,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,IAAI,EAAE,YAAY,CAClB,CAAC;AACH,CAAC;AAxDD,gDAwDC;AA+CD,MAAM,WAAW;IAChB,YACkB,MAAiE;QAAjE,WAAM,GAAN,MAAM,CAA2D;IAChF,CAAC;IAEG,KAAK;QACX,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC;IACM,MAAM;QACZ,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACrC,OAAO,4BAAiB,CAAC,MAAM,CAAC;IACjC,CAAC;IACM,KAAK;QACX,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACrC,OAAO,4BAAiB,CAAC,KAAK,CAAC;IAChC,CAAC;IACM,UAAU;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;CACD;AAgBD;;GAEG;AACH,MAAa,YAAY;IAkBxB,YACiB,WAAyB,EACxB,MAAiE,EACjE,YAAmE,EACpE,YAAwC,EACxC,MAAuB,EACvB,MAEa,EACZ,eAAkC,EAClC,gBAAkC,EAClC,YAA2B,EAC3B,eAAmC,IAAA,iCAAsB,EACzE,QAAQ,EACR,gBAAgB,EAChB,YAAY,CACZ;QAfe,gBAAW,GAAX,WAAW,CAAc;QACxB,WAAM,GAAN,MAAM,CAA2D;QACjE,iBAAY,GAAZ,YAAY,CAAuD;QACpE,iBAAY,GAAZ,YAAY,CAA4B;QACxC,WAAM,GAAN,MAAM,CAAiB;QACvB,WAAM,GAAN,MAAM,CAEO;QACZ,oBAAe,GAAf,eAAe,CAAmB;QAClC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,iBAAY,GAAZ,YAAY,CAAe;QAC3B,iBAAY,GAAZ,YAAY,CAI5B;QAjCM,eAAU,GAAG,KAAK,CAAC;QAE3B;;WAEG;QACc,gBAAW,GAAG,IAAI,GAAG,EAAwB,CAAC;QAE/D;;;;WAIG;QACc,6BAAwB,GAAG,IAAI,GAAG,EAGhD,CAAC;QAoBH,iIAAiI;QACjI,2IAA2I;QAC3I,2IAA2I;QAC3I,gKAAgK;QAChK,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,kEAAkE;gBAClE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC5B,MAAM,KAAK,GAAG,IAAA,oBAAS,EACtB,IAAA,oBAAS,EAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CACpD,CAAC;wBACF,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,EAAE;4BACpC,IAAA,qBAAU,EAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;wBAC/C,CAAC,CAAC,CAAC;oBACJ,CAAC;yBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACrC,yFAAyF;wBACzF,wFAAwF;wBACxF,sCAAsC;wBACtC,2EAA2E;wBAC3E,6DAA6D;wBAC7D,uFAAuF;wBACvF,+FAA+F;wBAC/F,mGAAmG;wBACnG,4FAA4F;wBAC5F,yCAAyC;wBACzC,wFAAwF;wBACxF,0EAA0E;wBAC1E,0FAA0F;wBAC1F,6FAA6F;wBAC7F,gCAAgC;wBAChC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACnD,CAAC;yBAAM,CAAC;wBACP,IAAA,eAAI,EAAC,kCAAkC,CAAC,CAAC;oBAC1C,CAAC;gBACF,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAA,+BAAoB,EAAC,KAAK,CAAC,KAAK,mBAAmB,EAAE,CAAC;gBACrF,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACzD,KAAK,MAAM,eAAe,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBACpD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;gBAC9E,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;YACpC,IAAI,kBAAkB,GAAG,IAAI,CAAC;YAE9B,MAAM,aAAa,GAAG,IAAA,2CAAe,EAAC,MAAM,CAAC;gBAC5C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,oBAAuD,EAAE,EAAE;oBAC5D,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACzB,MAAM,IAAI,qBAAU,CACnB,0EAA0E,CAC1E,CAAC;oBACH,CAAC;oBACD,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC/D,MAAM,IAAI,qBAAU,CACnB,2IAA2I,CAC3I,CAAC;oBACH,CAAC;oBACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC;oBACxD,MAAM,UAAU,GAAyB;wBACxC,IAAI,MAAM;4BACT,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;4BACzD,OAAO,gBAAgB,KAAK,SAAS;gCACpC,CAAC,CAAC,2BAAgB,CAAC,QAAQ;gCAC3B,CAAC,CAAC,2BAAgB,CAAC,KAAK,CAAC;wBAC3B,CAAC;wBACD,MAAM,EAAE,CAAC,UAAmB,IAAI,EAAE,EAAE;4BACnC,IAAI,UAAU,CAAC,MAAM,KAAK,2BAAgB,CAAC,QAAQ,EAAE,CAAC;gCACrD,MAAM,IAAI,qBAAU,CACnB,uDAAuD,CACvD,CAAC;4BACH,CAAC;4BACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC3C,IAAI,OAAO,EAAE,CAAC;gCACb,UAAU,CAAC,OAAO,EAAE,CAAC;4BACtB,CAAC;wBACF,CAAC;wBACD,OAAO,EAAE,GAAG,EAAE;4BACb,IAAI,UAAU,CAAC,MAAM,KAAK,2BAAgB,CAAC,QAAQ,EAAE,CAAC;gCACrD,MAAM,IAAI,qBAAU,CACnB,gEAAgE,CAChE,CAAC;4BACH,CAAC;4BACD,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;4BAC7C,oBAAoB,EAAE,CAAC,UAAU,CAAC,CAAC;wBACpC,CAAC;qBACD,CAAC;oBAEF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC3D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACjC,OAAO,UAAU,CAAC;gBAClB,CAAC,CAAC;YAEL,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YACvD,kBAAkB,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,EAAmC;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3D,MAAM,eAAe,GAAG,IAAA,0BAAe,EACtC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,EAC7C,CAAC,aAAa,CAAC,CACf,CAAC;QACF,EAAE,CAAC,eAAe,CAAC,CAAC;QACpB,eAAe,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAEO,gBAAgB;QACvB,IAAA,iBAAM,EAAC,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpF,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAW,MAAM;QAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,MAAc;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEM,IAAI;QACV,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,oBAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,IAAI,YAAY,CACtB,WAAW,EACX,MAAM,EACN,IAAI,CAAC,YAAY,EACjB,YAAY,EACZ,MAAM,EACN,IAAA,wBAAa,GAAE,EACf,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CACzB,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,IAAkB;QAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEM,UAAU,CAAC,IAAmB;QACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAIM,KAAK,CAAC,IAAkB,EAAE,WAAW,GAAG,IAAI;QAClD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAA,iBAAM,EACL,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,WAAW,EAC7C,KAAK,CAAC,4EAA4E,CAClF,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,wBAAa,CAAC,EAAE,CAAC;QACvB,CAAC;IACF,CAAC;IAEM,YAAY,CAAC,SAA2B;QAC9C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAEM,CAAC,wBAAa,CAAC;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAEM,eAAe;QACrB,MAAM,KAAK,GAA0D,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAC7D,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC3B,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,EAClD,MAAM,CACN,CAAC;YACF,MAAM,IAAI,GAAG,IAAA,iCAAsB,EAAC,MAAM,CAAC,CAAC;YAC5C,uDAAuD;YACvD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC5B,MAAM,cAAc,GACnB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,gBAAgB;QACvB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,UAAU,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;IAEO,iBAAiB,CAAC,UAAgC,EAAE,QAAqB;QAChF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QACvD,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,QAAqB,EAAE,IAAgB;QAC/D,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,qBAAU,CAAC,gDAAgD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAA,iBAAM,EAAC,gBAAgB,KAAK,SAAS,EAAE,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACzF,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAElD,IAAI,MAAM,GAAG,IAAA,yBAAc,EAC1B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,IAAA,oBAAS,EAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CACnF,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACzC,wFAAwF;QACxF,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,GAAG,IAAA,yBAAc,EACtB,IAAA,uBAAY,EACX,IAAI,CAAC,YAAY,CAAC,OAAO,EACzB,MAAM,EACN,cAAc,EACd,UAAU,EACV,IAAI,CAAC,eAAe,CACpB,CAAC,MAAM,CACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAChB,MAAM,CAAC,MAAM,EACb,IAAI,CAAC,eAAe,EAAE,EACtB,IAAI,KAAK,qBAAU,CAAC,OAAO,IAAI,IAAI,KAAK,qBAAU,CAAC,IAAI;YACtD,CAAC,CAAC,qBAAU,CAAC,IAAI;YACjB,CAAC,CAAC,qBAAU,CAAC,IAAI,CAClB,CAAC;IACH,CAAC;CACD;AAtSD,oCAsSC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC7B,IAAmB,EACnB,WAA8D;IAE9D,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,MAAM,KAAK,4BAAiB,CAAC,KAAK;QACxC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QAC1B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;AAC9B,CAAC;AATD,wCASC","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\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { noopValidator } from \"../codec/index.js\";\nimport {\n\ttype Anchor,\n\ttype AnchorLocator,\n\ttype AnchorNode,\n\tAnchorSet,\n\ttype AnchorSetRootEvents,\n\ttype ChangeFamily,\n\tCommitKind,\n\ttype CommitMetadata,\n\ttype DeltaVisitor,\n\ttype DetachedFieldIndex,\n\ttype IEditableForest,\n\ttype IForestSubscription,\n\ttype JsonableTree,\n\ttype Revertible,\n\tRevertibleStatus,\n\ttype RevisionTag,\n\ttype RevisionTagCodec,\n\ttype TreeStoredSchema,\n\tTreeStoredSchemaRepository,\n\ttype TreeStoredSchemaSubscription,\n\tcombineVisitors,\n\tmakeAnonChange,\n\tmakeDetachedFieldIndex,\n\trebaseChange,\n\ttagChange,\n\tvisitDelta,\n} from \"../core/index.js\";\nimport {\n\ttype HasListeners,\n\ttype IEmitter,\n\ttype Listenable,\n\tcreateEmitter,\n} from \"../events/index.js\";\nimport {\n\ttype FieldBatchCodec,\n\ttype TreeCompressionStrategy,\n\tbuildForest,\n\tintoDelta,\n\tjsonableTreeFromCursor,\n\tmakeFieldBatchCodec,\n} from \"../feature-libraries/index.js\";\nimport { SharedTreeBranch, getChangeReplaceType } from \"../shared-tree-core/index.js\";\nimport { type IDisposable, TransactionResult, disposeSymbol, fail } from \"../util/index.js\";\n\nimport { SharedTreeChangeFamily, hasSchemaChange } from \"./sharedTreeChangeFamily.js\";\nimport type { SharedTreeChange } from \"./sharedTreeChangeTypes.js\";\nimport type { ISharedTreeEditor, SharedTreeEditBuilder } from \"./sharedTreeEditBuilder.js\";\n\n/**\n * Events for {@link ITreeCheckout}.\n * @internal\n */\nexport interface CheckoutEvents {\n\t/**\n\t * A batch of changes has finished processing and the view is in a consistent state.\n\t * It is once again safe to access the FlexTree, Forest and AnchorSet.\n\t *\n\t * @remarks\n\t * This is mainly useful for knowing when to do followup work scheduled during events from Anchors.\n\t */\n\tafterBatch(): void;\n\n\t/**\n\t * Fired when a revertible change has been made to this view.\n\t *\n\t * Applications which subscribe to this event are expected to revert or discard revertibles they acquire (failure to do so will leak memory).\n\t * The provided revertible is inherently bound to the view that raised the event, calling `revert` won't apply to forked views.\n\t *\n\t * @param revertible - The revertible that can be used to revert the change.\n\t */\n\n\t/**\n\t * {@inheritdoc TreeViewEvents.commitApplied}\n\t */\n\tcommitApplied(data: CommitMetadata, getRevertible?: RevertibleFactory): void;\n}\n\n/**\n * Factory for creating a {@link Revertible}.\n * Will error if invoked outside the scope of the `commitApplied` event that provides it, or if invoked multiple times.\n *\n * @param onRevertibleDisposed - A callback that will be invoked when the `Revertible` generated by this factory is disposed.\n * This happens when the `Revertible` is disposed manually, or when the `TreeView` that the `Revertible` belongs to is disposed,\n * whichever happens first.\n * This is typically used to clean up any resources associated with the `Revertible` in the host application.\n *\n * @public\n */\nexport type RevertibleFactory = (\n\tonRevertibleDisposed?: (revertible: Revertible) => void,\n) => Revertible;\n\n/**\n * Provides a means for interacting with a SharedTree.\n * This includes reading data from the tree and running transactions to mutate the tree.\n * @remarks This interface should not have any implementations other than those provided by the SharedTree package libraries.\n * @privateRemarks\n * API for interacting with a {@link SharedTreeBranch}.\n * Implementations of this interface must implement the {@link branchKey} property.\n * @internal\n */\nexport interface ITreeCheckout extends AnchorLocator {\n\t/**\n\t * Read and Write access for schema stored in the document.\n\t *\n\t * These APIs are temporary and will be replaced with different abstractions (View Schema based) in a different place later.\n\t *\n\t * TODO:\n\t * Editing of this should be moved into transactions with the rest of tree editing to they can be intermixed.\n\t * This will be done after the relations between views, branches and Indexes are figured out.\n\t *\n\t * TODO:\n\t * Public APIs for dealing with schema should be in terms of View Schema, and schema update policies.\n\t * The actual stored schema should be hidden (or ar least not be the most prominent way to interact with schema).\n\t *\n\t * TODO:\n\t * Something should ensure the document contents are always in schema.\n\t */\n\treadonly storedSchema: TreeStoredSchemaSubscription;\n\t/**\n\t * Current contents.\n\t * Updated by edits (local and remote).\n\t * Use `editor` to create a local edit.\n\t */\n\treadonly forest: IForestSubscription;\n\n\t/**\n\t * Used to edit the state of the tree. Edits will be immediately applied locally to the tree.\n\t * If there is no transaction currently ongoing, then the edits will be submitted to Fluid immediately as well.\n\t */\n\treadonly editor: ISharedTreeEditor;\n\n\t/**\n\t * A collection of functions for managing transactions.\n\t */\n\treadonly transaction: ITransaction;\n\n\t/**\n\t * Spawn a new view which is based off of the current state of this view.\n\t * Any mutations of the new view will not apply to this view until the new view is merged back into this view via `merge()`.\n\t */\n\tfork(): ITreeCheckoutFork;\n\n\t/**\n\t * Apply all the new changes on the given view to this view.\n\t * @param view - a view which was created by a call to `fork()`.\n\t * It is automatically disposed after the merge completes.\n\t * @remarks All ongoing transactions (if any) in `view` will be committed before the merge.\n\t */\n\tmerge(view: ITreeCheckoutFork): void;\n\n\t/**\n\t * Apply all the new changes on the given view to this view.\n\t * @param view - a view which was created by a call to `fork()`.\n\t * @param disposeView - whether or not to dispose `view` after the merge completes.\n\t * @remarks All ongoing transactions (if any) in `view` will be committed before the merge.\n\t */\n\tmerge(view: ITreeCheckoutFork, disposeView: boolean): void;\n\n\t/**\n\t * Rebase the given view onto this view.\n\t * @param view - a view which was created by a call to `fork()`. It is modified by this operation.\n\t */\n\trebase(view: ITreeCheckoutFork): void;\n\n\t/**\n\t * Replaces all schema with the provided schema.\n\t * Can over-write preexisting schema, and removes unmentioned schema.\n\t */\n\tupdateSchema(newSchema: TreeStoredSchema): void;\n\n\t/**\n\t * Events about this view.\n\t */\n\treadonly events: Listenable<CheckoutEvents>;\n\n\t/**\n\t * Events about the root of the tree in this view.\n\t */\n\treadonly rootEvents: Listenable<AnchorSetRootEvents>;\n\n\t/**\n\t * Returns a JsonableTree for each tree that was removed from (and not restored to) the document.\n\t * This list is guaranteed to contain all nodes that are recoverable through undo/redo on this checkout.\n\t * The list may also contain additional nodes.\n\t *\n\t * This is only intended for use in testing and exceptional code paths: it is not performant.\n\t */\n\tgetRemovedRoots(): [string | number | undefined, number, JsonableTree][];\n}\n\n/**\n * Creates a {@link TreeCheckout}.\n * @param args - an object containing optional components that will be used to build the view.\n * Any components not provided will be created by default.\n * @remarks This does not create a {@link SharedTree}, but rather a view with the minimal state\n * and functionality required to implement {@link ITreeCheckout}.\n */\nexport function createTreeCheckout(\n\tidCompressor: IIdCompressor,\n\tmintRevisionTag: () => RevisionTag,\n\trevisionTagCodec: RevisionTagCodec,\n\targs?: {\n\t\tbranch?: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>;\n\t\tchangeFamily?: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>;\n\t\tschema?: TreeStoredSchemaRepository;\n\t\tforest?: IEditableForest;\n\t\tfieldBatchCodec?: FieldBatchCodec;\n\t\tevents?: Listenable<CheckoutEvents> &\n\t\t\tIEmitter<CheckoutEvents> &\n\t\t\tHasListeners<CheckoutEvents>;\n\t\tremovedRoots?: DetachedFieldIndex;\n\t\tchunkCompressionStrategy?: TreeCompressionStrategy;\n\t},\n): TreeCheckout {\n\tconst forest = args?.forest ?? buildForest();\n\tconst schema = args?.schema ?? new TreeStoredSchemaRepository();\n\tconst defaultCodecOptions = { jsonValidator: noopValidator };\n\tconst defaultFieldBatchVersion = 1;\n\tconst changeFamily =\n\t\targs?.changeFamily ??\n\t\tnew SharedTreeChangeFamily(\n\t\t\trevisionTagCodec,\n\t\t\targs?.fieldBatchCodec ??\n\t\t\t\tmakeFieldBatchCodec(defaultCodecOptions, defaultFieldBatchVersion),\n\t\t\t{ jsonValidator: noopValidator },\n\t\t\targs?.chunkCompressionStrategy,\n\t\t);\n\tconst branch =\n\t\targs?.branch ??\n\t\tnew SharedTreeBranch(\n\t\t\t{\n\t\t\t\tchange: changeFamily.rebaser.compose([]),\n\t\t\t\trevision: \"root\",\n\t\t\t},\n\t\t\tchangeFamily,\n\t\t\t() => idCompressor.generateCompressedId(),\n\t\t);\n\tconst events = args?.events ?? createEmitter();\n\n\tconst transaction = new Transaction(branch);\n\n\treturn new TreeCheckout(\n\t\ttransaction,\n\t\tbranch,\n\t\tchangeFamily,\n\t\tschema,\n\t\tforest,\n\t\tevents,\n\t\tmintRevisionTag,\n\t\trevisionTagCodec,\n\t\tidCompressor,\n\t\targs?.removedRoots,\n\t);\n}\n\n/**\n * A collection of functions for managing transactions.\n * Transactions allow edits to be batched into atomic units.\n * Edits made during a transaction will update the local state of the tree immediately, but will be squashed into a single edit when the transaction is committed.\n * If the transaction is aborted, the local state will be reset to what it was before the transaction began.\n * Transactions may nest, meaning that a transaction may be started while a transaction is already ongoing.\n *\n * To avoid updating observers of the view state with intermediate results during a transaction,\n * use {@link ITreeCheckout#fork} and {@link ISharedTreeFork#merge}.\n * @internal\n */\nexport interface ITransaction {\n\t/**\n\t * Start a new transaction.\n\t * If a transaction is already in progress when this new transaction starts, then this transaction will be \"nested\" inside of it,\n\t * i.e. the outer transaction will still be in progress after this new transaction is committed or aborted.\n\t *\n\t * @remarks - Asynchronous transactions are not supported on the root checkout,\n\t * since it is always kept up-to-date with the latest remote edits and the results of this rebasing (which might invalidate\n\t * the transaction) is not visible to the application author.\n\t * Instead,\n\t *\n\t * 1. fork the root checkout\n\t * 2. run the transaction on the fork\n\t * 3. merge the fork back into the root checkout\n\t *\n\t * @privateRemarks - There is currently no enforcement that asynchronous transactions don't happen on the root checkout.\n\t * AB#6488 tracks adding some enforcement to make it more clear to application authors that this is not supported.\n\t */\n\tstart(): void;\n\t/**\n\t * Close this transaction by squashing its edits and committing them as a single edit.\n\t * If this is the root checkout and there are no ongoing transactions remaining, the squashed edit will be submitted to Fluid.\n\t */\n\tcommit(): TransactionResult.Commit;\n\t/**\n\t * Close this transaction and revert the state of the tree to what it was before this transaction began.\n\t */\n\tabort(): TransactionResult.Abort;\n\t/**\n\t * True if there is at least one transaction currently in progress on this view, otherwise false.\n\t */\n\tinProgress(): boolean;\n}\n\nclass Transaction implements ITransaction {\n\tpublic constructor(\n\t\tprivate readonly branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,\n\t) {}\n\n\tpublic start(): void {\n\t\tthis.branch.startTransaction();\n\t\tthis.branch.editor.enterTransaction();\n\t}\n\tpublic commit(): TransactionResult.Commit {\n\t\tthis.branch.commitTransaction();\n\t\tthis.branch.editor.exitTransaction();\n\t\treturn TransactionResult.Commit;\n\t}\n\tpublic abort(): TransactionResult.Abort {\n\t\tthis.branch.abortTransaction();\n\t\tthis.branch.editor.exitTransaction();\n\t\treturn TransactionResult.Abort;\n\t}\n\tpublic inProgress(): boolean {\n\t\treturn this.branch.isTransacting();\n\t}\n}\n\n/**\n * Branch (like in a version control system) of SharedTree.\n *\n * {@link ITreeCheckout} that has forked off of the main trunk/branch.\n * @internal\n */\nexport interface ITreeCheckoutFork extends ITreeCheckout, IDisposable {\n\t/**\n\t * Rebase the changes that have been applied to this view over all the new changes in the given view.\n\t * @param view - Either the root view or a view that was created by a call to `fork()`. It is not modified by this operation.\n\t */\n\trebaseOnto(view: ITreeCheckout): void;\n}\n\n/**\n * An implementation of {@link ITreeCheckoutFork}.\n */\nexport class TreeCheckout implements ITreeCheckoutFork {\n\tprivate isDisposed = false;\n\n\t/**\n\t * Set of revertibles maintained for automatic disposal\n\t */\n\tprivate readonly revertibles = new Set<DisposableRevertible>();\n\n\t/**\n\t * Each branch's head commit corresponds to a revertible commit.\n\t * Maintaining a whole branch ensures the commit graph is not pruned in a way that would prevent the commit from\n\t * being reverted.\n\t */\n\tprivate readonly revertibleCommitBranches = new Map<\n\t\tRevisionTag,\n\t\tSharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>\n\t>();\n\n\tpublic constructor(\n\t\tpublic readonly transaction: ITransaction,\n\t\tprivate readonly branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,\n\t\tprivate readonly changeFamily: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,\n\t\tpublic readonly storedSchema: TreeStoredSchemaRepository,\n\t\tpublic readonly forest: IEditableForest,\n\t\tpublic readonly events: Listenable<CheckoutEvents> &\n\t\t\tIEmitter<CheckoutEvents> &\n\t\t\tHasListeners<CheckoutEvents>,\n\t\tprivate readonly mintRevisionTag: () => RevisionTag,\n\t\tprivate readonly revisionTagCodec: RevisionTagCodec,\n\t\tprivate readonly idCompressor: IIdCompressor,\n\t\tprivate readonly removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(\n\t\t\t\"repair\",\n\t\t\trevisionTagCodec,\n\t\t\tidCompressor,\n\t\t),\n\t) {\n\t\t// We subscribe to `beforeChange` rather than `afterChange` here because it's possible that the change is invalid WRT our forest.\n\t\t// For example, a bug in the editor might produce a malformed change object and thus applying the change to the forest will throw an error.\n\t\t// In such a case we will crash here, preventing the change from being added to the commit graph, and preventing `afterChange` from firing.\n\t\t// One important consequence of this is that we will not submit the op containing the invalid change, since op submissions happens in response to `afterChange`.\n\t\tbranch.on(\"beforeChange\", (event) => {\n\t\t\tif (event.change !== undefined) {\n\t\t\t\t// Conflicts due to schema will be empty and thus are not applied.\n\t\t\t\tfor (const change of event.change.change.changes) {\n\t\t\t\t\tif (change.type === \"data\") {\n\t\t\t\t\t\tconst delta = intoDelta(\n\t\t\t\t\t\t\ttagChange(change.innerChange, event.change.revision),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.withCombinedVisitor((visitor) => {\n\t\t\t\t\t\t\tvisitDelta(delta, visitor, this.removedRoots);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (change.type === \"schema\") {\n\t\t\t\t\t\t// Schema changes from a current to a new schema are expected to be backwards compatible.\n\t\t\t\t\t\t// This guarantees that all data in the forest (which is valid before the schema change)\n\t\t\t\t\t\t// is also valid under the new schema.\n\t\t\t\t\t\t// Note however, that such schema changes may in some cases be rolled back:\n\t\t\t\t\t\t// Case 1: A transaction with a schema change may be aborted.\n\t\t\t\t\t\t// The transaction may have made some data changes that would render some trees invalid\n\t\t\t\t\t\t// under the old schema, but these changes will also be rolled back, thereby putting the forest\n\t\t\t\t\t\t// back in the state before the transaction, which is valid under the original (reinstated) schema.\n\t\t\t\t\t\t// Case 2: A branch with a schema change may be rebased such that the schema change (because\n\t\t\t\t\t\t// of a constraint) is no longer applied.\n\t\t\t\t\t\t// Such a branch may contain data changes that would render some trees invalid under the\n\t\t\t\t\t\t// original schema. These data changes may not necessarily be rolled back.\n\t\t\t\t\t\t// They will however be rebased over the rollback of the schema change. This rebasing will\n\t\t\t\t\t\t// ensure that these data changes are muted if they would render some trees invalid under the\n\t\t\t\t\t\t// original (reinstated) schema.\n\t\t\t\t\t\tstoredSchema.apply(change.innerChange.schema.new);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfail(\"Unknown Shared Tree change type.\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.events.emit(\"afterBatch\");\n\t\t\t}\n\t\t\tif (event.type === \"replace\" && getChangeReplaceType(event) === \"transactionCommit\") {\n\t\t\t\tconst transactionRevision = event.newCommits[0].revision;\n\t\t\t\tfor (const transactionStep of event.removedCommits) {\n\t\t\t\t\tthis.removedRoots.updateMajor(transactionStep.revision, transactionRevision);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tbranch.on(\"commitApplied\", (data) => {\n\t\t\tconst commit = branch.getHead();\n\t\t\tconst { change, revision } = commit;\n\t\t\tlet withinEventContext = true;\n\n\t\t\tconst getRevertible = hasSchemaChange(change)\n\t\t\t\t? undefined\n\t\t\t\t: (onRevertibleDisposed?: (revertible: Revertible) => void) => {\n\t\t\t\t\t\tif (!withinEventContext) {\n\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\"Cannot get a revertible outside of the context of a commitApplied event.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.revertibleCommitBranches.get(revision) !== undefined) {\n\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\"Cannot generate the same revertible more than once. Note that this can happen when multiple commitApplied event listeners are registered.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst revertibleCommits = this.revertibleCommitBranches;\n\t\t\t\t\t\tconst revertible: DisposableRevertible = {\n\t\t\t\t\t\t\tget status(): RevertibleStatus {\n\t\t\t\t\t\t\t\tconst revertibleCommit = revertibleCommits.get(revision);\n\t\t\t\t\t\t\t\treturn revertibleCommit === undefined\n\t\t\t\t\t\t\t\t\t? RevertibleStatus.Disposed\n\t\t\t\t\t\t\t\t\t: RevertibleStatus.Valid;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trevert: (release: boolean = true) => {\n\t\t\t\t\t\t\t\tif (revertible.status === RevertibleStatus.Disposed) {\n\t\t\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\t\t\"Unable to revert a revertible that has been disposed.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.revertRevertible(revision, data.kind);\n\t\t\t\t\t\t\t\tif (release) {\n\t\t\t\t\t\t\t\t\trevertible.dispose();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdispose: () => {\n\t\t\t\t\t\t\t\tif (revertible.status === RevertibleStatus.Disposed) {\n\t\t\t\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t\t\t\t\"Unable to dispose a revertible that has already been disposed.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.disposeRevertible(revertible, revision);\n\t\t\t\t\t\t\t\tonRevertibleDisposed?.(revertible);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.revertibleCommitBranches.set(revision, branch.fork());\n\t\t\t\t\t\tthis.revertibles.add(revertible);\n\t\t\t\t\t\treturn revertible;\n\t\t\t\t };\n\n\t\t\tthis.events.emit(\"commitApplied\", data, getRevertible);\n\t\t\twithinEventContext = false;\n\t\t});\n\t}\n\n\tprivate withCombinedVisitor(fn: (visitor: DeltaVisitor) => void): void {\n\t\tconst anchorVisitor = this.forest.anchors.acquireVisitor();\n\t\tconst combinedVisitor = combineVisitors(\n\t\t\t[this.forest.acquireVisitor(), anchorVisitor],\n\t\t\t[anchorVisitor],\n\t\t);\n\t\tfn(combinedVisitor);\n\t\tcombinedVisitor.free();\n\t}\n\n\tprivate checkNotDisposed(): void {\n\t\tassert(!this.isDisposed, 0x911 /* Invalid operation on a disposed TreeCheckout */);\n\t}\n\n\tpublic get rootEvents(): Listenable<AnchorSetRootEvents> {\n\t\treturn this.forest.anchors;\n\t}\n\n\tpublic get editor(): ISharedTreeEditor {\n\t\tthis.checkNotDisposed();\n\t\treturn this.branch.editor;\n\t}\n\n\tpublic locate(anchor: Anchor): AnchorNode | undefined {\n\t\tthis.checkNotDisposed();\n\t\treturn this.forest.anchors.locate(anchor);\n\t}\n\n\tpublic fork(): TreeCheckout {\n\t\tthis.checkNotDisposed();\n\t\tconst anchors = new AnchorSet();\n\t\tconst branch = this.branch.fork();\n\t\tconst storedSchema = this.storedSchema.clone();\n\t\tconst forest = this.forest.clone(storedSchema, anchors);\n\t\tconst transaction = new Transaction(branch);\n\t\treturn new TreeCheckout(\n\t\t\ttransaction,\n\t\t\tbranch,\n\t\t\tthis.changeFamily,\n\t\t\tstoredSchema,\n\t\t\tforest,\n\t\t\tcreateEmitter(),\n\t\t\tthis.mintRevisionTag,\n\t\t\tthis.revisionTagCodec,\n\t\t\tthis.idCompressor,\n\t\t\tthis.removedRoots.clone(),\n\t\t);\n\t}\n\n\tpublic rebase(view: TreeCheckout): void {\n\t\tthis.checkNotDisposed();\n\t\tview.branch.rebaseOnto(this.branch);\n\t}\n\n\tpublic rebaseOnto(view: ITreeCheckout): void {\n\t\tthis.checkNotDisposed();\n\t\tview.rebase(this);\n\t}\n\n\tpublic merge(view: TreeCheckout): void;\n\tpublic merge(view: TreeCheckout, disposeView: boolean): void;\n\tpublic merge(view: TreeCheckout, disposeView = true): void {\n\t\tthis.checkNotDisposed();\n\t\tassert(\n\t\t\t!this.transaction.inProgress() || disposeView,\n\t\t\t0x710 /* A view that is merged into an in-progress transaction must be disposed */,\n\t\t);\n\t\twhile (view.transaction.inProgress()) {\n\t\t\tview.transaction.commit();\n\t\t}\n\t\tthis.branch.merge(view.branch);\n\t\tif (disposeView) {\n\t\t\tview[disposeSymbol]();\n\t\t}\n\t}\n\n\tpublic updateSchema(newSchema: TreeStoredSchema): void {\n\t\tthis.checkNotDisposed();\n\t\tthis.editor.schema.setStoredSchema(this.storedSchema.clone(), newSchema);\n\t}\n\n\tpublic [disposeSymbol](): void {\n\t\tthis.checkNotDisposed();\n\t\tthis.isDisposed = true;\n\t\tthis.purgeRevertibles();\n\t\tthis.branch.dispose();\n\t}\n\n\tpublic getRemovedRoots(): [string | number | undefined, number, JsonableTree][] {\n\t\tconst trees: [string | number | undefined, number, JsonableTree][] = [];\n\t\tconst cursor = this.forest.allocateCursor(\"getRemovedRoots\");\n\t\tfor (const { id, root } of this.removedRoots.entries()) {\n\t\t\tconst parentField = this.removedRoots.toFieldKey(root);\n\t\t\tthis.forest.moveCursorToPath(\n\t\t\t\t{ parent: undefined, parentField, parentIndex: 0 },\n\t\t\t\tcursor,\n\t\t\t);\n\t\t\tconst tree = jsonableTreeFromCursor(cursor);\n\t\t\t// This method is used for tree consistency comparison.\n\t\t\tconst { major, minor } = id;\n\t\t\tconst finalizedMajor =\n\t\t\t\tmajor !== undefined ? this.revisionTagCodec.encode(major) : major;\n\t\t\ttrees.push([finalizedMajor, minor, tree]);\n\t\t}\n\t\tcursor.free();\n\t\treturn trees;\n\t}\n\n\tprivate purgeRevertibles(): void {\n\t\tfor (const revertible of this.revertibles) {\n\t\t\trevertible.dispose();\n\t\t}\n\t}\n\n\tprivate disposeRevertible(revertible: DisposableRevertible, revision: RevisionTag): void {\n\t\tthis.revertibleCommitBranches.get(revision)?.dispose();\n\t\tthis.revertibleCommitBranches.delete(revision);\n\t\tthis.revertibles.delete(revertible);\n\t}\n\n\tprivate revertRevertible(revision: RevisionTag, kind: CommitKind): void {\n\t\tif (this.branch.isTransacting()) {\n\t\t\tthrow new UsageError(\"Undo is not yet supported during transactions.\");\n\t\t}\n\n\t\tconst revertibleBranch = this.revertibleCommitBranches.get(revision);\n\t\tassert(revertibleBranch !== undefined, 0x7cc /* expected to find a revertible commit */);\n\t\tconst commitToRevert = revertibleBranch.getHead();\n\n\t\tlet change = makeAnonChange(\n\t\t\tthis.changeFamily.rebaser.invert(tagChange(commitToRevert.change, revision), false),\n\t\t);\n\n\t\tconst headCommit = this.branch.getHead();\n\t\t// Rebase the inverted change onto any commits that occurred after the undoable commits.\n\t\tif (commitToRevert !== headCommit) {\n\t\t\tchange = makeAnonChange(\n\t\t\t\trebaseChange(\n\t\t\t\t\tthis.changeFamily.rebaser,\n\t\t\t\t\tchange,\n\t\t\t\t\tcommitToRevert,\n\t\t\t\t\theadCommit,\n\t\t\t\t\tthis.mintRevisionTag,\n\t\t\t\t).change,\n\t\t\t);\n\t\t}\n\n\t\tthis.branch.apply(\n\t\t\tchange.change,\n\t\t\tthis.mintRevisionTag(),\n\t\t\tkind === CommitKind.Default || kind === CommitKind.Redo\n\t\t\t\t? CommitKind.Undo\n\t\t\t\t: CommitKind.Redo,\n\t\t);\n\t}\n}\n\n/**\n * Run a synchronous transaction on the given shared tree view.\n * This is a convenience helper around the {@link SharedTreeFork#transaction} APIs.\n * @param view - the view on which to run the transaction\n * @param transaction - the transaction function. This will be executed immediately. It is passed `view` as an argument for convenience.\n * If this function returns an `Abort` result then the transaction will be aborted. Otherwise, it will be committed.\n * @returns whether or not the transaction was committed or aborted\n * @internal\n */\nexport function runSynchronous(\n\tview: ITreeCheckout,\n\ttransaction: (view: ITreeCheckout) => TransactionResult | void,\n): TransactionResult {\n\tview.transaction.start();\n\tconst result = transaction(view);\n\treturn result === TransactionResult.Abort\n\t\t? view.transaction.abort()\n\t\t: view.transaction.commit();\n}\n\ninterface DisposableRevertible extends Revertible {\n\tdispose: () => void;\n}\n"]}
@@ -11,12 +11,6 @@ const index_js_2 = require("../util/index.js");
11
11
  * Implementation of FlexTreeView wrapping a ITreeCheckout.
12
12
  */
13
13
  class CheckoutFlexTreeView {
14
- checkout;
15
- schema;
16
- nodeKeyManager;
17
- onDispose;
18
- context;
19
- flexTree;
20
14
  constructor(checkout, schema, nodeKeyManager, onDispose) {
21
15
  this.checkout = checkout;
22
16
  this.schema = schema;
@@ -1 +1 @@
1
- {"version":3,"file":"treeView.js","sourceRoot":"","sources":["../../src/shared-tree/treeView.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4DAQuC;AACvC,+CAAmE;AAmDnE;;GAEG;AACH,MAAa,oBAAoB;IAQf;IACA;IACA;IACC;IANF,OAAO,CAAU;IACjB,QAAQ,CAA4B;IACpD,YACiB,QAAmB,EACnB,MAA6B,EAC7B,cAA8B,EAC7B,SAAsB;QAHvB,aAAQ,GAAR,QAAQ,CAAW;QACnB,WAAM,GAAN,MAAM,CAAuB;QAC7B,mBAAc,GAAd,cAAc,CAAgB;QAC7B,cAAS,GAAT,SAAS,CAAa;QAEvC,IAAI,CAAC,OAAO,GAAG,IAAA,yBAAc,EAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACrE,yBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAiC,CAAC;IAChE,CAAC;IAEM,CAAC,wBAAa,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,wBAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IACpB,CAAC;IAEM,IAAI;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,IAAI,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC;CACD;AA3BD,oDA2BC;AAED;;;GAGG;AACH,uCAAuC;AACvC,8DAA8D;AACjD,QAAA,iBAAiB,GAAG,IAAI,OAAO,EAAsC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\ttype Context,\n\ttype FlexFieldSchema,\n\ttype FlexTreeContext,\n\ttype FlexTreeSchema,\n\ttype FlexTreeTypedField,\n\ttype NodeKeyManager,\n\tgetTreeContext,\n} from \"../feature-libraries/index.js\";\nimport { type IDisposable, disposeSymbol } from \"../util/index.js\";\n\nimport type { ITreeCheckout, ITreeCheckoutFork, TreeCheckout } from \"./treeCheckout.js\";\n\n/**\n * An editable view of a (version control style) branch of a shared tree.\n * @privateRemarks\n * TODO:\n * 1. Once ISharedTreeView is renamed this can become ISharedTreeView.\n * 2. This object should be combined with or accessible from the TreeContext to allow easy access to thinks like branching.\n * @internal\n */\nexport interface FlexTreeView<in out TRoot extends FlexFieldSchema> extends IDisposable {\n\t/**\n\t * Context for controlling the FlexTree nodes produced from {@link FlexTreeView.flexTree}.\n\t *\n\t * @remarks\n\t * This is an owning reference: disposing of this view disposes its context.\n\t */\n\treadonly context: FlexTreeContext;\n\n\t/**\n\t * Access non-view schema specific aspects of of this branch.\n\t *\n\t * @remarks\n\t * This is a non-owning reference: disposing of this view does not impact the branch.\n\t */\n\treadonly checkout: ITreeCheckout;\n\n\t/**\n\t * Get a typed view of the tree content using the flex-tree API.\n\t */\n\treadonly flexTree: FlexTreeTypedField<TRoot>;\n\n\t/**\n\t * Spawn a new view which is based off of the current state of this view.\n\t * Any mutations of the new view will not apply to this view until the new view is merged back into this view via `merge()`.\n\t */\n\tfork(): ITreeViewFork<TRoot>;\n}\n\n/**\n * Branch (like in a version control system) of SharedTree.\n *\n * {@link FlexTreeView} that has forked off of the main trunk/branch.\n * @internal\n */\nexport interface ITreeViewFork<in out TRoot extends FlexFieldSchema> extends FlexTreeView<TRoot> {\n\treadonly checkout: ITreeCheckoutFork;\n}\n\n/**\n * Implementation of FlexTreeView wrapping a ITreeCheckout.\n */\nexport class CheckoutFlexTreeView<\n\tin out TRoot extends FlexFieldSchema,\n\tout TCheckout extends TreeCheckout = TreeCheckout,\n> implements FlexTreeView<TRoot>\n{\n\tpublic readonly context: Context;\n\tpublic readonly flexTree: FlexTreeTypedField<TRoot>;\n\tpublic constructor(\n\t\tpublic readonly checkout: TCheckout,\n\t\tpublic readonly schema: FlexTreeSchema<TRoot>,\n\t\tpublic readonly nodeKeyManager: NodeKeyManager,\n\t\tprivate readonly onDispose?: () => void,\n\t) {\n\t\tthis.context = getTreeContext(schema, this.checkout, nodeKeyManager);\n\t\tcontextToTreeView.set(this.context, this);\n\t\tthis.flexTree = this.context.root as FlexTreeTypedField<TRoot>;\n\t}\n\n\tpublic [disposeSymbol](): void {\n\t\tthis.context[disposeSymbol]();\n\t\tthis.onDispose?.();\n\t}\n\n\tpublic fork(): CheckoutFlexTreeView<TRoot, TreeCheckout & ITreeCheckoutFork> {\n\t\tconst branch = this.checkout.fork();\n\t\treturn new CheckoutFlexTreeView(branch, this.schema, this.nodeKeyManager);\n\t}\n}\n\n/**\n * Maps the context of every {@link CheckoutFlexTreeView} to the view.\n * In practice, this allows the view or checkout to be obtained from a flex node by first getting the context from the flex node and then using this map.\n */\n// TODO: use something other than `any`\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const contextToTreeView = new WeakMap<Context, CheckoutFlexTreeView<any>>();\n"]}
1
+ {"version":3,"file":"treeView.js","sourceRoot":"","sources":["../../src/shared-tree/treeView.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4DAQuC;AACvC,+CAAmE;AAmDnE;;GAEG;AACH,MAAa,oBAAoB;IAOhC,YACiB,QAAmB,EACnB,MAA6B,EAC7B,cAA8B,EAC7B,SAAsB;QAHvB,aAAQ,GAAR,QAAQ,CAAW;QACnB,WAAM,GAAN,MAAM,CAAuB;QAC7B,mBAAc,GAAd,cAAc,CAAgB;QAC7B,cAAS,GAAT,SAAS,CAAa;QAEvC,IAAI,CAAC,OAAO,GAAG,IAAA,yBAAc,EAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACrE,yBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAiC,CAAC;IAChE,CAAC;IAEM,CAAC,wBAAa,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,wBAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IACpB,CAAC;IAEM,IAAI;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,IAAI,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC;CACD;AA3BD,oDA2BC;AAED;;;GAGG;AACH,uCAAuC;AACvC,8DAA8D;AACjD,QAAA,iBAAiB,GAAG,IAAI,OAAO,EAAsC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\ttype Context,\n\ttype FlexFieldSchema,\n\ttype FlexTreeContext,\n\ttype FlexTreeSchema,\n\ttype FlexTreeTypedField,\n\ttype NodeKeyManager,\n\tgetTreeContext,\n} from \"../feature-libraries/index.js\";\nimport { type IDisposable, disposeSymbol } from \"../util/index.js\";\n\nimport type { ITreeCheckout, ITreeCheckoutFork, TreeCheckout } from \"./treeCheckout.js\";\n\n/**\n * An editable view of a (version control style) branch of a shared tree.\n * @privateRemarks\n * TODO:\n * 1. Once ISharedTreeView is renamed this can become ISharedTreeView.\n * 2. This object should be combined with or accessible from the TreeContext to allow easy access to thinks like branching.\n * @internal\n */\nexport interface FlexTreeView<in out TRoot extends FlexFieldSchema> extends IDisposable {\n\t/**\n\t * Context for controlling the FlexTree nodes produced from {@link FlexTreeView.flexTree}.\n\t *\n\t * @remarks\n\t * This is an owning reference: disposing of this view disposes its context.\n\t */\n\treadonly context: FlexTreeContext;\n\n\t/**\n\t * Access non-view schema specific aspects of of this branch.\n\t *\n\t * @remarks\n\t * This is a non-owning reference: disposing of this view does not impact the branch.\n\t */\n\treadonly checkout: ITreeCheckout;\n\n\t/**\n\t * Get a typed view of the tree content using the flex-tree API.\n\t */\n\treadonly flexTree: FlexTreeTypedField<TRoot>;\n\n\t/**\n\t * Spawn a new view which is based off of the current state of this view.\n\t * Any mutations of the new view will not apply to this view until the new view is merged back into this view via `merge()`.\n\t */\n\tfork(): ITreeViewFork<TRoot>;\n}\n\n/**\n * Branch (like in a version control system) of SharedTree.\n *\n * {@link FlexTreeView} that has forked off of the main trunk/branch.\n * @internal\n */\nexport interface ITreeViewFork<in out TRoot extends FlexFieldSchema> extends FlexTreeView<TRoot> {\n\treadonly checkout: ITreeCheckoutFork;\n}\n\n/**\n * Implementation of FlexTreeView wrapping a ITreeCheckout.\n */\nexport class CheckoutFlexTreeView<\n\tin out TRoot extends FlexFieldSchema,\n\tout TCheckout extends TreeCheckout = TreeCheckout,\n> implements FlexTreeView<TRoot>\n{\n\tpublic readonly context: Context;\n\tpublic readonly flexTree: FlexTreeTypedField<TRoot>;\n\tpublic constructor(\n\t\tpublic readonly checkout: TCheckout,\n\t\tpublic readonly schema: FlexTreeSchema<TRoot>,\n\t\tpublic readonly nodeKeyManager: NodeKeyManager,\n\t\tprivate readonly onDispose?: () => void,\n\t) {\n\t\tthis.context = getTreeContext(schema, this.checkout, nodeKeyManager);\n\t\tcontextToTreeView.set(this.context, this);\n\t\tthis.flexTree = this.context.root as FlexTreeTypedField<TRoot>;\n\t}\n\n\tpublic [disposeSymbol](): void {\n\t\tthis.context[disposeSymbol]();\n\t\tthis.onDispose?.();\n\t}\n\n\tpublic fork(): CheckoutFlexTreeView<TRoot, TreeCheckout & ITreeCheckoutFork> {\n\t\tconst branch = this.checkout.fork();\n\t\treturn new CheckoutFlexTreeView(branch, this.schema, this.nodeKeyManager);\n\t}\n}\n\n/**\n * Maps the context of every {@link CheckoutFlexTreeView} to the view.\n * In practice, this allows the view or checkout to be obtained from a flex node by first getting the context from the flex node and then using this map.\n */\n// TODO: use something other than `any`\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const contextToTreeView = new WeakMap<Context, CheckoutFlexTreeView<any>>();\n"]}
@@ -66,6 +66,24 @@ export interface SharedTreeBranchEvents<TEditor extends ChangeFamilyEditor, TCha
66
66
  * Fired after this branch is disposed
67
67
  */
68
68
  dispose(): void;
69
+ /**
70
+ * Fired after a new transaction is started.
71
+ * @param isOuterTransaction - true iff the transaction being started is the outermost transaction
72
+ * as opposed to a nested transaction.
73
+ */
74
+ transactionStarted(isOuterTransaction: boolean): void;
75
+ /**
76
+ * Fired after the current transaction is aborted.
77
+ * @param isOuterTransaction - true iff the transaction being aborted is the outermost transaction
78
+ * as opposed to a nested transaction.
79
+ */
80
+ transactionAborted(isOuterTransaction: boolean): void;
81
+ /**
82
+ * Fired after the current transaction is committed.
83
+ * @param isOuterTransaction - true iff the transaction being committed is the outermost transaction
84
+ * as opposed to a nested transaction.
85
+ */
86
+ transactionCommitted(isOuterTransaction: boolean): void;
69
87
  }
70
88
  /**
71
89
  * Events related to branch trimming.
@@ -1 +1 @@
1
- {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/branch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/shared-tree-core/branch.ts"],"names":[],"mappings":"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"}