@fluidframework/tree 2.83.0 → 2.90.0-378676

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 (781) hide show
  1. package/api-report/tree.alpha.api.md +1 -0
  2. package/dist/core/change-family/changeFamily.d.ts +4 -1
  3. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  4. package/dist/core/change-family/changeFamily.js.map +1 -1
  5. package/dist/core/change-family/index.d.ts +1 -1
  6. package/dist/core/change-family/index.d.ts.map +1 -1
  7. package/dist/core/change-family/index.js.map +1 -1
  8. package/dist/core/index.d.ts +3 -3
  9. package/dist/core/index.d.ts.map +1 -1
  10. package/dist/core/index.js +6 -4
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/core/rebase/changeRebaser.d.ts +6 -1
  13. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  14. package/dist/core/rebase/changeRebaser.js.map +1 -1
  15. package/dist/core/rebase/index.d.ts +1 -1
  16. package/dist/core/rebase/index.d.ts.map +1 -1
  17. package/dist/core/rebase/index.js +2 -1
  18. package/dist/core/rebase/index.js.map +1 -1
  19. package/dist/core/rebase/types.d.ts +1 -0
  20. package/dist/core/rebase/types.d.ts.map +1 -1
  21. package/dist/core/rebase/types.js +5 -1
  22. package/dist/core/rebase/types.js.map +1 -1
  23. package/dist/core/rebase/utils.d.ts.map +1 -1
  24. package/dist/core/rebase/utils.js +25 -7
  25. package/dist/core/rebase/utils.js.map +1 -1
  26. package/dist/core/tree/delta.d.ts +5 -0
  27. package/dist/core/tree/delta.d.ts.map +1 -1
  28. package/dist/core/tree/delta.js.map +1 -1
  29. package/dist/core/tree/detachedFieldIndex.d.ts +13 -1
  30. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  31. package/dist/core/tree/detachedFieldIndex.js +14 -1
  32. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  33. package/dist/core/tree/detachedFieldIndexTypes.d.ts +4 -0
  34. package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  35. package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
  36. package/dist/core/tree/index.d.ts +2 -2
  37. package/dist/core/tree/index.d.ts.map +1 -1
  38. package/dist/core/tree/index.js +4 -3
  39. package/dist/core/tree/index.js.map +1 -1
  40. package/dist/core/tree/pathTree.d.ts +11 -3
  41. package/dist/core/tree/pathTree.d.ts.map +1 -1
  42. package/dist/core/tree/pathTree.js +14 -2
  43. package/dist/core/tree/pathTree.js.map +1 -1
  44. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  45. package/dist/core/tree/visitDelta.js +17 -13
  46. package/dist/core/tree/visitDelta.js.map +1 -1
  47. package/dist/feature-libraries/changeAtomIdBTree.d.ts +3 -2
  48. package/dist/feature-libraries/changeAtomIdBTree.d.ts.map +1 -1
  49. package/dist/feature-libraries/changeAtomIdBTree.js +15 -2
  50. package/dist/feature-libraries/changeAtomIdBTree.js.map +1 -1
  51. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +92 -44
  52. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  53. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +220 -70
  54. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  55. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  56. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +12 -2
  57. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  58. package/dist/feature-libraries/default-schema/index.d.ts +2 -1
  59. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  60. package/dist/feature-libraries/default-schema/index.js +4 -2
  61. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  62. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +40 -0
  63. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
  64. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js +153 -0
  65. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
  66. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
  67. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  68. package/dist/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
  69. package/dist/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  70. package/dist/feature-libraries/deltaUtils.d.ts +1 -0
  71. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  72. package/dist/feature-libraries/deltaUtils.js +6 -1
  73. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  74. package/dist/feature-libraries/flex-tree/context.d.ts +9 -0
  75. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  76. package/dist/feature-libraries/flex-tree/context.js +6 -0
  77. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  78. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  79. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  80. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  81. package/dist/feature-libraries/flex-tree/lazyField.d.ts +8 -7
  82. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  83. package/dist/feature-libraries/flex-tree/lazyField.js +39 -8
  84. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  85. package/dist/feature-libraries/index.d.ts +3 -3
  86. package/dist/feature-libraries/index.d.ts.map +1 -1
  87. package/dist/feature-libraries/index.js +8 -4
  88. package/dist/feature-libraries/index.js.map +1 -1
  89. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  90. package/dist/feature-libraries/mitigatedChangeFamily.js +2 -2
  91. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  92. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +100 -24
  93. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  94. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +8 -12
  95. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  96. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +85 -51
  97. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  98. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  99. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  100. package/dist/feature-libraries/modular-schema/genericFieldKind.js +4 -9
  101. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  102. package/dist/feature-libraries/modular-schema/index.d.ts +3 -3
  103. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  104. package/dist/feature-libraries/modular-schema/index.js +2 -3
  105. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  106. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +18 -22
  107. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  108. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +276 -158
  109. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  110. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  111. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js +1 -1
  112. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  113. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.d.ts +15 -0
  114. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.d.ts.map +1 -0
  115. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.js +296 -0
  116. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.js.map +1 -0
  117. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -0
  118. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  119. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -0
  120. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  121. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +56 -22
  122. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  123. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +1390 -462
  124. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  125. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  126. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  127. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +1 -2
  128. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  129. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +3 -3
  130. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  131. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.d.ts +74 -0
  132. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.d.ts.map +1 -0
  133. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.js +35 -0
  134. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.js.map +1 -0
  135. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +49 -10
  136. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  137. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +3 -3
  138. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  139. package/dist/feature-libraries/optional-field/optionalField.d.ts +13 -32
  140. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  141. package/dist/feature-libraries/optional-field/optionalField.js +257 -446
  142. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  143. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
  144. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
  145. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +31 -0
  146. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
  147. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +31 -31
  148. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  149. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  150. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  151. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  152. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js +57 -28
  153. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  154. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
  155. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
  156. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +57 -0
  157. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
  158. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  159. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
  160. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  161. package/dist/feature-libraries/optional-field/requiredField.d.ts +3 -2
  162. package/dist/feature-libraries/optional-field/requiredField.d.ts.map +1 -1
  163. package/dist/feature-libraries/optional-field/requiredField.js +6 -1
  164. package/dist/feature-libraries/optional-field/requiredField.js.map +1 -1
  165. package/dist/feature-libraries/sequence-field/compose.d.ts +6 -7
  166. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  167. package/dist/feature-libraries/sequence-field/compose.js +81 -259
  168. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  169. package/dist/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
  170. package/dist/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  171. package/dist/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  172. package/dist/feature-libraries/sequence-field/invert.d.ts +3 -3
  173. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  174. package/dist/feature-libraries/sequence-field/invert.js +65 -167
  175. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  176. package/dist/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  177. package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  178. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  179. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
  180. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  181. package/dist/feature-libraries/sequence-field/moveEffectTable.js +7 -90
  182. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  183. package/dist/feature-libraries/sequence-field/rebase.d.ts +3 -3
  184. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  185. package/dist/feature-libraries/sequence-field/rebase.js +109 -116
  186. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  187. package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  188. package/dist/feature-libraries/sequence-field/replaceRevisions.js +19 -32
  189. package/dist/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  190. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  191. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +1 -2
  192. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  193. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
  194. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  195. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +388 -187
  196. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  197. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  198. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js +20 -62
  199. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  200. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  201. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  202. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +13 -13
  203. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  204. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
  205. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  206. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +16 -111
  207. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  208. package/dist/feature-libraries/sequence-field/types.d.ts +37 -74
  209. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  210. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  211. package/dist/feature-libraries/sequence-field/utils.d.ts +20 -25
  212. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  213. package/dist/feature-libraries/sequence-field/utils.js +159 -320
  214. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  215. package/dist/packageVersion.d.ts +1 -1
  216. package/dist/packageVersion.d.ts.map +1 -1
  217. package/dist/packageVersion.js +1 -1
  218. package/dist/packageVersion.js.map +1 -1
  219. package/dist/shared-tree/independentView.d.ts.map +1 -1
  220. package/dist/shared-tree/independentView.js +1 -1
  221. package/dist/shared-tree/independentView.js.map +1 -1
  222. package/dist/shared-tree/index.d.ts +1 -1
  223. package/dist/shared-tree/index.d.ts.map +1 -1
  224. package/dist/shared-tree/index.js.map +1 -1
  225. package/dist/shared-tree/schematizeTree.d.ts +4 -4
  226. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  227. package/dist/shared-tree/schematizeTree.js +2 -1
  228. package/dist/shared-tree/schematizeTree.js.map +1 -1
  229. package/dist/shared-tree/schematizingTreeView.d.ts +1 -5
  230. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  231. package/dist/shared-tree/schematizingTreeView.js +21 -35
  232. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  233. package/dist/shared-tree/sharedTree.d.ts +9 -3
  234. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  235. package/dist/shared-tree/sharedTree.js +4 -1
  236. package/dist/shared-tree/sharedTree.js.map +1 -1
  237. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +1 -0
  238. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  239. package/dist/shared-tree/sharedTreeChangeCodecs.js +8 -0
  240. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  241. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +4 -4
  242. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  243. package/dist/shared-tree/sharedTreeChangeFamily.js +2 -2
  244. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  245. package/dist/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
  246. package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  247. package/dist/shared-tree/sharedTreeEditBuilder.js +14 -7
  248. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  249. package/dist/shared-tree/treeCheckout.d.ts +13 -11
  250. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  251. package/dist/shared-tree/treeCheckout.js +56 -6
  252. package/dist/shared-tree/treeCheckout.js.map +1 -1
  253. package/dist/shared-tree-core/branch.d.ts +3 -2
  254. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  255. package/dist/shared-tree-core/branch.js +4 -3
  256. package/dist/shared-tree-core/branch.js.map +1 -1
  257. package/dist/shared-tree-core/editManager.d.ts +2 -2
  258. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  259. package/dist/shared-tree-core/editManager.js +9 -9
  260. package/dist/shared-tree-core/editManager.js.map +1 -1
  261. package/dist/shared-tree-core/editManagerCodecs.d.ts +4 -0
  262. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  263. package/dist/shared-tree-core/editManagerCodecs.js +10 -2
  264. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  265. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +1 -0
  266. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  267. package/dist/shared-tree-core/editManagerFormatCommons.js +6 -0
  268. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  269. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  270. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  271. package/dist/shared-tree-core/editManagerFormatV1toV4.js +1 -0
  272. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  273. package/dist/shared-tree-core/index.d.ts +2 -2
  274. package/dist/shared-tree-core/index.d.ts.map +1 -1
  275. package/dist/shared-tree-core/index.js +3 -1
  276. package/dist/shared-tree-core/index.js.map +1 -1
  277. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  278. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  279. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  280. package/dist/shared-tree-core/messageCodecs.d.ts +4 -0
  281. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  282. package/dist/shared-tree-core/messageCodecs.js +10 -2
  283. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  284. package/dist/shared-tree-core/messageFormat.d.ts +1 -0
  285. package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
  286. package/dist/shared-tree-core/messageFormat.js +6 -0
  287. package/dist/shared-tree-core/messageFormat.js.map +1 -1
  288. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
  289. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  290. package/dist/shared-tree-core/messageFormatV1ToV4.js +1 -0
  291. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  292. package/dist/shared-tree-core/sharedTreeCore.d.ts +1 -0
  293. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  294. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  295. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  296. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +16 -12
  297. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  298. package/dist/simple-tree/core/unhydratedFlexTree.js +59 -8
  299. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  300. package/dist/simple-tree/fieldSchema.d.ts +4 -4
  301. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  302. package/dist/simple-tree/fieldSchema.js.map +1 -1
  303. package/dist/simple-tree/index.d.ts +2 -2
  304. package/dist/simple-tree/index.d.ts.map +1 -1
  305. package/dist/simple-tree/index.js +1 -1
  306. package/dist/simple-tree/index.js.map +1 -1
  307. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  308. package/dist/simple-tree/node-kinds/array/arrayNode.js +5 -3
  309. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  310. package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
  311. package/dist/simple-tree/node-kinds/common.js +1 -1
  312. package/dist/simple-tree/node-kinds/common.js.map +1 -1
  313. package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
  314. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  315. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  316. package/dist/simple-tree/node-kinds/object/objectNode.js +19 -19
  317. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  318. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  319. package/dist/simple-tree/node-kinds/record/recordNode.js +4 -2
  320. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  321. package/dist/simple-tree/prepareForInsertion.d.ts +54 -47
  322. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  323. package/dist/simple-tree/prepareForInsertion.js +183 -125
  324. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  325. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +8 -3
  326. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  327. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +27 -13
  328. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  329. package/dist/treeFactory.d.ts.map +1 -1
  330. package/dist/treeFactory.js +12 -2
  331. package/dist/treeFactory.js.map +1 -1
  332. package/dist/util/index.d.ts +1 -1
  333. package/dist/util/index.d.ts.map +1 -1
  334. package/dist/util/index.js +2 -1
  335. package/dist/util/index.js.map +1 -1
  336. package/dist/util/rangeMap.d.ts +23 -11
  337. package/dist/util/rangeMap.d.ts.map +1 -1
  338. package/dist/util/rangeMap.js +43 -10
  339. package/dist/util/rangeMap.js.map +1 -1
  340. package/lib/core/change-family/changeFamily.d.ts +4 -1
  341. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  342. package/lib/core/change-family/changeFamily.js.map +1 -1
  343. package/lib/core/change-family/index.d.ts +1 -1
  344. package/lib/core/change-family/index.d.ts.map +1 -1
  345. package/lib/core/change-family/index.js.map +1 -1
  346. package/lib/core/index.d.ts +3 -3
  347. package/lib/core/index.d.ts.map +1 -1
  348. package/lib/core/index.js +2 -2
  349. package/lib/core/index.js.map +1 -1
  350. package/lib/core/rebase/changeRebaser.d.ts +6 -1
  351. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  352. package/lib/core/rebase/changeRebaser.js.map +1 -1
  353. package/lib/core/rebase/index.d.ts +1 -1
  354. package/lib/core/rebase/index.d.ts.map +1 -1
  355. package/lib/core/rebase/index.js +1 -1
  356. package/lib/core/rebase/index.js.map +1 -1
  357. package/lib/core/rebase/types.d.ts +1 -0
  358. package/lib/core/rebase/types.d.ts.map +1 -1
  359. package/lib/core/rebase/types.js +3 -0
  360. package/lib/core/rebase/types.js.map +1 -1
  361. package/lib/core/rebase/utils.d.ts.map +1 -1
  362. package/lib/core/rebase/utils.js +25 -7
  363. package/lib/core/rebase/utils.js.map +1 -1
  364. package/lib/core/tree/delta.d.ts +5 -0
  365. package/lib/core/tree/delta.d.ts.map +1 -1
  366. package/lib/core/tree/delta.js.map +1 -1
  367. package/lib/core/tree/detachedFieldIndex.d.ts +13 -1
  368. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  369. package/lib/core/tree/detachedFieldIndex.js +15 -2
  370. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  371. package/lib/core/tree/detachedFieldIndexTypes.d.ts +4 -0
  372. package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  373. package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
  374. package/lib/core/tree/index.d.ts +2 -2
  375. package/lib/core/tree/index.d.ts.map +1 -1
  376. package/lib/core/tree/index.js +1 -1
  377. package/lib/core/tree/index.js.map +1 -1
  378. package/lib/core/tree/pathTree.d.ts +11 -3
  379. package/lib/core/tree/pathTree.d.ts.map +1 -1
  380. package/lib/core/tree/pathTree.js +12 -1
  381. package/lib/core/tree/pathTree.js.map +1 -1
  382. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  383. package/lib/core/tree/visitDelta.js +17 -13
  384. package/lib/core/tree/visitDelta.js.map +1 -1
  385. package/lib/feature-libraries/changeAtomIdBTree.d.ts +3 -2
  386. package/lib/feature-libraries/changeAtomIdBTree.d.ts.map +1 -1
  387. package/lib/feature-libraries/changeAtomIdBTree.js +15 -3
  388. package/lib/feature-libraries/changeAtomIdBTree.js.map +1 -1
  389. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +92 -44
  390. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  391. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +217 -69
  392. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  393. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  394. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +12 -2
  395. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  396. package/lib/feature-libraries/default-schema/index.d.ts +2 -1
  397. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  398. package/lib/feature-libraries/default-schema/index.js +2 -1
  399. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  400. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +40 -0
  401. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
  402. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js +149 -0
  403. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
  404. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
  405. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  406. package/lib/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
  407. package/lib/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  408. package/lib/feature-libraries/deltaUtils.d.ts +1 -0
  409. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  410. package/lib/feature-libraries/deltaUtils.js +5 -1
  411. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  412. package/lib/feature-libraries/flex-tree/context.d.ts +9 -0
  413. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  414. package/lib/feature-libraries/flex-tree/context.js +6 -0
  415. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  416. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  417. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  418. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  419. package/lib/feature-libraries/flex-tree/lazyField.d.ts +8 -7
  420. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  421. package/lib/feature-libraries/flex-tree/lazyField.js +40 -9
  422. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  423. package/lib/feature-libraries/index.d.ts +3 -3
  424. package/lib/feature-libraries/index.d.ts.map +1 -1
  425. package/lib/feature-libraries/index.js +3 -3
  426. package/lib/feature-libraries/index.js.map +1 -1
  427. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  428. package/lib/feature-libraries/mitigatedChangeFamily.js +2 -2
  429. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  430. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +100 -24
  431. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  432. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +7 -10
  433. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  434. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +85 -51
  435. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  436. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  437. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  438. package/lib/feature-libraries/modular-schema/genericFieldKind.js +4 -9
  439. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  440. package/lib/feature-libraries/modular-schema/index.d.ts +3 -3
  441. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  442. package/lib/feature-libraries/modular-schema/index.js +1 -1
  443. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  444. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +18 -22
  445. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  446. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +267 -144
  447. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  448. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  449. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js +1 -1
  450. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  451. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.d.ts +15 -0
  452. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.d.ts.map +1 -0
  453. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.js +292 -0
  454. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.js.map +1 -0
  455. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -0
  456. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  457. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +8 -0
  458. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  459. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +56 -22
  460. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  461. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +1387 -468
  462. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  463. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  464. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  465. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +1 -2
  466. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  467. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +1 -1
  468. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  469. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.d.ts +74 -0
  470. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.d.ts.map +1 -0
  471. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.js +32 -0
  472. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.js.map +1 -0
  473. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +49 -10
  474. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  475. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +1 -1
  476. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  477. package/lib/feature-libraries/optional-field/optionalField.d.ts +13 -32
  478. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  479. package/lib/feature-libraries/optional-field/optionalField.js +254 -442
  480. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  481. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
  482. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
  483. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +27 -0
  484. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
  485. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +31 -31
  486. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  487. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  488. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  489. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  490. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js +55 -26
  491. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  492. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
  493. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
  494. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +53 -0
  495. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
  496. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  497. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
  498. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  499. package/lib/feature-libraries/optional-field/requiredField.d.ts +3 -2
  500. package/lib/feature-libraries/optional-field/requiredField.d.ts.map +1 -1
  501. package/lib/feature-libraries/optional-field/requiredField.js +5 -1
  502. package/lib/feature-libraries/optional-field/requiredField.js.map +1 -1
  503. package/lib/feature-libraries/sequence-field/compose.d.ts +6 -7
  504. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  505. package/lib/feature-libraries/sequence-field/compose.js +83 -261
  506. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  507. package/lib/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
  508. package/lib/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  509. package/lib/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  510. package/lib/feature-libraries/sequence-field/invert.d.ts +3 -3
  511. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  512. package/lib/feature-libraries/sequence-field/invert.js +67 -169
  513. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  514. package/lib/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  515. package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  516. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  517. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
  518. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  519. package/lib/feature-libraries/sequence-field/moveEffectTable.js +6 -84
  520. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  521. package/lib/feature-libraries/sequence-field/rebase.d.ts +3 -3
  522. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  523. package/lib/feature-libraries/sequence-field/rebase.js +111 -118
  524. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  525. package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  526. package/lib/feature-libraries/sequence-field/replaceRevisions.js +19 -32
  527. package/lib/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  528. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  529. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +2 -3
  530. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  531. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
  532. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  533. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +379 -182
  534. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  535. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  536. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js +21 -63
  537. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  538. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  539. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  540. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +13 -13
  541. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  542. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
  543. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  544. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +16 -111
  545. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  546. package/lib/feature-libraries/sequence-field/types.d.ts +37 -74
  547. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  548. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  549. package/lib/feature-libraries/sequence-field/utils.d.ts +20 -25
  550. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  551. package/lib/feature-libraries/sequence-field/utils.js +155 -313
  552. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  553. package/lib/packageVersion.d.ts +1 -1
  554. package/lib/packageVersion.d.ts.map +1 -1
  555. package/lib/packageVersion.js +1 -1
  556. package/lib/packageVersion.js.map +1 -1
  557. package/lib/shared-tree/independentView.d.ts.map +1 -1
  558. package/lib/shared-tree/independentView.js +1 -1
  559. package/lib/shared-tree/independentView.js.map +1 -1
  560. package/lib/shared-tree/index.d.ts +1 -1
  561. package/lib/shared-tree/index.d.ts.map +1 -1
  562. package/lib/shared-tree/index.js.map +1 -1
  563. package/lib/shared-tree/schematizeTree.d.ts +4 -4
  564. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  565. package/lib/shared-tree/schematizeTree.js +3 -2
  566. package/lib/shared-tree/schematizeTree.js.map +1 -1
  567. package/lib/shared-tree/schematizingTreeView.d.ts +1 -5
  568. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  569. package/lib/shared-tree/schematizingTreeView.js +24 -38
  570. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  571. package/lib/shared-tree/sharedTree.d.ts +9 -3
  572. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  573. package/lib/shared-tree/sharedTree.js +4 -1
  574. package/lib/shared-tree/sharedTree.js.map +1 -1
  575. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +1 -0
  576. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  577. package/lib/shared-tree/sharedTreeChangeCodecs.js +8 -0
  578. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  579. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +4 -4
  580. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  581. package/lib/shared-tree/sharedTreeChangeFamily.js +3 -3
  582. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  583. package/lib/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
  584. package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  585. package/lib/shared-tree/sharedTreeEditBuilder.js +12 -6
  586. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  587. package/lib/shared-tree/treeCheckout.d.ts +13 -11
  588. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  589. package/lib/shared-tree/treeCheckout.js +59 -9
  590. package/lib/shared-tree/treeCheckout.js.map +1 -1
  591. package/lib/shared-tree-core/branch.d.ts +3 -2
  592. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  593. package/lib/shared-tree-core/branch.js +4 -3
  594. package/lib/shared-tree-core/branch.js.map +1 -1
  595. package/lib/shared-tree-core/editManager.d.ts +2 -2
  596. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  597. package/lib/shared-tree-core/editManager.js +9 -9
  598. package/lib/shared-tree-core/editManager.js.map +1 -1
  599. package/lib/shared-tree-core/editManagerCodecs.d.ts +4 -0
  600. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  601. package/lib/shared-tree-core/editManagerCodecs.js +8 -1
  602. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  603. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +1 -0
  604. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  605. package/lib/shared-tree-core/editManagerFormatCommons.js +6 -0
  606. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  607. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  608. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  609. package/lib/shared-tree-core/editManagerFormatV1toV4.js +1 -0
  610. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  611. package/lib/shared-tree-core/index.d.ts +2 -2
  612. package/lib/shared-tree-core/index.d.ts.map +1 -1
  613. package/lib/shared-tree-core/index.js +2 -2
  614. package/lib/shared-tree-core/index.js.map +1 -1
  615. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  616. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  617. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  618. package/lib/shared-tree-core/messageCodecs.d.ts +4 -0
  619. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  620. package/lib/shared-tree-core/messageCodecs.js +8 -1
  621. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  622. package/lib/shared-tree-core/messageFormat.d.ts +1 -0
  623. package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
  624. package/lib/shared-tree-core/messageFormat.js +6 -0
  625. package/lib/shared-tree-core/messageFormat.js.map +1 -1
  626. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
  627. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  628. package/lib/shared-tree-core/messageFormatV1ToV4.js +1 -0
  629. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  630. package/lib/shared-tree-core/sharedTreeCore.d.ts +1 -0
  631. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  632. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  633. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  634. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +16 -12
  635. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  636. package/lib/simple-tree/core/unhydratedFlexTree.js +58 -8
  637. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  638. package/lib/simple-tree/fieldSchema.d.ts +4 -4
  639. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  640. package/lib/simple-tree/fieldSchema.js.map +1 -1
  641. package/lib/simple-tree/index.d.ts +2 -2
  642. package/lib/simple-tree/index.d.ts.map +1 -1
  643. package/lib/simple-tree/index.js +1 -1
  644. package/lib/simple-tree/index.js.map +1 -1
  645. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  646. package/lib/simple-tree/node-kinds/array/arrayNode.js +6 -4
  647. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  648. package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
  649. package/lib/simple-tree/node-kinds/common.js +2 -2
  650. package/lib/simple-tree/node-kinds/common.js.map +1 -1
  651. package/lib/simple-tree/node-kinds/map/mapNode.js +2 -2
  652. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  653. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  654. package/lib/simple-tree/node-kinds/object/objectNode.js +20 -20
  655. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  656. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  657. package/lib/simple-tree/node-kinds/record/recordNode.js +4 -2
  658. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  659. package/lib/simple-tree/prepareForInsertion.d.ts +54 -47
  660. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  661. package/lib/simple-tree/prepareForInsertion.js +184 -125
  662. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  663. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +8 -3
  664. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  665. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +23 -10
  666. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  667. package/lib/treeFactory.d.ts.map +1 -1
  668. package/lib/treeFactory.js +13 -3
  669. package/lib/treeFactory.js.map +1 -1
  670. package/lib/util/index.d.ts +1 -1
  671. package/lib/util/index.d.ts.map +1 -1
  672. package/lib/util/index.js +1 -1
  673. package/lib/util/index.js.map +1 -1
  674. package/lib/util/rangeMap.d.ts +23 -11
  675. package/lib/util/rangeMap.d.ts.map +1 -1
  676. package/lib/util/rangeMap.js +41 -9
  677. package/lib/util/rangeMap.js.map +1 -1
  678. package/package.json +21 -21
  679. package/src/core/change-family/changeFamily.ts +5 -0
  680. package/src/core/change-family/index.ts +1 -0
  681. package/src/core/index.ts +4 -1
  682. package/src/core/rebase/changeRebaser.ts +6 -1
  683. package/src/core/rebase/index.ts +1 -0
  684. package/src/core/rebase/types.ts +4 -0
  685. package/src/core/rebase/utils.ts +31 -7
  686. package/src/core/tree/delta.ts +6 -0
  687. package/src/core/tree/detachedFieldIndex.ts +29 -1
  688. package/src/core/tree/detachedFieldIndexTypes.ts +5 -0
  689. package/src/core/tree/index.ts +13 -12
  690. package/src/core/tree/pathTree.ts +16 -4
  691. package/src/core/tree/visitDelta.ts +31 -11
  692. package/src/feature-libraries/changeAtomIdBTree.ts +28 -3
  693. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +369 -127
  694. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +13 -4
  695. package/src/feature-libraries/default-schema/index.ts +16 -5
  696. package/src/feature-libraries/default-schema/locationBasedEditBuilder.ts +231 -0
  697. package/src/feature-libraries/default-schema/mappedEditBuilder.ts +35 -9
  698. package/src/feature-libraries/deltaUtils.ts +6 -1
  699. package/src/feature-libraries/flex-tree/context.ts +17 -0
  700. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +7 -8
  701. package/src/feature-libraries/flex-tree/lazyField.ts +65 -24
  702. package/src/feature-libraries/index.ts +22 -9
  703. package/src/feature-libraries/mitigatedChangeFamily.ts +3 -1
  704. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +144 -47
  705. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +113 -58
  706. package/src/feature-libraries/modular-schema/genericFieldKind.ts +7 -18
  707. package/src/feature-libraries/modular-schema/index.ts +16 -16
  708. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +623 -348
  709. package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +1 -0
  710. package/src/feature-libraries/modular-schema/modularChangeCodecV3.ts +649 -0
  711. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +14 -0
  712. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +2694 -748
  713. package/src/feature-libraries/modular-schema/modularChangeFormatV1.ts +1 -0
  714. package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +1 -1
  715. package/src/feature-libraries/modular-schema/modularChangeFormatV3.ts +67 -0
  716. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +62 -10
  717. package/src/feature-libraries/optional-field/optionalField.ts +359 -568
  718. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV3.ts +45 -0
  719. package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +31 -35
  720. package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +89 -35
  721. package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +94 -0
  722. package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -1
  723. package/src/feature-libraries/optional-field/requiredField.ts +15 -2
  724. package/src/feature-libraries/sequence-field/compose.ts +137 -522
  725. package/src/feature-libraries/sequence-field/helperTypes.ts +34 -19
  726. package/src/feature-libraries/sequence-field/invert.ts +102 -228
  727. package/src/feature-libraries/sequence-field/markQueue.ts +2 -2
  728. package/src/feature-libraries/sequence-field/moveEffectTable.ts +8 -195
  729. package/src/feature-libraries/sequence-field/rebase.ts +171 -207
  730. package/src/feature-libraries/sequence-field/replaceRevisions.ts +26 -52
  731. package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +8 -3
  732. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +677 -229
  733. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +56 -70
  734. package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +28 -30
  735. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +21 -131
  736. package/src/feature-libraries/sequence-field/types.ts +40 -79
  737. package/src/feature-libraries/sequence-field/utils.ts +211 -370
  738. package/src/packageVersion.ts +1 -1
  739. package/src/shared-tree/independentView.ts +12 -6
  740. package/src/shared-tree/index.ts +3 -2
  741. package/src/shared-tree/schematizeTree.ts +21 -8
  742. package/src/shared-tree/schematizingTreeView.ts +38 -68
  743. package/src/shared-tree/sharedTree.ts +30 -15
  744. package/src/shared-tree/sharedTreeChangeCodecs.ts +8 -0
  745. package/src/shared-tree/sharedTreeChangeFamily.ts +7 -4
  746. package/src/shared-tree/sharedTreeEditBuilder.ts +43 -8
  747. package/src/shared-tree/treeCheckout.ts +93 -17
  748. package/src/shared-tree-core/branch.ts +8 -2
  749. package/src/shared-tree-core/editManager.ts +16 -2
  750. package/src/shared-tree-core/editManagerCodecs.ts +11 -1
  751. package/src/shared-tree-core/editManagerFormatCommons.ts +6 -0
  752. package/src/shared-tree-core/editManagerFormatV1toV4.ts +3 -1
  753. package/src/shared-tree-core/index.ts +2 -0
  754. package/src/shared-tree-core/messageCodecV1ToV4.ts +2 -1
  755. package/src/shared-tree-core/messageCodecs.ts +11 -1
  756. package/src/shared-tree-core/messageFormat.ts +6 -0
  757. package/src/shared-tree-core/messageFormatV1ToV4.ts +3 -1
  758. package/src/shared-tree-core/sharedTreeCore.ts +4 -1
  759. package/src/simple-tree/core/unhydratedFlexTree.ts +82 -35
  760. package/src/simple-tree/fieldSchema.ts +6 -4
  761. package/src/simple-tree/index.ts +2 -1
  762. package/src/simple-tree/node-kinds/array/arrayNode.ts +7 -5
  763. package/src/simple-tree/node-kinds/common.ts +2 -5
  764. package/src/simple-tree/node-kinds/map/mapNode.ts +4 -4
  765. package/src/simple-tree/node-kinds/object/objectNode.ts +26 -26
  766. package/src/simple-tree/node-kinds/record/recordNode.ts +10 -9
  767. package/src/simple-tree/prepareForInsertion.ts +342 -200
  768. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +35 -15
  769. package/src/treeFactory.ts +16 -4
  770. package/src/util/index.ts +3 -0
  771. package/src/util/rangeMap.ts +68 -26
  772. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
  773. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
  774. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -50
  775. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
  776. package/docs/main/sequence-field/move-composition.md +0 -46
  777. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
  778. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
  779. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -46
  780. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
  781. package/src/feature-libraries/sequence-field/relevantRemovedRoots.ts +0 -57
@@ -7,27 +7,17 @@ import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import {
9
9
  type ChangeAtomId,
10
- type ChangeAtomIdMap,
11
10
  type ChangesetLocalId,
12
- type DeltaDetachedNodeChanges,
13
- type DeltaDetachedNodeId,
11
+ type DeltaFieldChanges,
14
12
  type DeltaMark,
15
13
  Multiplicity,
16
14
  type RevisionReplacer,
17
15
  type RevisionTag,
18
- areEqualChangeAtomIds,
16
+ areEqualChangeAtomIdOpts,
19
17
  forbiddenFieldKindIdentifier,
20
18
  makeChangeAtomId,
21
- taggedAtomId,
22
19
  } from "../../core/index.js";
23
- import {
24
- type IdAllocator,
25
- type Mutable,
26
- SizedNestedMap,
27
- deleteFromNestedMap,
28
- setInNestedMap,
29
- tryGetFromNestedMap,
30
- } from "../../util/index.js";
20
+ import type { IdAllocator, Mutable } from "../../util/index.js";
31
21
  import { nodeIdFromChangeAtom } from "../deltaUtils.js";
32
22
  import {
33
23
  optionalIdentifier,
@@ -41,398 +31,172 @@ import {
41
31
  type NodeChangeComposer,
42
32
  type NodeChangePruner,
43
33
  type NodeChangeRebaser,
44
- NodeAttachState,
45
34
  type NodeId,
46
- type RelevantRemovedRootsFromChild,
47
35
  type ToDelta,
48
36
  type NestedChangesIndices,
49
- type FieldChangeDelta,
37
+ type RebaseNodeManager,
38
+ type ComposeNodeManager,
39
+ type InvertNodeManager,
40
+ type CrossFieldKeyRange,
41
+ NodeMoveType,
42
+ type RebaseVersion,
43
+ type RebaseRevisionMetadata,
50
44
  FlexFieldKind,
51
45
  } from "../modular-schema/index.js";
52
46
 
53
- import type {
54
- ChildChange,
55
- Move,
56
- OptionalChangeset,
57
- RegisterId,
58
- Replace,
59
- } from "./optionalFieldChangeTypes.js";
47
+ import type { OptionalChangeset, Replace } from "./optionalFieldChangeTypes.js";
60
48
  import { makeOptionalFieldCodecFamily } from "./optionalFieldCodecs.js";
61
49
 
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
- }
71
-
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
- }
86
-
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);
92
- }
93
- }
94
-
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
- }
110
-
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
- }
122
- }
123
- }
124
-
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]);
140
- } else {
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]);
147
- }
148
- }
149
-
150
- return entries;
151
- }
152
- public get size(): number {
153
- return this.nestedMapData.size;
154
- }
155
- }
156
-
157
50
  export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
158
- compose: (
159
- change1: OptionalChangeset,
160
- change2: OptionalChangeset,
161
- composeChild: NodeChangeComposer,
162
- ): OptionalChangeset => {
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
- }
185
-
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
- }
203
-
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);
215
- }
216
-
217
- for (const [id, childChange2] of childChanges2ByOriginalId.entries()) {
218
- composedChildChanges.push([id, composeChild(undefined, childChange2)]);
219
- }
220
-
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]);
232
- }
233
- }
234
-
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]);
240
- }
241
- }
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
-
51
+ compose,
274
52
  invert: (
275
53
  change: OptionalChangeset,
276
54
  isRollback: boolean,
277
55
  genId: IdAllocator<ChangesetLocalId>,
278
56
  revision: RevisionTag | undefined,
57
+ nodeManager: InvertNodeManager,
279
58
  ): OptionalChangeset => {
280
- const { moves, childChanges, valueReplace } = change;
59
+ const inverted: Mutable<OptionalChangeset> = {};
60
+ const detachId = getEffectiveDetachId(change);
281
61
 
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");
295
- }
62
+ if (detachId !== undefined) {
63
+ const attachIdForInverse = isRollback
64
+ ? detachId
65
+ : makeChangeAtomId(detachId.localId, revision);
66
+
67
+ nodeManager.invertDetach(detachId, 1, change.childChange, attachIdForInverse);
68
+
69
+ inverted.valueReplace = {
70
+ isEmpty: change.valueReplace?.src === undefined,
71
+ dst: makeChangeAtomId(genId.allocate(), revision),
72
+ src: attachIdForInverse,
73
+ };
296
74
  }
297
75
 
298
- const inverted: Mutable<OptionalChangeset> = {
299
- moves: invertedMoves,
300
- childChanges: childChanges.map(([id, childChange]) => {
301
- return [invertIdMap.get(id) ?? id, childChange];
302
- }),
303
- };
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
+ );
304
84
 
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
- };
85
+ if (attachEntry.value?.nodeChange !== undefined) {
86
+ inverted.childChange = attachEntry.value.nodeChange;
87
+ }
88
+
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 };
94
+ } else {
95
+ (inverted.valueReplace as Mutable<Replace>).dst = detachIdForInverse;
329
96
  }
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;
330
100
  }
101
+
331
102
  return inverted;
332
103
  },
333
104
 
334
105
  rebase: (
335
- change: OptionalChangeset,
106
+ newChange: OptionalChangeset,
336
107
  overChange: OptionalChangeset,
337
108
  rebaseChild: NodeChangeRebaser,
109
+ _genId: IdAllocator,
110
+ nodeManager: RebaseNodeManager,
111
+ _metadata: RebaseRevisionMetadata,
112
+ rebaseVersion: RebaseVersion,
338
113
  ): OptionalChangeset => {
339
- const { moves, childChanges, valueReplace: field } = change;
114
+ const rebased: Mutable<OptionalChangeset> = {};
340
115
 
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);
116
+ const rebasedChild = rebaseChild(newChange.childChange, overChange.childChange);
117
+ const overDetach = getEffectiveDetachId(overChange);
344
118
 
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");
356
- }
357
- }
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);
358
123
 
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]);
124
+ if (overDetach !== undefined) {
125
+ const nodeDetach = hasNodeDetachTreatedAsClear ? undefined : newChange.nodeDetach;
126
+ nodeManager.rebaseOverDetach(overDetach, 1, nodeDetach, rebasedChild);
363
127
  }
364
128
 
365
- const overChildChangesBySrc = new RegisterMap<NodeId>();
366
- for (const [id, childChange] of overChange.childChanges) {
367
- overChildChangesBySrc.set(id, childChange);
368
- }
129
+ const overAttach = overChange.valueReplace?.src;
130
+ if (overAttach !== undefined) {
131
+ const movedChangeEntry = nodeManager.getNewChangesForBaseAttach(overAttach, 1).value;
369
132
 
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);
133
+ if (movedChangeEntry?.nodeChange !== undefined) {
134
+ rebased.childChange = movedChangeEntry.nodeChange;
375
135
  }
376
136
 
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]);
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);
143
+ }
144
+ }
145
+ } else if (overDetach === undefined) {
146
+ // `overChange` did not change which node is in the field.
147
+ if (rebasedChild !== undefined) {
148
+ rebased.childChange = rebasedChild;
385
149
  }
386
- }
387
150
 
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]);
151
+ if (newChange.nodeDetach !== undefined) {
152
+ rebased.nodeDetach = newChange.nodeDetach;
397
153
  }
398
154
  }
399
155
 
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,
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,
412
162
  };
413
- if (field.src !== undefined) {
414
- replace.src = forwardMap.get(field.src) ?? field.src;
163
+
164
+ if (newChange.valueReplace?.src !== undefined) {
165
+ valueReplace.src = newChange.valueReplace.src;
415
166
  }
416
- rebased.valueReplace = replace;
167
+
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;
174
+
175
+ rebased.valueReplace = { ...newChange.valueReplace, isEmpty };
417
176
  }
418
177
 
178
+ const detachId = getEffectiveDetachId(newChange);
179
+ const rebasedDetachId = getEffectiveDetachId(rebased);
180
+
181
+ if (!areEqualChangeAtomIdOpts(detachId, rebasedDetachId)) {
182
+ if (detachId !== undefined) {
183
+ nodeManager.removeDetach(detachId, 1);
184
+ }
185
+ if (rebasedDetachId !== undefined) {
186
+ nodeManager.addDetach(rebasedDetachId, 1);
187
+ }
188
+ }
419
189
  return rebased;
420
190
  },
421
191
 
422
192
  prune: (change: OptionalChangeset, pruneChild: NodeChangePruner): OptionalChangeset => {
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
- }
193
+ const prunedChange: Mutable<OptionalChangeset> = { ...change };
431
194
 
432
- for (const [id, childChange] of change.childChanges) {
433
- const prunedChildChange = pruneChild(childChange);
434
- if (prunedChildChange !== undefined) {
435
- childChanges.push([id, prunedChildChange]);
195
+ delete prunedChange.childChange;
196
+ if (change.childChange !== undefined) {
197
+ const childChange = pruneChild(change.childChange);
198
+ if (childChange !== undefined) {
199
+ prunedChange.childChange = childChange;
436
200
  }
437
201
  }
438
202
 
@@ -443,154 +207,213 @@ export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
443
207
  change: OptionalChangeset,
444
208
  replacer: RevisionReplacer,
445
209
  ): OptionalChangeset => {
446
- const valueReplace = replaceReplaceRevisions(change.valueReplace, replacer);
210
+ const updated: Mutable<OptionalChangeset> = {};
447
211
 
448
- const childChanges: ChildChange[] = [];
449
- for (const [id, childChange] of change.childChanges) {
450
- childChanges.push([
451
- replaceRegisterRevisions(id, replacer),
452
- replacer.getUpdatedAtomId(childChange),
453
- ]);
454
- }
212
+ const valueReplace = replaceReplaceRevisions(change.valueReplace, replacer);
455
213
 
456
- const moves: Move[] = [];
457
- for (const [src, dst] of change.moves) {
458
- moves.push([replacer.getUpdatedAtomId(src), replacer.getUpdatedAtomId(dst)]);
214
+ if (change.childChange !== undefined) {
215
+ updated.childChange = replacer.getUpdatedAtomId(change.childChange);
459
216
  }
460
217
 
461
- const updated: Mutable<OptionalChangeset> = { childChanges, moves };
462
218
  if (valueReplace !== undefined) {
463
219
  updated.valueReplace = valueReplace;
464
220
  }
465
221
 
222
+ if (change.nodeDetach !== undefined) {
223
+ updated.nodeDetach = replacer.getUpdatedAtomId(change.nodeDetach);
224
+ }
225
+
466
226
  return updated;
467
227
  },
468
228
 
469
229
  mute: (change: OptionalChangeset): OptionalChangeset => {
470
- return { childChanges: change.childChanges, moves: [] };
230
+ return { childChange: change.childChange };
471
231
  },
472
232
  };
473
233
 
474
- function replaceReplaceRevisions(
475
- replace: Replace | undefined,
476
- replacer: RevisionReplacer,
477
- ): Replace | undefined {
478
- if (replace === undefined) {
479
- return undefined;
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);
480
244
  }
481
245
 
482
- const updated: Mutable<Replace> = {
483
- ...replace,
484
- dst: replacer.getUpdatedAtomId(replace.dst),
485
- };
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
+ );
486
254
 
487
- if (replace.src !== undefined) {
488
- updated.src = replaceRegisterRevisions(replace.src, replacer);
255
+ sendNewChildChanges(change1, change2, nodeManager);
256
+
257
+ if (
258
+ change1.nodeDetach !== undefined &&
259
+ areEqualChangeAtomIdOpts(change1.nodeDetach, change2.valueReplace?.src)
260
+ ) {
261
+ nodeManager.composeDetachAttach(change1.nodeDetach, change1.nodeDetach, 1, true);
489
262
  }
490
263
 
491
- return updated;
264
+ return makeChangeset(composedReplace, composedDetach, composedChildChange);
492
265
  }
493
266
 
494
- function replaceRegisterRevisions(
495
- register: RegisterId,
496
- replacer: RevisionReplacer,
497
- ): RegisterId {
498
- return register === "self" ? register : replacer.getUpdatedAtomId(register);
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;
499
291
  }
500
292
 
501
- function getComposedReplaceDst(
502
- change1: Replace | undefined,
293
+ function composeReplaces(
294
+ change1: OptionalChangeset,
503
295
  change2: OptionalChangeset,
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);
296
+ ): Replace | undefined {
297
+ const firstReplace = change1.valueReplace ?? change2.valueReplace;
298
+ if (firstReplace === undefined) {
299
+ return undefined;
509
300
  }
510
301
 
511
- if (
512
- dst1 === undefined ||
513
- change1?.src === "self" ||
514
- (change2.valueReplace.src !== undefined &&
515
- areEqualRegisterIds(change2.valueReplace.src, dst1))
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
516
309
  ) {
517
- assert(
518
- change2.valueReplace !== undefined,
519
- 0x8cf /* Both replace replaces should not be undefined */,
520
- );
521
- return change2.valueReplace.dst;
522
- } else {
523
- return getIdAfterMoves(dst1, change2.moves);
310
+ replace.src = change1.valueReplace.src;
524
311
  }
312
+
313
+ return replace;
525
314
  }
526
315
 
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
- }
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,
334
+ );
532
335
  }
533
- return id;
534
336
  }
535
337
 
536
- function areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {
537
- return id1 === "self" || id2 === "self" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);
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);
367
+ }
368
+ return composedChildChange;
538
369
  }
539
370
 
540
- function areEqualRegisterIdsOpt(
541
- id1: RegisterId | undefined,
542
- id2: RegisterId | undefined,
543
- ): boolean {
544
- if (id1 === undefined || id2 === undefined) {
545
- return id1 === id2;
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;
546
379
  }
547
- return areEqualRegisterIds(id1, id2);
548
- }
549
380
 
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);
381
+ if (nodeDetach !== undefined) {
382
+ changeset.nodeDetach = nodeDetach;
559
383
  }
560
- return { srcToDst, dstToSrc };
561
- }
562
384
 
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;
385
+ if (childChange !== undefined) {
386
+ changeset.childChange = childChange;
578
387
  }
579
- return !replace.isEmpty || replace.src !== undefined;
388
+ return changeset;
580
389
  }
581
390
 
582
- function getEffectfulDst(replace: Replace | undefined): ChangeAtomId | undefined {
583
- return replace === undefined || replace.isEmpty || replace.src === "self"
584
- ? undefined
585
- : replace.dst;
391
+ function replaceReplaceRevisions(
392
+ replace: Replace | undefined,
393
+ replacer: RevisionReplacer,
394
+ ): Replace | undefined {
395
+ if (replace === undefined) {
396
+ return undefined;
397
+ }
398
+
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);
406
+ }
407
+
408
+ return updated;
586
409
  }
587
410
 
588
- export function taggedRegister(id: RegisterId, revision: RevisionTag | undefined): RegisterId {
589
- if (id === "self") {
590
- return id;
411
+ function getEffectiveDetachId(change: OptionalChangeset): ChangeAtomId | undefined {
412
+ if (change.nodeDetach !== undefined) {
413
+ return change.nodeDetach;
591
414
  }
592
415
 
593
- return taggedAtomId(id, revision);
416
+ return change.valueReplace?.isEmpty === false ? change.valueReplace.dst : undefined;
594
417
  }
595
418
 
596
419
  export interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {
@@ -599,121 +422,97 @@ export interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {
599
422
  * with new content.
600
423
  * The content in the field will be moved to the `ids.detach` register.
601
424
  * The content in the `ids.detach` register will be moved to into the field.
602
- * @param wasEmpty - whether the field is empty when creating this change
603
- * @param ids - the "fill" and "detach" ids associated with the change.
425
+ * @param isEmpty - whether the field is empty when creating this change
426
+ * @param ids - the ids associated with the change.
604
427
  */
605
428
  set(
606
- wasEmpty: boolean,
429
+ isEmpty: boolean,
607
430
  ids: {
431
+ /** The ID of the node to attach in the field. */
608
432
  fill: ChangeAtomId;
433
+ /** The ID to assign to whichever node (if any) is detached from the field when the change applies. */
609
434
  detach: ChangeAtomId;
610
435
  },
611
436
  ): OptionalChangeset;
612
437
 
613
438
  /**
614
439
  * Creates a change which clears the field's contents (if any).
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.
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.
617
442
  */
618
- clear(wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;
443
+ clear(isEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;
619
444
  }
620
445
 
621
446
  export const optionalFieldEditor: OptionalFieldEditor = {
622
447
  set: (
623
- wasEmpty: boolean,
448
+ isEmpty: boolean,
624
449
  ids: {
625
450
  fill: ChangeAtomId;
626
- // Should be interpreted as a set of an empty field if undefined.
627
451
  detach: ChangeAtomId;
628
452
  },
629
453
  ): OptionalChangeset => ({
630
- moves: [],
631
- childChanges: [],
632
454
  valueReplace: {
633
- isEmpty: wasEmpty,
455
+ isEmpty,
634
456
  src: ids.fill,
635
457
  dst: ids.detach,
636
458
  },
637
459
  }),
638
460
 
639
- clear: (wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({
640
- moves: [],
641
- childChanges: [],
461
+ clear: (isEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({
642
462
  valueReplace: {
643
- isEmpty: wasEmpty,
463
+ isEmpty,
644
464
  dst: detachId,
645
465
  },
646
466
  }),
647
467
 
648
468
  buildChildChanges: (changes: Iterable<[number, NodeId]>): OptionalChangeset => {
649
- const childChanges: ChildChange[] = Array.from(changes, ([index, childChange]) => {
469
+ const childChanges: NodeId[] = Array.from(changes, ([index, child]) => {
650
470
  assert(index === 0, 0x404 /* Optional fields only support a single child node */);
651
- return ["self", childChange];
471
+ return child;
652
472
  });
653
473
  assert(
654
474
  childChanges.length <= 1,
655
475
  0xabd /* Optional fields only support a single child node */,
656
476
  );
657
- return {
658
- moves: [],
659
- childChanges,
660
- };
477
+
478
+ const childChange = childChanges[0];
479
+ return childChange === undefined ? {} : { childChange };
661
480
  },
662
481
  };
663
482
 
664
483
  export function optionalFieldIntoDelta(
665
484
  change: OptionalChangeset,
666
485
  deltaFromChild: ToDelta,
667
- ): FieldChangeDelta {
668
- const delta: Mutable<FieldChangeDelta> = {};
486
+ ): DeltaFieldChanges {
487
+ return optionalOrRequiredFieldIntoDelta(true, change, deltaFromChild);
488
+ }
669
489
 
490
+ export function optionalOrRequiredFieldIntoDelta(
491
+ allowReattach: boolean,
492
+ change: OptionalChangeset,
493
+ deltaFromChild: ToDelta,
494
+ ): DeltaFieldChanges {
670
495
  let markIsANoop = true;
671
496
  const mark: Mutable<DeltaMark> = { count: 1 };
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
- }
497
+ const detachId = getEffectiveDetachId(change);
498
+ const attachId = change.valueReplace?.src;
499
+ if (!areEqualChangeAtomIdOpts(detachId, attachId)) {
680
500
  markIsANoop = false;
681
- }
682
501
 
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
- }
502
+ if (detachId !== undefined) {
503
+ mark.detach = nodeIdFromChangeAtom(detachId);
705
504
  }
706
-
707
- if (globals.length > 0) {
708
- delta.global = globals;
505
+ if (attachId !== undefined) {
506
+ mark.attach = nodeIdFromChangeAtom(attachId);
709
507
  }
710
508
  }
711
509
 
712
- if (!markIsANoop) {
713
- delta.local = { marks: [mark] };
510
+ if (change.childChange !== undefined) {
511
+ mark.fields = deltaFromChild(change.childChange);
512
+ markIsANoop = false;
714
513
  }
715
514
 
716
- return delta;
515
+ return { marks: markIsANoop ? [] : [mark], allowReattach };
717
516
  }
718
517
 
719
518
  export const optionalChangeHandler: FieldChangeHandler<
@@ -725,71 +524,63 @@ export const optionalChangeHandler: FieldChangeHandler<
725
524
  editor: optionalFieldEditor,
726
525
 
727
526
  intoDelta: optionalFieldIntoDelta,
728
- relevantRemovedRoots,
729
527
 
730
528
  isEmpty: (change: OptionalChangeset) =>
731
- change.childChanges.length === 0 &&
732
- change.moves.length === 0 &&
733
- change.valueReplace === undefined,
529
+ change.childChange === undefined &&
530
+ change.valueReplace === undefined &&
531
+ change.nodeDetach === undefined,
734
532
 
735
533
  getNestedChanges,
736
534
 
737
- createEmpty: () => ({ moves: [], childChanges: [] }),
738
- getCrossFieldKeys: (_change) => [],
535
+ createEmpty: () => ({}),
536
+ getCrossFieldKeys,
537
+ getDetachCellIds: (_change) => [],
739
538
  };
740
539
 
741
- function getNestedChanges(change: OptionalChangeset): NestedChangesIndices {
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
- });
764
- }
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
+ }
765
548
 
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
- }
549
+ const detachId = getEffectiveDetachId(change);
550
+
551
+ if (detachId !== undefined) {
552
+ keys.push({ key: { ...detachId, target: NodeMoveType.Detach }, count: 1 });
777
553
  }
778
554
 
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);
555
+ return keys;
556
+ }
557
+
558
+ function getNestedChanges(change: OptionalChangeset): NestedChangesIndices {
559
+ if (change.childChange === undefined) {
560
+ return [];
787
561
  }
788
562
 
789
- const selfSrc = change.valueReplace?.src;
790
- if (selfSrc !== undefined && selfSrc !== "self" && !alreadyYielded.has(selfSrc)) {
791
- yield nodeIdFromChangeAtom(selfSrc);
563
+ return [[change.childChange, 0]];
564
+ }
565
+
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);
792
574
  }
575
+
576
+ return detachId ?? attachId;
577
+ }
578
+
579
+ function isPin(change: OptionalChangeset): boolean {
580
+ return (
581
+ change.nodeDetach !== undefined &&
582
+ areEqualChangeAtomIdOpts(change.nodeDetach, change.valueReplace?.src)
583
+ );
793
584
  }
794
585
 
795
586
  interface Optional