@fluidframework/tree 2.90.0-378676 → 2.90.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 (1104) hide show
  1. package/.vscode/settings.json +6 -5
  2. package/CHANGELOG.md +95 -0
  3. package/README.md +1 -1
  4. package/api-report/tree.alpha.api.md +63 -25
  5. package/api-report/tree.beta.api.md +30 -0
  6. package/api-report/tree.legacy.beta.api.md +30 -0
  7. package/dist/alpha.d.ts +10 -6
  8. package/dist/beta.d.ts +4 -1
  9. package/dist/codec/codec.d.ts +2 -0
  10. package/dist/codec/codec.d.ts.map +1 -1
  11. package/dist/codec/codec.js +4 -3
  12. package/dist/codec/codec.js.map +1 -1
  13. package/dist/codec/index.d.ts +1 -1
  14. package/dist/codec/index.d.ts.map +1 -1
  15. package/dist/codec/index.js +2 -1
  16. package/dist/codec/index.js.map +1 -1
  17. package/dist/codec/versioned/codec.d.ts +13 -1
  18. package/dist/codec/versioned/codec.d.ts.map +1 -1
  19. package/dist/codec/versioned/codec.js +18 -3
  20. package/dist/codec/versioned/codec.js.map +1 -1
  21. package/dist/codec/versioned/format.d.ts +22 -1
  22. package/dist/codec/versioned/format.d.ts.map +1 -1
  23. package/dist/codec/versioned/format.js +16 -3
  24. package/dist/codec/versioned/format.js.map +1 -1
  25. package/dist/codec/versioned/index.d.ts +1 -1
  26. package/dist/codec/versioned/index.d.ts.map +1 -1
  27. package/dist/codec/versioned/index.js +2 -1
  28. package/dist/codec/versioned/index.js.map +1 -1
  29. package/dist/core/change-family/changeFamily.d.ts +1 -4
  30. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  31. package/dist/core/change-family/changeFamily.js.map +1 -1
  32. package/dist/core/change-family/index.d.ts +1 -1
  33. package/dist/core/change-family/index.d.ts.map +1 -1
  34. package/dist/core/change-family/index.js.map +1 -1
  35. package/dist/core/index.d.ts +3 -4
  36. package/dist/core/index.d.ts.map +1 -1
  37. package/dist/core/index.js +4 -8
  38. package/dist/core/index.js.map +1 -1
  39. package/dist/core/rebase/changeRebaser.d.ts +1 -6
  40. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  41. package/dist/core/rebase/changeRebaser.js.map +1 -1
  42. package/dist/core/rebase/index.d.ts +1 -1
  43. package/dist/core/rebase/index.d.ts.map +1 -1
  44. package/dist/core/rebase/index.js +1 -2
  45. package/dist/core/rebase/index.js.map +1 -1
  46. package/dist/core/rebase/types.d.ts +78 -1
  47. package/dist/core/rebase/types.d.ts.map +1 -1
  48. package/dist/core/rebase/types.js +1 -5
  49. package/dist/core/rebase/types.js.map +1 -1
  50. package/dist/core/rebase/utils.d.ts.map +1 -1
  51. package/dist/core/rebase/utils.js +7 -25
  52. package/dist/core/rebase/utils.js.map +1 -1
  53. package/dist/core/tree/delta.d.ts +0 -5
  54. package/dist/core/tree/delta.d.ts.map +1 -1
  55. package/dist/core/tree/delta.js.map +1 -1
  56. package/dist/core/tree/detachedFieldIndex.d.ts +1 -13
  57. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  58. package/dist/core/tree/detachedFieldIndex.js +1 -14
  59. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  60. package/dist/core/tree/detachedFieldIndexTypes.d.ts +0 -4
  61. package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  62. package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
  63. package/dist/core/tree/index.d.ts +2 -2
  64. package/dist/core/tree/index.d.ts.map +1 -1
  65. package/dist/core/tree/index.js +3 -4
  66. package/dist/core/tree/index.js.map +1 -1
  67. package/dist/core/tree/pathTree.d.ts +3 -11
  68. package/dist/core/tree/pathTree.d.ts.map +1 -1
  69. package/dist/core/tree/pathTree.js +2 -14
  70. package/dist/core/tree/pathTree.js.map +1 -1
  71. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  72. package/dist/core/tree/visitDelta.js +13 -17
  73. package/dist/core/tree/visitDelta.js.map +1 -1
  74. package/dist/feature-libraries/changeAtomIdBTree.d.ts +2 -3
  75. package/dist/feature-libraries/changeAtomIdBTree.d.ts.map +1 -1
  76. package/dist/feature-libraries/changeAtomIdBTree.js +2 -15
  77. package/dist/feature-libraries/changeAtomIdBTree.js.map +1 -1
  78. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +8 -7
  79. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  80. package/dist/feature-libraries/chunked-forest/codec/codecs.js +22 -44
  81. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  82. package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  83. package/dist/feature-libraries/chunked-forest/codec/format.js +11 -0
  84. package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  85. package/dist/feature-libraries/chunked-forest/codec/index.d.ts +3 -2
  86. package/dist/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
  87. package/dist/feature-libraries/chunked-forest/codec/index.js +2 -4
  88. package/dist/feature-libraries/chunked-forest/codec/index.js.map +1 -1
  89. package/dist/feature-libraries/chunked-forest/index.d.ts +1 -1
  90. package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  91. package/dist/feature-libraries/chunked-forest/index.js +2 -4
  92. package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
  93. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +44 -92
  94. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  95. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +70 -220
  96. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  97. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  98. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +2 -12
  99. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  100. package/dist/feature-libraries/default-schema/index.d.ts +1 -2
  101. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  102. package/dist/feature-libraries/default-schema/index.js +2 -4
  103. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  104. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts +6 -7
  105. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  106. package/dist/feature-libraries/default-schema/mappedEditBuilder.js +0 -15
  107. package/dist/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  108. package/dist/feature-libraries/deltaUtils.d.ts +0 -1
  109. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  110. package/dist/feature-libraries/deltaUtils.js +1 -6
  111. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  112. package/dist/feature-libraries/flex-tree/context.d.ts +0 -9
  113. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  114. package/dist/feature-libraries/flex-tree/context.js +0 -6
  115. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  116. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  117. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  118. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  119. package/dist/feature-libraries/flex-tree/lazyField.d.ts +7 -8
  120. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  121. package/dist/feature-libraries/flex-tree/lazyField.js +8 -39
  122. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  123. package/dist/feature-libraries/flex-tree/observer.d.ts +17 -0
  124. package/dist/feature-libraries/flex-tree/observer.d.ts.map +1 -1
  125. package/dist/feature-libraries/flex-tree/observer.js.map +1 -1
  126. package/dist/feature-libraries/forest-summary/codec.d.ts +5 -12
  127. package/dist/feature-libraries/forest-summary/codec.d.ts.map +1 -1
  128. package/dist/feature-libraries/forest-summary/codec.js +33 -33
  129. package/dist/feature-libraries/forest-summary/codec.js.map +1 -1
  130. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -2
  131. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  132. package/dist/feature-libraries/forest-summary/forestSummarizer.js +6 -7
  133. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  134. package/dist/feature-libraries/forest-summary/formatCommon.d.ts +6 -4
  135. package/dist/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -1
  136. package/dist/feature-libraries/forest-summary/formatCommon.js +13 -11
  137. package/dist/feature-libraries/forest-summary/formatCommon.js.map +1 -1
  138. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +19 -14
  139. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  140. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +31 -48
  141. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  142. package/dist/feature-libraries/forest-summary/index.d.ts +1 -1
  143. package/dist/feature-libraries/forest-summary/index.d.ts.map +1 -1
  144. package/dist/feature-libraries/forest-summary/index.js +2 -2
  145. package/dist/feature-libraries/forest-summary/index.js.map +1 -1
  146. package/dist/feature-libraries/index.d.ts +6 -6
  147. package/dist/feature-libraries/index.d.ts.map +1 -1
  148. package/dist/feature-libraries/index.js +6 -11
  149. package/dist/feature-libraries/index.js.map +1 -1
  150. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts +3 -3
  151. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  152. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  153. package/dist/feature-libraries/indexing/index.d.ts +1 -1
  154. package/dist/feature-libraries/indexing/index.d.ts.map +1 -1
  155. package/dist/feature-libraries/indexing/index.js.map +1 -1
  156. package/dist/feature-libraries/indexing/types.d.ts +15 -13
  157. package/dist/feature-libraries/indexing/types.d.ts.map +1 -1
  158. package/dist/feature-libraries/indexing/types.js.map +1 -1
  159. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  160. package/dist/feature-libraries/mitigatedChangeFamily.js +2 -2
  161. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  162. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +24 -100
  163. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  164. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +12 -8
  165. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  166. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +51 -85
  167. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  168. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  169. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  170. package/dist/feature-libraries/modular-schema/genericFieldKind.js +9 -4
  171. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  172. package/dist/feature-libraries/modular-schema/index.d.ts +3 -3
  173. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  174. package/dist/feature-libraries/modular-schema/index.js +3 -2
  175. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  176. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +22 -18
  177. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  178. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +158 -276
  179. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  180. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  181. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js +1 -1
  182. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  183. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +0 -1
  184. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  185. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +0 -8
  186. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  187. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +22 -56
  188. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  189. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +462 -1390
  190. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  191. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  192. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  193. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +2 -1
  194. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  195. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +3 -3
  196. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  197. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +10 -49
  198. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  199. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +3 -3
  200. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  201. package/dist/feature-libraries/optional-field/optionalField.d.ts +32 -13
  202. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  203. package/dist/feature-libraries/optional-field/optionalField.js +446 -257
  204. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  205. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +31 -31
  206. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  207. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  208. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  209. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  210. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js +28 -57
  211. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  212. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  213. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +1 -5
  214. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  215. package/dist/feature-libraries/optional-field/requiredField.d.ts +2 -3
  216. package/dist/feature-libraries/optional-field/requiredField.d.ts.map +1 -1
  217. package/dist/feature-libraries/optional-field/requiredField.js +1 -6
  218. package/dist/feature-libraries/optional-field/requiredField.js.map +1 -1
  219. package/dist/feature-libraries/sequence-field/compose.d.ts +7 -6
  220. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  221. package/dist/feature-libraries/sequence-field/compose.js +259 -81
  222. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  223. package/dist/feature-libraries/sequence-field/helperTypes.d.ts +10 -14
  224. package/dist/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  225. package/dist/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  226. package/dist/feature-libraries/sequence-field/invert.d.ts +3 -3
  227. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  228. package/dist/feature-libraries/sequence-field/invert.js +167 -65
  229. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  230. package/dist/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  231. package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  232. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  233. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +56 -4
  234. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  235. package/dist/feature-libraries/sequence-field/moveEffectTable.js +90 -7
  236. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  237. package/dist/feature-libraries/sequence-field/rebase.d.ts +3 -3
  238. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  239. package/dist/feature-libraries/sequence-field/rebase.js +116 -109
  240. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  241. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +9 -0
  242. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +1 -0
  243. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js +50 -0
  244. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js.map +1 -0
  245. package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  246. package/dist/feature-libraries/sequence-field/replaceRevisions.js +32 -19
  247. package/dist/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  248. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  249. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +2 -1
  250. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  251. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +4 -22
  252. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  253. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +187 -388
  254. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  255. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  256. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js +62 -20
  257. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  258. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  259. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  260. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +13 -13
  261. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  262. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  263. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  264. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +111 -16
  265. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  266. package/dist/feature-libraries/sequence-field/types.d.ts +74 -37
  267. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  268. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  269. package/dist/feature-libraries/sequence-field/utils.d.ts +25 -20
  270. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  271. package/dist/feature-libraries/sequence-field/utils.js +320 -159
  272. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  273. package/dist/index.d.ts +3 -3
  274. package/dist/index.d.ts.map +1 -1
  275. package/dist/index.js +2 -2
  276. package/dist/index.js.map +1 -1
  277. package/dist/legacy.d.ts +4 -1
  278. package/dist/packageVersion.d.ts +1 -1
  279. package/dist/packageVersion.d.ts.map +1 -1
  280. package/dist/packageVersion.js +1 -1
  281. package/dist/packageVersion.js.map +1 -1
  282. package/dist/shared-tree/independentView.d.ts.map +1 -1
  283. package/dist/shared-tree/independentView.js +3 -3
  284. package/dist/shared-tree/independentView.js.map +1 -1
  285. package/dist/shared-tree/index.d.ts +1 -1
  286. package/dist/shared-tree/index.d.ts.map +1 -1
  287. package/dist/shared-tree/index.js.map +1 -1
  288. package/dist/shared-tree/schematizeTree.d.ts +4 -4
  289. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  290. package/dist/shared-tree/schematizeTree.js +1 -2
  291. package/dist/shared-tree/schematizeTree.js.map +1 -1
  292. package/dist/shared-tree/schematizingTreeView.d.ts +10 -1
  293. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  294. package/dist/shared-tree/schematizingTreeView.js +70 -28
  295. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  296. package/dist/shared-tree/sharedTree.d.ts +3 -9
  297. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  298. package/dist/shared-tree/sharedTree.js +8 -11
  299. package/dist/shared-tree/sharedTree.js.map +1 -1
  300. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +0 -1
  301. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  302. package/dist/shared-tree/sharedTreeChangeCodecs.js +0 -8
  303. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  304. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +4 -4
  305. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  306. package/dist/shared-tree/sharedTreeChangeFamily.js +2 -2
  307. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  308. package/dist/shared-tree/sharedTreeEditBuilder.d.ts +6 -16
  309. package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  310. package/dist/shared-tree/sharedTreeEditBuilder.js +7 -14
  311. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  312. package/dist/shared-tree/tree.js +1 -1
  313. package/dist/shared-tree/tree.js.map +1 -1
  314. package/dist/shared-tree/treeAlpha.d.ts +8 -1
  315. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  316. package/dist/shared-tree/treeAlpha.js +48 -8
  317. package/dist/shared-tree/treeAlpha.js.map +1 -1
  318. package/dist/shared-tree/treeCheckout.d.ts +46 -16
  319. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  320. package/dist/shared-tree/treeCheckout.js +129 -73
  321. package/dist/shared-tree/treeCheckout.js.map +1 -1
  322. package/dist/shared-tree/unhydratedTreeContext.d.ts +20 -0
  323. package/dist/shared-tree/unhydratedTreeContext.d.ts.map +1 -0
  324. package/dist/shared-tree/unhydratedTreeContext.js +56 -0
  325. package/dist/shared-tree/unhydratedTreeContext.js.map +1 -0
  326. package/dist/shared-tree-core/branch.d.ts +2 -3
  327. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  328. package/dist/shared-tree-core/branch.js +3 -4
  329. package/dist/shared-tree-core/branch.js.map +1 -1
  330. package/dist/shared-tree-core/editManager.d.ts +2 -2
  331. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  332. package/dist/shared-tree-core/editManager.js +9 -9
  333. package/dist/shared-tree-core/editManager.js.map +1 -1
  334. package/dist/shared-tree-core/editManagerCodecs.d.ts +0 -4
  335. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  336. package/dist/shared-tree-core/editManagerCodecs.js +2 -10
  337. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  338. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +0 -1
  339. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  340. package/dist/shared-tree-core/editManagerFormatCommons.js +0 -6
  341. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  342. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  343. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  344. package/dist/shared-tree-core/editManagerFormatV1toV4.js +0 -1
  345. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  346. package/dist/shared-tree-core/index.d.ts +2 -2
  347. package/dist/shared-tree-core/index.d.ts.map +1 -1
  348. package/dist/shared-tree-core/index.js +1 -3
  349. package/dist/shared-tree-core/index.js.map +1 -1
  350. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  351. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  352. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  353. package/dist/shared-tree-core/messageCodecs.d.ts +0 -4
  354. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  355. package/dist/shared-tree-core/messageCodecs.js +2 -10
  356. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  357. package/dist/shared-tree-core/messageFormat.d.ts +0 -1
  358. package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
  359. package/dist/shared-tree-core/messageFormat.js +0 -6
  360. package/dist/shared-tree-core/messageFormat.js.map +1 -1
  361. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
  362. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  363. package/dist/shared-tree-core/messageFormatV1ToV4.js +0 -1
  364. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  365. package/dist/shared-tree-core/sharedTreeCore.d.ts +0 -1
  366. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  367. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  368. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  369. package/dist/shared-tree-core/transaction.d.ts +15 -27
  370. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  371. package/dist/shared-tree-core/transaction.js +7 -11
  372. package/dist/shared-tree-core/transaction.js.map +1 -1
  373. package/dist/simple-tree/api/configuration.d.ts +4 -0
  374. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  375. package/dist/simple-tree/api/configuration.js.map +1 -1
  376. package/dist/simple-tree/api/identifierIndex.d.ts +2 -2
  377. package/dist/simple-tree/api/identifierIndex.d.ts.map +1 -1
  378. package/dist/simple-tree/api/identifierIndex.js +1 -1
  379. package/dist/simple-tree/api/identifierIndex.js.map +1 -1
  380. package/dist/simple-tree/api/index.d.ts +3 -3
  381. package/dist/simple-tree/api/index.d.ts.map +1 -1
  382. package/dist/simple-tree/api/index.js +2 -2
  383. package/dist/simple-tree/api/index.js.map +1 -1
  384. package/dist/simple-tree/api/schemaFactory.d.ts +3 -2
  385. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  386. package/dist/simple-tree/api/schemaFactory.js +3 -2
  387. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  388. package/dist/simple-tree/api/simpleTreeIndex.d.ts +15 -13
  389. package/dist/simple-tree/api/simpleTreeIndex.d.ts.map +1 -1
  390. package/dist/simple-tree/api/simpleTreeIndex.js +4 -4
  391. package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
  392. package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts +4 -4
  393. package/dist/simple-tree/api/snapshotCompatibilityChecker.js +2 -2
  394. package/dist/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  395. package/dist/simple-tree/api/transactionTypes.d.ts +22 -25
  396. package/dist/simple-tree/api/transactionTypes.d.ts.map +1 -1
  397. package/dist/simple-tree/api/transactionTypes.js.map +1 -1
  398. package/dist/simple-tree/api/tree.d.ts +69 -132
  399. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  400. package/dist/simple-tree/api/tree.js.map +1 -1
  401. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +12 -16
  402. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  403. package/dist/simple-tree/core/unhydratedFlexTree.js +8 -59
  404. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  405. package/dist/simple-tree/fieldSchema.d.ts +4 -4
  406. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  407. package/dist/simple-tree/fieldSchema.js.map +1 -1
  408. package/dist/simple-tree/index.d.ts +3 -3
  409. package/dist/simple-tree/index.d.ts.map +1 -1
  410. package/dist/simple-tree/index.js +3 -3
  411. package/dist/simple-tree/index.js.map +1 -1
  412. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  413. package/dist/simple-tree/node-kinds/array/arrayNode.js +3 -5
  414. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  415. package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
  416. package/dist/simple-tree/node-kinds/common.js +1 -1
  417. package/dist/simple-tree/node-kinds/common.js.map +1 -1
  418. package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
  419. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  420. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  421. package/dist/simple-tree/node-kinds/object/objectNode.js +19 -19
  422. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  423. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  424. package/dist/simple-tree/node-kinds/record/recordNode.js +2 -4
  425. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  426. package/dist/simple-tree/prepareForInsertion.d.ts +47 -54
  427. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  428. package/dist/simple-tree/prepareForInsertion.js +125 -183
  429. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  430. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +3 -8
  431. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  432. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +13 -27
  433. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  434. package/dist/text/textDomain.d.ts +27 -9
  435. package/dist/text/textDomain.d.ts.map +1 -1
  436. package/dist/text/textDomain.js +43 -7
  437. package/dist/text/textDomain.js.map +1 -1
  438. package/dist/text/textDomainFormatted.d.ts +14 -8
  439. package/dist/text/textDomainFormatted.d.ts.map +1 -1
  440. package/dist/text/textDomainFormatted.js +97 -25
  441. package/dist/text/textDomainFormatted.js.map +1 -1
  442. package/dist/treeFactory.d.ts.map +1 -1
  443. package/dist/treeFactory.js +2 -12
  444. package/dist/treeFactory.js.map +1 -1
  445. package/dist/util/index.d.ts +1 -1
  446. package/dist/util/index.d.ts.map +1 -1
  447. package/dist/util/index.js +1 -2
  448. package/dist/util/index.js.map +1 -1
  449. package/dist/util/rangeMap.d.ts +11 -22
  450. package/dist/util/rangeMap.d.ts.map +1 -1
  451. package/dist/util/rangeMap.js +4 -38
  452. package/dist/util/rangeMap.js.map +1 -1
  453. package/docs/main/sequence-field/move-composition.md +46 -0
  454. package/lib/alpha.d.ts +10 -6
  455. package/lib/beta.d.ts +4 -1
  456. package/lib/codec/codec.d.ts +2 -0
  457. package/lib/codec/codec.d.ts.map +1 -1
  458. package/lib/codec/codec.js +4 -3
  459. package/lib/codec/codec.js.map +1 -1
  460. package/lib/codec/index.d.ts +1 -1
  461. package/lib/codec/index.d.ts.map +1 -1
  462. package/lib/codec/index.js +1 -1
  463. package/lib/codec/index.js.map +1 -1
  464. package/lib/codec/versioned/codec.d.ts +13 -1
  465. package/lib/codec/versioned/codec.d.ts.map +1 -1
  466. package/lib/codec/versioned/codec.js +18 -3
  467. package/lib/codec/versioned/codec.js.map +1 -1
  468. package/lib/codec/versioned/format.d.ts +22 -1
  469. package/lib/codec/versioned/format.d.ts.map +1 -1
  470. package/lib/codec/versioned/format.js +15 -2
  471. package/lib/codec/versioned/format.js.map +1 -1
  472. package/lib/codec/versioned/index.d.ts +1 -1
  473. package/lib/codec/versioned/index.d.ts.map +1 -1
  474. package/lib/codec/versioned/index.js +1 -1
  475. package/lib/codec/versioned/index.js.map +1 -1
  476. package/lib/core/change-family/changeFamily.d.ts +1 -4
  477. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  478. package/lib/core/change-family/changeFamily.js.map +1 -1
  479. package/lib/core/change-family/index.d.ts +1 -1
  480. package/lib/core/change-family/index.d.ts.map +1 -1
  481. package/lib/core/change-family/index.js.map +1 -1
  482. package/lib/core/index.d.ts +3 -4
  483. package/lib/core/index.d.ts.map +1 -1
  484. package/lib/core/index.js +2 -3
  485. package/lib/core/index.js.map +1 -1
  486. package/lib/core/rebase/changeRebaser.d.ts +1 -6
  487. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  488. package/lib/core/rebase/changeRebaser.js.map +1 -1
  489. package/lib/core/rebase/index.d.ts +1 -1
  490. package/lib/core/rebase/index.d.ts.map +1 -1
  491. package/lib/core/rebase/index.js +1 -1
  492. package/lib/core/rebase/index.js.map +1 -1
  493. package/lib/core/rebase/types.d.ts +78 -1
  494. package/lib/core/rebase/types.d.ts.map +1 -1
  495. package/lib/core/rebase/types.js +0 -3
  496. package/lib/core/rebase/types.js.map +1 -1
  497. package/lib/core/rebase/utils.d.ts.map +1 -1
  498. package/lib/core/rebase/utils.js +7 -25
  499. package/lib/core/rebase/utils.js.map +1 -1
  500. package/lib/core/tree/delta.d.ts +0 -5
  501. package/lib/core/tree/delta.d.ts.map +1 -1
  502. package/lib/core/tree/delta.js.map +1 -1
  503. package/lib/core/tree/detachedFieldIndex.d.ts +1 -13
  504. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  505. package/lib/core/tree/detachedFieldIndex.js +2 -15
  506. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  507. package/lib/core/tree/detachedFieldIndexTypes.d.ts +0 -4
  508. package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  509. package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
  510. package/lib/core/tree/index.d.ts +2 -2
  511. package/lib/core/tree/index.d.ts.map +1 -1
  512. package/lib/core/tree/index.js +1 -1
  513. package/lib/core/tree/index.js.map +1 -1
  514. package/lib/core/tree/pathTree.d.ts +3 -11
  515. package/lib/core/tree/pathTree.d.ts.map +1 -1
  516. package/lib/core/tree/pathTree.js +1 -12
  517. package/lib/core/tree/pathTree.js.map +1 -1
  518. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  519. package/lib/core/tree/visitDelta.js +13 -17
  520. package/lib/core/tree/visitDelta.js.map +1 -1
  521. package/lib/feature-libraries/changeAtomIdBTree.d.ts +2 -3
  522. package/lib/feature-libraries/changeAtomIdBTree.d.ts.map +1 -1
  523. package/lib/feature-libraries/changeAtomIdBTree.js +3 -15
  524. package/lib/feature-libraries/changeAtomIdBTree.js.map +1 -1
  525. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +8 -7
  526. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  527. package/lib/feature-libraries/chunked-forest/codec/codecs.js +25 -45
  528. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  529. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  530. package/lib/feature-libraries/chunked-forest/codec/format.js +11 -0
  531. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  532. package/lib/feature-libraries/chunked-forest/codec/index.d.ts +3 -2
  533. package/lib/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
  534. package/lib/feature-libraries/chunked-forest/codec/index.js +2 -2
  535. package/lib/feature-libraries/chunked-forest/codec/index.js.map +1 -1
  536. package/lib/feature-libraries/chunked-forest/index.d.ts +1 -1
  537. package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  538. package/lib/feature-libraries/chunked-forest/index.js +1 -1
  539. package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
  540. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +44 -92
  541. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  542. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +69 -217
  543. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  544. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  545. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +2 -12
  546. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  547. package/lib/feature-libraries/default-schema/index.d.ts +1 -2
  548. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  549. package/lib/feature-libraries/default-schema/index.js +1 -2
  550. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  551. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts +6 -7
  552. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  553. package/lib/feature-libraries/default-schema/mappedEditBuilder.js +0 -15
  554. package/lib/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  555. package/lib/feature-libraries/deltaUtils.d.ts +0 -1
  556. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  557. package/lib/feature-libraries/deltaUtils.js +1 -5
  558. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  559. package/lib/feature-libraries/flex-tree/context.d.ts +0 -9
  560. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  561. package/lib/feature-libraries/flex-tree/context.js +0 -6
  562. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  563. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  564. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  565. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  566. package/lib/feature-libraries/flex-tree/lazyField.d.ts +7 -8
  567. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  568. package/lib/feature-libraries/flex-tree/lazyField.js +9 -40
  569. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  570. package/lib/feature-libraries/flex-tree/observer.d.ts +17 -0
  571. package/lib/feature-libraries/flex-tree/observer.d.ts.map +1 -1
  572. package/lib/feature-libraries/flex-tree/observer.js.map +1 -1
  573. package/lib/feature-libraries/forest-summary/codec.d.ts +5 -12
  574. package/lib/feature-libraries/forest-summary/codec.d.ts.map +1 -1
  575. package/lib/feature-libraries/forest-summary/codec.js +35 -32
  576. package/lib/feature-libraries/forest-summary/codec.js.map +1 -1
  577. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -2
  578. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  579. package/lib/feature-libraries/forest-summary/forestSummarizer.js +7 -8
  580. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  581. package/lib/feature-libraries/forest-summary/formatCommon.d.ts +6 -4
  582. package/lib/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -1
  583. package/lib/feature-libraries/forest-summary/formatCommon.js +7 -4
  584. package/lib/feature-libraries/forest-summary/formatCommon.js.map +1 -1
  585. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +19 -14
  586. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  587. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +30 -47
  588. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  589. package/lib/feature-libraries/forest-summary/index.d.ts +1 -1
  590. package/lib/feature-libraries/forest-summary/index.d.ts.map +1 -1
  591. package/lib/feature-libraries/forest-summary/index.js +1 -1
  592. package/lib/feature-libraries/forest-summary/index.js.map +1 -1
  593. package/lib/feature-libraries/index.d.ts +6 -6
  594. package/lib/feature-libraries/index.d.ts.map +1 -1
  595. package/lib/feature-libraries/index.js +5 -5
  596. package/lib/feature-libraries/index.js.map +1 -1
  597. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts +3 -3
  598. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  599. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  600. package/lib/feature-libraries/indexing/index.d.ts +1 -1
  601. package/lib/feature-libraries/indexing/index.d.ts.map +1 -1
  602. package/lib/feature-libraries/indexing/index.js.map +1 -1
  603. package/lib/feature-libraries/indexing/types.d.ts +15 -13
  604. package/lib/feature-libraries/indexing/types.d.ts.map +1 -1
  605. package/lib/feature-libraries/indexing/types.js.map +1 -1
  606. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  607. package/lib/feature-libraries/mitigatedChangeFamily.js +2 -2
  608. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  609. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +24 -100
  610. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  611. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +10 -7
  612. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  613. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +51 -85
  614. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  615. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  616. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  617. package/lib/feature-libraries/modular-schema/genericFieldKind.js +9 -4
  618. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  619. package/lib/feature-libraries/modular-schema/index.d.ts +3 -3
  620. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  621. package/lib/feature-libraries/modular-schema/index.js +1 -1
  622. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  623. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +22 -18
  624. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  625. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +144 -267
  626. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  627. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  628. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js +1 -1
  629. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  630. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +0 -1
  631. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  632. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +0 -8
  633. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  634. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +22 -56
  635. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  636. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +468 -1387
  637. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  638. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  639. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  640. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +2 -1
  641. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  642. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +1 -1
  643. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  644. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +10 -49
  645. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  646. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +1 -1
  647. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  648. package/lib/feature-libraries/optional-field/optionalField.d.ts +32 -13
  649. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  650. package/lib/feature-libraries/optional-field/optionalField.js +442 -254
  651. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  652. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +31 -31
  653. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  654. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  655. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  656. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  657. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js +26 -55
  658. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  659. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  660. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +1 -5
  661. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  662. package/lib/feature-libraries/optional-field/requiredField.d.ts +2 -3
  663. package/lib/feature-libraries/optional-field/requiredField.d.ts.map +1 -1
  664. package/lib/feature-libraries/optional-field/requiredField.js +1 -5
  665. package/lib/feature-libraries/optional-field/requiredField.js.map +1 -1
  666. package/lib/feature-libraries/sequence-field/compose.d.ts +7 -6
  667. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  668. package/lib/feature-libraries/sequence-field/compose.js +261 -83
  669. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  670. package/lib/feature-libraries/sequence-field/helperTypes.d.ts +10 -14
  671. package/lib/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  672. package/lib/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  673. package/lib/feature-libraries/sequence-field/invert.d.ts +3 -3
  674. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  675. package/lib/feature-libraries/sequence-field/invert.js +169 -67
  676. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  677. package/lib/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  678. package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  679. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  680. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +56 -4
  681. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  682. package/lib/feature-libraries/sequence-field/moveEffectTable.js +84 -6
  683. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  684. package/lib/feature-libraries/sequence-field/rebase.d.ts +3 -3
  685. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  686. package/lib/feature-libraries/sequence-field/rebase.js +118 -111
  687. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  688. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +9 -0
  689. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +1 -0
  690. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js +46 -0
  691. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js.map +1 -0
  692. package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  693. package/lib/feature-libraries/sequence-field/replaceRevisions.js +32 -19
  694. package/lib/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  695. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  696. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +3 -2
  697. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  698. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +4 -22
  699. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  700. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +182 -379
  701. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  702. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  703. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js +63 -21
  704. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  705. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  706. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  707. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +13 -13
  708. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  709. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  710. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  711. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +111 -16
  712. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  713. package/lib/feature-libraries/sequence-field/types.d.ts +74 -37
  714. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  715. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  716. package/lib/feature-libraries/sequence-field/utils.d.ts +25 -20
  717. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  718. package/lib/feature-libraries/sequence-field/utils.js +313 -155
  719. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  720. package/lib/index.d.ts +3 -3
  721. package/lib/index.d.ts.map +1 -1
  722. package/lib/index.js +1 -1
  723. package/lib/index.js.map +1 -1
  724. package/lib/legacy.d.ts +4 -1
  725. package/lib/packageVersion.d.ts +1 -1
  726. package/lib/packageVersion.d.ts.map +1 -1
  727. package/lib/packageVersion.js +1 -1
  728. package/lib/packageVersion.js.map +1 -1
  729. package/lib/shared-tree/independentView.d.ts.map +1 -1
  730. package/lib/shared-tree/independentView.js +4 -4
  731. package/lib/shared-tree/independentView.js.map +1 -1
  732. package/lib/shared-tree/index.d.ts +1 -1
  733. package/lib/shared-tree/index.d.ts.map +1 -1
  734. package/lib/shared-tree/index.js.map +1 -1
  735. package/lib/shared-tree/schematizeTree.d.ts +4 -4
  736. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  737. package/lib/shared-tree/schematizeTree.js +2 -3
  738. package/lib/shared-tree/schematizeTree.js.map +1 -1
  739. package/lib/shared-tree/schematizingTreeView.d.ts +10 -1
  740. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  741. package/lib/shared-tree/schematizingTreeView.js +71 -30
  742. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  743. package/lib/shared-tree/sharedTree.d.ts +3 -9
  744. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  745. package/lib/shared-tree/sharedTree.js +9 -12
  746. package/lib/shared-tree/sharedTree.js.map +1 -1
  747. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +0 -1
  748. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  749. package/lib/shared-tree/sharedTreeChangeCodecs.js +0 -8
  750. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  751. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +4 -4
  752. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  753. package/lib/shared-tree/sharedTreeChangeFamily.js +3 -3
  754. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  755. package/lib/shared-tree/sharedTreeEditBuilder.d.ts +6 -16
  756. package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  757. package/lib/shared-tree/sharedTreeEditBuilder.js +6 -12
  758. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  759. package/lib/shared-tree/tree.js +1 -1
  760. package/lib/shared-tree/tree.js.map +1 -1
  761. package/lib/shared-tree/treeAlpha.d.ts +8 -1
  762. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  763. package/lib/shared-tree/treeAlpha.js +49 -9
  764. package/lib/shared-tree/treeAlpha.js.map +1 -1
  765. package/lib/shared-tree/treeCheckout.d.ts +46 -16
  766. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  767. package/lib/shared-tree/treeCheckout.js +132 -76
  768. package/lib/shared-tree/treeCheckout.js.map +1 -1
  769. package/lib/shared-tree/unhydratedTreeContext.d.ts +20 -0
  770. package/lib/shared-tree/unhydratedTreeContext.d.ts.map +1 -0
  771. package/lib/shared-tree/unhydratedTreeContext.js +52 -0
  772. package/lib/shared-tree/unhydratedTreeContext.js.map +1 -0
  773. package/lib/shared-tree-core/branch.d.ts +2 -3
  774. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  775. package/lib/shared-tree-core/branch.js +3 -4
  776. package/lib/shared-tree-core/branch.js.map +1 -1
  777. package/lib/shared-tree-core/editManager.d.ts +2 -2
  778. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  779. package/lib/shared-tree-core/editManager.js +9 -9
  780. package/lib/shared-tree-core/editManager.js.map +1 -1
  781. package/lib/shared-tree-core/editManagerCodecs.d.ts +0 -4
  782. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  783. package/lib/shared-tree-core/editManagerCodecs.js +1 -8
  784. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  785. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +0 -1
  786. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  787. package/lib/shared-tree-core/editManagerFormatCommons.js +0 -6
  788. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  789. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  790. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  791. package/lib/shared-tree-core/editManagerFormatV1toV4.js +0 -1
  792. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  793. package/lib/shared-tree-core/index.d.ts +2 -2
  794. package/lib/shared-tree-core/index.d.ts.map +1 -1
  795. package/lib/shared-tree-core/index.js +2 -2
  796. package/lib/shared-tree-core/index.js.map +1 -1
  797. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  798. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  799. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  800. package/lib/shared-tree-core/messageCodecs.d.ts +0 -4
  801. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  802. package/lib/shared-tree-core/messageCodecs.js +1 -8
  803. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  804. package/lib/shared-tree-core/messageFormat.d.ts +0 -1
  805. package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
  806. package/lib/shared-tree-core/messageFormat.js +0 -6
  807. package/lib/shared-tree-core/messageFormat.js.map +1 -1
  808. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
  809. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  810. package/lib/shared-tree-core/messageFormatV1ToV4.js +0 -1
  811. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  812. package/lib/shared-tree-core/sharedTreeCore.d.ts +0 -1
  813. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  814. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  815. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  816. package/lib/shared-tree-core/transaction.d.ts +15 -27
  817. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  818. package/lib/shared-tree-core/transaction.js +7 -11
  819. package/lib/shared-tree-core/transaction.js.map +1 -1
  820. package/lib/simple-tree/api/configuration.d.ts +4 -0
  821. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  822. package/lib/simple-tree/api/configuration.js.map +1 -1
  823. package/lib/simple-tree/api/identifierIndex.d.ts +2 -2
  824. package/lib/simple-tree/api/identifierIndex.d.ts.map +1 -1
  825. package/lib/simple-tree/api/identifierIndex.js +2 -2
  826. package/lib/simple-tree/api/identifierIndex.js.map +1 -1
  827. package/lib/simple-tree/api/index.d.ts +3 -3
  828. package/lib/simple-tree/api/index.d.ts.map +1 -1
  829. package/lib/simple-tree/api/index.js +1 -1
  830. package/lib/simple-tree/api/index.js.map +1 -1
  831. package/lib/simple-tree/api/schemaFactory.d.ts +3 -2
  832. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  833. package/lib/simple-tree/api/schemaFactory.js +3 -2
  834. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  835. package/lib/simple-tree/api/simpleTreeIndex.d.ts +15 -13
  836. package/lib/simple-tree/api/simpleTreeIndex.d.ts.map +1 -1
  837. package/lib/simple-tree/api/simpleTreeIndex.js +2 -2
  838. package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
  839. package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts +4 -4
  840. package/lib/simple-tree/api/snapshotCompatibilityChecker.js +2 -2
  841. package/lib/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  842. package/lib/simple-tree/api/transactionTypes.d.ts +22 -25
  843. package/lib/simple-tree/api/transactionTypes.d.ts.map +1 -1
  844. package/lib/simple-tree/api/transactionTypes.js.map +1 -1
  845. package/lib/simple-tree/api/tree.d.ts +69 -132
  846. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  847. package/lib/simple-tree/api/tree.js.map +1 -1
  848. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +12 -16
  849. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  850. package/lib/simple-tree/core/unhydratedFlexTree.js +8 -58
  851. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  852. package/lib/simple-tree/fieldSchema.d.ts +4 -4
  853. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  854. package/lib/simple-tree/fieldSchema.js.map +1 -1
  855. package/lib/simple-tree/index.d.ts +3 -3
  856. package/lib/simple-tree/index.d.ts.map +1 -1
  857. package/lib/simple-tree/index.js +2 -2
  858. package/lib/simple-tree/index.js.map +1 -1
  859. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  860. package/lib/simple-tree/node-kinds/array/arrayNode.js +4 -6
  861. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  862. package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
  863. package/lib/simple-tree/node-kinds/common.js +2 -2
  864. package/lib/simple-tree/node-kinds/common.js.map +1 -1
  865. package/lib/simple-tree/node-kinds/map/mapNode.js +2 -2
  866. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  867. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  868. package/lib/simple-tree/node-kinds/object/objectNode.js +20 -20
  869. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  870. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  871. package/lib/simple-tree/node-kinds/record/recordNode.js +2 -4
  872. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  873. package/lib/simple-tree/prepareForInsertion.d.ts +47 -54
  874. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  875. package/lib/simple-tree/prepareForInsertion.js +125 -184
  876. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  877. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +3 -8
  878. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  879. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +10 -23
  880. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  881. package/lib/text/textDomain.d.ts +27 -9
  882. package/lib/text/textDomain.d.ts.map +1 -1
  883. package/lib/text/textDomain.js +45 -9
  884. package/lib/text/textDomain.js.map +1 -1
  885. package/lib/text/textDomainFormatted.d.ts +14 -8
  886. package/lib/text/textDomainFormatted.d.ts.map +1 -1
  887. package/lib/text/textDomainFormatted.js +80 -8
  888. package/lib/text/textDomainFormatted.js.map +1 -1
  889. package/lib/treeFactory.d.ts.map +1 -1
  890. package/lib/treeFactory.js +3 -13
  891. package/lib/treeFactory.js.map +1 -1
  892. package/lib/util/index.d.ts +1 -1
  893. package/lib/util/index.d.ts.map +1 -1
  894. package/lib/util/index.js +1 -1
  895. package/lib/util/index.js.map +1 -1
  896. package/lib/util/rangeMap.d.ts +11 -22
  897. package/lib/util/rangeMap.d.ts.map +1 -1
  898. package/lib/util/rangeMap.js +3 -36
  899. package/lib/util/rangeMap.js.map +1 -1
  900. package/package.json +24 -24
  901. package/src/codec/codec.ts +5 -4
  902. package/src/codec/index.ts +1 -0
  903. package/src/codec/versioned/codec.ts +32 -6
  904. package/src/codec/versioned/format.ts +17 -2
  905. package/src/codec/versioned/index.ts +1 -1
  906. package/src/core/change-family/changeFamily.ts +0 -5
  907. package/src/core/change-family/index.ts +0 -1
  908. package/src/core/index.ts +3 -10
  909. package/src/core/rebase/changeRebaser.ts +1 -6
  910. package/src/core/rebase/index.ts +2 -1
  911. package/src/core/rebase/types.ts +80 -4
  912. package/src/core/rebase/utils.ts +7 -31
  913. package/src/core/tree/delta.ts +0 -6
  914. package/src/core/tree/detachedFieldIndex.ts +1 -29
  915. package/src/core/tree/detachedFieldIndexTypes.ts +0 -5
  916. package/src/core/tree/index.ts +12 -13
  917. package/src/core/tree/pathTree.ts +4 -16
  918. package/src/core/tree/visitDelta.ts +11 -31
  919. package/src/feature-libraries/changeAtomIdBTree.ts +3 -28
  920. package/src/feature-libraries/chunked-forest/codec/codecs.ts +59 -78
  921. package/src/feature-libraries/chunked-forest/codec/format.ts +11 -0
  922. package/src/feature-libraries/chunked-forest/codec/index.ts +3 -3
  923. package/src/feature-libraries/chunked-forest/index.ts +2 -3
  924. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +127 -369
  925. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +4 -13
  926. package/src/feature-libraries/default-schema/index.ts +5 -16
  927. package/src/feature-libraries/default-schema/mappedEditBuilder.ts +9 -35
  928. package/src/feature-libraries/deltaUtils.ts +1 -6
  929. package/src/feature-libraries/flex-tree/context.ts +0 -17
  930. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +8 -7
  931. package/src/feature-libraries/flex-tree/lazyField.ts +24 -65
  932. package/src/feature-libraries/flex-tree/observer.ts +17 -0
  933. package/src/feature-libraries/forest-summary/codec.ts +46 -56
  934. package/src/feature-libraries/forest-summary/forestSummarizer.ts +5 -14
  935. package/src/feature-libraries/forest-summary/formatCommon.ts +14 -19
  936. package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +44 -74
  937. package/src/feature-libraries/forest-summary/index.ts +1 -1
  938. package/src/feature-libraries/index.ts +11 -26
  939. package/src/feature-libraries/indexing/anchorTreeIndex.ts +3 -5
  940. package/src/feature-libraries/indexing/index.ts +1 -1
  941. package/src/feature-libraries/indexing/types.ts +15 -17
  942. package/src/feature-libraries/mitigatedChangeFamily.ts +1 -3
  943. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +47 -144
  944. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +58 -113
  945. package/src/feature-libraries/modular-schema/genericFieldKind.ts +18 -7
  946. package/src/feature-libraries/modular-schema/index.ts +16 -16
  947. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +329 -604
  948. package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +0 -1
  949. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +0 -14
  950. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +748 -2694
  951. package/src/feature-libraries/modular-schema/modularChangeFormatV1.ts +0 -1
  952. package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +1 -1
  953. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +10 -62
  954. package/src/feature-libraries/optional-field/optionalField.ts +568 -359
  955. package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +35 -31
  956. package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +35 -89
  957. package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +1 -5
  958. package/src/feature-libraries/optional-field/requiredField.ts +2 -15
  959. package/src/feature-libraries/sequence-field/compose.ts +522 -137
  960. package/src/feature-libraries/sequence-field/helperTypes.ts +19 -34
  961. package/src/feature-libraries/sequence-field/invert.ts +228 -102
  962. package/src/feature-libraries/sequence-field/markQueue.ts +2 -2
  963. package/src/feature-libraries/sequence-field/moveEffectTable.ts +195 -8
  964. package/src/feature-libraries/sequence-field/rebase.ts +207 -171
  965. package/src/feature-libraries/sequence-field/relevantRemovedRoots.ts +57 -0
  966. package/src/feature-libraries/sequence-field/replaceRevisions.ts +52 -26
  967. package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +3 -8
  968. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +229 -677
  969. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +70 -56
  970. package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +30 -28
  971. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +131 -21
  972. package/src/feature-libraries/sequence-field/types.ts +79 -40
  973. package/src/feature-libraries/sequence-field/utils.ts +370 -211
  974. package/src/index.ts +6 -3
  975. package/src/packageVersion.ts +1 -1
  976. package/src/shared-tree/independentView.ts +9 -15
  977. package/src/shared-tree/index.ts +2 -3
  978. package/src/shared-tree/schematizeTree.ts +8 -21
  979. package/src/shared-tree/schematizingTreeView.ts +111 -48
  980. package/src/shared-tree/sharedTree.ts +23 -40
  981. package/src/shared-tree/sharedTreeChangeCodecs.ts +0 -8
  982. package/src/shared-tree/sharedTreeChangeFamily.ts +4 -7
  983. package/src/shared-tree/sharedTreeEditBuilder.ts +8 -43
  984. package/src/shared-tree/tree.ts +1 -1
  985. package/src/shared-tree/treeAlpha.ts +64 -11
  986. package/src/shared-tree/treeCheckout.ts +159 -114
  987. package/src/shared-tree/unhydratedTreeContext.ts +87 -0
  988. package/src/shared-tree-core/branch.ts +2 -8
  989. package/src/shared-tree-core/editManager.ts +2 -16
  990. package/src/shared-tree-core/editManagerCodecs.ts +1 -11
  991. package/src/shared-tree-core/editManagerFormatCommons.ts +0 -6
  992. package/src/shared-tree-core/editManagerFormatV1toV4.ts +1 -3
  993. package/src/shared-tree-core/index.ts +0 -2
  994. package/src/shared-tree-core/messageCodecV1ToV4.ts +1 -2
  995. package/src/shared-tree-core/messageCodecs.ts +1 -11
  996. package/src/shared-tree-core/messageFormat.ts +0 -6
  997. package/src/shared-tree-core/messageFormatV1ToV4.ts +1 -3
  998. package/src/shared-tree-core/sharedTreeCore.ts +1 -4
  999. package/src/shared-tree-core/transaction.ts +19 -39
  1000. package/src/simple-tree/api/configuration.ts +4 -0
  1001. package/src/simple-tree/api/identifierIndex.ts +4 -4
  1002. package/src/simple-tree/api/index.ts +3 -1
  1003. package/src/simple-tree/api/schemaFactory.ts +3 -2
  1004. package/src/simple-tree/api/simpleTreeIndex.ts +26 -20
  1005. package/src/simple-tree/api/snapshotCompatibilityChecker.ts +4 -4
  1006. package/src/simple-tree/api/transactionTypes.ts +24 -26
  1007. package/src/simple-tree/api/tree.ts +92 -131
  1008. package/src/simple-tree/core/unhydratedFlexTree.ts +35 -82
  1009. package/src/simple-tree/fieldSchema.ts +4 -6
  1010. package/src/simple-tree/index.ts +5 -4
  1011. package/src/simple-tree/node-kinds/array/arrayNode.ts +5 -7
  1012. package/src/simple-tree/node-kinds/common.ts +5 -2
  1013. package/src/simple-tree/node-kinds/map/mapNode.ts +4 -4
  1014. package/src/simple-tree/node-kinds/object/objectNode.ts +26 -26
  1015. package/src/simple-tree/node-kinds/record/recordNode.ts +9 -10
  1016. package/src/simple-tree/prepareForInsertion.ts +200 -342
  1017. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +15 -35
  1018. package/src/text/textDomain.ts +91 -12
  1019. package/src/text/textDomainFormatted.ts +127 -15
  1020. package/src/treeFactory.ts +4 -16
  1021. package/src/util/index.ts +0 -3
  1022. package/src/util/rangeMap.ts +15 -63
  1023. package/dist/core/schema-view/index.d.ts +0 -6
  1024. package/dist/core/schema-view/index.d.ts.map +0 -1
  1025. package/dist/core/schema-view/index.js +0 -10
  1026. package/dist/core/schema-view/index.js.map +0 -1
  1027. package/dist/core/schema-view/view.d.ts +0 -31
  1028. package/dist/core/schema-view/view.d.ts.map +0 -1
  1029. package/dist/core/schema-view/view.js +0 -18
  1030. package/dist/core/schema-view/view.js.map +0 -1
  1031. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +0 -40
  1032. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +0 -1
  1033. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js +0 -153
  1034. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js.map +0 -1
  1035. package/dist/feature-libraries/forest-summary/formatV1.d.ts +0 -12
  1036. package/dist/feature-libraries/forest-summary/formatV1.d.ts.map +0 -1
  1037. package/dist/feature-libraries/forest-summary/formatV1.js +0 -10
  1038. package/dist/feature-libraries/forest-summary/formatV1.js.map +0 -1
  1039. package/dist/feature-libraries/forest-summary/formatV2.d.ts +0 -12
  1040. package/dist/feature-libraries/forest-summary/formatV2.d.ts.map +0 -1
  1041. package/dist/feature-libraries/forest-summary/formatV2.js +0 -10
  1042. package/dist/feature-libraries/forest-summary/formatV2.js.map +0 -1
  1043. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.d.ts +0 -15
  1044. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.d.ts.map +0 -1
  1045. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.js +0 -296
  1046. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.js.map +0 -1
  1047. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.d.ts +0 -74
  1048. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.d.ts.map +0 -1
  1049. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.js +0 -35
  1050. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.js.map +0 -1
  1051. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +0 -23
  1052. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +0 -1
  1053. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +0 -31
  1054. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +0 -1
  1055. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +0 -12
  1056. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +0 -1
  1057. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +0 -57
  1058. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +0 -1
  1059. package/lib/core/schema-view/index.d.ts +0 -6
  1060. package/lib/core/schema-view/index.d.ts.map +0 -1
  1061. package/lib/core/schema-view/index.js +0 -6
  1062. package/lib/core/schema-view/index.js.map +0 -1
  1063. package/lib/core/schema-view/view.d.ts +0 -31
  1064. package/lib/core/schema-view/view.d.ts.map +0 -1
  1065. package/lib/core/schema-view/view.js +0 -14
  1066. package/lib/core/schema-view/view.js.map +0 -1
  1067. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +0 -40
  1068. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +0 -1
  1069. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js +0 -149
  1070. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js.map +0 -1
  1071. package/lib/feature-libraries/forest-summary/formatV1.d.ts +0 -12
  1072. package/lib/feature-libraries/forest-summary/formatV1.d.ts.map +0 -1
  1073. package/lib/feature-libraries/forest-summary/formatV1.js +0 -7
  1074. package/lib/feature-libraries/forest-summary/formatV1.js.map +0 -1
  1075. package/lib/feature-libraries/forest-summary/formatV2.d.ts +0 -12
  1076. package/lib/feature-libraries/forest-summary/formatV2.d.ts.map +0 -1
  1077. package/lib/feature-libraries/forest-summary/formatV2.js +0 -7
  1078. package/lib/feature-libraries/forest-summary/formatV2.js.map +0 -1
  1079. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.d.ts +0 -15
  1080. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.d.ts.map +0 -1
  1081. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.js +0 -292
  1082. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.js.map +0 -1
  1083. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.d.ts +0 -74
  1084. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.d.ts.map +0 -1
  1085. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.js +0 -32
  1086. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.js.map +0 -1
  1087. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +0 -23
  1088. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +0 -1
  1089. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +0 -27
  1090. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +0 -1
  1091. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +0 -12
  1092. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +0 -1
  1093. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +0 -53
  1094. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +0 -1
  1095. package/src/core/schema-view/README.md +0 -9
  1096. package/src/core/schema-view/index.ts +0 -10
  1097. package/src/core/schema-view/view.ts +0 -38
  1098. package/src/feature-libraries/default-schema/locationBasedEditBuilder.ts +0 -231
  1099. package/src/feature-libraries/forest-summary/formatV1.ts +0 -11
  1100. package/src/feature-libraries/forest-summary/formatV2.ts +0 -11
  1101. package/src/feature-libraries/modular-schema/modularChangeCodecV3.ts +0 -649
  1102. package/src/feature-libraries/modular-schema/modularChangeFormatV3.ts +0 -67
  1103. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV3.ts +0 -45
  1104. package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +0 -94
@@ -7,17 +7,27 @@ import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import {
9
9
  type ChangeAtomId,
10
+ type ChangeAtomIdMap,
10
11
  type ChangesetLocalId,
11
- type DeltaFieldChanges,
12
+ type DeltaDetachedNodeChanges,
13
+ type DeltaDetachedNodeId,
12
14
  type DeltaMark,
13
15
  Multiplicity,
14
16
  type RevisionReplacer,
15
17
  type RevisionTag,
16
- areEqualChangeAtomIdOpts,
18
+ areEqualChangeAtomIds,
17
19
  forbiddenFieldKindIdentifier,
18
20
  makeChangeAtomId,
21
+ taggedAtomId,
19
22
  } from "../../core/index.js";
20
- import type { IdAllocator, Mutable } from "../../util/index.js";
23
+ import {
24
+ type IdAllocator,
25
+ type Mutable,
26
+ SizedNestedMap,
27
+ deleteFromNestedMap,
28
+ setInNestedMap,
29
+ tryGetFromNestedMap,
30
+ } from "../../util/index.js";
21
31
  import { nodeIdFromChangeAtom } from "../deltaUtils.js";
22
32
  import {
23
33
  optionalIdentifier,
@@ -31,172 +41,398 @@ import {
31
41
  type NodeChangeComposer,
32
42
  type NodeChangePruner,
33
43
  type NodeChangeRebaser,
44
+ NodeAttachState,
34
45
  type NodeId,
46
+ type RelevantRemovedRootsFromChild,
35
47
  type ToDelta,
36
48
  type NestedChangesIndices,
37
- type RebaseNodeManager,
38
- type ComposeNodeManager,
39
- type InvertNodeManager,
40
- type CrossFieldKeyRange,
41
- NodeMoveType,
42
- type RebaseVersion,
43
- type RebaseRevisionMetadata,
49
+ type FieldChangeDelta,
44
50
  FlexFieldKind,
45
51
  } from "../modular-schema/index.js";
46
52
 
47
- import type { OptionalChangeset, Replace } from "./optionalFieldChangeTypes.js";
53
+ import type {
54
+ ChildChange,
55
+ Move,
56
+ OptionalChangeset,
57
+ RegisterId,
58
+ Replace,
59
+ } from "./optionalFieldChangeTypes.js";
48
60
  import { makeOptionalFieldCodecFamily } from "./optionalFieldCodecs.js";
49
61
 
50
- export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
51
- compose,
52
- invert: (
53
- change: OptionalChangeset,
54
- isRollback: boolean,
55
- genId: IdAllocator<ChangesetLocalId>,
56
- revision: RevisionTag | undefined,
57
- nodeManager: InvertNodeManager,
58
- ): OptionalChangeset => {
59
- const inverted: Mutable<OptionalChangeset> = {};
60
- const detachId = getEffectiveDetachId(change);
61
-
62
- if (detachId !== undefined) {
63
- const attachIdForInverse = isRollback
64
- ? detachId
65
- : makeChangeAtomId(detachId.localId, revision);
62
+ export interface IRegisterMap<T> {
63
+ set(id: RegisterId, childChange: T): void;
64
+ get(id: RegisterId): T | undefined;
65
+ delete(id: RegisterId): boolean;
66
+ keys(): Iterable<RegisterId>;
67
+ values(): Iterable<T>;
68
+ entries(): Iterable<[RegisterId, T]>;
69
+ readonly size: number;
70
+ }
66
71
 
67
- nodeManager.invertDetach(detachId, 1, change.childChange, attachIdForInverse);
72
+ export class RegisterMap<T> implements IRegisterMap<T> {
73
+ private readonly nestedMapData = new SizedNestedMap<
74
+ ChangesetLocalId | "self",
75
+ RevisionTag | undefined,
76
+ T
77
+ >();
78
+
79
+ public clone(): RegisterMap<T> {
80
+ const clone = new RegisterMap<T>();
81
+ for (const [id, t] of this.entries()) {
82
+ clone.set(id, t);
83
+ }
84
+ return clone;
85
+ }
68
86
 
69
- inverted.valueReplace = {
70
- isEmpty: change.valueReplace?.src === undefined,
71
- dst: makeChangeAtomId(genId.allocate(), revision),
72
- src: attachIdForInverse,
73
- };
87
+ public set(id: RegisterId, childChange: T): void {
88
+ if (id === "self") {
89
+ this.nestedMapData.set("self", undefined, childChange);
90
+ } else {
91
+ this.nestedMapData.set(id.localId, id.revision, childChange);
74
92
  }
93
+ }
75
94
 
76
- if (change.valueReplace?.src !== undefined) {
77
- const attachEntry = nodeManager.invertAttach(change.valueReplace.src, 1);
78
- const detachIdForInverse = invertAttachId(
79
- change.valueReplace.src,
80
- revision,
81
- isRollback,
82
- attachEntry.value?.detachId,
83
- );
95
+ public get(id: RegisterId): T | undefined {
96
+ return id === "self"
97
+ ? this.nestedMapData.tryGet(id, undefined)
98
+ : this.nestedMapData.tryGet(id.localId, id.revision);
99
+ }
100
+
101
+ public has(id: RegisterId): boolean {
102
+ return this.get(id) !== undefined;
103
+ }
104
+
105
+ public delete(id: RegisterId): boolean {
106
+ return id === "self"
107
+ ? this.nestedMapData.delete("self", undefined)
108
+ : this.nestedMapData.delete(id.localId, id.revision);
109
+ }
84
110
 
85
- if (attachEntry.value?.nodeChange !== undefined) {
86
- inverted.childChange = attachEntry.value.nodeChange;
111
+ public keys(): Iterable<RegisterId> {
112
+ const changeIds: RegisterId[] = [];
113
+ for (const [localId, nestedMap] of this.nestedMapData) {
114
+ if (localId === "self") {
115
+ changeIds.push("self");
116
+ } else {
117
+ for (const [revisionTag, _] of nestedMap) {
118
+ changeIds.push(
119
+ revisionTag === undefined ? { localId } : { localId, revision: revisionTag },
120
+ );
121
+ }
87
122
  }
123
+ }
88
124
 
89
- // TODO: Always use nodeDetach instead of valueReplace if not supporting older client versions.
90
- if (isPin(change)) {
91
- inverted.nodeDetach = detachIdForInverse;
92
- } else if (inverted.valueReplace === undefined) {
93
- inverted.valueReplace = { isEmpty: false, dst: detachIdForInverse };
125
+ return changeIds;
126
+ }
127
+ public values(): Iterable<T> {
128
+ return this.nestedMapData.values();
129
+ }
130
+ public entries(): Iterable<[RegisterId, T]> {
131
+ const entries: [RegisterId, T][] = [];
132
+ for (const changeId of this.keys()) {
133
+ if (changeId === "self") {
134
+ const entry = this.nestedMapData.tryGet("self", undefined);
135
+ assert(
136
+ entry !== undefined,
137
+ 0x770 /* Entry should not be undefined when iterating keys. */,
138
+ );
139
+ entries.push(["self", entry]);
94
140
  } else {
95
- (inverted.valueReplace as Mutable<Replace>).dst = detachIdForInverse;
141
+ const entry = this.nestedMapData.tryGet(changeId.localId, changeId.revision);
142
+ assert(
143
+ entry !== undefined,
144
+ 0x771 /* Entry should not be undefined when iterating keys. */,
145
+ );
146
+ entries.push([changeId, entry]);
96
147
  }
97
- } else if (detachId === undefined && change.childChange !== undefined) {
98
- // This change does not affect which node is in the field, so its child change should remain here.
99
- inverted.childChange = change.childChange;
100
148
  }
101
149
 
102
- return inverted;
103
- },
150
+ return entries;
151
+ }
152
+ public get size(): number {
153
+ return this.nestedMapData.size;
154
+ }
155
+ }
104
156
 
105
- rebase: (
106
- newChange: OptionalChangeset,
107
- overChange: OptionalChangeset,
108
- rebaseChild: NodeChangeRebaser,
109
- _genId: IdAllocator,
110
- nodeManager: RebaseNodeManager,
111
- _metadata: RebaseRevisionMetadata,
112
- rebaseVersion: RebaseVersion,
157
+ export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
158
+ compose: (
159
+ change1: OptionalChangeset,
160
+ change2: OptionalChangeset,
161
+ composeChild: NodeChangeComposer,
113
162
  ): OptionalChangeset => {
114
- const rebased: Mutable<OptionalChangeset> = {};
115
-
116
- const rebasedChild = rebaseChild(newChange.childChange, overChange.childChange);
117
- const overDetach = getEffectiveDetachId(overChange);
163
+ const { srcToDst, dstToSrc } = getBidirectionalMaps(change1.moves);
164
+ const change1FieldSrc = change1.valueReplace?.src;
165
+ const change1FieldDst = getEffectfulDst(change1.valueReplace);
166
+
167
+ const change2FieldSrc = change2.valueReplace?.src;
168
+ let composedFieldSrc: RegisterId | undefined;
169
+ if (change2FieldSrc !== undefined) {
170
+ if (change2FieldSrc === "self") {
171
+ composedFieldSrc = change1FieldSrc ?? change2FieldSrc;
172
+ } else if (
173
+ change1FieldDst !== undefined &&
174
+ areEqualRegisterIds(change1FieldDst, change2FieldSrc)
175
+ ) {
176
+ composedFieldSrc = "self";
177
+ } else {
178
+ composedFieldSrc =
179
+ tryGetFromNestedMap(dstToSrc, change2FieldSrc.revision, change2FieldSrc.localId) ??
180
+ change2FieldSrc;
181
+ }
182
+ } else if (change1FieldSrc !== undefined && change2.valueReplace === undefined) {
183
+ composedFieldSrc = change1FieldSrc;
184
+ }
118
185
 
119
- // Note that composition ignores rebase version, and so will create node detaches even when we are supporting collaboration with older clients.
120
- // Therefore, in rebase version 1 we must rebase node detach as if it were a clear, matching the behavior of older clients.
121
- const hasNodeDetachTreatedAsClear =
122
- newChange.nodeDetach !== undefined && rebaseVersion < 2 && !isPin(newChange);
186
+ const childChanges2ByOriginalId = new RegisterMap<NodeId>();
187
+ for (const [id, change] of change2.childChanges) {
188
+ if (id === "self") {
189
+ if (change1FieldSrc === undefined) {
190
+ childChanges2ByOriginalId.set("self", change);
191
+ } else {
192
+ childChanges2ByOriginalId.set(change1FieldSrc, change);
193
+ }
194
+ } else {
195
+ if (change1FieldDst !== undefined && areEqualChangeAtomIds(change1FieldDst, id)) {
196
+ childChanges2ByOriginalId.set("self", change);
197
+ } else {
198
+ const originalId = tryGetFromNestedMap(dstToSrc, id.revision, id.localId);
199
+ childChanges2ByOriginalId.set(originalId ?? id, change);
200
+ }
201
+ }
202
+ }
123
203
 
124
- if (overDetach !== undefined) {
125
- const nodeDetach = hasNodeDetachTreatedAsClear ? undefined : newChange.nodeDetach;
126
- nodeManager.rebaseOverDetach(overDetach, 1, nodeDetach, rebasedChild);
204
+ const composedMoves: Move[] = [];
205
+ const composedChildChanges: ChildChange[] = [];
206
+ const composed: Mutable<OptionalChangeset> = {
207
+ moves: composedMoves,
208
+ childChanges: composedChildChanges,
209
+ };
210
+
211
+ for (const [id, childChange1] of change1.childChanges) {
212
+ const childChange2 = childChanges2ByOriginalId.get(id);
213
+ composedChildChanges.push([id, composeChild(childChange1, childChange2)]);
214
+ childChanges2ByOriginalId.delete(id);
127
215
  }
128
216
 
129
- const overAttach = overChange.valueReplace?.src;
130
- if (overAttach !== undefined) {
131
- const movedChangeEntry = nodeManager.getNewChangesForBaseAttach(overAttach, 1).value;
217
+ for (const [id, childChange2] of childChanges2ByOriginalId.entries()) {
218
+ composedChildChanges.push([id, composeChild(undefined, childChange2)]);
219
+ }
132
220
 
133
- if (movedChangeEntry?.nodeChange !== undefined) {
134
- rebased.childChange = movedChangeEntry.nodeChange;
221
+ for (const [leg2Src, leg2Dst] of change2.moves) {
222
+ const leg1Src = tryGetFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);
223
+ if (leg1Src !== undefined) {
224
+ composedMoves.push([leg1Src, leg2Dst]);
225
+ deleteFromNestedMap(srcToDst, leg1Src.revision, leg1Src.localId);
226
+ deleteFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);
227
+ } else if (
228
+ change1FieldDst === undefined ||
229
+ !areEqualChangeAtomIds(change1FieldDst, leg2Src)
230
+ ) {
231
+ composedMoves.push([leg2Src, leg2Dst]);
135
232
  }
233
+ }
136
234
 
137
- if (movedChangeEntry?.detachId !== undefined) {
138
- rebased.nodeDetach = movedChangeEntry.detachId;
139
- if (newChange.valueReplace !== undefined) {
140
- // Now that the rebased change has a node detach,
141
- // the detach from the value replace no longer takes effect.
142
- nodeManager.removeDetach(newChange.valueReplace.dst, 1);
235
+ for (const [revision, innerMap] of srcToDst.entries()) {
236
+ for (const [localId, dst] of innerMap.entries()) {
237
+ const src = makeChangeAtomId(localId, revision);
238
+ if (composedFieldSrc === undefined || !areEqualRegisterIds(src, composedFieldSrc)) {
239
+ composedMoves.push([src, dst]);
143
240
  }
144
241
  }
145
- } else if (overDetach === undefined) {
146
- // `overChange` did not change which node is in the field.
147
- if (rebasedChild !== undefined) {
148
- rebased.childChange = rebasedChild;
242
+ }
243
+
244
+ if (
245
+ change1FieldSrc !== undefined &&
246
+ change1FieldSrc !== "self" &&
247
+ change2.valueReplace !== undefined
248
+ ) {
249
+ const change2FieldDst = change2.valueReplace.dst;
250
+ if (
251
+ isReplaceEffectful(change2.valueReplace) &&
252
+ !areEqualChangeAtomIds(change1FieldSrc, change2FieldDst)
253
+ ) {
254
+ composedMoves.push([change1FieldSrc, change2FieldDst]);
255
+ }
256
+ }
257
+
258
+ const firstChange = change1.valueReplace ?? change2.valueReplace;
259
+ if (firstChange === undefined) {
260
+ return composed;
261
+ }
262
+
263
+ const replace: Mutable<Replace> = {
264
+ isEmpty: firstChange.isEmpty,
265
+ dst: getComposedReplaceDst(change1.valueReplace, change2),
266
+ };
267
+ if (composedFieldSrc !== undefined) {
268
+ replace.src = composedFieldSrc;
269
+ }
270
+ composed.valueReplace = replace;
271
+ return composed;
272
+ },
273
+
274
+ invert: (
275
+ change: OptionalChangeset,
276
+ isRollback: boolean,
277
+ genId: IdAllocator<ChangesetLocalId>,
278
+ revision: RevisionTag | undefined,
279
+ ): OptionalChangeset => {
280
+ const { moves, childChanges, valueReplace } = change;
281
+
282
+ const invertIdMap = new RegisterMap<RegisterId>();
283
+ const invertedMoves: Move[] = [];
284
+ for (const [src, dst] of moves) {
285
+ invertIdMap.set(src, dst);
286
+ invertedMoves.push([dst, src]);
287
+ }
288
+ if (valueReplace !== undefined) {
289
+ const effectfulDst = getEffectfulDst(valueReplace);
290
+ if (effectfulDst !== undefined) {
291
+ invertIdMap.set("self", valueReplace.dst);
292
+ }
293
+ if (valueReplace.src !== undefined) {
294
+ invertIdMap.set(valueReplace.src, "self");
149
295
  }
296
+ }
297
+
298
+ const inverted: Mutable<OptionalChangeset> = {
299
+ moves: invertedMoves,
300
+ childChanges: childChanges.map(([id, childChange]) => {
301
+ return [invertIdMap.get(id) ?? id, childChange];
302
+ }),
303
+ };
150
304
 
151
- if (newChange.nodeDetach !== undefined) {
152
- rebased.nodeDetach = newChange.nodeDetach;
305
+ if (valueReplace !== undefined) {
306
+ if (isReplaceEffectful(valueReplace)) {
307
+ const replace: Mutable<Replace> =
308
+ valueReplace.src === undefined
309
+ ? {
310
+ isEmpty: true,
311
+ dst: makeChangeAtomId(genId.allocate(), revision),
312
+ }
313
+ : {
314
+ isEmpty: false,
315
+ dst: isRollback
316
+ ? valueReplace.src
317
+ : makeChangeAtomId(genId.allocate(), revision),
318
+ };
319
+ if (valueReplace.isEmpty === false) {
320
+ replace.src = valueReplace.dst;
321
+ }
322
+ inverted.valueReplace = replace;
323
+ } else if (!isRollback && valueReplace.src === "self") {
324
+ inverted.valueReplace = {
325
+ isEmpty: false,
326
+ src: "self",
327
+ dst: makeChangeAtomId(genId.allocate(), revision),
328
+ };
153
329
  }
154
330
  }
331
+ return inverted;
332
+ },
155
333
 
156
- if (hasNodeDetachTreatedAsClear && overDetach !== undefined) {
157
- // In order to emulate the rebasing behavior of older clients,
158
- // we convert the node detach to a clear.
159
- const valueReplace: Mutable<Replace> = {
160
- dst: newChange.nodeDetach,
161
- isEmpty: overAttach === undefined,
162
- };
334
+ rebase: (
335
+ change: OptionalChangeset,
336
+ overChange: OptionalChangeset,
337
+ rebaseChild: NodeChangeRebaser,
338
+ ): OptionalChangeset => {
339
+ const { moves, childChanges, valueReplace: field } = change;
163
340
 
164
- if (newChange.valueReplace?.src !== undefined) {
165
- valueReplace.src = newChange.valueReplace.src;
341
+ // TODO: avoid computing the dstToSrc map if it's not needed.
342
+ // TODO: de-dupe overSrcToDst and forwardMap
343
+ const { srcToDst: overSrcToDst } = getBidirectionalMaps(overChange.moves);
344
+
345
+ const forwardMap = new RegisterMap<RegisterId>();
346
+ for (const [src, dst] of overChange.moves) {
347
+ forwardMap.set(src, dst);
348
+ }
349
+ if (overChange.valueReplace !== undefined) {
350
+ const effectfulDst = getEffectfulDst(overChange.valueReplace);
351
+ if (effectfulDst !== undefined) {
352
+ forwardMap.set("self", overChange.valueReplace.dst);
353
+ }
354
+ if (overChange.valueReplace.src !== undefined) {
355
+ forwardMap.set(overChange.valueReplace.src, "self");
166
356
  }
357
+ }
167
358
 
168
- rebased.valueReplace = valueReplace;
169
- } else if (newChange.valueReplace !== undefined) {
170
- const isEmpty =
171
- overDetach !== undefined || overAttach !== undefined
172
- ? overAttach === undefined
173
- : newChange.valueReplace.isEmpty;
359
+ const rebasedMoves: Move[] = [];
360
+ for (const [src, dst] of moves) {
361
+ const newDst = tryGetFromNestedMap(overSrcToDst, src.revision, src.localId);
362
+ rebasedMoves.push([src, newDst ?? dst]);
363
+ }
174
364
 
175
- rebased.valueReplace = { ...newChange.valueReplace, isEmpty };
365
+ const overChildChangesBySrc = new RegisterMap<NodeId>();
366
+ for (const [id, childChange] of overChange.childChanges) {
367
+ overChildChangesBySrc.set(id, childChange);
176
368
  }
177
369
 
178
- const detachId = getEffectiveDetachId(newChange);
179
- const rebasedDetachId = getEffectiveDetachId(rebased);
370
+ const rebasedChildChanges: ChildChange[] = [];
371
+ for (const [id, childChange] of childChanges) {
372
+ const overChildChange = overChildChangesBySrc.get(id);
373
+ if (overChildChange !== undefined) {
374
+ overChildChangesBySrc.delete(id);
375
+ }
376
+
377
+ const rebasedId = forwardMap.get(id) ?? id;
378
+ const rebasedChildChange = rebaseChild(
379
+ childChange,
380
+ overChildChange,
381
+ rebasedId === "self" ? NodeAttachState.Attached : NodeAttachState.Detached,
382
+ );
383
+ if (rebasedChildChange !== undefined) {
384
+ rebasedChildChanges.push([rebasedId, rebasedChildChange]);
385
+ }
386
+ }
180
387
 
181
- if (!areEqualChangeAtomIdOpts(detachId, rebasedDetachId)) {
182
- if (detachId !== undefined) {
183
- nodeManager.removeDetach(detachId, 1);
388
+ for (const [id, overChildChange] of overChildChangesBySrc.entries()) {
389
+ const rebasedId = forwardMap.get(id) ?? id;
390
+ const rebasedChildChange = rebaseChild(
391
+ undefined,
392
+ overChildChange,
393
+ rebasedId === "self" ? NodeAttachState.Attached : NodeAttachState.Detached,
394
+ );
395
+ if (rebasedChildChange !== undefined) {
396
+ rebasedChildChanges.push([rebasedId, rebasedChildChange]);
184
397
  }
185
- if (rebasedDetachId !== undefined) {
186
- nodeManager.addDetach(rebasedDetachId, 1);
398
+ }
399
+
400
+ const rebased: Mutable<OptionalChangeset> = {
401
+ moves: rebasedMoves,
402
+ childChanges: rebasedChildChanges,
403
+ };
404
+
405
+ if (field !== undefined) {
406
+ const replace: Mutable<Replace> = {
407
+ isEmpty:
408
+ overChange.valueReplace === undefined
409
+ ? field.isEmpty
410
+ : overChange.valueReplace.src === undefined,
411
+ dst: field.dst,
412
+ };
413
+ if (field.src !== undefined) {
414
+ replace.src = forwardMap.get(field.src) ?? field.src;
187
415
  }
416
+ rebased.valueReplace = replace;
188
417
  }
418
+
189
419
  return rebased;
190
420
  },
191
421
 
192
422
  prune: (change: OptionalChangeset, pruneChild: NodeChangePruner): OptionalChangeset => {
193
- const prunedChange: Mutable<OptionalChangeset> = { ...change };
423
+ const childChanges: ChildChange[] = [];
424
+ const prunedChange: Mutable<OptionalChangeset> = {
425
+ moves: change.moves,
426
+ childChanges,
427
+ };
428
+ if (change.valueReplace !== undefined) {
429
+ prunedChange.valueReplace = change.valueReplace;
430
+ }
194
431
 
195
- delete prunedChange.childChange;
196
- if (change.childChange !== undefined) {
197
- const childChange = pruneChild(change.childChange);
198
- if (childChange !== undefined) {
199
- prunedChange.childChange = childChange;
432
+ for (const [id, childChange] of change.childChanges) {
433
+ const prunedChildChange = pruneChild(childChange);
434
+ if (prunedChildChange !== undefined) {
435
+ childChanges.push([id, prunedChildChange]);
200
436
  }
201
437
  }
202
438
 
@@ -207,213 +443,154 @@ export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
207
443
  change: OptionalChangeset,
208
444
  replacer: RevisionReplacer,
209
445
  ): OptionalChangeset => {
210
- const updated: Mutable<OptionalChangeset> = {};
211
-
212
446
  const valueReplace = replaceReplaceRevisions(change.valueReplace, replacer);
213
447
 
214
- if (change.childChange !== undefined) {
215
- updated.childChange = replacer.getUpdatedAtomId(change.childChange);
448
+ const childChanges: ChildChange[] = [];
449
+ for (const [id, childChange] of change.childChanges) {
450
+ childChanges.push([
451
+ replaceRegisterRevisions(id, replacer),
452
+ replacer.getUpdatedAtomId(childChange),
453
+ ]);
216
454
  }
217
455
 
218
- if (valueReplace !== undefined) {
219
- updated.valueReplace = valueReplace;
456
+ const moves: Move[] = [];
457
+ for (const [src, dst] of change.moves) {
458
+ moves.push([replacer.getUpdatedAtomId(src), replacer.getUpdatedAtomId(dst)]);
220
459
  }
221
460
 
222
- if (change.nodeDetach !== undefined) {
223
- updated.nodeDetach = replacer.getUpdatedAtomId(change.nodeDetach);
461
+ const updated: Mutable<OptionalChangeset> = { childChanges, moves };
462
+ if (valueReplace !== undefined) {
463
+ updated.valueReplace = valueReplace;
224
464
  }
225
465
 
226
466
  return updated;
227
467
  },
228
468
 
229
469
  mute: (change: OptionalChangeset): OptionalChangeset => {
230
- return { childChange: change.childChange };
470
+ return { childChanges: change.childChanges, moves: [] };
231
471
  },
232
472
  };
233
473
 
234
- function compose(
235
- change1: OptionalChangeset,
236
- change2: OptionalChangeset,
237
- composeChild: NodeChangeComposer,
238
- _genId: IdAllocator,
239
- nodeManager: ComposeNodeManager,
240
- ): OptionalChangeset {
241
- const detachId2 = getEffectiveDetachId(change2);
242
- if (change1.valueReplace?.src !== undefined && detachId2 !== undefined) {
243
- nodeManager.composeAttachDetach(change1.valueReplace.src, detachId2, 1);
474
+ function replaceReplaceRevisions(
475
+ replace: Replace | undefined,
476
+ replacer: RevisionReplacer,
477
+ ): Replace | undefined {
478
+ if (replace === undefined) {
479
+ return undefined;
244
480
  }
245
481
 
246
- const composedDetach = composeNodeDetaches(change1, change2, nodeManager);
247
- const composedReplace = composeReplaces(change1, change2);
248
- const composedChildChange = getComposedChildChanges(
249
- change1,
250
- change2,
251
- nodeManager,
252
- composeChild,
253
- );
254
-
255
- sendNewChildChanges(change1, change2, nodeManager);
482
+ const updated: Mutable<Replace> = {
483
+ ...replace,
484
+ dst: replacer.getUpdatedAtomId(replace.dst),
485
+ };
256
486
 
257
- if (
258
- change1.nodeDetach !== undefined &&
259
- areEqualChangeAtomIdOpts(change1.nodeDetach, change2.valueReplace?.src)
260
- ) {
261
- nodeManager.composeDetachAttach(change1.nodeDetach, change1.nodeDetach, 1, true);
487
+ if (replace.src !== undefined) {
488
+ updated.src = replaceRegisterRevisions(replace.src, replacer);
262
489
  }
263
490
 
264
- return makeChangeset(composedReplace, composedDetach, composedChildChange);
491
+ return updated;
265
492
  }
266
493
 
267
- function composeNodeDetaches(
268
- change1: OptionalChangeset,
269
- change2: OptionalChangeset,
270
- nodeManager: ComposeNodeManager,
271
- ): ChangeAtomId | undefined {
272
- const detach1 = getEffectiveDetachId(change1);
273
- if (detach1 !== undefined) {
274
- const newDetachId = nodeManager.getNewChangesForBaseDetach(detach1, 1).value?.detachId;
275
- if (newDetachId !== undefined) {
276
- // change2 either renames or detaches this node (the latter case implying that change1 reattaches/moves it).
277
- // In either case, the composition ends with the node detached by `newDetachId`.
278
- // Note that even if change2 detaches the node with a location-targeting detach (e.g. an optional field clear),
279
- // the composition should still have a node-targeting detach.
280
- // This is because change1 must attach the node in the location targeted by the detach,
281
- // and rebasing does not affect attaches, although that could change if slice moves are implemented.
282
- return newDetachId;
283
- }
284
- }
285
-
286
- if (change1.nodeDetach !== undefined) {
287
- return change1.nodeDetach;
288
- }
289
-
290
- return change1.valueReplace === undefined ? change2.nodeDetach : undefined;
494
+ function replaceRegisterRevisions(
495
+ register: RegisterId,
496
+ replacer: RevisionReplacer,
497
+ ): RegisterId {
498
+ return register === "self" ? register : replacer.getUpdatedAtomId(register);
291
499
  }
292
500
 
293
- function composeReplaces(
294
- change1: OptionalChangeset,
501
+ function getComposedReplaceDst(
502
+ change1: Replace | undefined,
295
503
  change2: OptionalChangeset,
296
- ): Replace | undefined {
297
- const firstReplace = change1.valueReplace ?? change2.valueReplace;
298
- if (firstReplace === undefined) {
299
- return undefined;
504
+ ): ChangeAtomId {
505
+ const dst1 = change1?.dst;
506
+ if (change2.valueReplace === undefined) {
507
+ assert(dst1 !== undefined, 0x8ce /* Both replace replaces should not be undefined */);
508
+ return getIdAfterMoves(dst1, change2.moves);
300
509
  }
301
510
 
302
- const isEmpty = change1.nodeDetach === undefined ? firstReplace.isEmpty : false;
303
- const replace: Mutable<Replace> = { isEmpty, dst: firstReplace.dst };
304
- if (change2.valueReplace?.src !== undefined) {
305
- replace.src = change2.valueReplace.src;
306
- } else if (
307
- getEffectiveDetachId(change2) === undefined &&
308
- change1.valueReplace?.src !== undefined
511
+ if (
512
+ dst1 === undefined ||
513
+ change1?.src === "self" ||
514
+ (change2.valueReplace.src !== undefined &&
515
+ areEqualRegisterIds(change2.valueReplace.src, dst1))
309
516
  ) {
310
- replace.src = change1.valueReplace.src;
311
- }
312
-
313
- return replace;
314
- }
315
-
316
- /**
317
- * Informs the node manager of any child changes in `change2` that may need to be represented somewhere else in the input context of the composed changeset.
318
- * See {@link ComposeNodeManager.sendNewChangesToBaseSourceLocation} for motivation.
319
- * @param change1 - The first change to compose. Conceptually applies before `change2`.
320
- * @param change2 - The second change to compose. Conceptually applies after `change1`.
321
- * @param nodeManager - The node manager that needs to be informed of the child changes.
322
- */
323
- function sendNewChildChanges(
324
- change1: OptionalChangeset,
325
- change2: OptionalChangeset,
326
- nodeManager: ComposeNodeManager,
327
- ): void {
328
- if (change2.childChange !== undefined && change1.valueReplace?.src !== undefined) {
329
- // The presence of new child implies that there is some node present in the field in the input context of change2.
330
- // The fact that the change1 has a shallow effect implies that this node was attached by change1.
331
- nodeManager.sendNewChangesToBaseSourceLocation(
332
- change1.valueReplace.src,
333
- change2.childChange,
517
+ assert(
518
+ change2.valueReplace !== undefined,
519
+ 0x8cf /* Both replace replaces should not be undefined */,
334
520
  );
521
+ return change2.valueReplace.dst;
522
+ } else {
523
+ return getIdAfterMoves(dst1, change2.moves);
335
524
  }
336
525
  }
337
526
 
338
- /**
339
- * Computes the child changes that should be included in the composed changeset.
340
- * @param change1 - The first change to compose. Conceptually applies before `change2`.
341
- * @param change2 - The second change to compose. Conceptually applies after `change1`.
342
- * @param nodeManager - The node manager. Provides information about potential child changes from `change2`.
343
- * @param composeChild - The delegate to compose child changes.
344
- * @returns The composed child changes (if any) for the node (if any) present in the field in the input context of `change1`.
345
- */
346
- function getComposedChildChanges(
347
- change1: OptionalChangeset,
348
- change2: OptionalChangeset,
349
- nodeManager: ComposeNodeManager,
350
- composeChild: NodeChangeComposer,
351
- ): NodeId | undefined {
352
- const detachId1 = getEffectiveDetachId(change1);
353
-
354
- // We need to determine what the child changes are in change2 for the node (if any) that resides in the field in the input context of change1.
355
- const childChangesFromChange2: NodeId | undefined =
356
- // If such a node did exist, the changes for it in change2 would come from wherever change1 sends that node.
357
- // Note: in both branches of this ternary, we are leveraging the fact querying for changes of a non-existent node safely yields undefined
358
- detachId1 === undefined
359
- ? change1.valueReplace?.src === undefined
360
- ? change2.childChange
361
- : undefined
362
- : nodeManager.getNewChangesForBaseDetach(detachId1, 1).value?.nodeChange;
363
-
364
- let composedChildChange: NodeId | undefined;
365
- if (change1.childChange !== undefined || childChangesFromChange2 !== undefined) {
366
- composedChildChange = composeChild(change1.childChange, childChangesFromChange2);
527
+ function getIdAfterMoves(id: ChangeAtomId, moves: readonly Move[]): ChangeAtomId {
528
+ for (const [src, dst] of moves) {
529
+ if (areEqualChangeAtomIds(id, src)) {
530
+ return dst;
531
+ }
367
532
  }
368
- return composedChildChange;
533
+ return id;
369
534
  }
370
535
 
371
- function makeChangeset(
372
- replace: Replace | undefined,
373
- nodeDetach: ChangeAtomId | undefined,
374
- childChange: NodeId | undefined,
375
- ): OptionalChangeset {
376
- const changeset: Mutable<OptionalChangeset> = {};
377
- if (replace !== undefined) {
378
- changeset.valueReplace = replace;
379
- }
380
-
381
- if (nodeDetach !== undefined) {
382
- changeset.nodeDetach = nodeDetach;
383
- }
536
+ function areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {
537
+ return id1 === "self" || id2 === "self" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);
538
+ }
384
539
 
385
- if (childChange !== undefined) {
386
- changeset.childChange = childChange;
540
+ function areEqualRegisterIdsOpt(
541
+ id1: RegisterId | undefined,
542
+ id2: RegisterId | undefined,
543
+ ): boolean {
544
+ if (id1 === undefined || id2 === undefined) {
545
+ return id1 === id2;
387
546
  }
388
- return changeset;
547
+ return areEqualRegisterIds(id1, id2);
389
548
  }
390
549
 
391
- function replaceReplaceRevisions(
392
- replace: Replace | undefined,
393
- replacer: RevisionReplacer,
394
- ): Replace | undefined {
395
- if (replace === undefined) {
396
- return undefined;
550
+ function getBidirectionalMaps(moves: OptionalChangeset["moves"]): {
551
+ srcToDst: ChangeAtomIdMap<ChangeAtomId>;
552
+ dstToSrc: ChangeAtomIdMap<ChangeAtomId>;
553
+ } {
554
+ const srcToDst: ChangeAtomIdMap<ChangeAtomId> = new Map();
555
+ const dstToSrc: ChangeAtomIdMap<ChangeAtomId> = new Map();
556
+ for (const [src, dst] of moves) {
557
+ setInNestedMap(srcToDst, src.revision, src.localId, dst);
558
+ setInNestedMap(dstToSrc, dst.revision, dst.localId, src);
397
559
  }
560
+ return { srcToDst, dstToSrc };
561
+ }
398
562
 
399
- const updated: Mutable<Replace> = {
400
- ...replace,
401
- dst: replacer.getUpdatedAtomId(replace.dst),
402
- };
403
-
404
- if (replace.src !== undefined) {
405
- updated.src = replacer.getUpdatedAtomId(replace.src);
563
+ type EffectfulReplace =
564
+ | {
565
+ isEmpty: true;
566
+ src?: ChangeAtomId;
567
+ dst: ChangeAtomId;
568
+ }
569
+ | {
570
+ isEmpty: boolean;
571
+ src: ChangeAtomId;
572
+ dst: ChangeAtomId;
573
+ };
574
+
575
+ function isReplaceEffectful(replace: Replace): replace is EffectfulReplace {
576
+ if (replace.src === "self") {
577
+ return false;
406
578
  }
579
+ return !replace.isEmpty || replace.src !== undefined;
580
+ }
407
581
 
408
- return updated;
582
+ function getEffectfulDst(replace: Replace | undefined): ChangeAtomId | undefined {
583
+ return replace === undefined || replace.isEmpty || replace.src === "self"
584
+ ? undefined
585
+ : replace.dst;
409
586
  }
410
587
 
411
- function getEffectiveDetachId(change: OptionalChangeset): ChangeAtomId | undefined {
412
- if (change.nodeDetach !== undefined) {
413
- return change.nodeDetach;
588
+ export function taggedRegister(id: RegisterId, revision: RevisionTag | undefined): RegisterId {
589
+ if (id === "self") {
590
+ return id;
414
591
  }
415
592
 
416
- return change.valueReplace?.isEmpty === false ? change.valueReplace.dst : undefined;
593
+ return taggedAtomId(id, revision);
417
594
  }
418
595
 
419
596
  export interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {
@@ -422,97 +599,121 @@ export interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {
422
599
  * with new content.
423
600
  * The content in the field will be moved to the `ids.detach` register.
424
601
  * The content in the `ids.detach` register will be moved to into the field.
425
- * @param isEmpty - whether the field is empty when creating this change
426
- * @param ids - the ids associated with the change.
602
+ * @param wasEmpty - whether the field is empty when creating this change
603
+ * @param ids - the "fill" and "detach" ids associated with the change.
427
604
  */
428
605
  set(
429
- isEmpty: boolean,
606
+ wasEmpty: boolean,
430
607
  ids: {
431
- /** The ID of the node to attach in the field. */
432
608
  fill: ChangeAtomId;
433
- /** The ID to assign to whichever node (if any) is detached from the field when the change applies. */
434
609
  detach: ChangeAtomId;
435
610
  },
436
611
  ): OptionalChangeset;
437
612
 
438
613
  /**
439
614
  * Creates a change which clears the field's contents (if any).
440
- * @param isEmpty - whether the field is empty when creating this change
441
- * @param detachId - the ID to assign to whichever node (if any) is detached from the field when the change applies.
615
+ * @param wasEmpty - whether the field is empty when creating this change
616
+ * @param detachId - the ID of the register that existing field content (if any) will be moved to.
442
617
  */
443
- clear(isEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;
618
+ clear(wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;
444
619
  }
445
620
 
446
621
  export const optionalFieldEditor: OptionalFieldEditor = {
447
622
  set: (
448
- isEmpty: boolean,
623
+ wasEmpty: boolean,
449
624
  ids: {
450
625
  fill: ChangeAtomId;
626
+ // Should be interpreted as a set of an empty field if undefined.
451
627
  detach: ChangeAtomId;
452
628
  },
453
629
  ): OptionalChangeset => ({
630
+ moves: [],
631
+ childChanges: [],
454
632
  valueReplace: {
455
- isEmpty,
633
+ isEmpty: wasEmpty,
456
634
  src: ids.fill,
457
635
  dst: ids.detach,
458
636
  },
459
637
  }),
460
638
 
461
- clear: (isEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({
639
+ clear: (wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({
640
+ moves: [],
641
+ childChanges: [],
462
642
  valueReplace: {
463
- isEmpty,
643
+ isEmpty: wasEmpty,
464
644
  dst: detachId,
465
645
  },
466
646
  }),
467
647
 
468
648
  buildChildChanges: (changes: Iterable<[number, NodeId]>): OptionalChangeset => {
469
- const childChanges: NodeId[] = Array.from(changes, ([index, child]) => {
649
+ const childChanges: ChildChange[] = Array.from(changes, ([index, childChange]) => {
470
650
  assert(index === 0, 0x404 /* Optional fields only support a single child node */);
471
- return child;
651
+ return ["self", childChange];
472
652
  });
473
653
  assert(
474
654
  childChanges.length <= 1,
475
655
  0xabd /* Optional fields only support a single child node */,
476
656
  );
477
-
478
- const childChange = childChanges[0];
479
- return childChange === undefined ? {} : { childChange };
657
+ return {
658
+ moves: [],
659
+ childChanges,
660
+ };
480
661
  },
481
662
  };
482
663
 
483
664
  export function optionalFieldIntoDelta(
484
665
  change: OptionalChangeset,
485
666
  deltaFromChild: ToDelta,
486
- ): DeltaFieldChanges {
487
- return optionalOrRequiredFieldIntoDelta(true, change, deltaFromChild);
488
- }
667
+ ): FieldChangeDelta {
668
+ const delta: Mutable<FieldChangeDelta> = {};
489
669
 
490
- export function optionalOrRequiredFieldIntoDelta(
491
- allowReattach: boolean,
492
- change: OptionalChangeset,
493
- deltaFromChild: ToDelta,
494
- ): DeltaFieldChanges {
495
670
  let markIsANoop = true;
496
671
  const mark: Mutable<DeltaMark> = { count: 1 };
497
- const detachId = getEffectiveDetachId(change);
498
- const attachId = change.valueReplace?.src;
499
- if (!areEqualChangeAtomIdOpts(detachId, attachId)) {
672
+
673
+ if (change.valueReplace !== undefined && isReplaceEffectful(change.valueReplace)) {
674
+ if (!change.valueReplace.isEmpty) {
675
+ mark.detach = nodeIdFromChangeAtom(change.valueReplace.dst);
676
+ }
677
+ if (change.valueReplace.src !== undefined) {
678
+ mark.attach = nodeIdFromChangeAtom(change.valueReplace.src);
679
+ }
500
680
  markIsANoop = false;
681
+ }
501
682
 
502
- if (detachId !== undefined) {
503
- mark.detach = nodeIdFromChangeAtom(detachId);
683
+ if (change.moves.length > 0) {
684
+ delta.rename = change.moves.map(([src, dst]) => ({
685
+ count: 1,
686
+ oldId: nodeIdFromChangeAtom(src),
687
+ newId: nodeIdFromChangeAtom(dst),
688
+ }));
689
+ }
690
+
691
+ if (change.childChanges.length > 0) {
692
+ const globals: DeltaDetachedNodeChanges[] = [];
693
+ for (const [id, childChange] of change.childChanges) {
694
+ const childDelta = deltaFromChild(childChange);
695
+ if (id === "self") {
696
+ mark.fields = childDelta;
697
+ markIsANoop = false;
698
+ } else {
699
+ const fields = childDelta;
700
+ globals.push({
701
+ id: { major: id.revision, minor: id.localId },
702
+ fields,
703
+ });
704
+ }
504
705
  }
505
- if (attachId !== undefined) {
506
- mark.attach = nodeIdFromChangeAtom(attachId);
706
+
707
+ if (globals.length > 0) {
708
+ delta.global = globals;
507
709
  }
508
710
  }
509
711
 
510
- if (change.childChange !== undefined) {
511
- mark.fields = deltaFromChild(change.childChange);
512
- markIsANoop = false;
712
+ if (!markIsANoop) {
713
+ delta.local = { marks: [mark] };
513
714
  }
514
715
 
515
- return { marks: markIsANoop ? [] : [mark], allowReattach };
716
+ return delta;
516
717
  }
517
718
 
518
719
  export const optionalChangeHandler: FieldChangeHandler<
@@ -524,63 +725,71 @@ export const optionalChangeHandler: FieldChangeHandler<
524
725
  editor: optionalFieldEditor,
525
726
 
526
727
  intoDelta: optionalFieldIntoDelta,
728
+ relevantRemovedRoots,
527
729
 
528
730
  isEmpty: (change: OptionalChangeset) =>
529
- change.childChange === undefined &&
530
- change.valueReplace === undefined &&
531
- change.nodeDetach === undefined,
731
+ change.childChanges.length === 0 &&
732
+ change.moves.length === 0 &&
733
+ change.valueReplace === undefined,
532
734
 
533
735
  getNestedChanges,
534
736
 
535
- createEmpty: () => ({}),
536
- getCrossFieldKeys,
537
- getDetachCellIds: (_change) => [],
737
+ createEmpty: () => ({ moves: [], childChanges: [] }),
738
+ getCrossFieldKeys: (_change) => [],
538
739
  };
539
740
 
540
- function getCrossFieldKeys(change: OptionalChangeset): CrossFieldKeyRange[] {
541
- const keys: CrossFieldKeyRange[] = [];
542
- if (change.valueReplace?.src !== undefined) {
543
- keys.push({
544
- key: { ...change.valueReplace.src, target: NodeMoveType.Attach },
545
- count: 1,
546
- });
547
- }
548
-
549
- const detachId = getEffectiveDetachId(change);
550
-
551
- if (detachId !== undefined) {
552
- keys.push({ key: { ...detachId, target: NodeMoveType.Detach }, count: 1 });
553
- }
554
-
555
- return keys;
556
- }
557
-
558
741
  function getNestedChanges(change: OptionalChangeset): NestedChangesIndices {
559
- if (change.childChange === undefined) {
560
- return [];
561
- }
562
-
563
- return [[change.childChange, 0]];
742
+ // True iff the content of the field changes in some way
743
+ const isFieldContentChanged =
744
+ change.valueReplace !== undefined && change.valueReplace.src !== "self";
745
+
746
+ // The node that is moved into the field (if any).
747
+ const nodeMovedIntoField = change.valueReplace?.src;
748
+
749
+ return change.childChanges.map(([register, nodeId]) => {
750
+ // The node is removed in the input context iif register is not self.
751
+ const inputIndex = register === "self" ? 0 : undefined;
752
+ const outputIndex =
753
+ register === "self"
754
+ ? // If the node starts out as not-removed, it is removed in the output context iff the field content is changed
755
+ isFieldContentChanged
756
+ ? undefined
757
+ : 0
758
+ : // If the node starts out as removed, then it remains removed in the output context iff it is not the node that is moved into the field
759
+ areEqualRegisterIdsOpt(register, nodeMovedIntoField)
760
+ ? 0
761
+ : undefined;
762
+ return [nodeId, inputIndex, outputIndex];
763
+ });
564
764
  }
565
765
 
566
- function invertAttachId(
567
- attachId: ChangeAtomId,
568
- revision: RevisionTag | undefined,
569
- isRollback: boolean,
570
- detachId: ChangeAtomId | undefined,
571
- ): ChangeAtomId {
572
- if (!isRollback) {
573
- return makeChangeAtomId(attachId.localId, revision);
766
+ function* relevantRemovedRoots(
767
+ change: OptionalChangeset,
768
+ relevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,
769
+ ): Iterable<DeltaDetachedNodeId> {
770
+ const alreadyYielded = new RegisterMap<boolean>();
771
+
772
+ for (const [src] of change.moves) {
773
+ if (!alreadyYielded.has(src)) {
774
+ alreadyYielded.set(src, true);
775
+ yield nodeIdFromChangeAtom(src);
776
+ }
574
777
  }
575
778
 
576
- return detachId ?? attachId;
577
- }
779
+ for (const [id, childChange] of change.childChanges) {
780
+ // Child changes make the tree they apply to relevant unless that tree existed in the starting context of
781
+ // of this change.
782
+ if (id !== "self" && !alreadyYielded.has(id)) {
783
+ alreadyYielded.set(id, true);
784
+ yield nodeIdFromChangeAtom(id);
785
+ }
786
+ yield* relevantRemovedRootsFromChild(childChange);
787
+ }
578
788
 
579
- function isPin(change: OptionalChangeset): boolean {
580
- return (
581
- change.nodeDetach !== undefined &&
582
- areEqualChangeAtomIdOpts(change.nodeDetach, change.valueReplace?.src)
583
- );
789
+ const selfSrc = change.valueReplace?.src;
790
+ if (selfSrc !== undefined && selfSrc !== "self" && !alreadyYielded.has(selfSrc)) {
791
+ yield nodeIdFromChangeAtom(selfSrc);
792
+ }
584
793
  }
585
794
 
586
795
  interface Optional