@fluidframework/tree 2.113.1 → 2.115.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/CHANGELOG.md +289 -0
  2. package/api-report/tree.alpha.api.md +127 -39
  3. package/dist/core/change-family/changeFamily.d.ts +15 -4
  4. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  5. package/dist/core/change-family/changeFamily.js.map +1 -1
  6. package/dist/core/change-family/editBuilder.d.ts +2 -3
  7. package/dist/core/change-family/editBuilder.d.ts.map +1 -1
  8. package/dist/core/change-family/editBuilder.js +1 -2
  9. package/dist/core/change-family/editBuilder.js.map +1 -1
  10. package/dist/core/change-family/index.d.ts +1 -1
  11. package/dist/core/change-family/index.d.ts.map +1 -1
  12. package/dist/core/change-family/index.js.map +1 -1
  13. package/dist/core/index.d.ts +4 -3
  14. package/dist/core/index.d.ts.map +1 -1
  15. package/dist/core/index.js +3 -2
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/core/rebase/index.d.ts +1 -1
  18. package/dist/core/rebase/index.d.ts.map +1 -1
  19. package/dist/core/rebase/index.js +2 -1
  20. package/dist/core/rebase/index.js.map +1 -1
  21. package/dist/core/rebase/types.d.ts +110 -0
  22. package/dist/core/rebase/types.d.ts.map +1 -1
  23. package/dist/core/rebase/types.js +47 -1
  24. package/dist/core/rebase/types.js.map +1 -1
  25. package/dist/core/tree/delta.d.ts +62 -16
  26. package/dist/core/tree/delta.d.ts.map +1 -1
  27. package/dist/core/tree/delta.js.map +1 -1
  28. package/dist/core/tree/detachedFieldIndex.d.ts +7 -13
  29. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  30. package/dist/core/tree/detachedFieldIndex.js +32 -46
  31. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  32. package/dist/core/tree/index.d.ts +1 -0
  33. package/dist/core/tree/index.d.ts.map +1 -1
  34. package/dist/core/tree/index.js.map +1 -1
  35. package/dist/core/tree/visitorUtils.d.ts +2 -4
  36. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  37. package/dist/core/tree/visitorUtils.js +2 -2
  38. package/dist/core/tree/visitorUtils.js.map +1 -1
  39. package/dist/entrypoints/alpha.d.ts +1 -1
  40. package/dist/entrypoints/alpha.d.ts.map +1 -1
  41. package/dist/entrypoints/alpha.js +8 -3
  42. package/dist/entrypoints/alpha.js.map +1 -1
  43. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -6
  44. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  45. package/dist/feature-libraries/chunked-forest/codec/codecs.js +16 -13
  46. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  47. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/uniformChunk.js +10 -2
  49. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  50. package/dist/feature-libraries/comparison-forest/comparisonForest.d.ts +51 -0
  51. package/dist/feature-libraries/comparison-forest/comparisonForest.d.ts.map +1 -0
  52. package/dist/feature-libraries/comparison-forest/comparisonForest.js +98 -0
  53. package/dist/feature-libraries/comparison-forest/comparisonForest.js.map +1 -0
  54. package/dist/feature-libraries/comparison-forest/index.d.ts +6 -0
  55. package/dist/feature-libraries/comparison-forest/index.d.ts.map +1 -0
  56. package/dist/feature-libraries/comparison-forest/index.js +10 -0
  57. package/dist/feature-libraries/comparison-forest/index.js.map +1 -0
  58. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +8 -6
  59. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  60. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +6 -3
  61. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  62. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  63. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  64. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  65. package/dist/feature-libraries/default-schema/noChangeCodecs.d.ts +2 -2
  66. package/dist/feature-libraries/default-schema/noChangeCodecs.d.ts.map +1 -1
  67. package/dist/feature-libraries/default-schema/noChangeCodecs.js +3 -1
  68. package/dist/feature-libraries/default-schema/noChangeCodecs.js.map +1 -1
  69. package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts +6 -3
  70. package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
  71. package/dist/feature-libraries/detachedFieldIndexSummarizer.js +18 -6
  72. package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  73. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -3
  74. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  75. package/dist/feature-libraries/forest-summary/forestSummarizer.js +2 -3
  76. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  77. package/dist/feature-libraries/index.d.ts +4 -3
  78. package/dist/feature-libraries/index.d.ts.map +1 -1
  79. package/dist/feature-libraries/index.js +77 -72
  80. package/dist/feature-libraries/index.js.map +1 -1
  81. package/dist/feature-libraries/mitigatedChangeFamily.d.ts +1 -1
  82. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  83. package/dist/feature-libraries/mitigatedChangeFamily.js +12 -0
  84. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  85. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -1
  86. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  87. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  88. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts +2 -2
  89. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts.map +1 -1
  90. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
  91. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  92. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  93. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  94. package/dist/feature-libraries/modular-schema/invert.d.ts +15 -0
  95. package/dist/feature-libraries/modular-schema/invert.d.ts.map +1 -0
  96. package/dist/feature-libraries/modular-schema/invert.js +159 -0
  97. package/dist/feature-libraries/modular-schema/invert.js.map +1 -0
  98. package/dist/feature-libraries/modular-schema/minimizeModularChange.d.ts +3 -4
  99. package/dist/feature-libraries/modular-schema/minimizeModularChange.d.ts.map +1 -1
  100. package/dist/feature-libraries/modular-schema/minimizeModularChange.js +2 -2
  101. package/dist/feature-libraries/modular-schema/minimizeModularChange.js.map +1 -1
  102. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +9 -9
  103. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  104. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +0 -2
  105. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  106. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +2 -2
  107. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  108. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  109. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +2 -2
  110. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  111. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  112. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +8 -22
  113. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  114. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +53 -406
  115. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  116. package/dist/feature-libraries/modular-schema/modularChangeUtils.d.ts +61 -0
  117. package/dist/feature-libraries/modular-schema/modularChangeUtils.d.ts.map +1 -0
  118. package/dist/feature-libraries/modular-schema/modularChangeUtils.js +205 -0
  119. package/dist/feature-libraries/modular-schema/modularChangeUtils.js.map +1 -0
  120. package/dist/feature-libraries/modular-schema/prune.d.ts +10 -0
  121. package/dist/feature-libraries/modular-schema/prune.d.ts.map +1 -0
  122. package/dist/feature-libraries/modular-schema/prune.js +49 -0
  123. package/dist/feature-libraries/modular-schema/prune.js.map +1 -0
  124. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +2 -2
  125. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  126. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  127. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts +2 -2
  128. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  129. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  130. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +2 -2
  131. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  132. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  133. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts +2 -2
  134. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  135. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  136. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts +2 -2
  137. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts.map +1 -1
  138. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.js.map +1 -1
  139. package/dist/feature-libraries/treeTextCursor.d.ts +15 -0
  140. package/dist/feature-libraries/treeTextCursor.d.ts.map +1 -1
  141. package/dist/feature-libraries/treeTextCursor.js +64 -1
  142. package/dist/feature-libraries/treeTextCursor.js.map +1 -1
  143. package/dist/index.d.ts +6 -4
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +10 -5
  146. package/dist/index.js.map +1 -1
  147. package/dist/packageVersion.d.ts +1 -1
  148. package/dist/packageVersion.js +1 -1
  149. package/dist/packageVersion.js.map +1 -1
  150. package/dist/shared-tree/serializedChange.d.ts +2 -2
  151. package/dist/shared-tree/serializedChange.d.ts.map +1 -1
  152. package/dist/shared-tree/serializedChange.js.map +1 -1
  153. package/dist/shared-tree/sharedTree.d.ts +11 -3
  154. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  155. package/dist/shared-tree/sharedTree.js +9 -7
  156. package/dist/shared-tree/sharedTree.js.map +1 -1
  157. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +2 -2
  158. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  159. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  160. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +41 -4
  161. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  162. package/dist/shared-tree/sharedTreeChangeFamily.js +57 -1
  163. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  164. package/dist/shared-tree/transactionMinimize.d.ts.map +1 -1
  165. package/dist/shared-tree/transactionMinimize.js +2 -2
  166. package/dist/shared-tree/transactionMinimize.js.map +1 -1
  167. package/dist/shared-tree/transactionPostProcessor.d.ts +2 -1
  168. package/dist/shared-tree/transactionPostProcessor.d.ts.map +1 -1
  169. package/dist/shared-tree/transactionPostProcessor.js.map +1 -1
  170. package/dist/shared-tree/treeCheckout.d.ts +13 -7
  171. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  172. package/dist/shared-tree/treeCheckout.js +59 -13
  173. package/dist/shared-tree/treeCheckout.js.map +1 -1
  174. package/dist/shared-tree-core/branch.d.ts +24 -9
  175. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  176. package/dist/shared-tree-core/branch.js +7 -0
  177. package/dist/shared-tree-core/branch.js.map +1 -1
  178. package/dist/shared-tree-core/editManager.d.ts +4 -4
  179. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  180. package/dist/shared-tree-core/editManager.js +2 -0
  181. package/dist/shared-tree-core/editManager.js.map +1 -1
  182. package/dist/shared-tree-core/editManagerCodecs.d.ts +3 -14
  183. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  184. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  185. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts +11 -1
  186. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  187. package/dist/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  188. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts +4 -11
  189. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  190. package/dist/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  191. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +4 -11
  192. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  193. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  194. package/dist/shared-tree-core/editManagerSummarizer.d.ts +4 -4
  195. package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  196. package/dist/shared-tree-core/editManagerSummarizer.js +0 -1
  197. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  198. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +2 -2
  199. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  200. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  201. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  202. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  203. package/dist/shared-tree-core/messageCodecs.d.ts +8 -1
  204. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  205. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  206. package/dist/shared-tree-core/sharedTreeCore.d.ts +5 -5
  207. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  208. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  209. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  210. package/dist/shared-tree-core/transaction.d.ts +10 -10
  211. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  212. package/dist/shared-tree-core/transaction.js +6 -3
  213. package/dist/shared-tree-core/transaction.js.map +1 -1
  214. package/dist/simple-tree/api/eraseSchemaDetails.d.ts +15 -0
  215. package/dist/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -1
  216. package/dist/simple-tree/api/eraseSchemaDetails.js +15 -0
  217. package/dist/simple-tree/api/eraseSchemaDetails.js.map +1 -1
  218. package/dist/simple-tree/api/index.d.ts +1 -1
  219. package/dist/simple-tree/api/index.d.ts.map +1 -1
  220. package/dist/simple-tree/api/index.js +2 -3
  221. package/dist/simple-tree/api/index.js.map +1 -1
  222. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +3 -3
  223. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  224. package/dist/simple-tree/api/schemaStatics.d.ts +6 -7
  225. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -1
  226. package/dist/simple-tree/api/schemaStatics.js.map +1 -1
  227. package/dist/simple-tree/api/treeNodeApi.d.ts +20 -24
  228. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  229. package/dist/simple-tree/api/treeNodeApi.js +48 -49
  230. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  231. package/dist/simple-tree/core/treeNode.d.ts +5 -6
  232. package/dist/simple-tree/core/treeNode.d.ts.map +1 -1
  233. package/dist/simple-tree/core/treeNode.js +2 -4
  234. package/dist/simple-tree/core/treeNode.js.map +1 -1
  235. package/dist/simple-tree/core/withType.d.ts +20 -7
  236. package/dist/simple-tree/core/withType.d.ts.map +1 -1
  237. package/dist/simple-tree/core/withType.js +4 -7
  238. package/dist/simple-tree/core/withType.js.map +1 -1
  239. package/dist/simple-tree/index.d.ts +2 -2
  240. package/dist/simple-tree/index.d.ts.map +1 -1
  241. package/dist/simple-tree/index.js +3 -4
  242. package/dist/simple-tree/index.js.map +1 -1
  243. package/dist/simple-tree/leafNodeSchema.d.ts +6 -1
  244. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  245. package/dist/simple-tree/leafNodeSchema.js +0 -1
  246. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  247. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +53 -5
  248. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  249. package/dist/simple-tree/node-kinds/array/arrayNode.js +91 -10
  250. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  251. package/dist/simple-tree/node-kinds/map/mapNode.d.ts +90 -0
  252. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  253. package/dist/simple-tree/node-kinds/map/mapNode.js +26 -1
  254. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  255. package/dist/simple-tree/node-kinds/object/objectNode.js +2 -2
  256. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  257. package/dist/simple-tree/node-kinds/record/recordNode.js +2 -2
  258. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  259. package/dist/text/codePointUtils.d.ts +2 -2
  260. package/dist/text/codePointUtils.js +2 -2
  261. package/dist/text/codePointUtils.js.map +1 -1
  262. package/dist/text/index.d.ts +3 -3
  263. package/dist/text/index.d.ts.map +1 -1
  264. package/dist/text/index.js +4 -4
  265. package/dist/text/index.js.map +1 -1
  266. package/dist/text/textDomain.d.ts +30 -18
  267. package/dist/text/textDomain.d.ts.map +1 -1
  268. package/dist/text/textDomain.js +44 -23
  269. package/dist/text/textDomain.js.map +1 -1
  270. package/dist/text/textDomainFormatted.d.ts +180 -82
  271. package/dist/text/textDomainFormatted.d.ts.map +1 -1
  272. package/dist/text/textDomainFormatted.js +164 -84
  273. package/dist/text/textDomainFormatted.js.map +1 -1
  274. package/dist/text/textDomainFormattedDefault.d.ts +48 -25
  275. package/dist/text/textDomainFormattedDefault.d.ts.map +1 -1
  276. package/dist/text/textDomainFormattedDefault.js +24 -19
  277. package/dist/text/textDomainFormattedDefault.js.map +1 -1
  278. package/dist/treeDataStore.d.ts +49 -0
  279. package/dist/treeDataStore.d.ts.map +1 -0
  280. package/dist/treeDataStore.js +57 -0
  281. package/dist/treeDataStore.js.map +1 -0
  282. package/dist/treeFactory.d.ts +8 -3
  283. package/dist/treeFactory.d.ts.map +1 -1
  284. package/dist/treeFactory.js +6 -1
  285. package/dist/treeFactory.js.map +1 -1
  286. package/dist/util/compressedIds.d.ts +22 -2
  287. package/dist/util/compressedIds.d.ts.map +1 -1
  288. package/dist/util/compressedIds.js +22 -1
  289. package/dist/util/compressedIds.js.map +1 -1
  290. package/lib/core/change-family/changeFamily.d.ts +15 -4
  291. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  292. package/lib/core/change-family/changeFamily.js.map +1 -1
  293. package/lib/core/change-family/editBuilder.d.ts +2 -3
  294. package/lib/core/change-family/editBuilder.d.ts.map +1 -1
  295. package/lib/core/change-family/editBuilder.js +1 -2
  296. package/lib/core/change-family/editBuilder.js.map +1 -1
  297. package/lib/core/change-family/index.d.ts +1 -1
  298. package/lib/core/change-family/index.d.ts.map +1 -1
  299. package/lib/core/change-family/index.js.map +1 -1
  300. package/lib/core/index.d.ts +4 -3
  301. package/lib/core/index.d.ts.map +1 -1
  302. package/lib/core/index.js +2 -2
  303. package/lib/core/index.js.map +1 -1
  304. package/lib/core/rebase/index.d.ts +1 -1
  305. package/lib/core/rebase/index.d.ts.map +1 -1
  306. package/lib/core/rebase/index.js +1 -1
  307. package/lib/core/rebase/index.js.map +1 -1
  308. package/lib/core/rebase/types.d.ts +110 -0
  309. package/lib/core/rebase/types.d.ts.map +1 -1
  310. package/lib/core/rebase/types.js +46 -0
  311. package/lib/core/rebase/types.js.map +1 -1
  312. package/lib/core/tree/delta.d.ts +62 -16
  313. package/lib/core/tree/delta.d.ts.map +1 -1
  314. package/lib/core/tree/delta.js.map +1 -1
  315. package/lib/core/tree/detachedFieldIndex.d.ts +7 -13
  316. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  317. package/lib/core/tree/detachedFieldIndex.js +7 -21
  318. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  319. package/lib/core/tree/index.d.ts +1 -0
  320. package/lib/core/tree/index.d.ts.map +1 -1
  321. package/lib/core/tree/index.js.map +1 -1
  322. package/lib/core/tree/visitorUtils.d.ts +2 -4
  323. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  324. package/lib/core/tree/visitorUtils.js +2 -2
  325. package/lib/core/tree/visitorUtils.js.map +1 -1
  326. package/lib/entrypoints/alpha.d.ts +1 -1
  327. package/lib/entrypoints/alpha.d.ts.map +1 -1
  328. package/lib/entrypoints/alpha.js +1 -1
  329. package/lib/entrypoints/alpha.js.map +1 -1
  330. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -6
  331. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  332. package/lib/feature-libraries/chunked-forest/codec/codecs.js +16 -13
  333. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  334. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  335. package/lib/feature-libraries/chunked-forest/uniformChunk.js +10 -2
  336. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  337. package/lib/feature-libraries/comparison-forest/comparisonForest.d.ts +51 -0
  338. package/lib/feature-libraries/comparison-forest/comparisonForest.d.ts.map +1 -0
  339. package/lib/feature-libraries/comparison-forest/comparisonForest.js +94 -0
  340. package/lib/feature-libraries/comparison-forest/comparisonForest.js.map +1 -0
  341. package/lib/feature-libraries/comparison-forest/index.d.ts +6 -0
  342. package/lib/feature-libraries/comparison-forest/index.d.ts.map +1 -0
  343. package/lib/feature-libraries/comparison-forest/index.js +6 -0
  344. package/lib/feature-libraries/comparison-forest/index.js.map +1 -0
  345. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +8 -6
  346. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  347. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +6 -3
  348. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  349. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  350. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  351. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  352. package/lib/feature-libraries/default-schema/noChangeCodecs.d.ts +2 -2
  353. package/lib/feature-libraries/default-schema/noChangeCodecs.d.ts.map +1 -1
  354. package/lib/feature-libraries/default-schema/noChangeCodecs.js +3 -1
  355. package/lib/feature-libraries/default-schema/noChangeCodecs.js.map +1 -1
  356. package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts +6 -3
  357. package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
  358. package/lib/feature-libraries/detachedFieldIndexSummarizer.js +16 -4
  359. package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  360. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -3
  361. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  362. package/lib/feature-libraries/forest-summary/forestSummarizer.js +2 -3
  363. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  364. package/lib/feature-libraries/index.d.ts +4 -3
  365. package/lib/feature-libraries/index.d.ts.map +1 -1
  366. package/lib/feature-libraries/index.js +2 -1
  367. package/lib/feature-libraries/index.js.map +1 -1
  368. package/lib/feature-libraries/mitigatedChangeFamily.d.ts +1 -1
  369. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  370. package/lib/feature-libraries/mitigatedChangeFamily.js +12 -0
  371. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  372. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -1
  373. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  374. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  375. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts +2 -2
  376. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts.map +1 -1
  377. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
  378. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  379. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  380. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  381. package/lib/feature-libraries/modular-schema/invert.d.ts +15 -0
  382. package/lib/feature-libraries/modular-schema/invert.d.ts.map +1 -0
  383. package/lib/feature-libraries/modular-schema/invert.js +155 -0
  384. package/lib/feature-libraries/modular-schema/invert.js.map +1 -0
  385. package/lib/feature-libraries/modular-schema/minimizeModularChange.d.ts +3 -4
  386. package/lib/feature-libraries/modular-schema/minimizeModularChange.d.ts.map +1 -1
  387. package/lib/feature-libraries/modular-schema/minimizeModularChange.js +2 -2
  388. package/lib/feature-libraries/modular-schema/minimizeModularChange.js.map +1 -1
  389. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +9 -9
  390. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  391. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +0 -2
  392. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  393. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +2 -2
  394. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  395. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  396. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +2 -2
  397. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  398. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  399. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +8 -22
  400. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  401. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +16 -367
  402. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  403. package/lib/feature-libraries/modular-schema/modularChangeUtils.d.ts +61 -0
  404. package/lib/feature-libraries/modular-schema/modularChangeUtils.d.ts.map +1 -0
  405. package/lib/feature-libraries/modular-schema/modularChangeUtils.js +192 -0
  406. package/lib/feature-libraries/modular-schema/modularChangeUtils.js.map +1 -0
  407. package/lib/feature-libraries/modular-schema/prune.d.ts +10 -0
  408. package/lib/feature-libraries/modular-schema/prune.d.ts.map +1 -0
  409. package/lib/feature-libraries/modular-schema/prune.js +45 -0
  410. package/lib/feature-libraries/modular-schema/prune.js.map +1 -0
  411. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +2 -2
  412. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  413. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  414. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts +2 -2
  415. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  416. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  417. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +2 -2
  418. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  419. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  420. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts +2 -2
  421. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  422. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  423. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts +2 -2
  424. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts.map +1 -1
  425. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.js.map +1 -1
  426. package/lib/feature-libraries/treeTextCursor.d.ts +15 -0
  427. package/lib/feature-libraries/treeTextCursor.d.ts.map +1 -1
  428. package/lib/feature-libraries/treeTextCursor.js +62 -1
  429. package/lib/feature-libraries/treeTextCursor.js.map +1 -1
  430. package/lib/index.d.ts +6 -4
  431. package/lib/index.d.ts.map +1 -1
  432. package/lib/index.js +4 -3
  433. package/lib/index.js.map +1 -1
  434. package/lib/packageVersion.d.ts +1 -1
  435. package/lib/packageVersion.js +1 -1
  436. package/lib/packageVersion.js.map +1 -1
  437. package/lib/shared-tree/serializedChange.d.ts +2 -2
  438. package/lib/shared-tree/serializedChange.d.ts.map +1 -1
  439. package/lib/shared-tree/serializedChange.js.map +1 -1
  440. package/lib/shared-tree/sharedTree.d.ts +11 -3
  441. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  442. package/lib/shared-tree/sharedTree.js +10 -8
  443. package/lib/shared-tree/sharedTree.js.map +1 -1
  444. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +2 -2
  445. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  446. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  447. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +41 -4
  448. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  449. package/lib/shared-tree/sharedTreeChangeFamily.js +55 -0
  450. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  451. package/lib/shared-tree/transactionMinimize.d.ts.map +1 -1
  452. package/lib/shared-tree/transactionMinimize.js +3 -3
  453. package/lib/shared-tree/transactionMinimize.js.map +1 -1
  454. package/lib/shared-tree/transactionPostProcessor.d.ts +2 -1
  455. package/lib/shared-tree/transactionPostProcessor.d.ts.map +1 -1
  456. package/lib/shared-tree/transactionPostProcessor.js.map +1 -1
  457. package/lib/shared-tree/treeCheckout.d.ts +13 -7
  458. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  459. package/lib/shared-tree/treeCheckout.js +61 -15
  460. package/lib/shared-tree/treeCheckout.js.map +1 -1
  461. package/lib/shared-tree-core/branch.d.ts +24 -9
  462. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  463. package/lib/shared-tree-core/branch.js +7 -0
  464. package/lib/shared-tree-core/branch.js.map +1 -1
  465. package/lib/shared-tree-core/editManager.d.ts +4 -4
  466. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  467. package/lib/shared-tree-core/editManager.js +2 -0
  468. package/lib/shared-tree-core/editManager.js.map +1 -1
  469. package/lib/shared-tree-core/editManagerCodecs.d.ts +3 -14
  470. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  471. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  472. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts +11 -1
  473. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  474. package/lib/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  475. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts +4 -11
  476. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  477. package/lib/shared-tree-core/editManagerCodecsV1toV4.js +1 -1
  478. package/lib/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  479. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +4 -11
  480. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  481. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js +1 -1
  482. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  483. package/lib/shared-tree-core/editManagerSummarizer.d.ts +4 -4
  484. package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  485. package/lib/shared-tree-core/editManagerSummarizer.js +0 -1
  486. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  487. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +2 -2
  488. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  489. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  490. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  491. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  492. package/lib/shared-tree-core/messageCodecs.d.ts +8 -1
  493. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  494. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  495. package/lib/shared-tree-core/sharedTreeCore.d.ts +5 -5
  496. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  497. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  498. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  499. package/lib/shared-tree-core/transaction.d.ts +10 -10
  500. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  501. package/lib/shared-tree-core/transaction.js +6 -3
  502. package/lib/shared-tree-core/transaction.js.map +1 -1
  503. package/lib/simple-tree/api/eraseSchemaDetails.d.ts +15 -0
  504. package/lib/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -1
  505. package/lib/simple-tree/api/eraseSchemaDetails.js +15 -0
  506. package/lib/simple-tree/api/eraseSchemaDetails.js.map +1 -1
  507. package/lib/simple-tree/api/index.d.ts +1 -1
  508. package/lib/simple-tree/api/index.d.ts.map +1 -1
  509. package/lib/simple-tree/api/index.js +1 -1
  510. package/lib/simple-tree/api/index.js.map +1 -1
  511. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +3 -3
  512. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  513. package/lib/simple-tree/api/schemaStatics.d.ts +6 -7
  514. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -1
  515. package/lib/simple-tree/api/schemaStatics.js.map +1 -1
  516. package/lib/simple-tree/api/treeNodeApi.d.ts +20 -24
  517. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  518. package/lib/simple-tree/api/treeNodeApi.js +46 -46
  519. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  520. package/lib/simple-tree/core/treeNode.d.ts +5 -6
  521. package/lib/simple-tree/core/treeNode.d.ts.map +1 -1
  522. package/lib/simple-tree/core/treeNode.js +2 -4
  523. package/lib/simple-tree/core/treeNode.js.map +1 -1
  524. package/lib/simple-tree/core/withType.d.ts +20 -7
  525. package/lib/simple-tree/core/withType.d.ts.map +1 -1
  526. package/lib/simple-tree/core/withType.js +4 -7
  527. package/lib/simple-tree/core/withType.js.map +1 -1
  528. package/lib/simple-tree/index.d.ts +2 -2
  529. package/lib/simple-tree/index.d.ts.map +1 -1
  530. package/lib/simple-tree/index.js +1 -1
  531. package/lib/simple-tree/index.js.map +1 -1
  532. package/lib/simple-tree/leafNodeSchema.d.ts +6 -1
  533. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  534. package/lib/simple-tree/leafNodeSchema.js +0 -1
  535. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  536. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +53 -5
  537. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  538. package/lib/simple-tree/node-kinds/array/arrayNode.js +93 -12
  539. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  540. package/lib/simple-tree/node-kinds/map/mapNode.d.ts +90 -0
  541. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  542. package/lib/simple-tree/node-kinds/map/mapNode.js +27 -2
  543. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  544. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -3
  545. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  546. package/lib/simple-tree/node-kinds/record/recordNode.js +3 -3
  547. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  548. package/lib/text/codePointUtils.d.ts +2 -2
  549. package/lib/text/codePointUtils.js +2 -2
  550. package/lib/text/codePointUtils.js.map +1 -1
  551. package/lib/text/index.d.ts +3 -3
  552. package/lib/text/index.d.ts.map +1 -1
  553. package/lib/text/index.js +3 -3
  554. package/lib/text/index.js.map +1 -1
  555. package/lib/text/textDomain.d.ts +30 -18
  556. package/lib/text/textDomain.d.ts.map +1 -1
  557. package/lib/text/textDomain.js +41 -22
  558. package/lib/text/textDomain.js.map +1 -1
  559. package/lib/text/textDomainFormatted.d.ts +180 -82
  560. package/lib/text/textDomainFormatted.d.ts.map +1 -1
  561. package/lib/text/textDomainFormatted.js +165 -86
  562. package/lib/text/textDomainFormatted.js.map +1 -1
  563. package/lib/text/textDomainFormattedDefault.d.ts +48 -25
  564. package/lib/text/textDomainFormattedDefault.d.ts.map +1 -1
  565. package/lib/text/textDomainFormattedDefault.js +25 -20
  566. package/lib/text/textDomainFormattedDefault.js.map +1 -1
  567. package/lib/treeDataStore.d.ts +49 -0
  568. package/lib/treeDataStore.d.ts.map +1 -0
  569. package/lib/treeDataStore.js +52 -0
  570. package/lib/treeDataStore.js.map +1 -0
  571. package/lib/treeFactory.d.ts +8 -3
  572. package/lib/treeFactory.d.ts.map +1 -1
  573. package/lib/treeFactory.js +5 -0
  574. package/lib/treeFactory.js.map +1 -1
  575. package/lib/util/compressedIds.d.ts +22 -2
  576. package/lib/util/compressedIds.d.ts.map +1 -1
  577. package/lib/util/compressedIds.js +22 -1
  578. package/lib/util/compressedIds.js.map +1 -1
  579. package/package.json +32 -24
  580. package/src/core/change-family/changeFamily.ts +32 -4
  581. package/src/core/change-family/editBuilder.ts +1 -2
  582. package/src/core/change-family/index.ts +2 -0
  583. package/src/core/index.ts +11 -6
  584. package/src/core/rebase/index.ts +2 -0
  585. package/src/core/rebase/types.ts +113 -0
  586. package/src/core/tree/delta.ts +62 -16
  587. package/src/core/tree/detachedFieldIndex.ts +7 -38
  588. package/src/core/tree/index.ts +2 -0
  589. package/src/core/tree/visitorUtils.ts +3 -17
  590. package/src/entrypoints/alpha.ts +9 -1
  591. package/src/feature-libraries/chunked-forest/codec/codecs.ts +17 -14
  592. package/src/feature-libraries/chunked-forest/uniformChunk.ts +11 -1
  593. package/src/feature-libraries/comparison-forest/comparisonForest.ts +140 -0
  594. package/src/feature-libraries/comparison-forest/index.ts +6 -0
  595. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +20 -6
  596. package/src/feature-libraries/default-schema/index.ts +1 -0
  597. package/src/feature-libraries/default-schema/noChangeCodecs.ts +11 -3
  598. package/src/feature-libraries/detachedFieldIndexSummarizer.ts +33 -5
  599. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -3
  600. package/src/feature-libraries/index.ts +5 -0
  601. package/src/feature-libraries/mitigatedChangeFamily.ts +21 -3
  602. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +10 -1
  603. package/src/feature-libraries/modular-schema/genericFieldKindCodecs.ts +9 -4
  604. package/src/feature-libraries/modular-schema/index.ts +1 -0
  605. package/src/feature-libraries/modular-schema/invert.ts +338 -0
  606. package/src/feature-libraries/modular-schema/minimizeModularChange.ts +3 -5
  607. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +16 -13
  608. package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +3 -1
  609. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +2 -1
  610. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +45 -644
  611. package/src/feature-libraries/modular-schema/modularChangeUtils.ts +340 -0
  612. package/src/feature-libraries/modular-schema/prune.ts +69 -0
  613. package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +4 -2
  614. package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -2
  615. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +4 -2
  616. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +4 -2
  617. package/src/feature-libraries/sequence-field/sequenceFieldCodecs.ts +6 -3
  618. package/src/feature-libraries/treeTextCursor.ts +66 -1
  619. package/src/index.ts +11 -4
  620. package/src/packageVersion.ts +1 -1
  621. package/src/shared-tree/serializedChange.ts +2 -2
  622. package/src/shared-tree/sharedTree.ts +40 -15
  623. package/src/shared-tree/sharedTreeChangeCodecs.ts +11 -3
  624. package/src/shared-tree/sharedTreeChangeFamily.ts +77 -2
  625. package/src/shared-tree/transactionMinimize.ts +7 -3
  626. package/src/shared-tree/transactionPostProcessor.ts +5 -1
  627. package/src/shared-tree/treeCheckout.ts +136 -30
  628. package/src/shared-tree-core/branch.ts +41 -12
  629. package/src/shared-tree-core/editManager.ts +46 -25
  630. package/src/shared-tree-core/editManagerCodecs.ts +9 -21
  631. package/src/shared-tree-core/editManagerCodecsCommons.ts +14 -2
  632. package/src/shared-tree-core/editManagerCodecsV1toV4.ts +18 -21
  633. package/src/shared-tree-core/editManagerCodecsVSharedBranches.ts +18 -20
  634. package/src/shared-tree-core/editManagerSummarizer.ts +9 -6
  635. package/src/shared-tree-core/messageCodecV1ToV4.ts +3 -3
  636. package/src/shared-tree-core/messageCodecVSharedBranches.ts +2 -2
  637. package/src/shared-tree-core/messageCodecs.ts +12 -2
  638. package/src/shared-tree-core/sharedTreeCore.ts +16 -7
  639. package/src/shared-tree-core/transaction.ts +47 -25
  640. package/src/simple-tree/api/eraseSchemaDetails.ts +15 -0
  641. package/src/simple-tree/api/index.ts +0 -1
  642. package/src/simple-tree/api/schemaStatics.ts +2 -2
  643. package/src/simple-tree/api/treeNodeApi.ts +64 -48
  644. package/src/simple-tree/core/treeNode.ts +13 -10
  645. package/src/simple-tree/core/withType.ts +20 -7
  646. package/src/simple-tree/index.ts +1 -2
  647. package/src/simple-tree/leafNodeSchema.ts +6 -1
  648. package/src/simple-tree/node-kinds/array/arrayNode.ts +130 -16
  649. package/src/simple-tree/node-kinds/map/mapNode.ts +137 -5
  650. package/src/simple-tree/node-kinds/object/objectNode.ts +3 -3
  651. package/src/simple-tree/node-kinds/record/recordNode.ts +3 -3
  652. package/src/text/README.md +1 -1
  653. package/src/text/codePointUtils.ts +2 -2
  654. package/src/text/index.ts +3 -3
  655. package/src/text/textDomain.ts +50 -27
  656. package/src/text/textDomainFormatted.ts +384 -163
  657. package/src/text/textDomainFormattedDefault.ts +32 -32
  658. package/src/treeDataStore.ts +125 -0
  659. package/src/treeFactory.ts +11 -3
  660. package/src/util/compressedIds.ts +36 -3
@@ -52,6 +52,7 @@ import {
52
52
  TreeCompressionStrategy,
53
53
  buildChunkedForest,
54
54
  buildForest,
55
+ ComparisonForest,
55
56
  defaultIncrementalEncodingPolicy,
56
57
  defaultSchemaPolicy,
57
58
  fieldBatchCodecBuilder,
@@ -105,6 +106,7 @@ import {
105
106
  getCodecTreeForChangeFormat,
106
107
  SharedTreeChangeFormatVersion,
107
108
  } from "./sharedTreeChangeCodecs.js";
109
+ import type { SharedTreeChangeProcessingContext } from "./sharedTreeChangeFamily.js";
108
110
  import { SharedTreeChangeFamily } from "./sharedTreeChangeFamily.js";
109
111
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
110
112
  import type { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
@@ -174,7 +176,11 @@ export type SharedTreeKernelView = Omit<ITreePrivate, keyof (IChannelView & IFlu
174
176
  */
175
177
  @breakingClass
176
178
  export class SharedTreeKernel
177
- extends SharedTreeCore<SharedTreeEditBuilder, SharedTreeChange>
179
+ extends SharedTreeCore<
180
+ SharedTreeEditBuilder,
181
+ SharedTreeChange,
182
+ SharedTreeChangeProcessingContext
183
+ >
178
184
  implements SharedKernel
179
185
  {
180
186
  public readonly checkout: TreeCheckout;
@@ -219,13 +225,7 @@ export class SharedTreeKernel
219
225
  idCompressor,
220
226
  options.shouldEncodeIncrementally,
221
227
  );
222
- const revisionTagCodec = new RevisionTagCodec(idCompressor);
223
- const removedRoots = makeDetachedFieldIndex(
224
- "repair",
225
- revisionTagCodec,
226
- idCompressor,
227
- options,
228
- );
228
+ const removedRoots = makeDetachedFieldIndex("repair");
229
229
  const schemaCodec = schemaCodecBuilder.build(options);
230
230
  const schemaSummarizer = new SchemaSummarizer(
231
231
  schema,
@@ -252,12 +252,11 @@ export class SharedTreeKernel
252
252
  idCompressor,
253
253
  healing:
254
254
  options.healUnresolvableIdentifiersOnDecode === true
255
- ? { sharedObjectId: sharedObject.id }
255
+ ? { sharedObjectId: sharedObject.id, logger }
256
256
  : undefined,
257
257
  });
258
258
  const forestSummarizer = new ForestSummarizer(
259
259
  forest,
260
- revisionTagCodec,
261
260
  encoderContext,
262
261
  decoderContext,
263
262
  options,
@@ -265,9 +264,12 @@ export class SharedTreeKernel
265
264
  initialSequenceNumber,
266
265
  options.shouldEncodeIncrementally,
267
266
  );
267
+ const revisionTagCodec = new RevisionTagCodec(idCompressor);
268
268
  const removedRootsSummarizer = new DetachedFieldIndexSummarizer(
269
269
  removedRoots,
270
- options.minVersionForCollab,
270
+ revisionTagCodec,
271
+ idCompressor,
272
+ options,
271
273
  );
272
274
  const innerChangeFamily = new SharedTreeChangeFamily(
273
275
  revisionTagCodec,
@@ -436,7 +438,11 @@ export class SharedTreeKernel
436
438
 
437
439
  public override applyStashedOp(
438
440
  ...args: Parameters<
439
- SharedTreeCore<SharedTreeEditBuilder, SharedTreeChange>["applyStashedOp"]
441
+ SharedTreeCore<
442
+ SharedTreeEditBuilder,
443
+ SharedTreeChange,
444
+ SharedTreeChangeProcessingContext
445
+ >["applyStashedOp"]
440
446
  >
441
447
  ): void {
442
448
  for (const checkout of this.checkouts.values()) {
@@ -596,6 +602,11 @@ export interface SharedTreeOptionsBeta extends ForestOptions, Partial<CodecWrite
596
602
  * Healed identifiers are written back out at the next summary in their stable UUID form,
597
603
  * so the inconsistency does not need to be re-healed on every load.
598
604
  *
605
+ * When this flag is enabled, each time an unresolvable identifier is healed a
606
+ * `HealUnresolvableIdentifierOnDecode` telemetry event is emitted (at
607
+ * {@link @fluidframework/core-interfaces#LogLevelConst.info | LogLevel.info}) through the shared
608
+ * object's logger, allowing applications to detect which documents actually required healing.
609
+ *
599
610
  * Off by default because enabling it for documents that are not actually corrupt
600
611
  * would mask genuine bugs that otherwise surface as decode failures.
601
612
  *
@@ -739,12 +750,26 @@ export const ForestTypeOptimized = toForestType(
739
750
  * Includes validation with scales poorly.
740
751
  * May be asymptotically slower than {@link ForestTypeReference}, and may perform very badly with larger data sizes.
741
752
  * @privateRemarks
742
- * The "ObjectForest" forest type with expensive asserts for debugging.
753
+ * A {@link ComparisonForest} which uses the "ChunkedForest" forest type as its main forest and validates every delta
754
+ * against a reference "ObjectForest" (with expensive asserts enabled for schema validation).
755
+ * This exercises the optimized forest while asserting that its contents stay consistent with the reference implementation.
743
756
  * @beta
744
757
  */
745
758
  export const ForestTypeExpensiveDebug = toForestType(
746
- (breaker: Breakable, schema: TreeStoredSchemaSubscription) =>
747
- buildForest(breaker, schema, undefined, true),
759
+ (
760
+ breaker: Breakable,
761
+ schema: TreeStoredSchemaSubscription,
762
+ idCompressor: IIdCompressor,
763
+ shouldEncodeIncrementally: IncrementalEncodingPolicy,
764
+ ) =>
765
+ new ComparisonForest(
766
+ buildChunkedForest(
767
+ makeTreeChunker(schema, defaultSchemaPolicy, shouldEncodeIncrementally),
768
+ undefined,
769
+ idCompressor,
770
+ ),
771
+ buildForest(breaker, schema, undefined, true),
772
+ ),
748
773
  );
749
774
 
750
775
  type ForestFactory = (
@@ -16,7 +16,11 @@ import {
16
16
  makeCodecFamily,
17
17
  withSchemaValidation,
18
18
  } from "../codec/index.js";
19
- import type { ChangeEncodingContext, TreeStoredSchema } from "../core/index.js";
19
+ import type {
20
+ ChangeEncodingContext,
21
+ ChangeDecodingContext,
22
+ TreeStoredSchema,
23
+ } from "../core/index.js";
20
24
  import {
21
25
  ModularChangeFormatVersion,
22
26
  type ModularChangeset,
@@ -39,9 +43,13 @@ import {
39
43
  import type { SharedTreeChange, SharedTreeInnerChange } from "./sharedTreeChangeTypes.js";
40
44
 
41
45
  export function makeSharedTreeChangeCodecFamily(
42
- modularChangeCodecFamily: ICodecFamily<ModularChangeset, ChangeEncodingContext>,
46
+ modularChangeCodecFamily: ICodecFamily<
47
+ ModularChangeset,
48
+ ChangeEncodingContext,
49
+ ChangeDecodingContext
50
+ >,
43
51
  options: CodecWriteOptions,
44
- ): ICodecFamily<SharedTreeChange, ChangeEncodingContext> {
52
+ ): ICodecFamily<SharedTreeChange, ChangeEncodingContext, ChangeDecodingContext> {
45
53
  const versions: [
46
54
  FormatVersion,
47
55
  IJsonCodec<
@@ -9,6 +9,7 @@ import type { IIdCompressor } from "@fluidframework/id-compressor";
9
9
  import type { CodecWriteOptions, ICodecFamily } from "../codec/index.js";
10
10
  import {
11
11
  type ChangeEncodingContext,
12
+ type ChangeDecodingContext,
12
13
  type ChangeFamily,
13
14
  type ChangeRebaser,
14
15
  type DeltaDetachedNodeId,
@@ -18,6 +19,7 @@ import {
18
19
  type RevisionTagCodec,
19
20
  type TaggedChange,
20
21
  mapTaggedChange,
22
+ type ProcessChangeFn,
21
23
  } from "../core/index.js";
22
24
  import {
23
25
  type FieldBatchCodec,
@@ -41,6 +43,10 @@ import { makeSharedTreeChangeCodecFamily } from "./sharedTreeChangeCodecs.js";
41
43
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
42
44
  import { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
43
45
 
46
+ export interface SharedTreeChangeProcessingContext {
47
+ modularChangeFamily: ModularChangeFamily;
48
+ }
49
+
44
50
  /**
45
51
  * Implementation of {@link ChangeFamily} that combines edits to fields and schema changes.
46
52
  *
@@ -48,14 +54,18 @@ import { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
48
54
  */
49
55
  export class SharedTreeChangeFamily
50
56
  implements
51
- ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,
57
+ ChangeFamily<SharedTreeEditBuilder, SharedTreeChange, SharedTreeChangeProcessingContext>,
52
58
  ChangeRebaser<SharedTreeChange>
53
59
  {
54
60
  public static readonly emptyChange: SharedTreeChange = {
55
61
  changes: [],
56
62
  };
57
63
 
58
- public readonly codecs: ICodecFamily<SharedTreeChange, ChangeEncodingContext>;
64
+ public readonly codecs: ICodecFamily<
65
+ SharedTreeChange,
66
+ ChangeEncodingContext,
67
+ ChangeDecodingContext
68
+ >;
59
69
  private readonly modularChangeFamily: ModularChangeFamily;
60
70
 
61
71
  public constructor(
@@ -94,6 +104,15 @@ export class SharedTreeChangeFamily
94
104
  );
95
105
  }
96
106
 
107
+ public buildProcessor(
108
+ processFn: ProcessChangeFn<SharedTreeChange, SharedTreeChangeProcessingContext>,
109
+ ): (change: SharedTreeChange) => SharedTreeChange {
110
+ return (change: SharedTreeChange) =>
111
+ processFn(change, {
112
+ modularChangeFamily: this.modularChangeFamily,
113
+ });
114
+ }
115
+
97
116
  public compose(changes: TaggedChange<SharedTreeChange>[]): SharedTreeChange {
98
117
  const newChanges: Mutable<SharedTreeChange["changes"]> = [];
99
118
  const dataChangeRun: TaggedChange<ModularChangeset>[] = [];
@@ -342,3 +361,59 @@ export function updateRefreshers(
342
361
  }
343
362
  });
344
363
  }
364
+
365
+ /**
366
+ * The status of a {@link SharedTreeChange} with respect to its constraints.
367
+ */
368
+ export enum ConstraintStatus {
369
+ /**
370
+ * All constraints are satisfied.
371
+ */
372
+ Satisfied,
373
+ /**
374
+ * At least one implicit constraint has been violated.
375
+ * @remarks
376
+ * Implicit constraints are those that are automatically enforced by SharedTree on all changes.
377
+ *
378
+ * Such a violation typically arises in one of two scenarios:
379
+ * 1. A schema change conflicts with a concurrent data or schema change that was sequenced before it.
380
+ * 2. A data change conflicts with a concurrent schema change that was sequenced before it.
381
+ */
382
+ ImplicitViolation,
383
+ /**
384
+ * At least one explicit constraint has been violated.
385
+ * @remarks
386
+ * Explicit constraints are those that are explicitly added
387
+ * through {@link RunTransactionParamsAlpha.preconditions | preconditions}
388
+ * or {@link TransactionCallbackStatusAlpha.preconditionsOnRevert | preconditionsOnRevert}.
389
+ */
390
+ ExplicitViolation,
391
+ }
392
+
393
+ /**
394
+ * Gets the constraint status of a shared tree change.
395
+ * @param change - The shared tree change to evaluate.
396
+ * @returns The constraint status of the change.
397
+ */
398
+ export function getConstraintStatus(change: SharedTreeChange): ConstraintStatus {
399
+ if (change.changes.length === 0) {
400
+ // The SharedTreeChange format (both in memory and over the wire) has no way to convey implicit constraint violation.
401
+ // Instead, the current rebase implementation in SharedTreeChangeFamily produces an empty change.
402
+ // This is not ideal because there is no guarantee that an empty change didn't just start out that way.
403
+ // There is currently only one way to generate an empty change that isn't a result of an implicit constraint violation:
404
+ // when the SharedTreeChangeFamily is wrapped in makeMitigatedChangeFamily, an empty change is produced when an error occurs.
405
+ // This is unlikely to cause problems for this logic for two reasons:
406
+ // 1. Such an error will put SharedTree into a broken state, halting further operations.
407
+ // 2. It is reasonable to treat a changeset whose production triggered an error as having violated the implicit constraints in our code.
408
+ return ConstraintStatus.ImplicitViolation;
409
+ }
410
+ if (
411
+ change.changes.some(
412
+ ({ type, innerChange }) =>
413
+ type === "data" && (innerChange.constraintViolationCount ?? 0) > 0,
414
+ )
415
+ ) {
416
+ return ConstraintStatus.ExplicitViolation;
417
+ }
418
+ return ConstraintStatus.Satisfied;
419
+ }
@@ -5,13 +5,14 @@
5
5
 
6
6
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
7
7
 
8
- import { fieldKinds, minimizeModularChangeset } from "../feature-libraries/index.js";
8
+ import { minimizeModularChangeset } from "../feature-libraries/index.js";
9
9
  import { ChangeProcessorApplicability } from "../shared-tree-core/index.js";
10
10
  import type { TransactionPostProcessor } from "../simple-tree/index.js";
11
11
 
12
12
  import { mapDataChanges } from "./sharedTreeChangeFamily.js";
13
13
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
14
14
  import { createTransactionPostProcessor } from "./transactionPostProcessor.js";
15
+ import type { SharedTreeChangeProcessingContext } from "./sharedTreeChangeFamily.js";
15
16
 
16
17
  /**
17
18
  * "Minimizes" a {@link SharedTreeChange} so that it contains no extraneous
@@ -26,7 +27,10 @@ import { createTransactionPostProcessor } from "./transactionPostProcessor.js";
26
27
  *
27
28
  * Schema changes are left unchanged.
28
29
  */
29
- function minimizeSharedTreeChange(change: SharedTreeChange): SharedTreeChange {
30
+ function minimizeSharedTreeChange(
31
+ change: SharedTreeChange,
32
+ context: SharedTreeChangeProcessingContext,
33
+ ): SharedTreeChange {
30
34
  const countOfDataChanges = change.changes.filter(
31
35
  (innerChange) => innerChange.type === "data",
32
36
  ).length;
@@ -36,7 +40,7 @@ function minimizeSharedTreeChange(change: SharedTreeChange): SharedTreeChange {
36
40
  );
37
41
  }
38
42
  return mapDataChanges(change, (dataChange) =>
39
- minimizeModularChangeset(dataChange, fieldKinds),
43
+ minimizeModularChangeset(dataChange, context.modularChangeFamily),
40
44
  );
41
45
  }
42
46
 
@@ -5,6 +5,7 @@
5
5
 
6
6
  import type { ChangeProcessor } from "../shared-tree-core/index.js";
7
7
  import type { TransactionPostProcessor } from "../simple-tree/index.js";
8
+ import type { SharedTreeChangeProcessingContext } from "./sharedTreeChangeFamily.js";
8
9
 
9
10
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
10
11
 
@@ -13,7 +14,10 @@ import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
13
14
  * {@link SharedTreeChange}.
14
15
  * @remarks This is the (non-type-erased) form used internally to apply a transaction's post-processor.
15
16
  */
16
- export type TransactionPostProcessorInternal = ChangeProcessor<SharedTreeChange>;
17
+ export type TransactionPostProcessorInternal = ChangeProcessor<
18
+ SharedTreeChange,
19
+ SharedTreeChangeProcessingContext
20
+ >;
17
21
 
18
22
  /**
19
23
  * Type-erases an internal {@link TransactionPostProcessorInternal | change processor} as a public
@@ -4,7 +4,11 @@
4
4
  */
5
5
 
6
6
  import { createEmitter } from "@fluid-internal/client-utils";
7
- import type { IFluidHandle, Listenable } from "@fluidframework/core-interfaces/internal";
7
+ import type {
8
+ IEmitter,
9
+ IFluidHandle,
10
+ Listenable,
11
+ } from "@fluidframework/core-interfaces/internal";
8
12
  import { assert, unreachableCase, fail } from "@fluidframework/core-utils/internal";
9
13
  import type { IIdCompressor } from "@fluidframework/id-compressor";
10
14
  import { type TelemetryLoggerExt, UsageError } from "@fluidframework/telemetry-utils/internal";
@@ -21,6 +25,7 @@ import {
21
25
  type AnchorSetRootEvents,
22
26
  type ChangeFamily,
23
27
  CommitKind,
28
+ CommitOutcome,
24
29
  type DeltaVisitor,
25
30
  type DetachedFieldIndex,
26
31
  type IEditableForest,
@@ -57,6 +62,7 @@ import {
57
62
  deltaFieldMapHasVisibleChanges,
58
63
  findCommonAncestor,
59
64
  rebaseBranch,
65
+ type LocalCommitEvents,
60
66
  } from "../core/index.js";
61
67
  import {
62
68
  type FieldBatchCodec,
@@ -114,7 +120,13 @@ import {
114
120
 
115
121
  import { SchematizingSimpleTreeView } from "./schematizingTreeView.js";
116
122
  import { SharedTreeChangeEnricher } from "./sharedTreeChangeEnricher.js";
117
- import { SharedTreeChangeFamily, hasSchemaChange } from "./sharedTreeChangeFamily.js";
123
+ import type { SharedTreeChangeProcessingContext } from "./sharedTreeChangeFamily.js";
124
+ import {
125
+ ConstraintStatus,
126
+ SharedTreeChangeFamily,
127
+ getConstraintStatus,
128
+ hasSchemaChange,
129
+ } from "./sharedTreeChangeFamily.js";
118
130
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
119
131
  import type { ISharedTreeEditor, SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
120
132
  import { extractTransactionChangeProcessor } from "./transactionPostProcessor.js";
@@ -210,7 +222,9 @@ export interface CheckoutEvents {
210
222
  /**
211
223
  * A collection of functions for managing transactions on a {@link ITreeCheckout}.
212
224
  */
213
- export type TreeTransactor = Transactor<SquashingTransactionOptions<SharedTreeChange>>;
225
+ export type TreeTransactor = Transactor<
226
+ SquashingTransactionOptions<SharedTreeChange, SharedTreeChangeProcessingContext>
227
+ >;
214
228
 
215
229
  /**
216
230
  * Provides a means for interacting with a SharedTree.
@@ -305,8 +319,16 @@ export function createTreeCheckout(
305
319
  mintRevisionTag: () => RevisionTag,
306
320
  revisionTagCodec: RevisionTagCodec,
307
321
  args?: {
308
- branch?: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>;
309
- changeFamily?: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>;
322
+ branch?: SharedTreeBranch<
323
+ SharedTreeEditBuilder,
324
+ SharedTreeChange,
325
+ SharedTreeChangeProcessingContext
326
+ >;
327
+ changeFamily?: ChangeFamily<
328
+ SharedTreeEditBuilder,
329
+ SharedTreeChange,
330
+ SharedTreeChangeProcessingContext
331
+ >;
310
332
  schema?: TreeStoredSchemaRepository;
311
333
  forest?: IEditableForest;
312
334
  fieldBatchCodec?: FieldBatchCodec;
@@ -489,6 +511,14 @@ export class TreeCheckout implements ITreeCheckout {
489
511
 
490
512
  private readonly views = new Set<TreeView<ImplicitFieldSchema>>();
491
513
 
514
+ /**
515
+ * Event emitters for local commits.
516
+ */
517
+ private readonly localCommitEventEmitters = new Map<
518
+ RevisionTag,
519
+ IEmitter<LocalCommitEvents>
520
+ >();
521
+
492
522
  /**
493
523
  * Revertibles maintained for automatic disposal
494
524
  */
@@ -501,7 +531,11 @@ export class TreeCheckout implements ITreeCheckout {
501
531
  */
502
532
  private readonly revertibleCommitBranches = new Map<
503
533
  RevisionTag,
504
- SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>
534
+ SharedTreeBranch<
535
+ SharedTreeEditBuilder,
536
+ SharedTreeChange,
537
+ SharedTreeChangeProcessingContext
538
+ >
505
539
  >();
506
540
 
507
541
  /**
@@ -514,20 +548,24 @@ export class TreeCheckout implements ITreeCheckout {
514
548
  public events: Listenable<CheckoutEvents> = this.#events;
515
549
 
516
550
  public constructor(
517
- branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
551
+ branch: SharedTreeBranch<
552
+ SharedTreeEditBuilder,
553
+ SharedTreeChange,
554
+ SharedTreeChangeProcessingContext
555
+ >,
518
556
  /** True if and only if this checkout is for a branch which is persisted and shared with other clients. */
519
557
  public readonly isSharedBranch: boolean,
520
- private readonly changeFamily: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,
558
+ private readonly changeFamily: ChangeFamily<
559
+ SharedTreeEditBuilder,
560
+ SharedTreeChange,
561
+ SharedTreeChangeProcessingContext
562
+ >,
521
563
  public readonly storedSchema: TreeStoredSchemaRepository,
522
564
  public readonly forest: IEditableForest,
523
565
  private readonly mintRevisionTag: () => RevisionTag,
524
566
  private readonly revisionTagCodec: RevisionTagCodec,
525
567
  private readonly idCompressor: IIdCompressor,
526
- private readonly _removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(
527
- "repair",
528
- revisionTagCodec,
529
- idCompressor,
530
- ),
568
+ private readonly _removedRoots: DetachedFieldIndex = makeDetachedFieldIndex("repair"),
531
569
  /** Optional logger for telemetry. */
532
570
  private readonly logger?: TelemetryLoggerExt,
533
571
  public readonly breaker: Breakable = new Breakable("TreeCheckout", logger),
@@ -649,19 +687,29 @@ export class TreeCheckout implements ITreeCheckout {
649
687
 
650
688
  private registerForBranchEvents(): void {
651
689
  this.#transaction.branch.events.on("afterChange", this.onAfterBranchChange);
690
+ this.#transaction.branch.events.on("commitSequenced", this.onCommitSequenced);
652
691
  this.#transaction.activeBranchEvents.on("afterChange", this.onAfterChange);
653
692
  this.#transaction.activeBranchEvents.on("ancestryTrimmed", this.onAncestryTrimmed);
654
693
  }
655
694
 
656
695
  private unregisterFromBranchEvents(): void {
657
696
  this.#transaction.branch.events.off("afterChange", this.onAfterBranchChange);
697
+ this.#transaction.branch.events.off("commitSequenced", this.onCommitSequenced);
658
698
  this.#transaction.activeBranchEvents.off("afterChange", this.onAfterChange);
659
699
  this.#transaction.activeBranchEvents.off("ancestryTrimmed", this.onAncestryTrimmed);
660
700
  }
661
701
 
662
702
  private createTransactionStack(
663
- branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
664
- ): SquashingTransactionStack<SharedTreeEditBuilder, SharedTreeChange> {
703
+ branch: SharedTreeBranch<
704
+ SharedTreeEditBuilder,
705
+ SharedTreeChange,
706
+ SharedTreeChangeProcessingContext
707
+ >,
708
+ ): SquashingTransactionStack<
709
+ SharedTreeEditBuilder,
710
+ SharedTreeChange,
711
+ SharedTreeChangeProcessingContext
712
+ > {
665
713
  return new SquashingTransactionStack(branch, this.mintRevisionTag, () => {
666
714
  // When each transaction is started, make a restorable checkpoint of the current state of removed roots
667
715
  const restoreRemovedRoots = this._removedRoots.createCheckpoint();
@@ -712,6 +760,39 @@ export class TreeCheckout implements ITreeCheckout {
712
760
  }
713
761
  }
714
762
 
763
+ private readonly onCommitSequenced = (commit: GraphCommit<SharedTreeChange>): void => {
764
+ const emitter = this.localCommitEventEmitters.get(commit.revision);
765
+ if (emitter === undefined) {
766
+ // If the commit predates the creation of this checkout, there will be no emitter associated with the commit.
767
+ // In that case, we don't need to emit any events.
768
+ return;
769
+ }
770
+ const constraintStatus = getConstraintStatus(commit.change);
771
+ let outcome: CommitOutcome;
772
+ switch (constraintStatus) {
773
+ case ConstraintStatus.Satisfied: {
774
+ outcome = CommitOutcome.FullyApplied;
775
+ break;
776
+ }
777
+ case ConstraintStatus.ImplicitViolation: {
778
+ outcome = CommitOutcome.FullyDropped;
779
+ break;
780
+ }
781
+ case ConstraintStatus.ExplicitViolation: {
782
+ outcome = CommitOutcome.NewContentOnly;
783
+ break;
784
+ }
785
+ default: {
786
+ unreachableCase(constraintStatus);
787
+ }
788
+ }
789
+ this.emitChangedLocked(() => {
790
+ emitter.emit("settled", outcome);
791
+ }, "a commit settled event callback");
792
+ // No more events will be emitted for this commit, so we can remove the emitter from the map.
793
+ this.localCommitEventEmitters.delete(commit.revision);
794
+ };
795
+
715
796
  private readonly onAfterBranchChange = (
716
797
  event: SharedTreeBranchChange<SharedTreeChange>,
717
798
  ): void => {
@@ -760,6 +841,8 @@ export class TreeCheckout implements ITreeCheckout {
760
841
 
761
842
  let withinEventContext = true;
762
843
 
844
+ const events = createEmitter<LocalCommitEvents>();
845
+ this.localCommitEventEmitters.set(commit.revision, events);
763
846
  const metadata: ChangeMetadata = {
764
847
  kind,
765
848
  isLocal: true,
@@ -778,6 +861,7 @@ export class TreeCheckout implements ITreeCheckout {
778
861
  getRevertible: (onDisposed) => getRevertible?.(onDisposed),
779
862
  label: this.labelTreeNode?.label,
780
863
  labels: buildLabelsSet(this.labelTreeNode),
864
+ events,
781
865
  };
782
866
 
783
867
  this.emitChangedLocked(() => {
@@ -811,8 +895,11 @@ export class TreeCheckout implements ITreeCheckout {
811
895
  * Shared by both the local and remote `changed` emission paths in {@link TreeCheckout.onAfterBranchChange}.
812
896
  * The `try`/`finally` ensures the lock is released even if a listener throws.
813
897
  */
814
- private emitChangedLocked(emit: () => void): void {
815
- this.editLock.lock();
898
+ private emitChangedLocked(
899
+ emit: () => void,
900
+ reason: string = "a change event callback",
901
+ ): void {
902
+ this.editLock.lock(reason);
816
903
  try {
817
904
  emit();
818
905
  } finally {
@@ -828,7 +915,7 @@ export class TreeCheckout implements ITreeCheckout {
828
915
  }
829
916
 
830
917
  private readonly onAfterChange = (event: SharedTreeBranchChange<SharedTreeChange>): void => {
831
- this.editLock.lock();
918
+ this.editLock.lock("a change event callback");
832
919
  this.#events.emit("beforeBatch", event);
833
920
  if (event.change !== undefined) {
834
921
  const revision =
@@ -1187,7 +1274,11 @@ export class TreeCheckout implements ITreeCheckout {
1187
1274
  * To avoid updating observers of the view state with intermediate results during a transaction,
1188
1275
  * use {@link ITreeCheckout#fork} and {@link ISharedTreeFork#merge}.
1189
1276
  */
1190
- #transaction: SquashingTransactionStack<SharedTreeEditBuilder, SharedTreeChange>;
1277
+ #transaction: SquashingTransactionStack<
1278
+ SharedTreeEditBuilder,
1279
+ SharedTreeChange,
1280
+ SharedTreeChangeProcessingContext
1281
+ >;
1191
1282
 
1192
1283
  @throwIfBroken
1193
1284
  public fork(): TreeCheckout {
@@ -1221,7 +1312,11 @@ export class TreeCheckout implements ITreeCheckout {
1221
1312
  }
1222
1313
 
1223
1314
  public switchBranch(
1224
- branch: SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>,
1315
+ branch: SharedTreeBranch<
1316
+ SharedTreeEditBuilder,
1317
+ SharedTreeChange,
1318
+ SharedTreeChangeProcessingContext
1319
+ >,
1225
1320
  ): void {
1226
1321
  // TODO: Dispose old branch, if necessary
1227
1322
  assert(
@@ -1648,7 +1743,11 @@ export class TreeCheckout implements ITreeCheckout {
1648
1743
  return enriched;
1649
1744
  }
1650
1745
 
1651
- public get mainBranch(): SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange> {
1746
+ public get mainBranch(): SharedTreeBranch<
1747
+ SharedTreeEditBuilder,
1748
+ SharedTreeChange,
1749
+ SharedTreeChangeProcessingContext
1750
+ > {
1652
1751
  return this.#transaction.branch;
1653
1752
  }
1654
1753
 
@@ -1664,7 +1763,13 @@ class EditLock {
1664
1763
  * @remarks Edits will throw an error if the lock is currently locked.
1665
1764
  */
1666
1765
  public readonly editor: ISharedTreeEditor;
1667
- private locked = false;
1766
+ /**
1767
+ * The current status of the lock.
1768
+ * The `reason` string will be included in the error message if an attempt is made to edit the tree while the lock is held.
1769
+ */
1770
+ private status:
1771
+ | { readonly isLocked: false }
1772
+ | { readonly isLocked: true; readonly reason: string } = { isLocked: false };
1668
1773
 
1669
1774
  /**
1670
1775
  * @param editor - an editor which will be used to create a new editor that is monitored to determine if any changes are happening to the tree.
@@ -1728,14 +1833,15 @@ class EditLock {
1728
1833
 
1729
1834
  /**
1730
1835
  * Prevent further changes from being made to {@link EditLock.editor} until {@link EditLock.unlock} is called.
1836
+ * @param reason - A string describing why the lock is being acquired. This will be included in the error message if an attempt is made to edit while the lock is held.
1731
1837
  * @remarks May only be called when the lock is not already locked.
1732
1838
  */
1733
- public lock(): void {
1734
- if (this.locked) {
1839
+ public lock(reason: string): void {
1840
+ if (this.status.isLocked) {
1735
1841
  debugger;
1736
1842
  }
1737
- assert(!this.locked, 0xaa7 /* Checkout has already been locked */);
1738
- this.locked = true;
1843
+ assert(!this.status.isLocked, 0xaa7 /* Checkout has already been locked */);
1844
+ this.status = { isLocked: true, reason };
1739
1845
  }
1740
1846
 
1741
1847
  /**
@@ -1744,8 +1850,8 @@ class EditLock {
1744
1850
  * This must start with a capital letter, as it shows up as the first part of the error message and we want it to look nice.
1745
1851
  */
1746
1852
  public checkUnlocked<T extends string>(action: T extends Capitalize<T> ? T : never): void {
1747
- if (this.locked) {
1748
- throw new UsageError(`${action} is forbidden during a change event callback`);
1853
+ if (this.status.isLocked) {
1854
+ throw new UsageError(`${action} is forbidden during ${this.status.reason}`);
1749
1855
  }
1750
1856
  }
1751
1857
 
@@ -1754,8 +1860,8 @@ class EditLock {
1754
1860
  * @remarks May only be called when the lock is currently locked.
1755
1861
  */
1756
1862
  public unlock(): void {
1757
- assert(this.locked, 0xaa8 /* Checkout has not been locked */);
1758
- this.locked = false;
1863
+ assert(this.status.isLocked, 0xaa8 /* Checkout has not been locked */);
1864
+ this.status = { isLocked: false };
1759
1865
  }
1760
1866
  }
1761
1867