@fluidframework/tree 2.73.0 → 2.74.0-368706

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 (1294) hide show
  1. package/.vscode/settings.json +2 -2
  2. package/api-report/tree.alpha.api.md +133 -85
  3. package/api-report/tree.beta.api.md +0 -1
  4. package/api-report/tree.legacy.beta.api.md +0 -1
  5. package/api-report/tree.legacy.public.api.md +0 -1
  6. package/api-report/tree.public.api.md +0 -1
  7. package/dist/alpha.d.ts +7 -2
  8. package/dist/codec/codec.d.ts +14 -1
  9. package/dist/codec/codec.d.ts.map +1 -1
  10. package/dist/codec/codec.js +11 -0
  11. package/dist/codec/codec.js.map +1 -1
  12. package/dist/codec/versioned/codec.d.ts +1 -1
  13. package/dist/codec/versioned/codec.d.ts.map +1 -1
  14. package/dist/codec/versioned/codec.js.map +1 -1
  15. package/dist/codec/versioned/format.d.ts +4 -1
  16. package/dist/codec/versioned/format.d.ts.map +1 -1
  17. package/dist/codec/versioned/format.js +4 -1
  18. package/dist/codec/versioned/format.js.map +1 -1
  19. package/dist/core/change-family/changeFamily.d.ts +4 -1
  20. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  21. package/dist/core/change-family/changeFamily.js.map +1 -1
  22. package/dist/core/change-family/index.d.ts +1 -1
  23. package/dist/core/change-family/index.d.ts.map +1 -1
  24. package/dist/core/change-family/index.js.map +1 -1
  25. package/dist/core/index.d.ts +3 -3
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/index.js +7 -4
  28. package/dist/core/index.js.map +1 -1
  29. package/dist/core/rebase/changeRebaser.d.ts +6 -1
  30. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  31. package/dist/core/rebase/changeRebaser.js.map +1 -1
  32. package/dist/core/rebase/index.d.ts +1 -1
  33. package/dist/core/rebase/index.d.ts.map +1 -1
  34. package/dist/core/rebase/index.js +2 -1
  35. package/dist/core/rebase/index.js.map +1 -1
  36. package/dist/core/rebase/types.d.ts +2 -1
  37. package/dist/core/rebase/types.d.ts.map +1 -1
  38. package/dist/core/rebase/types.js +5 -1
  39. package/dist/core/rebase/types.js.map +1 -1
  40. package/dist/core/rebase/utils.d.ts.map +1 -1
  41. package/dist/core/rebase/utils.js +25 -7
  42. package/dist/core/rebase/utils.js.map +1 -1
  43. package/dist/core/tree/detachedFieldIndex.d.ts +40 -13
  44. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  45. package/dist/core/tree/detachedFieldIndex.js +21 -12
  46. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  47. package/dist/core/tree/index.d.ts +4 -3
  48. package/dist/core/tree/index.d.ts.map +1 -1
  49. package/dist/core/tree/index.js +6 -2
  50. package/dist/core/tree/index.js.map +1 -1
  51. package/dist/core/tree/pathTree.d.ts +11 -3
  52. package/dist/core/tree/pathTree.d.ts.map +1 -1
  53. package/dist/core/tree/pathTree.js +14 -2
  54. package/dist/core/tree/pathTree.js.map +1 -1
  55. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/basicChunk.js +7 -0
  57. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  59. package/dist/feature-libraries/chunked-forest/chunkTree.js +4 -1
  60. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  61. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -2
  62. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/codec/codecs.js +1 -1
  64. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  65. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +15 -7
  66. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -1
  67. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -1
  68. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +7 -2
  69. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  70. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +90 -42
  71. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  72. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +234 -69
  73. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  74. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -4
  75. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  76. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +33 -28
  77. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  78. package/dist/feature-libraries/default-schema/index.d.ts +2 -1
  79. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  80. package/dist/feature-libraries/default-schema/index.js +4 -2
  81. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  82. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +36 -0
  83. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
  84. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js +126 -0
  85. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
  86. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
  87. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  88. package/dist/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
  89. package/dist/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  90. package/dist/feature-libraries/deltaUtils.d.ts +1 -0
  91. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  92. package/dist/feature-libraries/deltaUtils.js +6 -1
  93. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  94. package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts +30 -8
  95. package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
  96. package/dist/feature-libraries/detachedFieldIndexSummarizer.js +41 -11
  97. package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  98. package/dist/feature-libraries/flex-tree/context.d.ts +9 -0
  99. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  100. package/dist/feature-libraries/flex-tree/context.js +6 -0
  101. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  102. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  103. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  104. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  105. package/dist/feature-libraries/flex-tree/lazyField.d.ts +8 -7
  106. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  107. package/dist/feature-libraries/flex-tree/lazyField.js +37 -8
  108. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  109. package/dist/feature-libraries/forest-summary/codec.d.ts +2 -2
  110. package/dist/feature-libraries/forest-summary/codec.d.ts.map +1 -1
  111. package/dist/feature-libraries/forest-summary/codec.js +4 -4
  112. package/dist/feature-libraries/forest-summary/codec.js.map +1 -1
  113. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +9 -13
  114. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  115. package/dist/feature-libraries/forest-summary/forestSummarizer.js +22 -27
  116. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  117. package/dist/feature-libraries/forest-summary/format.d.ts +41 -5
  118. package/dist/feature-libraries/forest-summary/format.d.ts.map +1 -1
  119. package/dist/feature-libraries/forest-summary/format.js +7 -7
  120. package/dist/feature-libraries/forest-summary/format.js.map +1 -1
  121. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +11 -9
  122. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  123. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +16 -29
  124. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  125. package/dist/feature-libraries/forest-summary/index.d.ts +2 -1
  126. package/dist/feature-libraries/forest-summary/index.d.ts.map +1 -1
  127. package/dist/feature-libraries/forest-summary/index.js +3 -2
  128. package/dist/feature-libraries/forest-summary/index.js.map +1 -1
  129. package/dist/feature-libraries/forest-summary/summaryTypes.d.ts +47 -0
  130. package/dist/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -0
  131. package/dist/feature-libraries/forest-summary/summaryTypes.js +57 -0
  132. package/dist/feature-libraries/forest-summary/summaryTypes.js.map +1 -0
  133. package/dist/feature-libraries/index.d.ts +5 -5
  134. package/dist/feature-libraries/index.d.ts.map +1 -1
  135. package/dist/feature-libraries/index.js +7 -4
  136. package/dist/feature-libraries/index.js.map +1 -1
  137. package/dist/feature-libraries/mapTreeCursor.d.ts.map +1 -1
  138. package/dist/feature-libraries/mapTreeCursor.js +1 -0
  139. package/dist/feature-libraries/mapTreeCursor.js.map +1 -1
  140. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  141. package/dist/feature-libraries/mitigatedChangeFamily.js +2 -2
  142. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  143. package/dist/feature-libraries/modular-schema/comparison.d.ts +18 -2
  144. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  145. package/dist/feature-libraries/modular-schema/comparison.js +54 -3
  146. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  147. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +97 -21
  148. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  149. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +4 -7
  150. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  151. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +20 -52
  152. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  153. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  154. package/dist/feature-libraries/modular-schema/fieldKind.d.ts +25 -13
  155. package/dist/feature-libraries/modular-schema/fieldKind.d.ts.map +1 -1
  156. package/dist/feature-libraries/modular-schema/fieldKind.js +0 -21
  157. package/dist/feature-libraries/modular-schema/fieldKind.js.map +1 -1
  158. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  159. package/dist/feature-libraries/modular-schema/genericFieldKind.js +7 -10
  160. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  161. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.js +2 -2
  162. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
  163. package/dist/feature-libraries/modular-schema/index.d.ts +5 -5
  164. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  165. package/dist/feature-libraries/modular-schema/index.js +12 -8
  166. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  167. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +17 -0
  168. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -0
  169. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +388 -0
  170. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -0
  171. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +17 -0
  172. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -0
  173. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js +413 -0
  174. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -0
  175. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +4 -4
  176. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  177. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -284
  178. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  179. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +48 -15
  180. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  181. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +1298 -465
  182. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  183. package/dist/feature-libraries/modular-schema/{modularChangeFormat.d.ts → modularChangeFormatV1.d.ts} +2 -2
  184. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -0
  185. package/dist/feature-libraries/modular-schema/{modularChangeFormat.js → modularChangeFormatV1.js} +5 -5
  186. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -0
  187. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +146 -0
  188. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -0
  189. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +32 -0
  190. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -0
  191. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +50 -10
  192. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  193. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +24 -3
  194. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  195. package/dist/feature-libraries/optional-field/index.d.ts +2 -2
  196. package/dist/feature-libraries/optional-field/index.d.ts.map +1 -1
  197. package/dist/feature-libraries/optional-field/index.js +1 -2
  198. package/dist/feature-libraries/optional-field/index.js.map +1 -1
  199. package/dist/feature-libraries/optional-field/optionalField.d.ts +5 -26
  200. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  201. package/dist/feature-libraries/optional-field/optionalField.js +217 -451
  202. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  203. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +24 -33
  204. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  205. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  206. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  207. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  208. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js +57 -28
  209. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  210. package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts +27 -8
  211. package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
  212. package/dist/feature-libraries/schema-index/schemaSummarizer.js +42 -16
  213. package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  214. package/dist/feature-libraries/sequence-field/compose.d.ts +6 -7
  215. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  216. package/dist/feature-libraries/sequence-field/compose.js +80 -256
  217. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  218. package/dist/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  219. package/dist/feature-libraries/sequence-field/formatV2.js +1 -0
  220. package/dist/feature-libraries/sequence-field/formatV2.js.map +1 -1
  221. package/dist/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
  222. package/dist/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  223. package/dist/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  224. package/dist/feature-libraries/sequence-field/index.d.ts +2 -3
  225. package/dist/feature-libraries/sequence-field/index.d.ts.map +1 -1
  226. package/dist/feature-libraries/sequence-field/index.js +1 -3
  227. package/dist/feature-libraries/sequence-field/index.js.map +1 -1
  228. package/dist/feature-libraries/sequence-field/invert.d.ts +3 -3
  229. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  230. package/dist/feature-libraries/sequence-field/invert.js +65 -167
  231. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  232. package/dist/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  233. package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  234. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  235. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
  236. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  237. package/dist/feature-libraries/sequence-field/moveEffectTable.js +7 -86
  238. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  239. package/dist/feature-libraries/sequence-field/rebase.d.ts +3 -3
  240. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  241. package/dist/feature-libraries/sequence-field/rebase.js +106 -112
  242. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  243. package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  244. package/dist/feature-libraries/sequence-field/replaceRevisions.js +16 -33
  245. package/dist/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  246. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  247. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +0 -2
  248. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  249. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
  250. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  251. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +358 -179
  252. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  253. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  254. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js +20 -60
  255. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  256. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  257. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  258. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +10 -10
  259. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  260. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
  261. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  262. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +14 -109
  263. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  264. package/dist/feature-libraries/sequence-field/types.d.ts +30 -59
  265. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  266. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  267. package/dist/feature-libraries/sequence-field/utils.d.ts +15 -24
  268. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  269. package/dist/feature-libraries/sequence-field/utils.js +111 -299
  270. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  271. package/dist/feature-libraries/treeCompressionUtils.d.ts +2 -12
  272. package/dist/feature-libraries/treeCompressionUtils.d.ts.map +1 -1
  273. package/dist/feature-libraries/treeCompressionUtils.js +4 -14
  274. package/dist/feature-libraries/treeCompressionUtils.js.map +1 -1
  275. package/dist/index.d.ts +3 -3
  276. package/dist/index.d.ts.map +1 -1
  277. package/dist/index.js +6 -3
  278. package/dist/index.js.map +1 -1
  279. package/dist/packageVersion.d.ts +1 -1
  280. package/dist/packageVersion.d.ts.map +1 -1
  281. package/dist/packageVersion.js +1 -1
  282. package/dist/packageVersion.js.map +1 -1
  283. package/dist/shared-tree/independentView.d.ts +1 -1
  284. package/dist/shared-tree/independentView.d.ts.map +1 -1
  285. package/dist/shared-tree/independentView.js.map +1 -1
  286. package/dist/shared-tree/index.d.ts +1 -1
  287. package/dist/shared-tree/index.d.ts.map +1 -1
  288. package/dist/shared-tree/index.js.map +1 -1
  289. package/dist/shared-tree/schematizeTree.d.ts +4 -4
  290. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  291. package/dist/shared-tree/schematizeTree.js +2 -1
  292. package/dist/shared-tree/schematizeTree.js.map +1 -1
  293. package/dist/shared-tree/schematizingTreeView.d.ts +1 -5
  294. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  295. package/dist/shared-tree/schematizingTreeView.js +32 -33
  296. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  297. package/dist/shared-tree/sharedTree.d.ts +18 -15
  298. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  299. package/dist/shared-tree/sharedTree.js +15 -4
  300. package/dist/shared-tree/sharedTree.js.map +1 -1
  301. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +1 -1
  302. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  303. package/dist/shared-tree/sharedTreeChangeCodecs.js +1 -0
  304. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  305. package/dist/shared-tree/sharedTreeChangeEnricher.d.ts +20 -8
  306. package/dist/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
  307. package/dist/shared-tree/sharedTreeChangeEnricher.js +25 -11
  308. package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  309. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +6 -6
  310. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  311. package/dist/shared-tree/sharedTreeChangeFamily.js +2 -2
  312. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  313. package/dist/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
  314. package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  315. package/dist/shared-tree/sharedTreeEditBuilder.js +13 -6
  316. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  317. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  318. package/dist/shared-tree/treeAlpha.js +1 -1
  319. package/dist/shared-tree/treeAlpha.js.map +1 -1
  320. package/dist/shared-tree/treeCheckout.d.ts +14 -12
  321. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  322. package/dist/shared-tree/treeCheckout.js +66 -17
  323. package/dist/shared-tree/treeCheckout.js.map +1 -1
  324. package/dist/shared-tree-core/branch.d.ts +3 -2
  325. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  326. package/dist/shared-tree-core/branch.js +4 -3
  327. package/dist/shared-tree-core/branch.js.map +1 -1
  328. package/dist/shared-tree-core/editManager.d.ts +2 -2
  329. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  330. package/dist/shared-tree-core/editManager.js +9 -9
  331. package/dist/shared-tree-core/editManager.js.map +1 -1
  332. package/dist/shared-tree-core/editManagerCodecs.d.ts +4 -0
  333. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  334. package/dist/shared-tree-core/editManagerCodecs.js +16 -6
  335. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  336. package/{lib/shared-tree-core/editManagerCodecsV5.d.ts → dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts} +3 -3
  337. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -0
  338. package/dist/shared-tree-core/{editManagerCodecsV5.js → editManagerCodecsVSharedBranches.js} +7 -7
  339. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -0
  340. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +20 -6
  341. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  342. package/dist/shared-tree-core/editManagerFormatCommons.js +22 -7
  343. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  344. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  345. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  346. package/dist/shared-tree-core/editManagerFormatV1toV4.js +1 -0
  347. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  348. package/dist/shared-tree-core/{editManagerFormatV5.d.ts → editManagerFormatVSharedBranches.d.ts} +3 -3
  349. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -0
  350. package/dist/shared-tree-core/{editManagerFormatV5.js → editManagerFormatVSharedBranches.js} +2 -2
  351. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -0
  352. package/dist/shared-tree-core/editManagerSummarizer.d.ts +29 -9
  353. package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  354. package/dist/shared-tree-core/editManagerSummarizer.js +41 -13
  355. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  356. package/dist/shared-tree-core/index.d.ts +5 -3
  357. package/dist/shared-tree-core/index.d.ts.map +1 -1
  358. package/dist/shared-tree-core/index.js +8 -1
  359. package/dist/shared-tree-core/index.js.map +1 -1
  360. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  361. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  362. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  363. package/{lib/shared-tree-core/messageCodecV5.d.ts → dist/shared-tree-core/messageCodecVSharedBranches.d.ts} +2 -2
  364. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -0
  365. package/dist/shared-tree-core/{messageCodecV5.js → messageCodecVSharedBranches.js} +6 -6
  366. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -0
  367. package/dist/shared-tree-core/messageCodecs.d.ts +4 -0
  368. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  369. package/dist/shared-tree-core/messageCodecs.js +16 -6
  370. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  371. package/dist/shared-tree-core/messageFormat.d.ts +20 -6
  372. package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
  373. package/dist/shared-tree-core/messageFormat.js +22 -7
  374. package/dist/shared-tree-core/messageFormat.js.map +1 -1
  375. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +3 -2
  376. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  377. package/dist/shared-tree-core/messageFormatV1ToV4.js +8 -1
  378. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  379. package/dist/shared-tree-core/{messageFormatV5.d.ts → messageFormatVSharedBranches.d.ts} +5 -7
  380. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -0
  381. package/dist/shared-tree-core/{messageFormatV5.js → messageFormatVSharedBranches.js} +3 -2
  382. package/dist/shared-tree-core/messageFormatVSharedBranches.js.map +1 -0
  383. package/dist/shared-tree-core/sharedTreeCore.d.ts +14 -47
  384. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  385. package/dist/shared-tree-core/sharedTreeCore.js +30 -18
  386. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  387. package/dist/shared-tree-core/summaryTypes.d.ts +94 -0
  388. package/dist/shared-tree-core/summaryTypes.d.ts.map +1 -0
  389. package/dist/shared-tree-core/summaryTypes.js +47 -0
  390. package/dist/shared-tree-core/summaryTypes.js.map +1 -0
  391. package/dist/shared-tree-core/versionedSummarizer.d.ts +67 -0
  392. package/dist/shared-tree-core/versionedSummarizer.d.ts.map +1 -0
  393. package/dist/shared-tree-core/versionedSummarizer.js +63 -0
  394. package/dist/shared-tree-core/versionedSummarizer.js.map +1 -0
  395. package/dist/simple-tree/api/configuration.d.ts +3 -26
  396. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  397. package/dist/simple-tree/api/configuration.js +10 -21
  398. package/dist/simple-tree/api/configuration.js.map +1 -1
  399. package/dist/simple-tree/api/dirtyIndex.d.ts +11 -0
  400. package/dist/simple-tree/api/dirtyIndex.d.ts.map +1 -1
  401. package/dist/simple-tree/api/dirtyIndex.js +7 -0
  402. package/dist/simple-tree/api/dirtyIndex.js.map +1 -1
  403. package/dist/simple-tree/api/discrepancies.d.ts +1 -1
  404. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
  405. package/dist/simple-tree/api/discrepancies.js.map +1 -1
  406. package/dist/simple-tree/api/getSimpleSchema.d.ts +3 -3
  407. package/dist/simple-tree/api/getSimpleSchema.d.ts.map +1 -1
  408. package/dist/simple-tree/api/getSimpleSchema.js +9 -3
  409. package/dist/simple-tree/api/getSimpleSchema.js.map +1 -1
  410. package/dist/simple-tree/api/incrementalAllowedTypes.d.ts +16 -13
  411. package/dist/simple-tree/api/incrementalAllowedTypes.d.ts.map +1 -1
  412. package/dist/simple-tree/api/incrementalAllowedTypes.js +24 -14
  413. package/dist/simple-tree/api/incrementalAllowedTypes.js.map +1 -1
  414. package/dist/simple-tree/api/index.d.ts +4 -5
  415. package/dist/simple-tree/api/index.d.ts.map +1 -1
  416. package/dist/simple-tree/api/index.js +5 -6
  417. package/dist/simple-tree/api/index.js.map +1 -1
  418. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +1 -1
  419. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  420. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  421. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +5 -5
  422. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  423. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  424. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  425. package/dist/simple-tree/api/schemaFactoryRecursive.js +0 -1
  426. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  427. package/dist/simple-tree/api/schemaFromSimple.d.ts +6 -1
  428. package/dist/simple-tree/api/schemaFromSimple.d.ts.map +1 -1
  429. package/dist/simple-tree/api/schemaFromSimple.js +5 -0
  430. package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
  431. package/dist/simple-tree/api/schemaStatics.d.ts +12 -12
  432. package/dist/simple-tree/api/simpleSchemaCodec.d.ts +15 -3
  433. package/dist/simple-tree/api/simpleSchemaCodec.d.ts.map +1 -1
  434. package/dist/simple-tree/api/simpleSchemaCodec.js +18 -6
  435. package/dist/simple-tree/api/simpleSchemaCodec.js.map +1 -1
  436. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts +1 -1
  437. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  438. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  439. package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts +8 -1
  440. package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts.map +1 -1
  441. package/dist/simple-tree/api/snapshotCompatibilityChecker.js +13 -8
  442. package/dist/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  443. package/dist/simple-tree/api/tree.d.ts +1 -1
  444. package/dist/simple-tree/api/tree.js.map +1 -1
  445. package/dist/simple-tree/api/typesUnsafe.d.ts +3 -3
  446. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  447. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  448. package/dist/simple-tree/core/allowedTypes.d.ts +2 -2
  449. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  450. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  451. package/dist/simple-tree/core/index.d.ts +1 -1
  452. package/dist/simple-tree/core/index.d.ts.map +1 -1
  453. package/dist/simple-tree/core/index.js +2 -3
  454. package/dist/simple-tree/core/index.js.map +1 -1
  455. package/dist/simple-tree/core/toStored.d.ts +17 -15
  456. package/dist/simple-tree/core/toStored.d.ts.map +1 -1
  457. package/dist/simple-tree/core/toStored.js +5 -40
  458. package/dist/simple-tree/core/toStored.js.map +1 -1
  459. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  460. package/dist/simple-tree/core/treeNodeKernel.js +1 -0
  461. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  462. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +15 -15
  463. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  464. package/dist/simple-tree/core/unhydratedFlexTree.js +59 -8
  465. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  466. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  467. package/dist/simple-tree/core/walkSchema.js +4 -0
  468. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  469. package/dist/simple-tree/createContext.d.ts.map +1 -1
  470. package/dist/simple-tree/createContext.js +20 -5
  471. package/dist/simple-tree/createContext.js.map +1 -1
  472. package/dist/simple-tree/fieldSchema.d.ts +7 -7
  473. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  474. package/dist/simple-tree/fieldSchema.js.map +1 -1
  475. package/dist/simple-tree/index.d.ts +8 -7
  476. package/dist/simple-tree/index.d.ts.map +1 -1
  477. package/dist/simple-tree/index.js +16 -13
  478. package/dist/simple-tree/index.js.map +1 -1
  479. package/dist/simple-tree/leafNodeSchema.d.ts +5 -5
  480. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  481. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  482. package/dist/simple-tree/node-kinds/array/arrayNode.js +6 -3
  483. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  484. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
  485. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
  486. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
  487. package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
  488. package/dist/simple-tree/node-kinds/common.js +1 -1
  489. package/dist/simple-tree/node-kinds/common.js.map +1 -1
  490. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  491. package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
  492. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  493. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
  494. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  495. package/dist/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  496. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  497. package/dist/simple-tree/node-kinds/object/objectNode.js +19 -18
  498. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  499. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +2 -2
  500. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  501. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  502. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  503. package/dist/simple-tree/node-kinds/record/recordNode.js +4 -2
  504. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  505. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +3 -3
  506. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
  507. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
  508. package/dist/simple-tree/prepareForInsertion.d.ts +54 -47
  509. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  510. package/dist/simple-tree/prepareForInsertion.js +183 -125
  511. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  512. package/dist/simple-tree/simpleSchema.d.ts +55 -23
  513. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  514. package/dist/simple-tree/simpleSchema.js +17 -0
  515. package/dist/simple-tree/simpleSchema.js.map +1 -1
  516. package/dist/simple-tree/simpleSchemaFormatV1.d.ts +1 -1
  517. package/dist/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
  518. package/dist/simple-tree/simpleSchemaFormatV1.js +8 -1
  519. package/dist/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  520. package/dist/simple-tree/toStoredSchema.d.ts +58 -11
  521. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  522. package/dist/simple-tree/toStoredSchema.js +205 -30
  523. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  524. package/dist/simple-tree/treeSchema.d.ts +23 -0
  525. package/dist/simple-tree/treeSchema.d.ts.map +1 -0
  526. package/dist/simple-tree/treeSchema.js +25 -0
  527. package/dist/simple-tree/treeSchema.js.map +1 -0
  528. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +13 -4
  529. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  530. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +29 -11
  531. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  532. package/dist/tableSchema.d.ts +117 -63
  533. package/dist/tableSchema.d.ts.map +1 -1
  534. package/dist/tableSchema.js +159 -58
  535. package/dist/tableSchema.js.map +1 -1
  536. package/dist/treeFactory.d.ts +5 -0
  537. package/dist/treeFactory.d.ts.map +1 -1
  538. package/dist/treeFactory.js +29 -8
  539. package/dist/treeFactory.js.map +1 -1
  540. package/dist/util/breakable.js +3 -3
  541. package/dist/util/breakable.js.map +1 -1
  542. package/dist/util/index.d.ts +2 -1
  543. package/dist/util/index.d.ts.map +1 -1
  544. package/dist/util/index.js +4 -1
  545. package/dist/util/index.js.map +1 -1
  546. package/dist/util/rangeMap.d.ts +24 -12
  547. package/dist/util/rangeMap.d.ts.map +1 -1
  548. package/dist/util/rangeMap.js +46 -6
  549. package/dist/util/rangeMap.js.map +1 -1
  550. package/dist/util/readSnapshotBlob.d.ts +13 -0
  551. package/dist/util/readSnapshotBlob.d.ts.map +1 -0
  552. package/dist/util/readSnapshotBlob.js +18 -0
  553. package/dist/util/readSnapshotBlob.js.map +1 -0
  554. package/dist/util/typeCheckTests.d.ts.map +1 -1
  555. package/dist/util/typeCheckTests.js.map +1 -1
  556. package/lib/alpha.d.ts +7 -2
  557. package/lib/codec/codec.d.ts +14 -1
  558. package/lib/codec/codec.d.ts.map +1 -1
  559. package/lib/codec/codec.js +11 -0
  560. package/lib/codec/codec.js.map +1 -1
  561. package/lib/codec/versioned/codec.d.ts +1 -1
  562. package/lib/codec/versioned/codec.d.ts.map +1 -1
  563. package/lib/codec/versioned/codec.js.map +1 -1
  564. package/lib/codec/versioned/format.d.ts +4 -1
  565. package/lib/codec/versioned/format.d.ts.map +1 -1
  566. package/lib/codec/versioned/format.js +4 -1
  567. package/lib/codec/versioned/format.js.map +1 -1
  568. package/lib/core/change-family/changeFamily.d.ts +4 -1
  569. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  570. package/lib/core/change-family/changeFamily.js.map +1 -1
  571. package/lib/core/change-family/index.d.ts +1 -1
  572. package/lib/core/change-family/index.d.ts.map +1 -1
  573. package/lib/core/change-family/index.js.map +1 -1
  574. package/lib/core/index.d.ts +3 -3
  575. package/lib/core/index.d.ts.map +1 -1
  576. package/lib/core/index.js +2 -2
  577. package/lib/core/index.js.map +1 -1
  578. package/lib/core/rebase/changeRebaser.d.ts +6 -1
  579. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  580. package/lib/core/rebase/changeRebaser.js.map +1 -1
  581. package/lib/core/rebase/index.d.ts +1 -1
  582. package/lib/core/rebase/index.d.ts.map +1 -1
  583. package/lib/core/rebase/index.js +1 -1
  584. package/lib/core/rebase/index.js.map +1 -1
  585. package/lib/core/rebase/types.d.ts +2 -1
  586. package/lib/core/rebase/types.d.ts.map +1 -1
  587. package/lib/core/rebase/types.js +3 -0
  588. package/lib/core/rebase/types.js.map +1 -1
  589. package/lib/core/rebase/utils.d.ts.map +1 -1
  590. package/lib/core/rebase/utils.js +25 -7
  591. package/lib/core/rebase/utils.js.map +1 -1
  592. package/lib/core/tree/detachedFieldIndex.d.ts +40 -13
  593. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  594. package/lib/core/tree/detachedFieldIndex.js +22 -13
  595. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  596. package/lib/core/tree/index.d.ts +4 -3
  597. package/lib/core/tree/index.d.ts.map +1 -1
  598. package/lib/core/tree/index.js +3 -2
  599. package/lib/core/tree/index.js.map +1 -1
  600. package/lib/core/tree/pathTree.d.ts +11 -3
  601. package/lib/core/tree/pathTree.d.ts.map +1 -1
  602. package/lib/core/tree/pathTree.js +12 -1
  603. package/lib/core/tree/pathTree.js.map +1 -1
  604. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  605. package/lib/feature-libraries/chunked-forest/basicChunk.js +8 -1
  606. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  607. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  608. package/lib/feature-libraries/chunked-forest/chunkTree.js +4 -1
  609. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  610. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -2
  611. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  612. package/lib/feature-libraries/chunked-forest/codec/codecs.js +2 -2
  613. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  614. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +15 -7
  615. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -1
  616. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -1
  617. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +7 -2
  618. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  619. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +90 -42
  620. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  621. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +232 -69
  622. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  623. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -4
  624. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  625. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +34 -29
  626. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  627. package/lib/feature-libraries/default-schema/index.d.ts +2 -1
  628. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  629. package/lib/feature-libraries/default-schema/index.js +2 -1
  630. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  631. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +36 -0
  632. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
  633. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js +122 -0
  634. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
  635. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
  636. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  637. package/lib/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
  638. package/lib/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  639. package/lib/feature-libraries/deltaUtils.d.ts +1 -0
  640. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  641. package/lib/feature-libraries/deltaUtils.js +5 -1
  642. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  643. package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts +30 -8
  644. package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
  645. package/lib/feature-libraries/detachedFieldIndexSummarizer.js +38 -8
  646. package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  647. package/lib/feature-libraries/flex-tree/context.d.ts +9 -0
  648. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  649. package/lib/feature-libraries/flex-tree/context.js +6 -0
  650. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  651. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  652. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  653. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  654. package/lib/feature-libraries/flex-tree/lazyField.d.ts +8 -7
  655. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  656. package/lib/feature-libraries/flex-tree/lazyField.js +38 -9
  657. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  658. package/lib/feature-libraries/forest-summary/codec.d.ts +2 -2
  659. package/lib/feature-libraries/forest-summary/codec.d.ts.map +1 -1
  660. package/lib/feature-libraries/forest-summary/codec.js +5 -5
  661. package/lib/feature-libraries/forest-summary/codec.js.map +1 -1
  662. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +9 -13
  663. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  664. package/lib/feature-libraries/forest-summary/forestSummarizer.js +19 -24
  665. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  666. package/lib/feature-libraries/forest-summary/format.d.ts +41 -5
  667. package/lib/feature-libraries/forest-summary/format.d.ts.map +1 -1
  668. package/lib/feature-libraries/forest-summary/format.js +3 -3
  669. package/lib/feature-libraries/forest-summary/format.js.map +1 -1
  670. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +11 -9
  671. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  672. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +13 -26
  673. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  674. package/lib/feature-libraries/forest-summary/index.d.ts +2 -1
  675. package/lib/feature-libraries/forest-summary/index.d.ts.map +1 -1
  676. package/lib/feature-libraries/forest-summary/index.js +2 -1
  677. package/lib/feature-libraries/forest-summary/index.js.map +1 -1
  678. package/lib/feature-libraries/forest-summary/summaryTypes.d.ts +47 -0
  679. package/lib/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -0
  680. package/lib/feature-libraries/forest-summary/summaryTypes.js +53 -0
  681. package/lib/feature-libraries/forest-summary/summaryTypes.js.map +1 -0
  682. package/lib/feature-libraries/index.d.ts +5 -5
  683. package/lib/feature-libraries/index.d.ts.map +1 -1
  684. package/lib/feature-libraries/index.js +4 -4
  685. package/lib/feature-libraries/index.js.map +1 -1
  686. package/lib/feature-libraries/mapTreeCursor.d.ts.map +1 -1
  687. package/lib/feature-libraries/mapTreeCursor.js +2 -1
  688. package/lib/feature-libraries/mapTreeCursor.js.map +1 -1
  689. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  690. package/lib/feature-libraries/mitigatedChangeFamily.js +2 -2
  691. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  692. package/lib/feature-libraries/modular-schema/comparison.d.ts +18 -2
  693. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  694. package/lib/feature-libraries/modular-schema/comparison.js +55 -5
  695. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  696. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +97 -21
  697. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  698. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +3 -5
  699. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  700. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +20 -52
  701. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  702. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  703. package/lib/feature-libraries/modular-schema/fieldKind.d.ts +25 -13
  704. package/lib/feature-libraries/modular-schema/fieldKind.d.ts.map +1 -1
  705. package/lib/feature-libraries/modular-schema/fieldKind.js +0 -21
  706. package/lib/feature-libraries/modular-schema/fieldKind.js.map +1 -1
  707. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  708. package/lib/feature-libraries/modular-schema/genericFieldKind.js +7 -10
  709. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  710. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.js +1 -1
  711. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
  712. package/lib/feature-libraries/modular-schema/index.d.ts +5 -5
  713. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  714. package/lib/feature-libraries/modular-schema/index.js +4 -3
  715. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  716. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +17 -0
  717. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -0
  718. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +384 -0
  719. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -0
  720. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +17 -0
  721. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -0
  722. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js +409 -0
  723. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -0
  724. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +4 -4
  725. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  726. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +10 -286
  727. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  728. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +48 -15
  729. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  730. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +1284 -458
  731. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  732. package/lib/feature-libraries/modular-schema/{modularChangeFormat.d.ts → modularChangeFormatV1.d.ts} +2 -2
  733. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -0
  734. package/lib/feature-libraries/modular-schema/{modularChangeFormat.js → modularChangeFormatV1.js} +2 -2
  735. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -0
  736. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +146 -0
  737. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -0
  738. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +29 -0
  739. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -0
  740. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +50 -10
  741. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  742. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +20 -2
  743. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  744. package/lib/feature-libraries/optional-field/index.d.ts +2 -2
  745. package/lib/feature-libraries/optional-field/index.d.ts.map +1 -1
  746. package/lib/feature-libraries/optional-field/index.js +1 -1
  747. package/lib/feature-libraries/optional-field/index.js.map +1 -1
  748. package/lib/feature-libraries/optional-field/optionalField.d.ts +5 -26
  749. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  750. package/lib/feature-libraries/optional-field/optionalField.js +217 -449
  751. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  752. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +24 -33
  753. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  754. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  755. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  756. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  757. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js +55 -26
  758. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  759. package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts +27 -8
  760. package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
  761. package/lib/feature-libraries/schema-index/schemaSummarizer.js +38 -12
  762. package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  763. package/lib/feature-libraries/sequence-field/compose.d.ts +6 -7
  764. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  765. package/lib/feature-libraries/sequence-field/compose.js +82 -258
  766. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  767. package/lib/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  768. package/lib/feature-libraries/sequence-field/formatV2.js +1 -0
  769. package/lib/feature-libraries/sequence-field/formatV2.js.map +1 -1
  770. package/lib/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
  771. package/lib/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  772. package/lib/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  773. package/lib/feature-libraries/sequence-field/index.d.ts +2 -3
  774. package/lib/feature-libraries/sequence-field/index.d.ts.map +1 -1
  775. package/lib/feature-libraries/sequence-field/index.js +0 -1
  776. package/lib/feature-libraries/sequence-field/index.js.map +1 -1
  777. package/lib/feature-libraries/sequence-field/invert.d.ts +3 -3
  778. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  779. package/lib/feature-libraries/sequence-field/invert.js +67 -169
  780. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  781. package/lib/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  782. package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  783. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  784. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
  785. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  786. package/lib/feature-libraries/sequence-field/moveEffectTable.js +6 -80
  787. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  788. package/lib/feature-libraries/sequence-field/rebase.d.ts +3 -3
  789. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  790. package/lib/feature-libraries/sequence-field/rebase.js +108 -114
  791. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  792. package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  793. package/lib/feature-libraries/sequence-field/replaceRevisions.js +16 -33
  794. package/lib/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  795. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  796. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +0 -2
  797. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  798. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
  799. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  800. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +350 -175
  801. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  802. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  803. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js +21 -61
  804. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  805. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  806. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  807. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +10 -10
  808. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  809. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
  810. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  811. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +14 -109
  812. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  813. package/lib/feature-libraries/sequence-field/types.d.ts +30 -59
  814. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  815. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  816. package/lib/feature-libraries/sequence-field/utils.d.ts +15 -24
  817. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  818. package/lib/feature-libraries/sequence-field/utils.js +107 -292
  819. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  820. package/lib/feature-libraries/treeCompressionUtils.d.ts +2 -12
  821. package/lib/feature-libraries/treeCompressionUtils.d.ts.map +1 -1
  822. package/lib/feature-libraries/treeCompressionUtils.js +3 -13
  823. package/lib/feature-libraries/treeCompressionUtils.js.map +1 -1
  824. package/lib/index.d.ts +3 -3
  825. package/lib/index.d.ts.map +1 -1
  826. package/lib/index.js +2 -2
  827. package/lib/index.js.map +1 -1
  828. package/lib/packageVersion.d.ts +1 -1
  829. package/lib/packageVersion.d.ts.map +1 -1
  830. package/lib/packageVersion.js +1 -1
  831. package/lib/packageVersion.js.map +1 -1
  832. package/lib/shared-tree/independentView.d.ts +1 -1
  833. package/lib/shared-tree/independentView.d.ts.map +1 -1
  834. package/lib/shared-tree/independentView.js.map +1 -1
  835. package/lib/shared-tree/index.d.ts +1 -1
  836. package/lib/shared-tree/index.d.ts.map +1 -1
  837. package/lib/shared-tree/index.js.map +1 -1
  838. package/lib/shared-tree/schematizeTree.d.ts +4 -4
  839. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  840. package/lib/shared-tree/schematizeTree.js +3 -2
  841. package/lib/shared-tree/schematizeTree.js.map +1 -1
  842. package/lib/shared-tree/schematizingTreeView.d.ts +1 -5
  843. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  844. package/lib/shared-tree/schematizingTreeView.js +35 -36
  845. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  846. package/lib/shared-tree/sharedTree.d.ts +18 -15
  847. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  848. package/lib/shared-tree/sharedTree.js +15 -4
  849. package/lib/shared-tree/sharedTree.js.map +1 -1
  850. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +1 -1
  851. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  852. package/lib/shared-tree/sharedTreeChangeCodecs.js +1 -0
  853. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  854. package/lib/shared-tree/sharedTreeChangeEnricher.d.ts +20 -8
  855. package/lib/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
  856. package/lib/shared-tree/sharedTreeChangeEnricher.js +25 -11
  857. package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  858. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +6 -6
  859. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  860. package/lib/shared-tree/sharedTreeChangeFamily.js +3 -3
  861. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  862. package/lib/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
  863. package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  864. package/lib/shared-tree/sharedTreeEditBuilder.js +11 -5
  865. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  866. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  867. package/lib/shared-tree/treeAlpha.js +2 -2
  868. package/lib/shared-tree/treeAlpha.js.map +1 -1
  869. package/lib/shared-tree/treeCheckout.d.ts +14 -12
  870. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  871. package/lib/shared-tree/treeCheckout.js +69 -20
  872. package/lib/shared-tree/treeCheckout.js.map +1 -1
  873. package/lib/shared-tree-core/branch.d.ts +3 -2
  874. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  875. package/lib/shared-tree-core/branch.js +4 -3
  876. package/lib/shared-tree-core/branch.js.map +1 -1
  877. package/lib/shared-tree-core/editManager.d.ts +2 -2
  878. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  879. package/lib/shared-tree-core/editManager.js +9 -9
  880. package/lib/shared-tree-core/editManager.js.map +1 -1
  881. package/lib/shared-tree-core/editManagerCodecs.d.ts +4 -0
  882. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  883. package/lib/shared-tree-core/editManagerCodecs.js +14 -5
  884. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  885. package/{dist/shared-tree-core/editManagerCodecsV5.d.ts → lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts} +3 -3
  886. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -0
  887. package/lib/shared-tree-core/{editManagerCodecsV5.js → editManagerCodecsVSharedBranches.js} +4 -4
  888. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -0
  889. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +20 -6
  890. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  891. package/lib/shared-tree-core/editManagerFormatCommons.js +22 -7
  892. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  893. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  894. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  895. package/lib/shared-tree-core/editManagerFormatV1toV4.js +1 -0
  896. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  897. package/lib/shared-tree-core/{editManagerFormatV5.d.ts → editManagerFormatVSharedBranches.d.ts} +3 -3
  898. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -0
  899. package/lib/shared-tree-core/{editManagerFormatV5.js → editManagerFormatVSharedBranches.js} +2 -2
  900. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -0
  901. package/lib/shared-tree-core/editManagerSummarizer.d.ts +29 -9
  902. package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  903. package/lib/shared-tree-core/editManagerSummarizer.js +39 -11
  904. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  905. package/lib/shared-tree-core/index.d.ts +5 -3
  906. package/lib/shared-tree-core/index.d.ts.map +1 -1
  907. package/lib/shared-tree-core/index.js +4 -2
  908. package/lib/shared-tree-core/index.js.map +1 -1
  909. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  910. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  911. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  912. package/{dist/shared-tree-core/messageCodecV5.d.ts → lib/shared-tree-core/messageCodecVSharedBranches.d.ts} +2 -2
  913. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -0
  914. package/lib/shared-tree-core/{messageCodecV5.js → messageCodecVSharedBranches.js} +3 -3
  915. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -0
  916. package/lib/shared-tree-core/messageCodecs.d.ts +4 -0
  917. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  918. package/lib/shared-tree-core/messageCodecs.js +14 -5
  919. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  920. package/lib/shared-tree-core/messageFormat.d.ts +20 -6
  921. package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
  922. package/lib/shared-tree-core/messageFormat.js +22 -7
  923. package/lib/shared-tree-core/messageFormat.js.map +1 -1
  924. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +3 -2
  925. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  926. package/lib/shared-tree-core/messageFormatV1ToV4.js +8 -1
  927. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  928. package/lib/shared-tree-core/{messageFormatV5.d.ts → messageFormatVSharedBranches.d.ts} +5 -7
  929. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -0
  930. package/lib/shared-tree-core/{messageFormatV5.js → messageFormatVSharedBranches.js} +3 -2
  931. package/lib/shared-tree-core/messageFormatVSharedBranches.js.map +1 -0
  932. package/lib/shared-tree-core/sharedTreeCore.d.ts +14 -47
  933. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  934. package/lib/shared-tree-core/sharedTreeCore.js +28 -16
  935. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  936. package/lib/shared-tree-core/summaryTypes.d.ts +94 -0
  937. package/lib/shared-tree-core/summaryTypes.d.ts.map +1 -0
  938. package/lib/shared-tree-core/summaryTypes.js +43 -0
  939. package/lib/shared-tree-core/summaryTypes.js.map +1 -0
  940. package/lib/shared-tree-core/versionedSummarizer.d.ts +67 -0
  941. package/lib/shared-tree-core/versionedSummarizer.d.ts.map +1 -0
  942. package/lib/shared-tree-core/versionedSummarizer.js +59 -0
  943. package/lib/shared-tree-core/versionedSummarizer.js.map +1 -0
  944. package/lib/simple-tree/api/configuration.d.ts +3 -26
  945. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  946. package/lib/simple-tree/api/configuration.js +14 -25
  947. package/lib/simple-tree/api/configuration.js.map +1 -1
  948. package/lib/simple-tree/api/dirtyIndex.d.ts +11 -0
  949. package/lib/simple-tree/api/dirtyIndex.d.ts.map +1 -1
  950. package/lib/simple-tree/api/dirtyIndex.js +7 -0
  951. package/lib/simple-tree/api/dirtyIndex.js.map +1 -1
  952. package/lib/simple-tree/api/discrepancies.d.ts +1 -1
  953. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
  954. package/lib/simple-tree/api/discrepancies.js.map +1 -1
  955. package/lib/simple-tree/api/getSimpleSchema.d.ts +3 -3
  956. package/lib/simple-tree/api/getSimpleSchema.d.ts.map +1 -1
  957. package/lib/simple-tree/api/getSimpleSchema.js +9 -3
  958. package/lib/simple-tree/api/getSimpleSchema.js.map +1 -1
  959. package/lib/simple-tree/api/incrementalAllowedTypes.d.ts +16 -13
  960. package/lib/simple-tree/api/incrementalAllowedTypes.d.ts.map +1 -1
  961. package/lib/simple-tree/api/incrementalAllowedTypes.js +23 -13
  962. package/lib/simple-tree/api/incrementalAllowedTypes.js.map +1 -1
  963. package/lib/simple-tree/api/index.d.ts +4 -5
  964. package/lib/simple-tree/api/index.d.ts.map +1 -1
  965. package/lib/simple-tree/api/index.js +3 -4
  966. package/lib/simple-tree/api/index.js.map +1 -1
  967. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +1 -1
  968. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  969. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  970. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +5 -5
  971. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  972. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  973. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  974. package/lib/simple-tree/api/schemaFactoryRecursive.js +0 -1
  975. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  976. package/lib/simple-tree/api/schemaFromSimple.d.ts +6 -1
  977. package/lib/simple-tree/api/schemaFromSimple.d.ts.map +1 -1
  978. package/lib/simple-tree/api/schemaFromSimple.js +5 -0
  979. package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
  980. package/lib/simple-tree/api/schemaStatics.d.ts +12 -12
  981. package/lib/simple-tree/api/simpleSchemaCodec.d.ts +15 -3
  982. package/lib/simple-tree/api/simpleSchemaCodec.d.ts.map +1 -1
  983. package/lib/simple-tree/api/simpleSchemaCodec.js +15 -3
  984. package/lib/simple-tree/api/simpleSchemaCodec.js.map +1 -1
  985. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts +1 -1
  986. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  987. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  988. package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts +8 -1
  989. package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts.map +1 -1
  990. package/lib/simple-tree/api/snapshotCompatibilityChecker.js +15 -10
  991. package/lib/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  992. package/lib/simple-tree/api/tree.d.ts +1 -1
  993. package/lib/simple-tree/api/tree.js.map +1 -1
  994. package/lib/simple-tree/api/typesUnsafe.d.ts +3 -3
  995. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  996. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  997. package/lib/simple-tree/core/allowedTypes.d.ts +2 -2
  998. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  999. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  1000. package/lib/simple-tree/core/index.d.ts +1 -1
  1001. package/lib/simple-tree/core/index.d.ts.map +1 -1
  1002. package/lib/simple-tree/core/index.js +1 -1
  1003. package/lib/simple-tree/core/index.js.map +1 -1
  1004. package/lib/simple-tree/core/toStored.d.ts +17 -15
  1005. package/lib/simple-tree/core/toStored.d.ts.map +1 -1
  1006. package/lib/simple-tree/core/toStored.js +4 -37
  1007. package/lib/simple-tree/core/toStored.js.map +1 -1
  1008. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  1009. package/lib/simple-tree/core/treeNodeKernel.js +1 -0
  1010. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  1011. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +15 -15
  1012. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  1013. package/lib/simple-tree/core/unhydratedFlexTree.js +58 -8
  1014. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  1015. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  1016. package/lib/simple-tree/core/walkSchema.js +5 -1
  1017. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  1018. package/lib/simple-tree/createContext.d.ts.map +1 -1
  1019. package/lib/simple-tree/createContext.js +20 -5
  1020. package/lib/simple-tree/createContext.js.map +1 -1
  1021. package/lib/simple-tree/fieldSchema.d.ts +7 -7
  1022. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  1023. package/lib/simple-tree/fieldSchema.js.map +1 -1
  1024. package/lib/simple-tree/index.d.ts +8 -7
  1025. package/lib/simple-tree/index.d.ts.map +1 -1
  1026. package/lib/simple-tree/index.js +6 -5
  1027. package/lib/simple-tree/index.js.map +1 -1
  1028. package/lib/simple-tree/leafNodeSchema.d.ts +5 -5
  1029. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  1030. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  1031. package/lib/simple-tree/node-kinds/array/arrayNode.js +7 -4
  1032. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  1033. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
  1034. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
  1035. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
  1036. package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
  1037. package/lib/simple-tree/node-kinds/common.js +2 -2
  1038. package/lib/simple-tree/node-kinds/common.js.map +1 -1
  1039. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  1040. package/lib/simple-tree/node-kinds/map/mapNode.js +2 -2
  1041. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  1042. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
  1043. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  1044. package/lib/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  1045. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  1046. package/lib/simple-tree/node-kinds/object/objectNode.js +20 -19
  1047. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  1048. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +2 -2
  1049. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  1050. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  1051. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  1052. package/lib/simple-tree/node-kinds/record/recordNode.js +4 -2
  1053. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  1054. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +3 -3
  1055. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
  1056. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
  1057. package/lib/simple-tree/prepareForInsertion.d.ts +54 -47
  1058. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  1059. package/lib/simple-tree/prepareForInsertion.js +183 -124
  1060. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  1061. package/lib/simple-tree/simpleSchema.d.ts +55 -23
  1062. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  1063. package/lib/simple-tree/simpleSchema.js +16 -1
  1064. package/lib/simple-tree/simpleSchema.js.map +1 -1
  1065. package/lib/simple-tree/simpleSchemaFormatV1.d.ts +1 -1
  1066. package/lib/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
  1067. package/lib/simple-tree/simpleSchemaFormatV1.js +8 -1
  1068. package/lib/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  1069. package/lib/simple-tree/toStoredSchema.d.ts +58 -11
  1070. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  1071. package/lib/simple-tree/toStoredSchema.js +204 -31
  1072. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  1073. package/lib/simple-tree/treeSchema.d.ts +23 -0
  1074. package/lib/simple-tree/treeSchema.d.ts.map +1 -0
  1075. package/lib/simple-tree/treeSchema.js +21 -0
  1076. package/lib/simple-tree/treeSchema.js.map +1 -0
  1077. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +13 -4
  1078. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  1079. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +26 -9
  1080. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  1081. package/lib/tableSchema.d.ts +117 -63
  1082. package/lib/tableSchema.d.ts.map +1 -1
  1083. package/lib/tableSchema.js +160 -59
  1084. package/lib/tableSchema.js.map +1 -1
  1085. package/lib/treeFactory.d.ts +5 -0
  1086. package/lib/treeFactory.d.ts.map +1 -1
  1087. package/lib/treeFactory.js +28 -8
  1088. package/lib/treeFactory.js.map +1 -1
  1089. package/lib/util/breakable.js +3 -3
  1090. package/lib/util/breakable.js.map +1 -1
  1091. package/lib/util/index.d.ts +2 -1
  1092. package/lib/util/index.d.ts.map +1 -1
  1093. package/lib/util/index.js +2 -1
  1094. package/lib/util/index.js.map +1 -1
  1095. package/lib/util/rangeMap.d.ts +24 -12
  1096. package/lib/util/rangeMap.d.ts.map +1 -1
  1097. package/lib/util/rangeMap.js +44 -5
  1098. package/lib/util/rangeMap.js.map +1 -1
  1099. package/lib/util/readSnapshotBlob.d.ts +13 -0
  1100. package/lib/util/readSnapshotBlob.d.ts.map +1 -0
  1101. package/lib/util/readSnapshotBlob.js +14 -0
  1102. package/lib/util/readSnapshotBlob.js.map +1 -0
  1103. package/lib/util/typeCheckTests.d.ts.map +1 -1
  1104. package/lib/util/typeCheckTests.js.map +1 -1
  1105. package/package.json +22 -22
  1106. package/src/codec/codec.ts +15 -1
  1107. package/src/codec/versioned/codec.ts +1 -1
  1108. package/src/codec/versioned/format.ts +4 -1
  1109. package/src/core/change-family/changeFamily.ts +5 -0
  1110. package/src/core/change-family/index.ts +1 -0
  1111. package/src/core/index.ts +7 -2
  1112. package/src/core/rebase/changeRebaser.ts +6 -1
  1113. package/src/core/rebase/index.ts +1 -0
  1114. package/src/core/rebase/types.ts +8 -1
  1115. package/src/core/rebase/utils.ts +31 -7
  1116. package/src/core/tree/detachedFieldIndex.ts +71 -14
  1117. package/src/core/tree/index.ts +9 -3
  1118. package/src/core/tree/pathTree.ts +16 -4
  1119. package/src/feature-libraries/chunked-forest/basicChunk.ts +7 -1
  1120. package/src/feature-libraries/chunked-forest/chunkTree.ts +6 -1
  1121. package/src/feature-libraries/chunked-forest/codec/codecs.ts +3 -7
  1122. package/src/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.ts +18 -11
  1123. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +9 -9
  1124. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +393 -127
  1125. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +35 -38
  1126. package/src/feature-libraries/default-schema/index.ts +16 -5
  1127. package/src/feature-libraries/default-schema/locationBasedEditBuilder.ts +180 -0
  1128. package/src/feature-libraries/default-schema/mappedEditBuilder.ts +35 -9
  1129. package/src/feature-libraries/deltaUtils.ts +6 -1
  1130. package/src/feature-libraries/detachedFieldIndexSummarizer.ts +62 -15
  1131. package/src/feature-libraries/flex-tree/context.ts +17 -0
  1132. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +7 -8
  1133. package/src/feature-libraries/flex-tree/lazyField.ts +66 -24
  1134. package/src/feature-libraries/forest-summary/codec.ts +8 -8
  1135. package/src/feature-libraries/forest-summary/forestSummarizer.ts +47 -39
  1136. package/src/feature-libraries/forest-summary/format.ts +4 -4
  1137. package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +23 -39
  1138. package/src/feature-libraries/forest-summary/index.ts +2 -1
  1139. package/src/feature-libraries/forest-summary/summaryTypes.ts +61 -0
  1140. package/src/feature-libraries/index.ts +23 -14
  1141. package/src/feature-libraries/mapTreeCursor.ts +2 -1
  1142. package/src/feature-libraries/mitigatedChangeFamily.ts +3 -1
  1143. package/src/feature-libraries/modular-schema/comparison.ts +63 -5
  1144. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +142 -44
  1145. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +36 -57
  1146. package/src/feature-libraries/modular-schema/fieldKind.ts +24 -40
  1147. package/src/feature-libraries/modular-schema/genericFieldKind.ts +10 -19
  1148. package/src/feature-libraries/modular-schema/genericFieldKindCodecs.ts +1 -1
  1149. package/src/feature-libraries/modular-schema/index.ts +21 -15
  1150. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +732 -0
  1151. package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +790 -0
  1152. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +32 -505
  1153. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +2542 -742
  1154. package/src/feature-libraries/modular-schema/{modularChangeFormat.ts → modularChangeFormatV1.ts} +2 -1
  1155. package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +62 -0
  1156. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +98 -10
  1157. package/src/feature-libraries/optional-field/index.ts +1 -3
  1158. package/src/feature-libraries/optional-field/optionalField.ts +317 -574
  1159. package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +24 -38
  1160. package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +89 -35
  1161. package/src/feature-libraries/schema-index/schemaSummarizer.ts +59 -18
  1162. package/src/feature-libraries/sequence-field/compose.ts +134 -519
  1163. package/src/feature-libraries/sequence-field/formatV2.ts +1 -0
  1164. package/src/feature-libraries/sequence-field/helperTypes.ts +34 -19
  1165. package/src/feature-libraries/sequence-field/index.ts +0 -9
  1166. package/src/feature-libraries/sequence-field/invert.ts +103 -228
  1167. package/src/feature-libraries/sequence-field/markQueue.ts +2 -2
  1168. package/src/feature-libraries/sequence-field/moveEffectTable.ts +8 -191
  1169. package/src/feature-libraries/sequence-field/rebase.ts +168 -203
  1170. package/src/feature-libraries/sequence-field/replaceRevisions.ts +31 -52
  1171. package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +0 -2
  1172. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +643 -220
  1173. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +56 -68
  1174. package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +25 -27
  1175. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +19 -129
  1176. package/src/feature-libraries/sequence-field/types.ts +34 -64
  1177. package/src/feature-libraries/sequence-field/utils.ts +133 -346
  1178. package/src/feature-libraries/treeCompressionUtils.ts +1 -15
  1179. package/src/index.ts +7 -2
  1180. package/src/packageVersion.ts +1 -1
  1181. package/src/shared-tree/independentView.ts +1 -1
  1182. package/src/shared-tree/index.ts +3 -2
  1183. package/src/shared-tree/schematizeTree.ts +21 -8
  1184. package/src/shared-tree/schematizingTreeView.ts +50 -68
  1185. package/src/shared-tree/sharedTree.ts +51 -30
  1186. package/src/shared-tree/sharedTreeChangeCodecs.ts +5 -1
  1187. package/src/shared-tree/sharedTreeChangeEnricher.ts +31 -11
  1188. package/src/shared-tree/sharedTreeChangeFamily.ts +9 -6
  1189. package/src/shared-tree/sharedTreeEditBuilder.ts +46 -12
  1190. package/src/shared-tree/treeAlpha.ts +2 -3
  1191. package/src/shared-tree/treeCheckout.ts +106 -33
  1192. package/src/shared-tree-core/branch.ts +8 -2
  1193. package/src/shared-tree-core/editManager.ts +16 -2
  1194. package/src/shared-tree-core/editManagerCodecs.ts +17 -5
  1195. package/src/shared-tree-core/{editManagerCodecsV5.ts → editManagerCodecsVSharedBranches.ts} +3 -3
  1196. package/src/shared-tree-core/editManagerFormatCommons.ts +22 -7
  1197. package/src/shared-tree-core/editManagerFormatV1toV4.ts +3 -1
  1198. package/src/shared-tree-core/{editManagerFormatV5.ts → editManagerFormatVSharedBranches.ts} +2 -2
  1199. package/src/shared-tree-core/editManagerSummarizer.ts +58 -16
  1200. package/src/shared-tree-core/index.ts +11 -3
  1201. package/src/shared-tree-core/messageCodecV1ToV4.ts +2 -1
  1202. package/src/shared-tree-core/{messageCodecV5.ts → messageCodecVSharedBranches.ts} +3 -3
  1203. package/src/shared-tree-core/messageCodecs.ts +17 -5
  1204. package/src/shared-tree-core/messageFormat.ts +22 -7
  1205. package/src/shared-tree-core/messageFormatV1ToV4.ts +16 -2
  1206. package/src/shared-tree-core/{messageFormatV5.ts → messageFormatVSharedBranches.ts} +4 -6
  1207. package/src/shared-tree-core/sharedTreeCore.ts +67 -76
  1208. package/src/shared-tree-core/summaryTypes.ts +122 -0
  1209. package/src/shared-tree-core/versionedSummarizer.ts +107 -0
  1210. package/src/simple-tree/api/configuration.ts +21 -68
  1211. package/src/simple-tree/api/dirtyIndex.ts +11 -0
  1212. package/src/simple-tree/api/discrepancies.ts +1 -1
  1213. package/src/simple-tree/api/getSimpleSchema.ts +13 -6
  1214. package/src/simple-tree/api/incrementalAllowedTypes.ts +34 -20
  1215. package/src/simple-tree/api/index.ts +4 -5
  1216. package/src/simple-tree/api/schemaCompatibilityTester.ts +1 -1
  1217. package/src/simple-tree/api/schemaFactoryAlpha.ts +2 -2
  1218. package/src/simple-tree/api/schemaFactoryRecursive.ts +0 -2
  1219. package/src/simple-tree/api/schemaFromSimple.ts +11 -5
  1220. package/src/simple-tree/api/simpleSchemaCodec.ts +17 -3
  1221. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +1 -1
  1222. package/src/simple-tree/api/snapshotCompatibilityChecker.ts +18 -10
  1223. package/src/simple-tree/api/tree.ts +1 -1
  1224. package/src/simple-tree/api/typesUnsafe.ts +7 -3
  1225. package/src/simple-tree/core/allowedTypes.ts +3 -3
  1226. package/src/simple-tree/core/index.ts +2 -2
  1227. package/src/simple-tree/core/toStored.ts +22 -55
  1228. package/src/simple-tree/core/treeNodeKernel.ts +1 -0
  1229. package/src/simple-tree/core/unhydratedFlexTree.ts +87 -36
  1230. package/src/simple-tree/core/walkSchema.ts +6 -0
  1231. package/src/simple-tree/createContext.ts +26 -11
  1232. package/src/simple-tree/fieldSchema.ts +16 -7
  1233. package/src/simple-tree/index.ts +13 -12
  1234. package/src/simple-tree/node-kinds/array/arrayNode.ts +14 -7
  1235. package/src/simple-tree/node-kinds/array/arrayNodeTypes.ts +3 -3
  1236. package/src/simple-tree/node-kinds/common.ts +2 -5
  1237. package/src/simple-tree/node-kinds/map/mapNode.ts +9 -6
  1238. package/src/simple-tree/node-kinds/map/mapNodeTypes.ts +3 -3
  1239. package/src/simple-tree/node-kinds/object/objectNode.ts +28 -27
  1240. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +6 -2
  1241. package/src/simple-tree/node-kinds/record/recordNode.ts +15 -11
  1242. package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +3 -3
  1243. package/src/simple-tree/prepareForInsertion.ts +343 -200
  1244. package/src/simple-tree/simpleSchema.ts +79 -32
  1245. package/src/simple-tree/simpleSchemaFormatV1.ts +9 -1
  1246. package/src/simple-tree/toStoredSchema.ts +319 -61
  1247. package/src/simple-tree/treeSchema.ts +54 -0
  1248. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +42 -14
  1249. package/src/tableSchema.ts +485 -166
  1250. package/src/treeFactory.ts +32 -9
  1251. package/src/util/breakable.ts +4 -4
  1252. package/src/util/index.ts +5 -0
  1253. package/src/util/rangeMap.ts +72 -18
  1254. package/src/util/readSnapshotBlob.ts +23 -0
  1255. package/src/util/typeCheckTests.ts +0 -1
  1256. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +0 -1
  1257. package/dist/feature-libraries/modular-schema/modularChangeFormat.js.map +0 -1
  1258. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
  1259. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
  1260. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -50
  1261. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
  1262. package/dist/shared-tree-core/editManagerCodecsV5.d.ts.map +0 -1
  1263. package/dist/shared-tree-core/editManagerCodecsV5.js.map +0 -1
  1264. package/dist/shared-tree-core/editManagerFormatV5.d.ts.map +0 -1
  1265. package/dist/shared-tree-core/editManagerFormatV5.js.map +0 -1
  1266. package/dist/shared-tree-core/messageCodecV5.d.ts.map +0 -1
  1267. package/dist/shared-tree-core/messageCodecV5.js.map +0 -1
  1268. package/dist/shared-tree-core/messageFormatV5.d.ts.map +0 -1
  1269. package/dist/shared-tree-core/messageFormatV5.js.map +0 -1
  1270. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts +0 -40
  1271. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +0 -1
  1272. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +0 -177
  1273. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +0 -1
  1274. package/docs/main/sequence-field/move-composition.md +0 -46
  1275. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +0 -1
  1276. package/lib/feature-libraries/modular-schema/modularChangeFormat.js.map +0 -1
  1277. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
  1278. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
  1279. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -46
  1280. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
  1281. package/lib/shared-tree-core/editManagerCodecsV5.d.ts.map +0 -1
  1282. package/lib/shared-tree-core/editManagerCodecsV5.js.map +0 -1
  1283. package/lib/shared-tree-core/editManagerFormatV5.d.ts.map +0 -1
  1284. package/lib/shared-tree-core/editManagerFormatV5.js.map +0 -1
  1285. package/lib/shared-tree-core/messageCodecV5.d.ts.map +0 -1
  1286. package/lib/shared-tree-core/messageCodecV5.js.map +0 -1
  1287. package/lib/shared-tree-core/messageFormatV5.d.ts.map +0 -1
  1288. package/lib/shared-tree-core/messageFormatV5.js.map +0 -1
  1289. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts +0 -40
  1290. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +0 -1
  1291. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +0 -171
  1292. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +0 -1
  1293. package/src/feature-libraries/sequence-field/relevantRemovedRoots.ts +0 -57
  1294. package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +0 -209
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.normalizeFieldId = exports.getParentFieldId = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
7
+ exports.addNodeRename = exports.getFirstAttachField = exports.getFirstDetachField = exports.cloneRootTable = exports.newRootTable = exports.normalizeNodeId = exports.normalizeFieldId = exports.getNodeParent = exports.buildModularChangesetFromField = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
8
8
  const internal_1 = require("@fluidframework/core-utils/internal");
9
9
  const sorted_btree_es6_1 = require("@tylerbu/sorted-btree-es6");
10
10
  const index_js_1 = require("../../core/index.js");
@@ -67,18 +67,19 @@ class ModularChangeFamily {
67
67
  return convertedChange;
68
68
  }
69
69
  compose(changes) {
70
- const { revInfos, maxId } = getRevInfoFromTaggedChanges(changes);
70
+ const { maxId } = getRevInfoFromTaggedChanges(changes);
71
71
  const idState = { maxId };
72
72
  const pairwiseDelegate = (left, right) => {
73
- return this.composePair(left, right, revInfos, idState);
73
+ return this.composePair(left, right, idState);
74
74
  };
75
75
  const innerChanges = changes.map((change) => change.change);
76
76
  return (0, index_js_2.balancedReduce)(innerChanges, pairwiseDelegate, makeModularChangeset);
77
77
  }
78
- composePair(change1, change2, revInfos, idState) {
79
- const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys } = this.composeAllFields(change1, change2, revInfos, idState);
78
+ composePair(change1, change2, idState) {
79
+ const revInfos = composeRevInfos(change1.revisions, change2.revisions);
80
+ const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, rootNodes } = this.composeAllFields(change1, change2, revInfos, idState);
80
81
  const { allBuilds, allDestroys, allRefreshers } = composeBuildsDestroysAndRefreshers(change1, change2);
81
- return makeModularChangeset({
82
+ const composed = makeModularChangeset({
82
83
  fieldChanges,
83
84
  nodeChanges,
84
85
  nodeToParent,
@@ -86,10 +87,14 @@ class ModularChangeFamily {
86
87
  crossFieldKeys,
87
88
  maxId: idState.maxId,
88
89
  revisions: revInfos,
90
+ rootNodes,
89
91
  builds: allBuilds,
90
92
  destroys: allDestroys,
91
93
  refreshers: allRefreshers,
92
94
  });
95
+ // XXX: This is an expensive assert which should be disabled before merging.
96
+ this.validateChangeset(composed);
97
+ return composed;
93
98
  }
94
99
  composeAllFields(potentiallyConflictedChange1, potentiallyConflictedChange2, revInfos, idState) {
95
100
  // Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.
@@ -110,34 +115,50 @@ class ModularChangeFamily {
110
115
  const composedNodeChanges = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeChanges, change2.nodeChanges));
111
116
  const composedNodeToParent = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeToParent, change2.nodeToParent));
112
117
  const composedNodeAliases = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeAliases, change2.nodeAliases));
113
- const crossFieldTable = newComposeTable(change1, change2, composedNodeToParent);
118
+ const pendingCompositions = {
119
+ nodeIdsToCompose: [],
120
+ affectedBaseFields: (0, index_js_2.newTupleBTree)(),
121
+ };
122
+ const movedCrossFieldKeys = (0, modularChangeTypes_js_1.newCrossFieldRangeTable)();
123
+ const removedCrossFieldKeys = (0, modularChangeTypes_js_1.newCrossFieldRangeTable)();
124
+ const composedRoots = composeRootTables(change1, change2, composedNodeToParent, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
125
+ const crossFieldTable = newComposeTable(change1, change2, composedRoots, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
114
126
  const composedFields = this.composeFieldMaps(change1.fieldChanges, change2.fieldChanges, undefined, genId, crossFieldTable, revisionMetadata);
115
127
  this.composeInvalidatedElements(crossFieldTable, composedFields, composedNodeChanges, composedNodeToParent, composedNodeAliases, genId, revisionMetadata);
116
- // Currently no field kinds require making changes to cross-field keys during composition, so we can just merge the two tables.
117
- const composedCrossFieldKeys = index_js_2.RangeMap.union(change1.crossFieldKeys, change2.crossFieldKeys);
128
+ for (const entry of crossFieldTable.renamesToDelete.entries()) {
129
+ deleteNodeRenameFrom(crossFieldTable.composedRootNodes, entry.start, entry.length);
130
+ }
131
+ for (const [nodeId, location] of crossFieldTable.movedNodeToParent.entries()) {
132
+ // Moved nodes are from change2.
133
+ // If there is a corresponding node in change1, then composedNodeToParent will already have the correct entry,
134
+ // because the location of the node is the same in change1 and the composed change
135
+ // (since they have the same input context).
136
+ if (crossFieldTable.newToBaseNodeId.get(nodeId) === undefined) {
137
+ composedNodeToParent.set(nodeId, location);
138
+ }
139
+ }
118
140
  return {
119
141
  fieldChanges: composedFields,
120
142
  nodeChanges: composedNodeChanges,
121
143
  nodeToParent: composedNodeToParent,
122
144
  nodeAliases: composedNodeAliases,
123
- crossFieldKeys: composedCrossFieldKeys,
145
+ crossFieldKeys: composeCrossFieldKeyTables(change1.crossFieldKeys, change2.crossFieldKeys, crossFieldTable.movedCrossFieldKeys, crossFieldTable.removedCrossFieldKeys),
146
+ rootNodes: composedRoots,
124
147
  };
125
148
  }
126
149
  composeInvalidatedField(fieldChange, crossFieldTable, genId, revisionMetadata) {
127
150
  const context = crossFieldTable.fieldToContext.get(fieldChange);
128
151
  (0, internal_1.assert)(context !== undefined, 0x8cc /* Should have context for every invalidated field */);
129
- const { fieldId, change1: fieldChange1, change2: fieldChange2, composedChange } = context;
152
+ const { change1: fieldChange1, change2: fieldChange2, composedChange } = context;
153
+ crossFieldTable.pendingCompositions.affectedBaseFields.delete(fieldIdKeyFromFieldId(context.fieldId));
130
154
  const rebaser = getChangeHandler(this.fieldKinds, composedChange.fieldKind).rebaser;
131
155
  const composeNodes = (child1, child2) => {
132
- if (child1 !== undefined &&
133
- child2 !== undefined &&
134
- getFromChangeAtomIdMap(crossFieldTable.newToBaseNodeId, child2) === undefined) {
135
- setInChangeAtomIdMap(crossFieldTable.newToBaseNodeId, child2, child1);
136
- crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
156
+ if (child1 !== undefined && child2 !== undefined) {
157
+ addNodesToCompose(crossFieldTable, child1, child2);
137
158
  }
138
159
  return child1 ?? child2 ?? (0, internal_1.fail)(0xb22 /* Should not compose two undefined nodes */);
139
160
  };
140
- const amendedChange = rebaser.compose(fieldChange1, fieldChange2, composeNodes, genId, new ComposeManager(crossFieldTable, fieldChange, fieldId, false), revisionMetadata);
161
+ const amendedChange = rebaser.compose(fieldChange1, fieldChange2, composeNodes, genId, new ComposeNodeManagerI(crossFieldTable, context.fieldId, false), revisionMetadata);
141
162
  composedChange.change = (0, index_js_2.brand)(amendedChange);
142
163
  }
143
164
  /**
@@ -146,32 +167,23 @@ class ModularChangeFamily {
146
167
  * - discovering that two node changesets refer to the same node (`nodeIdsToCompose`)
147
168
  * - a previously composed field being invalidated by a cross field effect (`invalidatedFields`)
148
169
  * - a field which was copied directly from an input changeset being invalidated by a cross field effect
149
- * (`affectedBaseFields` and `affectedNewFields`)
170
+ * (`affectedBaseFields`)
150
171
  *
151
172
  * Updating an element may invalidate further elements. This function runs until there is no more invalidation.
152
173
  */
153
174
  composeInvalidatedElements(table, composedFields, composedNodes, composedNodeToParent, nodeAliases, genId, metadata) {
154
175
  const pending = table.pendingCompositions;
155
- while (table.invalidatedFields.size > 0 ||
156
- pending.nodeIdsToCompose.length > 0 ||
157
- pending.affectedBaseFields.length > 0 ||
158
- pending.affectedNewFields.length > 0) {
159
- // Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.
160
- for (const [id1, id2] of pending.nodeIdsToCompose) {
161
- this.composeNodesById(table.baseChange.nodeChanges, table.newChange.nodeChanges, composedNodes, composedNodeToParent, nodeAliases, id1, id2, genId, table, metadata);
162
- }
163
- pending.nodeIdsToCompose.length = 0;
164
- this.composeAffectedFields(table, table.baseChange, true, pending.affectedBaseFields, composedFields, composedNodes, genId, metadata);
165
- this.composeAffectedFields(table, table.newChange, false, pending.affectedNewFields, composedFields, composedNodes, genId, metadata);
166
- this.processInvalidatedCompositions(table, genId, metadata);
176
+ while (pending.nodeIdsToCompose.length > 0 || pending.affectedBaseFields.length > 0) {
177
+ this.processPendingNodeCompositions(table, composedNodes, composedNodeToParent, nodeAliases, genId, metadata);
178
+ this.composeAffectedFields(table, table.baseChange, pending.affectedBaseFields, composedFields, composedNodes, genId, metadata);
167
179
  }
168
180
  }
169
- processInvalidatedCompositions(table, genId, metadata) {
170
- const fieldsToUpdate = table.invalidatedFields;
171
- table.invalidatedFields = new Set();
172
- for (const fieldChange of fieldsToUpdate) {
173
- this.composeInvalidatedField(fieldChange, table, genId, metadata);
181
+ processPendingNodeCompositions(table, composedNodes, composedNodeToParent, nodeAliases, genId, metadata) {
182
+ // Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.
183
+ for (const [id1, id2] of table.pendingCompositions.nodeIdsToCompose) {
184
+ this.composeNodesById(table.baseChange, table.newChange, composedNodes, composedNodeToParent, nodeAliases, id1, id2, genId, table, metadata);
174
185
  }
186
+ table.pendingCompositions.nodeIdsToCompose.length = 0;
175
187
  }
176
188
  /**
177
189
  * Ensures that each field in `affectedFields` has been updated in the composition output.
@@ -184,38 +196,36 @@ class ModularChangeFamily {
184
196
  * If not, they are assumed to be part of the new changeset.
185
197
  * @param affectedFields - The set of fields to process.
186
198
  */
187
- composeAffectedFields(table, change, areBaseFields, affectedFields, composedFields, composedNodes, genId, metadata) {
188
- for (const fieldIdKey of affectedFields.keys()) {
189
- const fieldId = normalizeFieldId(fieldIdFromFieldIdKey(fieldIdKey), change.nodeAliases);
190
- const fieldChange = fieldChangeFromId(change.fieldChanges, change.nodeChanges, fieldId);
199
+ composeAffectedFields(table, change, affectedFields, composedFields, composedNodes, genId, metadata) {
200
+ const fieldsToProcess = affectedFields.clone();
201
+ affectedFields.clear();
202
+ for (const fieldIdKey of fieldsToProcess.keys()) {
203
+ const fieldId = fieldIdFromFieldIdKey(fieldIdKey);
204
+ const fieldChange = fieldChangeFromId(change, fieldId);
191
205
  if (table.fieldToContext.has(fieldChange) ||
192
206
  table.newFieldToBaseField.has(fieldChange)) {
193
- // This function handles fields which were not part of the intersection of the two changesets but which need to be updated anyway.
194
- // If we've already processed this field then either it is up to date
195
- // or there is pending inval which will be handled in processInvalidatedCompositions.
196
- continue;
207
+ this.composeInvalidatedField(fieldChange, table, genId, metadata);
197
208
  }
198
- const emptyChange = this.createEmptyFieldChange(fieldChange.fieldKind);
199
- const [change1, change2] = areBaseFields
200
- ? [fieldChange, emptyChange]
201
- : [emptyChange, fieldChange];
202
- const composedField = this.composeFieldChanges(fieldId, change1, change2, genId, table, metadata);
203
- if (fieldId.nodeId === undefined) {
204
- composedFields.set(fieldId.field, composedField);
205
- continue;
206
- }
207
- const nodeId = getFromChangeAtomIdMap(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId;
208
- let nodeChangeset = nodeChangeFromId(composedNodes, nodeId);
209
- if (!table.composedNodes.has(nodeChangeset)) {
210
- nodeChangeset = cloneNodeChangeset(nodeChangeset);
211
- setInChangeAtomIdMap(composedNodes, nodeId, nodeChangeset);
212
- }
213
- if (nodeChangeset.fieldChanges === undefined) {
214
- nodeChangeset.fieldChanges = new Map();
209
+ else {
210
+ this.composeFieldWithNoNewChange(table, fieldChange, fieldId, composedFields, composedNodes, genId, metadata);
215
211
  }
216
- nodeChangeset.fieldChanges.set(fieldId.field, composedField);
217
212
  }
218
- affectedFields.clear();
213
+ }
214
+ composeFieldWithNoNewChange(table, baseFieldChange, fieldId, composedFields, composedNodes, genId, metadata) {
215
+ const emptyChange = this.createEmptyFieldChange(baseFieldChange.fieldKind);
216
+ const composedField = this.composeFieldChanges(fieldId, baseFieldChange, emptyChange, genId, table, metadata);
217
+ if (fieldId.nodeId === undefined) {
218
+ composedFields.set(fieldId.field, composedField);
219
+ return;
220
+ }
221
+ const nodeId = normalizeNodeId((0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId, table.baseChange.nodeAliases);
222
+ // We clone the node changeset before mutating it, as it may be from one of the input changesets.
223
+ const nodeChangeset = cloneNodeChangeset(nodeChangeFromId(composedNodes, table.baseChange.nodeAliases, nodeId));
224
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(composedNodes, nodeId, nodeChangeset);
225
+ if (nodeChangeset.fieldChanges === undefined) {
226
+ nodeChangeset.fieldChanges = new Map();
227
+ }
228
+ nodeChangeset.fieldChanges.set(fieldId.field, composedField);
219
229
  }
220
230
  composeFieldMaps(change1, change2, parentId, genId, crossFieldTable, revisionMetadata) {
221
231
  const composedFields = new Map();
@@ -225,6 +235,14 @@ class ModularChangeFamily {
225
235
  for (const [field, fieldChange1] of change1) {
226
236
  const fieldId = { nodeId: parentId, field };
227
237
  const fieldChange2 = change2.get(field);
238
+ const cachedComposedFieldChange = crossFieldTable.fieldToContext.get(fieldChange1)?.composedChange;
239
+ if (fieldChange2 === undefined && cachedComposedFieldChange !== undefined) {
240
+ // This can happen if the field was previous processed in `composeFieldWithNoNewChange`.
241
+ // If `change2` does not have a change for this field, then without this check we would
242
+ // lose the composed field change and instead simply have `change1`'s change.
243
+ composedFields.set(field, cachedComposedFieldChange);
244
+ continue;
245
+ }
228
246
  const composedField = fieldChange2 !== undefined
229
247
  ? this.composeFieldChanges(fieldId, fieldChange1, fieldChange2, genId, crossFieldTable, revisionMetadata)
230
248
  : fieldChange1;
@@ -244,17 +262,16 @@ class ModularChangeFamily {
244
262
  * will be added to `crossFieldTable.pendingCompositions.nodeIdsToCompose`.
245
263
  *
246
264
  * Any fields which had cross-field information sent to them as part of this field composition
247
- * will be added to either `affectedBaseFields` or `affectedNewFields` in `crossFieldTable.pendingCompositions`.
265
+ * will be added to `affectedBaseFields` in `crossFieldTable.pendingCompositions`.
248
266
  *
249
267
  * Any composed `FieldChange` which is invalidated by new cross-field information will be added to `crossFieldTable.invalidatedFields`.
250
268
  */
251
269
  composeFieldChanges(fieldId, change1, change2, idAllocator, crossFieldTable, revisionMetadata) {
252
270
  const { fieldKind, changeHandler, change1: change1Normalized, change2: change2Normalized, } = this.normalizeFieldChanges(change1, change2);
253
- const manager = new ComposeManager(crossFieldTable, change1, fieldId);
271
+ const manager = new ComposeNodeManagerI(crossFieldTable, fieldId);
254
272
  const composedChange = changeHandler.rebaser.compose(change1Normalized, change2Normalized, (child1, child2) => {
255
273
  if (child1 !== undefined && child2 !== undefined) {
256
- setInChangeAtomIdMap(crossFieldTable.newToBaseNodeId, child2, child1);
257
- crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
274
+ addNodesToCompose(crossFieldTable, child1, child2);
258
275
  }
259
276
  return child1 ?? child2 ?? (0, internal_1.fail)(0xb23 /* Should not compose two undefined nodes */);
260
277
  }, idAllocator, manager, revisionMetadata);
@@ -271,19 +288,18 @@ class ModularChangeFamily {
271
288
  crossFieldTable.newFieldToBaseField.set(change2, change1);
272
289
  return composedField;
273
290
  }
274
- composeNodesById(nodeChanges1, nodeChanges2, composedNodes, composedNodeToParent, nodeAliases, id1, id2, idAllocator, crossFieldTable, revisionMetadata) {
275
- const nodeChangeset1 = nodeChangeFromId(nodeChanges1, id1);
276
- const nodeChangeset2 = nodeChangeFromId(nodeChanges2, id2);
291
+ composeNodesById(change1, change2, composedNodes, composedNodeToParent, composedAliases, id1, id2, idAllocator, crossFieldTable, revisionMetadata) {
292
+ const nodeChangeset1 = nodeChangeFromId(change1.nodeChanges, change1.nodeAliases, id1);
293
+ const nodeChangeset2 = nodeChangeFromId(change2.nodeChanges, change2.nodeAliases, id2);
277
294
  const composedNodeChangeset = this.composeNodeChanges(id1, nodeChangeset1, nodeChangeset2, idAllocator, crossFieldTable, revisionMetadata);
278
- setInChangeAtomIdMap(composedNodes, id1, composedNodeChangeset);
295
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(composedNodes, id1, composedNodeChangeset);
279
296
  if (!(0, index_js_1.areEqualChangeAtomIds)(id1, id2)) {
280
297
  composedNodes.delete([id2.revision, id2.localId]);
281
298
  composedNodeToParent.delete([id2.revision, id2.localId]);
282
- setInChangeAtomIdMap(nodeAliases, id2, id1);
299
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(composedAliases, id2, id1);
283
300
  // We need to delete id1 to avoid forming a cycle in case id1 already had an alias.
284
- nodeAliases.delete([id1.revision, id1.localId]);
301
+ composedAliases.delete([id1.revision, id1.localId]);
285
302
  }
286
- crossFieldTable.composedNodes.add(composedNodeChangeset);
287
303
  }
288
304
  composeNodeChanges(nodeId, change1, change2, genId, crossFieldTable, revisionMetadata) {
289
305
  // WARNING: this composition logic assumes that we never make compositions of the following form:
@@ -334,9 +350,14 @@ class ModularChangeFamily {
334
350
  }
335
351
  const genId = (0, index_js_2.idAllocatorFromMaxId)(change.change.maxId ?? -1);
336
352
  const crossFieldTable = {
337
- ...newCrossFieldTable(),
353
+ change: change.change,
354
+ entries: (0, index_js_1.newChangeAtomIdRangeMap)(),
338
355
  originalFieldToContext: new Map(),
356
+ invertRevision: revisionForInvert,
339
357
  invertedNodeToParent: (0, index_js_2.brand)(change.change.nodeToParent.clone()),
358
+ invalidatedFields: new Set(),
359
+ invertedRoots: invertRootTable(change.change, isRollback),
360
+ attachToDetachId: (0, index_js_1.newChangeAtomIdTransform)(),
340
361
  };
341
362
  const { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);
342
363
  const revisionMetadata = (0, index_js_1.revisionMetadataSourceFromInfo)(oldRevInfos);
@@ -352,16 +373,18 @@ class ModularChangeFamily {
352
373
  const originalFieldChange = fieldChange.change;
353
374
  const context = crossFieldTable.originalFieldToContext.get(fieldChange);
354
375
  (0, internal_1.assert)(context !== undefined, 0x851 /* Should have context for every invalidated field */);
355
- const { invertedField, fieldId } = context;
356
- const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new InvertManager(crossFieldTable, fieldChange, fieldId), revisionMetadata);
376
+ const { invertedField } = context;
377
+ const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new InvertNodeManagerI(crossFieldTable, context.fieldId), revisionMetadata);
357
378
  invertedField.change = (0, index_js_2.brand)(amendedChange);
358
379
  }
359
380
  }
360
381
  const crossFieldKeys = this.makeCrossFieldKeyTable(invertedFields, invertedNodes);
382
+ this.processInvertRenames(crossFieldTable);
361
383
  return makeModularChangeset({
362
384
  fieldChanges: invertedFields,
363
385
  nodeChanges: invertedNodes,
364
386
  nodeToParent: crossFieldTable.invertedNodeToParent,
387
+ rootNodes: crossFieldTable.invertedRoots,
365
388
  nodeAliases: change.change.nodeAliases,
366
389
  crossFieldKeys,
367
390
  maxId: genId.getMaxId(),
@@ -375,7 +398,7 @@ class ModularChangeFamily {
375
398
  const invertedFields = new Map();
376
399
  for (const [field, fieldChange] of changes) {
377
400
  const fieldId = { nodeId: parentId, field };
378
- const manager = new InvertManager(crossFieldTable, fieldChange, fieldId);
401
+ const manager = new InvertNodeManagerI(crossFieldTable, fieldId);
379
402
  const invertedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(fieldChange.change, isRollback, genId, revisionForInvert, manager, revisionMetadata);
380
403
  const invertedFieldChange = {
381
404
  ...fieldChange,
@@ -407,6 +430,12 @@ class ModularChangeFamily {
407
430
  }
408
431
  return inverse;
409
432
  }
433
+ processInvertRenames(table) {
434
+ for (const { start: newAttachId, value: originalDetachId, length, } of table.attachToDetachId.entries()) {
435
+ // Note that the detach location is already set in `invertDetach`.
436
+ addNodeRename(table.invertedRoots, originalDetachId, newAttachId, length, undefined);
437
+ }
438
+ }
410
439
  rebase(taggedChange, potentiallyConflictedOver, revisionMetadata) {
411
440
  // Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.
412
441
  // This means that we must rebase over a muted version of the conflicted changeset.
@@ -417,17 +446,26 @@ class ModularChangeFamily {
417
446
  const maxId = Math.max(change.maxId ?? -1, over.change.maxId ?? -1);
418
447
  const idState = { maxId };
419
448
  const genId = (0, index_js_2.idAllocatorFromState)(idState);
449
+ const affectedBaseFields = (0, index_js_2.newTupleBTree)();
450
+ const nodesToRebase = [];
451
+ const rebasedNodeToParent = (0, index_js_2.brand)(change.nodeToParent.clone());
452
+ const rebaseVersion = Math.max(change.rebaseVersion, over.change.rebaseVersion);
453
+ const rebasedRootNodes = rebaseRoots(change, over.change, affectedBaseFields, nodesToRebase, rebasedNodeToParent, rebaseVersion);
420
454
  const crossFieldTable = {
421
- ...newCrossFieldTable(),
455
+ rebaseVersion,
456
+ entries: newDetachedEntryMap(),
422
457
  newChange: change,
423
458
  baseChange: over.change,
424
459
  baseFieldToContext: new Map(),
460
+ baseRoots: over.change.rootNodes,
461
+ rebasedRootNodes,
425
462
  baseToRebasedNodeId: (0, index_js_2.newTupleBTree)(),
426
463
  rebasedFields: new Set(),
427
- rebasedNodeToParent: (0, index_js_2.brand)(change.nodeToParent.clone()),
428
- rebasedCrossFieldKeys: change.crossFieldKeys.clone(),
464
+ rebasedNodeToParent,
465
+ rebasedDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
466
+ movedDetaches: (0, index_js_1.newChangeAtomIdRangeMap)(),
429
467
  nodeIdPairs: [],
430
- affectedBaseFields: (0, index_js_2.newTupleBTree)(),
468
+ affectedBaseFields,
431
469
  fieldsWithUnattachedChild: new Set(),
432
470
  };
433
471
  const getBaseRevisions = () => revisionInfoFromTaggedChange(over).map((info) => info.revision);
@@ -437,17 +475,22 @@ class ModularChangeFamily {
437
475
  getBaseRevisions,
438
476
  };
439
477
  const rebasedNodes = (0, index_js_2.brand)(change.nodeChanges.clone());
440
- const rebasedFields = this.rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, rebaseMetadata);
441
- this.rebaseInvalidatedElements(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId);
478
+ const rebasedFields = this.rebaseIntersectingFields(nodesToRebase, crossFieldTable, rebasedNodes, genId, rebaseMetadata);
479
+ this.rebaseInvalidatedFields(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId);
480
+ fixupRebasedDetachLocations(crossFieldTable);
442
481
  const constraintState = newConstraintState(change.constraintViolationCount ?? 0);
443
482
  const revertConstraintState = newConstraintState(change.constraintViolationCountOnRevert ?? 0);
444
- this.updateConstraintsForFields(rebasedFields, fieldChangeHandler_js_1.NodeAttachState.Attached, fieldChangeHandler_js_1.NodeAttachState.Attached, constraintState, revertConstraintState, rebasedNodes);
483
+ this.updateConstraints(rebasedFields, rebasedNodes, rebasedRootNodes, constraintState, revertConstraintState);
484
+ const fieldsWithRootMoves = getFieldsWithRootMoves(crossFieldTable.rebasedRootNodes, change.nodeAliases);
485
+ const fieldToRootChanges = getFieldToRootChanges(crossFieldTable.rebasedRootNodes, change.nodeAliases);
445
486
  const rebased = makeModularChangeset({
446
- fieldChanges: this.pruneFieldMap(rebasedFields, rebasedNodes),
487
+ fieldChanges: this.pruneFieldMap(rebasedFields, undefined, rebasedNodes, crossFieldTable.rebasedNodeToParent, change.nodeAliases, crossFieldTable.rebasedRootNodes, fieldsWithRootMoves, fieldToRootChanges),
447
488
  nodeChanges: rebasedNodes,
448
489
  nodeToParent: crossFieldTable.rebasedNodeToParent,
490
+ rootNodes: this.pruneRoots(crossFieldTable.rebasedRootNodes, rebasedNodes, crossFieldTable.rebasedNodeToParent, change.nodeAliases, fieldsWithRootMoves, fieldToRootChanges),
491
+ // TODO: Do we need to include aliases for node changesets added during rebasing?
449
492
  nodeAliases: change.nodeAliases,
450
- crossFieldKeys: crossFieldTable.rebasedCrossFieldKeys,
493
+ crossFieldKeys: rebaseCrossFieldKeys(change.crossFieldKeys, crossFieldTable.movedDetaches, crossFieldTable.rebasedDetachLocations),
451
494
  maxId: idState.maxId,
452
495
  revisions: change.revisions,
453
496
  constraintViolationCount: constraintState.violationCount,
@@ -455,158 +498,177 @@ class ModularChangeFamily {
455
498
  builds: change.builds,
456
499
  destroys: change.destroys,
457
500
  refreshers: change.refreshers,
501
+ rebaseVersion,
458
502
  });
503
+ // XXX: This is an expensive assert which should be disabled before merging.
504
+ this.validateChangeset(rebased);
459
505
  return rebased;
460
506
  }
461
507
  // This performs a first pass on all fields which have both new and base changes.
462
508
  // TODO: Can we also handle additional passes in this method?
463
- rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, metadata) {
509
+ rebaseIntersectingFields(rootChanges, crossFieldTable, rebasedNodes, genId, metadata) {
464
510
  const change = crossFieldTable.newChange;
465
511
  const baseChange = crossFieldTable.baseChange;
466
512
  const rebasedFields = this.rebaseFieldMap(change.fieldChanges, baseChange.fieldChanges, undefined, genId, crossFieldTable, metadata);
513
+ for (const [newChildChange, baseChildChange] of rootChanges) {
514
+ const rebasedNode = this.rebaseNodeChange(newChildChange, baseChildChange, genId, crossFieldTable, metadata);
515
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, newChildChange, rebasedNode);
516
+ }
467
517
  // This loop processes all fields which have both base and new changes.
468
518
  // Note that the call to `rebaseNodeChange` can add entries to `crossFieldTable.nodeIdPairs`.
469
519
  for (const [newId, baseId, _attachState] of crossFieldTable.nodeIdPairs) {
470
520
  const rebasedNode = this.rebaseNodeChange(newId, baseId, genId, crossFieldTable, metadata);
471
- setInChangeAtomIdMap(rebasedNodes, newId, rebasedNode);
521
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, newId, rebasedNode);
472
522
  }
473
523
  return rebasedFields;
474
524
  }
475
- // This processes fields which have no new changes but have been invalidated by another field.
476
- rebaseFieldsWithoutNewChanges(rebasedFields, rebasedNodes, crossFieldTable, genId, metadata) {
477
- const baseChange = crossFieldTable.baseChange;
478
- for (const [revision, localId, fieldKey] of crossFieldTable.affectedBaseFields.keys()) {
479
- const baseNodeId = localId !== undefined
480
- ? normalizeNodeId({ revision, localId }, baseChange.nodeAliases)
481
- : undefined;
482
- const baseFieldChange = fieldMapFromNodeId(baseChange.fieldChanges, baseChange.nodeChanges, baseNodeId).get(fieldKey);
483
- (0, internal_1.assert)(baseFieldChange !== undefined, 0x9c2 /* Cross field key registered for empty field */);
484
- if (crossFieldTable.baseFieldToContext.has(baseFieldChange)) {
485
- // This field has already been processed because there were changes to rebase.
486
- continue;
487
- }
488
- // This field has no changes in the new changeset, otherwise it would have been added to
489
- // `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.
490
- const rebaseChild = (child, baseChild, stateChange) => {
491
- (0, internal_1.assert)(child === undefined, 0x9c3 /* There should be no new changes in this field */);
525
+ rebaseFieldWithoutNewChanges(baseFieldChange, baseFieldId, crossFieldTable, rebasedFields, rebasedNodes, genId, metadata,
526
+ /**
527
+ * The ID of a node in `baseFieldChange` which should be included in the rebased field change.
528
+ */
529
+ baseNodeId) {
530
+ // This field has no changes in the new changeset, otherwise it would have been added to
531
+ // `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.
532
+ const rebaseChild = (child, baseChild, stateChange) => {
533
+ (0, internal_1.assert)(child === undefined, 0x9c3 /* There should be no new changes in this field */);
534
+ if (baseChild === undefined || baseNodeId === undefined) {
492
535
  return undefined;
493
- };
494
- const handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);
495
- const fieldChange = {
496
- ...baseFieldChange,
497
- change: (0, index_js_2.brand)(handler.createEmpty()),
498
- };
499
- const rebasedNodeId = baseNodeId !== undefined
500
- ? rebasedNodeIdFromBaseNodeId(crossFieldTable, baseNodeId)
536
+ }
537
+ return (0, index_js_1.areEqualChangeAtomIds)(normalizeNodeId(baseChild, crossFieldTable.baseChange.nodeAliases), baseNodeId)
538
+ ? baseNodeId
501
539
  : undefined;
502
- const fieldId = { nodeId: rebasedNodeId, field: fieldKey };
503
- const rebasedField = handler.rebaser.rebase(fieldChange.change, baseFieldChange.change, rebaseChild, genId, new RebaseManager(crossFieldTable, baseFieldChange, fieldId), metadata);
504
- const rebasedFieldChange = {
505
- ...baseFieldChange,
506
- change: (0, index_js_2.brand)(rebasedField),
507
- };
508
- // TODO: Deduplicate
509
- crossFieldTable.baseFieldToContext.set(baseFieldChange, {
510
- newChange: fieldChange,
511
- baseChange: baseFieldChange,
512
- rebasedChange: rebasedFieldChange,
513
- fieldId,
514
- baseNodeIds: [],
515
- });
516
- crossFieldTable.rebasedFields.add(rebasedFieldChange);
517
- this.attachRebasedField(rebasedFields, rebasedNodes, crossFieldTable, rebasedFieldChange, fieldId, genId, metadata);
518
- }
519
- }
520
- rebaseInvalidatedElements(rebasedFields, rebasedNodes, table, metadata, idAllocator) {
521
- this.rebaseFieldsWithoutNewChanges(rebasedFields, rebasedNodes, table, idAllocator, metadata);
522
- this.rebaseFieldsWithUnattachedChild(table, metadata, idAllocator);
523
- this.rebaseInvalidatedFields(table, metadata, idAllocator);
524
- }
525
- rebaseInvalidatedFields(crossFieldTable, rebaseMetadata, genId) {
526
- const fieldsToUpdate = crossFieldTable.invalidatedFields;
527
- crossFieldTable.invalidatedFields = new Set();
528
- for (const field of fieldsToUpdate) {
529
- this.rebaseInvalidatedField(field, crossFieldTable, rebaseMetadata, genId);
530
- }
531
- }
532
- rebaseFieldsWithUnattachedChild(table, metadata, idAllocator) {
533
- for (const field of table.fieldsWithUnattachedChild) {
534
- table.invalidatedFields.delete(field);
535
- this.rebaseInvalidatedField(field, table, metadata, idAllocator, true);
540
+ };
541
+ const handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);
542
+ const fieldChange = {
543
+ ...baseFieldChange,
544
+ change: (0, index_js_2.brand)(handler.createEmpty()),
545
+ };
546
+ const rebasedNodeId = baseFieldId.nodeId !== undefined
547
+ ? rebasedNodeIdFromBaseNodeId(crossFieldTable, baseFieldId.nodeId)
548
+ : undefined;
549
+ const fieldId = { nodeId: rebasedNodeId, field: baseFieldId.field };
550
+ const rebasedField = handler.rebaser.rebase(fieldChange.change, baseFieldChange.change, rebaseChild, genId, new RebaseNodeManagerI(crossFieldTable, fieldId), metadata, crossFieldTable.rebaseVersion);
551
+ const rebasedFieldChange = {
552
+ ...baseFieldChange,
553
+ change: (0, index_js_2.brand)(rebasedField),
554
+ };
555
+ const context = {
556
+ newChange: fieldChange,
557
+ baseChange: baseFieldChange,
558
+ rebasedChange: rebasedFieldChange,
559
+ fieldId,
560
+ baseNodeIds: (0, index_js_2.newTupleBTree)(),
561
+ };
562
+ if (baseNodeId !== undefined) {
563
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(context.baseNodeIds, baseNodeId, true);
564
+ }
565
+ crossFieldTable.baseFieldToContext.set(baseFieldChange, context);
566
+ crossFieldTable.rebasedFields.add(rebasedFieldChange);
567
+ this.attachRebasedField(rebasedFields, rebasedNodes, crossFieldTable, rebasedFieldChange, fieldId, genId, metadata);
568
+ }
569
+ rebaseInvalidatedFields(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId) {
570
+ while (crossFieldTable.affectedBaseFields.size > 0) {
571
+ const baseFields = crossFieldTable.affectedBaseFields.clone();
572
+ crossFieldTable.affectedBaseFields.clear();
573
+ for (const baseFieldIdKey of baseFields.keys()) {
574
+ const baseFieldId = normalizeFieldId(fieldIdFromFieldIdKey(baseFieldIdKey), crossFieldTable.baseChange.nodeAliases);
575
+ const baseField = fieldChangeFromId(crossFieldTable.baseChange, baseFieldId);
576
+ (0, internal_1.assert)(baseField !== undefined, 0x9c2 /* Cross field key registered for empty field */);
577
+ const context = crossFieldTable.baseFieldToContext.get(baseField);
578
+ if (context === undefined) {
579
+ this.rebaseFieldWithoutNewChanges(baseField, baseFieldId, crossFieldTable, rebasedFields, rebasedNodes, genId, rebaseMetadata);
580
+ }
581
+ else {
582
+ this.rebaseInvalidatedField(baseField, crossFieldTable, context, rebaseMetadata, genId);
583
+ }
584
+ }
536
585
  }
537
586
  }
538
- rebaseInvalidatedField(baseField, crossFieldTable, rebaseMetadata, genId, allowInval = false) {
539
- const context = crossFieldTable.baseFieldToContext.get(baseField);
540
- (0, internal_1.assert)(context !== undefined, 0x852 /* Every field should have a context */);
587
+ rebaseInvalidatedField(baseField, crossFieldTable, context, rebaseMetadata, genId) {
541
588
  const { changeHandler, change1: fieldChangeset, change2: baseChangeset, } = this.normalizeFieldChanges(context.newChange, context.baseChange);
542
589
  const rebaseChild = (curr, base) => {
543
590
  if (curr !== undefined) {
544
591
  return curr;
545
592
  }
546
- if (base !== undefined) {
547
- for (const id of context.baseNodeIds) {
548
- if ((0, index_js_1.areEqualChangeAtomIds)(base, id)) {
549
- return base;
550
- }
551
- }
593
+ if (base !== undefined && (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(context.baseNodeIds, base) === true) {
594
+ return base;
552
595
  }
553
596
  return undefined;
554
597
  };
555
- context.rebasedChange.change = (0, index_js_2.brand)(changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, new RebaseManager(crossFieldTable, baseField, context.fieldId, allowInval), rebaseMetadata));
598
+ let allowInval = false;
599
+ if (crossFieldTable.fieldsWithUnattachedChild.has(baseField)) {
600
+ crossFieldTable.fieldsWithUnattachedChild.delete(baseField);
601
+ allowInval = true;
602
+ }
603
+ context.rebasedChange.change = (0, index_js_2.brand)(changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, new RebaseNodeManagerI(crossFieldTable, context.fieldId, allowInval), rebaseMetadata, crossFieldTable.rebaseVersion));
556
604
  }
557
605
  attachRebasedField(rebasedFields, rebasedNodes, table, rebasedField, { nodeId, field: fieldKey }, idAllocator, metadata) {
558
606
  if (nodeId === undefined) {
559
607
  rebasedFields.set(fieldKey, rebasedField);
560
608
  return;
561
609
  }
562
- const rebasedNode = getFromChangeAtomIdMap(rebasedNodes, nodeId);
610
+ const rebasedNode = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(rebasedNodes, nodeId);
563
611
  if (rebasedNode !== undefined) {
564
- if (rebasedNode.fieldChanges === undefined) {
565
- rebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);
612
+ const updatedRebasedNode = cloneNodeChangeset(rebasedNode);
613
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, nodeId, updatedRebasedNode);
614
+ if (updatedRebasedNode.fieldChanges === undefined) {
615
+ updatedRebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);
566
616
  return;
567
617
  }
568
- (0, internal_1.assert)(!rebasedNode.fieldChanges.has(fieldKey), 0x9c4 /* Expected an empty field */);
569
- rebasedNode.fieldChanges.set(fieldKey, rebasedField);
618
+ (0, internal_1.assert)(!updatedRebasedNode.fieldChanges.has(fieldKey), 0x9c4 /* Expected an empty field */);
619
+ updatedRebasedNode.fieldChanges.set(fieldKey, rebasedField);
570
620
  return;
571
621
  }
572
622
  const newNode = {
573
623
  fieldChanges: new Map([[fieldKey, rebasedField]]),
574
624
  };
575
- setInChangeAtomIdMap(rebasedNodes, nodeId, newNode);
576
- setInChangeAtomIdMap(table.baseToRebasedNodeId, nodeId, nodeId);
577
- const parentFieldId = getParentFieldId(table.baseChange, nodeId);
578
- this.attachRebasedNode(rebasedFields, rebasedNodes, table, nodeId, parentFieldId, idAllocator, metadata);
579
- }
580
- attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId, parentFieldIdBase, idAllocator, metadata) {
581
- const baseFieldChange = fieldChangeFromId(table.baseChange.fieldChanges, table.baseChange.nodeChanges, parentFieldIdBase);
625
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, nodeId, newNode);
626
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.baseToRebasedNodeId, nodeId, nodeId);
627
+ const parentBase = getNodeParent(table.baseChange, nodeId);
628
+ this.attachRebasedNode(rebasedFields, rebasedNodes, table, nodeId, parentBase, idAllocator, metadata);
629
+ }
630
+ attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId, parentBase, idAllocator, metadata) {
631
+ if (parentBase.root !== undefined) {
632
+ const renamedRoot = firstAttachIdFromDetachId(table.baseChange.rootNodes, parentBase.root, 1).value;
633
+ const attachField = table.baseChange.crossFieldKeys.getFirst({ ...renamedRoot, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, 1).value;
634
+ if (attachField !== undefined) {
635
+ // The base change inserts this node into `attachField`, so the rebased change should represent this node there.
636
+ const normalizedAttachField = normalizeFieldId(attachField, table.baseChange.nodeAliases);
637
+ const entry = table.entries.getFirst(renamedRoot, 1).value ?? {};
638
+ table.entries.set(renamedRoot, 1, { ...entry, nodeChange: baseNodeId });
639
+ table.affectedBaseFields.set(fieldIdKeyFromFieldId(normalizedAttachField), true);
640
+ this.attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId, { field: normalizedAttachField }, idAllocator, metadata);
641
+ }
642
+ else {
643
+ const baseDetachLocation = table.baseChange.rootNodes.detachLocations.getFirst(parentBase.root, 1).value;
644
+ assignRootChange(table.rebasedRootNodes, table.rebasedNodeToParent, renamedRoot, baseNodeId, baseDetachLocation, table.rebaseVersion);
645
+ // We need to make sure the rebased changeset includes the detach location,
646
+ // so we add that field to `affectedBaseFields` unless it's already been processed.
647
+ if (baseDetachLocation !== undefined &&
648
+ !table.baseFieldToContext.has(fieldChangeFromId(table.baseChange, baseDetachLocation))) {
649
+ table.affectedBaseFields.set(fieldIdKeyFromFieldId(baseDetachLocation), true);
650
+ }
651
+ }
652
+ return;
653
+ }
654
+ const parentFieldIdBase = parentBase.field;
655
+ const baseFieldChange = fieldChangeFromId(table.baseChange, parentFieldIdBase);
582
656
  const rebasedFieldId = rebasedFieldIdFromBaseId(table, parentFieldIdBase);
583
- setInChangeAtomIdMap(table.rebasedNodeToParent, baseNodeId, rebasedFieldId);
657
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.rebasedNodeToParent, baseNodeId, { field: rebasedFieldId });
584
658
  const context = table.baseFieldToContext.get(baseFieldChange);
585
659
  if (context !== undefined) {
586
660
  // We've already processed this field.
587
- // The new child node will be attached in rebaseFieldsWithUnattachedChild.
588
- context.baseNodeIds.push(baseNodeId);
589
- table.fieldsWithUnattachedChild.add(baseFieldChange);
661
+ // The new child node will be attached in the next pass.
662
+ // Note that adding to `fieldsWithUnattachedChild` allows that field to generate new invalidations,
663
+ // so to avoid invalidation cycles we make sure we only add to it once per new unattached child.
664
+ // This is done by checking whether `context.baseNodeIds` already contained `baseNodeId`.
665
+ if ((0, modularChangeTypes_js_1.setInChangeAtomIdMap)(context.baseNodeIds, baseNodeId, true)) {
666
+ table.fieldsWithUnattachedChild.add(baseFieldChange);
667
+ table.affectedBaseFields.set(fieldIdKeyFromFieldId(parentFieldIdBase), true);
668
+ }
590
669
  return;
591
670
  }
592
- const handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);
593
- const fieldChange = {
594
- ...baseFieldChange,
595
- change: (0, index_js_2.brand)(handler.createEmpty()),
596
- };
597
- const rebasedChangeset = handler.rebaser.rebase(handler.createEmpty(), baseFieldChange.change, (_idNew, idBase) => idBase !== undefined && (0, index_js_1.areEqualChangeAtomIds)(idBase, baseNodeId)
598
- ? baseNodeId
599
- : undefined, idAllocator, new RebaseManager(table, baseFieldChange, rebasedFieldId), metadata);
600
- const rebasedField = { ...baseFieldChange, change: (0, index_js_2.brand)(rebasedChangeset) };
601
- table.rebasedFields.add(rebasedField);
602
- table.baseFieldToContext.set(baseFieldChange, {
603
- newChange: fieldChange,
604
- baseChange: baseFieldChange,
605
- rebasedChange: rebasedField,
606
- fieldId: rebasedFieldId,
607
- baseNodeIds: [],
608
- });
609
- this.attachRebasedField(rebasedFields, rebasedNodes, table, rebasedField, rebasedFieldId, idAllocator, metadata);
671
+ this.rebaseFieldWithoutNewChanges(baseFieldChange, parentFieldIdBase, table, rebasedFields, rebasedNodes, idAllocator, metadata, baseNodeId);
610
672
  }
611
673
  rebaseFieldMap(change, over, parentId, genId, crossFieldTable, revisionMetadata) {
612
674
  const rebasedFields = new Map();
@@ -624,8 +686,8 @@ class ModularChangeFamily {
624
686
  continue;
625
687
  }
626
688
  const { fieldKind, changeHandler, change1: fieldChangeset, change2: baseChangeset, } = this.normalizeFieldChanges(fieldChange, baseChange);
627
- const manager = new RebaseManager(crossFieldTable, baseChange, fieldId);
628
- const rebasedField = changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, manager, revisionMetadata);
689
+ const manager = new RebaseNodeManagerI(crossFieldTable, fieldId);
690
+ const rebasedField = changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, manager, revisionMetadata, crossFieldTable.rebaseVersion);
629
691
  const rebasedFieldChange = {
630
692
  fieldKind,
631
693
  change: (0, index_js_2.brand)(rebasedField),
@@ -636,15 +698,15 @@ class ModularChangeFamily {
636
698
  newChange: fieldChange,
637
699
  rebasedChange: rebasedFieldChange,
638
700
  fieldId,
639
- baseNodeIds: [],
701
+ baseNodeIds: (0, index_js_2.newTupleBTree)(),
640
702
  });
641
703
  crossFieldTable.rebasedFields.add(rebasedFieldChange);
642
704
  }
643
705
  return rebasedFields;
644
706
  }
645
707
  rebaseNodeChange(newId, baseId, genId, crossFieldTable, revisionMetadata) {
646
- const change = nodeChangeFromId(crossFieldTable.newChange.nodeChanges, newId);
647
- const over = nodeChangeFromId(crossFieldTable.baseChange.nodeChanges, baseId);
708
+ const change = nodeChangeFromId(crossFieldTable.newChange.nodeChanges, crossFieldTable.newChange.nodeAliases, newId);
709
+ const over = nodeChangeFromId(crossFieldTable.baseChange.nodeChanges, crossFieldTable.baseChange.nodeAliases, baseId);
648
710
  const baseMap = over?.fieldChanges ?? new Map();
649
711
  const fieldChanges = change.fieldChanges !== undefined && over.fieldChanges !== undefined
650
712
  ? this.rebaseFieldMap(change?.fieldChanges ?? new Map(), baseMap, newId, genId, crossFieldTable, revisionMetadata)
@@ -659,31 +721,40 @@ class ModularChangeFamily {
659
721
  if (change?.nodeExistsConstraintOnRevert !== undefined) {
660
722
  rebasedChange.nodeExistsConstraintOnRevert = change.nodeExistsConstraintOnRevert;
661
723
  }
662
- setInChangeAtomIdMap(crossFieldTable.baseToRebasedNodeId, baseId, newId);
724
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(crossFieldTable.baseToRebasedNodeId, baseId, newId);
663
725
  return rebasedChange;
664
726
  }
727
+ updateConstraints(rebasedFields, rebasedNodes, rebasedRoots, constraintState, revertConstraintState) {
728
+ this.updateConstraintsForFields(rebasedFields, fieldChangeHandler_js_1.NodeAttachState.Attached, fieldChangeHandler_js_1.NodeAttachState.Attached, constraintState, revertConstraintState, rebasedNodes);
729
+ for (const [_detachId, nodeId] of rebasedRoots.nodeChanges.entries()) {
730
+ // XXX: This is incorrect if the rebased changeset attaches the node.
731
+ // Efficiently computing whether the changeset attaches the node would require maintaining a mapping from node ID to attach ID.
732
+ const detachedInOutput = true;
733
+ this.updateConstraintsForNode(nodeId, fieldChangeHandler_js_1.NodeAttachState.Detached, detachedInOutput ? fieldChangeHandler_js_1.NodeAttachState.Detached : fieldChangeHandler_js_1.NodeAttachState.Attached, rebasedNodes, constraintState, revertConstraintState);
734
+ }
735
+ }
665
736
  updateConstraintsForFields(fields, parentInputAttachState, parentOutputAttachState, constraintState, revertConstraintState, nodes) {
666
737
  for (const field of fields.values()) {
667
738
  const handler = getChangeHandler(this.fieldKinds, field.fieldKind);
668
- for (const [nodeId, inputIndex, outputIndex] of handler.getNestedChanges(field.change)) {
669
- const isInputDetached = inputIndex === undefined;
670
- const inputAttachState = parentInputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached || isInputDetached
671
- ? fieldChangeHandler_js_1.NodeAttachState.Detached
672
- : fieldChangeHandler_js_1.NodeAttachState.Attached;
673
- const isOutputDetached = outputIndex === undefined;
739
+ for (const [nodeId] of handler.getNestedChanges(field.change)) {
740
+ // XXX: This is incorrect if the rebased changeset detaches this node.
741
+ // Efficiently computing whether the changeset detaches the node would require maintaining a mapping from node ID to detach ID.
742
+ const isOutputDetached = false;
674
743
  const outputAttachState = parentOutputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached || isOutputDetached
675
744
  ? fieldChangeHandler_js_1.NodeAttachState.Detached
676
745
  : fieldChangeHandler_js_1.NodeAttachState.Attached;
677
- this.updateConstraintsForNode(nodeId, inputAttachState, outputAttachState, nodes, constraintState, revertConstraintState);
746
+ this.updateConstraintsForNode(nodeId, parentInputAttachState, outputAttachState, nodes, constraintState, revertConstraintState);
678
747
  }
679
748
  }
680
749
  }
681
750
  updateConstraintsForNode(nodeId, inputAttachState, outputAttachState, nodes, constraintState, revertConstraintState) {
682
- const node = nodes.get([nodeId.revision, nodeId.localId]) ?? (0, internal_1.fail)(0xb24 /* Unknown node ID */);
751
+ const node = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodes, nodeId) ?? (0, internal_1.fail)(0xb24 /* Unknown node ID */);
752
+ const updatedNode = { ...node };
753
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodes, nodeId, updatedNode);
683
754
  if (node.nodeExistsConstraint !== undefined) {
684
755
  const isNowViolated = inputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached;
685
756
  if (node.nodeExistsConstraint.violated !== isNowViolated) {
686
- node.nodeExistsConstraint = {
757
+ updatedNode.nodeExistsConstraint = {
687
758
  ...node.nodeExistsConstraint,
688
759
  violated: isNowViolated,
689
760
  };
@@ -693,7 +764,7 @@ class ModularChangeFamily {
693
764
  if (node.nodeExistsConstraintOnRevert !== undefined) {
694
765
  const isNowViolated = outputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached;
695
766
  if (node.nodeExistsConstraintOnRevert.violated !== isNowViolated) {
696
- node.nodeExistsConstraintOnRevert = {
767
+ updatedNode.nodeExistsConstraintOnRevert = {
697
768
  ...node.nodeExistsConstraintOnRevert,
698
769
  violated: isNowViolated,
699
770
  };
@@ -704,35 +775,70 @@ class ModularChangeFamily {
704
775
  this.updateConstraintsForFields(node.fieldChanges, inputAttachState, outputAttachState, constraintState, revertConstraintState, nodes);
705
776
  }
706
777
  }
707
- pruneFieldMap(changeset, nodeMap) {
778
+ pruneFieldMap(changeset, parentId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges) {
708
779
  if (changeset === undefined) {
709
780
  return undefined;
710
781
  }
711
782
  const prunedChangeset = new Map();
712
783
  for (const [field, fieldChange] of changeset) {
713
784
  const handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);
714
- const prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) => this.pruneNodeChange(nodeId, nodeMap));
715
- if (!handler.isEmpty(prunedFieldChangeset)) {
785
+ const prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) => this.pruneNodeChange(nodeId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges));
786
+ const fieldId = { nodeId: parentId, field };
787
+ const fieldIdKey = fieldIdKeyFromFieldId(fieldId);
788
+ const rootsWithChanges = fieldsToRootChanges.get(fieldIdKey) ?? [];
789
+ let hasRootWithNodeChange = false;
790
+ for (const rootId of rootsWithChanges) {
791
+ const nodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(roots.nodeChanges, rootId) ?? (0, internal_1.fail)("No root change found");
792
+ const isRootChangeEmpty = this.pruneNodeChange(nodeId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges) === undefined;
793
+ if (isRootChangeEmpty) {
794
+ roots.nodeChanges.delete([rootId.revision, rootId.localId]);
795
+ tryRemoveDetachLocation(roots, rootId, 1);
796
+ }
797
+ else {
798
+ hasRootWithNodeChange = true;
799
+ }
800
+ }
801
+ const hasRootChanges = hasRootWithNodeChange || fieldsWithRootMoves.get(fieldIdKey) === true;
802
+ if (!handler.isEmpty(prunedFieldChangeset) || hasRootChanges) {
716
803
  prunedChangeset.set(field, { ...fieldChange, change: (0, index_js_2.brand)(prunedFieldChangeset) });
717
804
  }
718
805
  }
719
806
  return prunedChangeset.size > 0 ? prunedChangeset : undefined;
720
807
  }
721
- pruneNodeChange(nodeId, nodeMap) {
722
- const changeset = nodeChangeFromId(nodeMap, nodeId);
808
+ pruneRoots(roots, nodeMap, nodeToParent, aliases, fieldsWithRootMoves, fieldsToRootChanges) {
809
+ const pruned = { ...roots, nodeChanges: (0, index_js_2.newTupleBTree)() };
810
+ for (const [rootIdKey, nodeId] of roots.nodeChanges.entries()) {
811
+ const rootId = { revision: rootIdKey[0], localId: rootIdKey[1] };
812
+ const hasDetachLocation = roots.detachLocations.getFirst(rootId, 1).value !== undefined;
813
+ // If the root has a detach location it should be pruned by recursion when pruning the field it was detached from.
814
+ const prunedId = hasDetachLocation
815
+ ? nodeId
816
+ : this.pruneNodeChange(nodeId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges);
817
+ if (prunedId !== undefined) {
818
+ pruned.nodeChanges.set(rootIdKey, prunedId);
819
+ }
820
+ tryRemoveDetachLocation(pruned, rootId, 1);
821
+ }
822
+ return pruned;
823
+ }
824
+ pruneNodeChange(nodeId, nodes, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges) {
825
+ const changeset = nodeChangeFromId(nodes, aliases, nodeId);
723
826
  const prunedFields = changeset.fieldChanges !== undefined
724
- ? this.pruneFieldMap(changeset.fieldChanges, nodeMap)
827
+ ? this.pruneFieldMap(changeset.fieldChanges, nodeId, nodes, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges)
725
828
  : undefined;
726
829
  const prunedChange = { ...changeset, fieldChanges: prunedFields };
727
830
  if (prunedChange.fieldChanges === undefined) {
728
831
  delete prunedChange.fieldChanges;
729
832
  }
730
833
  if (isEmptyNodeChangeset(prunedChange)) {
731
- nodeMap.delete([nodeId.revision, nodeId.localId]);
834
+ const nodeIdKey = [nodeId.revision, nodeId.localId];
835
+ // TODO: Shouldn't we also delete all aliases associated with this node?
836
+ nodes.delete(nodeIdKey);
837
+ nodeToParent.delete(nodeIdKey);
732
838
  return undefined;
733
839
  }
734
840
  else {
735
- setInChangeAtomIdMap(nodeMap, nodeId, prunedChange);
841
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodes, nodeId, prunedChange);
736
842
  return nodeId;
737
843
  }
738
844
  }
@@ -746,17 +852,18 @@ class ModularChangeFamily {
746
852
  updatedNodes.set([replaceRevision(revision, oldRevisions, newRevision), id], this.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision));
747
853
  }
748
854
  const updatedNodeToParent = (0, index_js_2.newTupleBTree)();
749
- for (const [[revision, id], fieldId] of change.nodeToParent.entries()) {
750
- updatedNodeToParent.set([replaceRevision(revision, oldRevisions, newRevision), id], replaceFieldIdRevision(normalizeFieldId(fieldId, change.nodeAliases), oldRevisions, newRevision));
855
+ for (const [[revision, id], location] of change.nodeToParent.entries()) {
856
+ updatedNodeToParent.set([replaceRevision(revision, oldRevisions, newRevision), id], replaceNodeLocationRevision(normalizeNodeLocation(location, change.nodeAliases), oldRevisions, newRevision));
751
857
  }
752
858
  const updated = {
753
859
  ...change,
754
860
  fieldChanges: updatedFields,
755
861
  nodeChanges: updatedNodes,
756
862
  nodeToParent: updatedNodeToParent,
863
+ rootNodes: replaceRootTableRevision(change.rootNodes, oldRevisions, newRevision, change.nodeAliases),
757
864
  // We've updated all references to old node IDs, so we no longer need an alias table.
758
865
  nodeAliases: (0, index_js_2.newTupleBTree)(),
759
- crossFieldKeys: replaceCrossFieldKeyTableRevisions(change.crossFieldKeys, oldRevisions, newRevision, change.nodeAliases),
866
+ crossFieldKeys: change.crossFieldKeys.mapEntries((key) => replaceCrossFieldKeyRevision(key, oldRevisions, newRevision), (id) => replaceFieldIdRevision(normalizeFieldId(id, change.nodeAliases), oldRevisions, newRevision)),
760
867
  };
761
868
  if (change.builds !== undefined) {
762
869
  updated.builds = replaceIdMapRevisions(change.builds, oldRevisions, newRevision);
@@ -795,7 +902,7 @@ class ModularChangeFamily {
795
902
  return updatedFields;
796
903
  }
797
904
  makeCrossFieldKeyTable(fields, nodes) {
798
- const keys = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
905
+ const keys = (0, modularChangeTypes_js_1.newCrossFieldRangeTable)();
799
906
  this.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);
800
907
  nodes.forEachPair(([revision, localId], node) => {
801
908
  if (node.fieldChanges !== undefined) {
@@ -823,40 +930,53 @@ class ModularChangeFamily {
823
930
  return { fieldKind, change: (0, index_js_2.brand)(emptyChange) };
824
931
  }
825
932
  validateChangeset(change) {
826
- let numNodes = this.validateFieldChanges(change, change.fieldChanges, undefined);
933
+ const unreachableNodes = (0, index_js_2.brand)(change.nodeToParent.clone());
934
+ const unreachableCFKs = change.crossFieldKeys.clone();
935
+ this.validateFieldChanges(change, change.fieldChanges, undefined, unreachableNodes, unreachableCFKs);
827
936
  for (const [[revision, localId], node] of change.nodeChanges.entries()) {
828
937
  if (node.fieldChanges === undefined) {
829
938
  continue;
830
939
  }
831
- const nodeId = { revision, localId };
832
- const numChildren = this.validateFieldChanges(change, node.fieldChanges, nodeId);
833
- numNodes += numChildren;
940
+ const nodeId = normalizeNodeId({ revision, localId }, change.nodeAliases);
941
+ this.validateFieldChanges(change, node.fieldChanges, nodeId, unreachableNodes, unreachableCFKs);
942
+ }
943
+ for (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {
944
+ const detachId = { revision: detachIdKey[0], localId: detachIdKey[1] };
945
+ const location = getNodeParent(change, nodeId);
946
+ (0, internal_1.assert)((0, index_js_1.areEqualChangeAtomIdOpts)(location.root, detachId), "Inconsistent node location");
947
+ const normalizedNodeId = normalizeNodeId(nodeId, change.nodeAliases);
948
+ unreachableNodes.delete([normalizedNodeId.revision, normalizedNodeId.localId]);
949
+ const fieldChanges = nodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId).fieldChanges;
950
+ if (fieldChanges !== undefined) {
951
+ this.validateFieldChanges(change, fieldChanges, normalizedNodeId, unreachableNodes, unreachableCFKs);
952
+ }
834
953
  }
835
- (0, internal_1.assert)(numNodes === change.nodeChanges.size, 0xa4d /* Node table contains unparented nodes */);
954
+ (0, internal_1.assert)(unreachableNodes.size === 0, "Unreachable nodes found");
955
+ (0, internal_1.assert)(unreachableCFKs.entries().length === 0, "Unreachable cross-field keys found");
836
956
  }
837
957
  /**
838
- * Asserts that each child and cross field key in each field has a correct entry in
839
- * `nodeToParent` or `crossFieldKeyTable`.
958
+ * Asserts that each node has a correct entry in `change.nodeToParent`,
959
+ * and each cross field key has a correct entry in `change.crossFieldKeys`.
840
960
  * @returns the number of children found.
841
961
  */
842
- validateFieldChanges(change, fieldChanges, nodeParent) {
843
- let numChildren = 0;
962
+ validateFieldChanges(change, fieldChanges, nodeParent, unreachableNodes, unreachableCFKs) {
844
963
  for (const [field, fieldChange] of fieldChanges.entries()) {
845
964
  const fieldId = { nodeId: nodeParent, field };
846
965
  const handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);
847
966
  for (const [child, _index] of handler.getNestedChanges(fieldChange.change)) {
848
- const parentFieldId = getParentFieldId(change, child);
849
- (0, internal_1.assert)(areEqualFieldIds(parentFieldId, fieldId), 0xa4e /* Inconsistent node parentage */);
850
- numChildren += 1;
967
+ const parentFieldId = getNodeParent(change, child);
968
+ (0, internal_1.assert)(parentFieldId.field !== undefined && areEqualFieldIds(parentFieldId.field, fieldId), 0xa4e /* Inconsistent node parentage */);
969
+ unreachableNodes.delete([child.revision, child.localId]);
851
970
  }
852
971
  for (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {
853
972
  const fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);
854
- (0, internal_1.assert)(fields.length === 1 &&
855
- fields[0] !== undefined &&
856
- areEqualFieldIds(fields[0], fieldId), 0xa4f /* Inconsistent cross field keys */);
973
+ (0, internal_1.assert)(fields.length > 0, "Unregistered cross-field key");
974
+ for (const fieldFromLookup of fields) {
975
+ (0, internal_1.assert)(areEqualFieldIds(fieldFromLookup, fieldId), 0xa4f /* Inconsistent cross field keys */);
976
+ }
977
+ unreachableCFKs.delete(keyRange.key, keyRange.count);
857
978
  }
858
979
  }
859
- return numChildren;
860
980
  }
861
981
  getEffectiveChange(change) {
862
982
  if (hasConflicts(change)) {
@@ -870,7 +990,8 @@ class ModularChangeFamily {
870
990
  muteChange(change) {
871
991
  const muted = {
872
992
  ...change,
873
- crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
993
+ rootNodes: muteRootChanges(change.rootNodes),
994
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
874
995
  fieldChanges: this.muteFieldChanges(change.fieldChanges),
875
996
  nodeChanges: (0, index_js_2.brand)(change.nodeChanges.mapValues((v) => this.muteNodeChange(v))),
876
997
  };
@@ -898,27 +1019,12 @@ class ModularChangeFamily {
898
1019
  }
899
1020
  exports.ModularChangeFamily = ModularChangeFamily;
900
1021
  ModularChangeFamily.emptyChange = makeModularChangeset();
901
- function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, nodeAliases) {
902
- const updated = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
903
- for (const entry of table.entries()) {
904
- const key = entry.start;
905
- const updatedKey = {
906
- target: key.target,
907
- revision: replaceRevision(key.revision, oldRevisions, newRevision),
908
- localId: key.localId,
909
- };
910
- const field = entry.value;
911
- const normalizedFieldId = normalizeFieldId(field, nodeAliases);
912
- const updatedNodeId = normalizedFieldId.nodeId !== undefined
913
- ? (0, index_js_1.replaceAtomRevisions)(normalizedFieldId.nodeId, oldRevisions, newRevision)
914
- : undefined;
915
- const updatedValue = {
916
- ...normalizedFieldId,
917
- nodeId: updatedNodeId,
918
- };
919
- updated.set(updatedKey, entry.length, updatedValue);
920
- }
921
- return updated;
1022
+ function replaceCrossFieldKeyRevision(key, oldRevisions, newRevision) {
1023
+ return {
1024
+ target: key.target,
1025
+ revision: replaceRevision(key.revision, oldRevisions, newRevision),
1026
+ localId: key.localId,
1027
+ };
922
1028
  }
923
1029
  function replaceRevision(revision, oldRevisions, newRevision) {
924
1030
  return oldRevisions.has(revision) ? newRevision : revision;
@@ -964,6 +1070,19 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
964
1070
  }
965
1071
  }
966
1072
  }
1073
+ // It's possible to have a build and a refresher for the same root because an attach operation need not be performed in the same changeset as the corresponding build.
1074
+ if (change1.builds !== undefined && change2.refreshers !== undefined) {
1075
+ for (const [key, chunk] of change2.refreshers.entries()) {
1076
+ (0, internal_1.assert)(chunk.topLevelLength === 1, "Expected refresher chunk to have length 1");
1077
+ const match = change1.builds.getPairOrNextLower(key);
1078
+ if (match !== undefined) {
1079
+ const [buildKey, buildChunk] = match;
1080
+ if (buildKey[0] === key[0] && buildKey[1] + buildChunk.topLevelLength > key[1]) {
1081
+ allRefreshers.delete(key);
1082
+ }
1083
+ }
1084
+ }
1085
+ }
967
1086
  return { allBuilds, allDestroys, allRefreshers };
968
1087
  }
969
1088
  function invertBuilds(builds) {
@@ -988,19 +1107,45 @@ function invertBuilds(builds) {
988
1107
  * @param fieldKinds - The field kinds to delegate to.
989
1108
  */
990
1109
  function* relevantRemovedRoots(change, fieldKinds) {
991
- yield* relevantRemovedRootsFromFields(change.fieldChanges, change.nodeChanges, fieldKinds);
1110
+ const rootIds = (0, index_js_1.newChangeAtomIdRangeMap)();
1111
+ addAttachesToSet(change, rootIds);
1112
+ addRenamesToSet(change, rootIds);
1113
+ for (const [[revision, localId]] of change.rootNodes.nodeChanges.entries()) {
1114
+ rootIds.set({ revision, localId }, 1, true);
1115
+ }
1116
+ for (const entry of rootIds.entries()) {
1117
+ for (let offset = 0; offset < entry.length; offset++) {
1118
+ const detachId = (0, index_js_1.offsetChangeAtomId)(entry.start, offset);
1119
+ yield (0, index_js_1.makeDetachedNodeId)(detachId.revision, detachId.localId);
1120
+ }
1121
+ }
992
1122
  }
993
1123
  exports.relevantRemovedRoots = relevantRemovedRoots;
994
- function* relevantRemovedRootsFromFields(change, nodeChanges, fieldKinds) {
995
- for (const [_, fieldChange] of change) {
996
- const handler = getChangeHandler(fieldKinds, fieldChange.fieldKind);
997
- const delegate = function* (node) {
998
- const nodeChangeset = nodeChangeFromId(nodeChanges, node);
999
- if (nodeChangeset.fieldChanges !== undefined) {
1000
- yield* relevantRemovedRootsFromFields(nodeChangeset.fieldChanges, nodeChanges, fieldKinds);
1124
+ function addAttachesToSet(change, rootIds) {
1125
+ // This includes each attach which does not have a corresponding detach.
1126
+ for (const entry of change.crossFieldKeys.entries()) {
1127
+ if (entry.start.target !== crossFieldQueries_js_1.CrossFieldTarget.Destination) {
1128
+ continue;
1129
+ }
1130
+ for (const detachIdEntry of change.rootNodes.newToOldId.getAll2(entry.start, entry.length)) {
1131
+ const detachId = detachIdEntry.value ?? (0, index_js_1.offsetChangeAtomId)(entry.start, detachIdEntry.offset);
1132
+ for (const detachEntry of change.crossFieldKeys.getAll2({ ...detachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, detachIdEntry.length)) {
1133
+ if (detachEntry.value === undefined) {
1134
+ rootIds.set((0, index_js_1.offsetChangeAtomId)(detachId, detachEntry.offset), detachEntry.length, true);
1135
+ }
1001
1136
  }
1002
- };
1003
- yield* handler.relevantRemovedRoots(fieldChange.change, delegate);
1137
+ }
1138
+ }
1139
+ }
1140
+ function addRenamesToSet(change, rootIds) {
1141
+ for (const renameEntry of change.rootNodes.oldToNewId.entries()) {
1142
+ for (const detachEntry of change.crossFieldKeys.getAll2({ ...renameEntry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, renameEntry.length)) {
1143
+ // We only want to include renames of nodes which are detached in the input context of the changeset.
1144
+ // So if there is a detach for the node, the rename is not relevant.
1145
+ if (detachEntry.value === undefined) {
1146
+ rootIds.set(renameEntry.start, renameEntry.length, true);
1147
+ }
1148
+ }
1004
1149
  }
1005
1150
  }
1006
1151
  /**
@@ -1052,6 +1197,7 @@ function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshe
1052
1197
  nodeChanges,
1053
1198
  nodeToParent: change.nodeToParent,
1054
1199
  nodeAliases: change.nodeAliases,
1200
+ rootNodes: change.rootNodes,
1055
1201
  crossFieldKeys: change.crossFieldKeys,
1056
1202
  maxId: maxId,
1057
1203
  revisions,
@@ -1072,11 +1218,24 @@ exports.updateRefreshers = updateRefreshers;
1072
1218
  function intoDelta(taggedChange, fieldKinds) {
1073
1219
  const change = taggedChange.change;
1074
1220
  const rootDelta = {};
1075
- const global = [];
1076
- const rename = [];
1077
1221
  if (!hasConflicts(change)) {
1078
1222
  // If there are no constraint violations, then tree changes apply.
1079
- const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds, global, rename);
1223
+ const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldKinds);
1224
+ const global = [];
1225
+ for (const [[major, minor], nodeId] of change.rootNodes.nodeChanges.entries()) {
1226
+ global.push({
1227
+ id: { major, minor },
1228
+ fields: deltaFromNodeChange(nodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId), change.nodeChanges, change.nodeAliases, fieldKinds),
1229
+ });
1230
+ }
1231
+ const rename = [];
1232
+ for (const { start: oldId, value: newId, length, } of change.rootNodes.oldToNewId.entries()) {
1233
+ rename.push({
1234
+ count: length,
1235
+ oldId: (0, index_js_1.makeDetachedNodeId)(oldId.revision, oldId.localId),
1236
+ newId: (0, index_js_1.makeDetachedNodeId)(newId.revision, newId.localId),
1237
+ });
1238
+ }
1080
1239
  if (fieldDeltas.size > 0) {
1081
1240
  rootDelta.fields = fieldDeltas;
1082
1241
  }
@@ -1123,24 +1282,22 @@ function copyDetachedNodes(detachedNodes) {
1123
1282
  /**
1124
1283
  * @param change - The change to convert into a delta.
1125
1284
  */
1126
- function intoDeltaImpl(change, nodeChanges, fieldKinds, global, rename) {
1285
+ function intoDeltaImpl(change, nodeChanges, nodeAliases, fieldKinds) {
1127
1286
  const delta = new Map();
1128
1287
  for (const [field, fieldChange] of change) {
1129
- const { local: fieldChanges, global: fieldGlobal, rename: fieldRename, } = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
1130
- const nodeChange = nodeChangeFromId(nodeChanges, childChange);
1131
- return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds, global, rename);
1288
+ const fieldDelta = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
1289
+ const nodeChange = nodeChangeFromId(nodeChanges, nodeAliases, childChange);
1290
+ return deltaFromNodeChange(nodeChange, nodeChanges, nodeAliases, fieldKinds);
1132
1291
  });
1133
- if (fieldChanges !== undefined && fieldChanges.length > 0) {
1134
- delta.set(field, fieldChanges);
1292
+ if (fieldDelta !== undefined && fieldDelta.length > 0) {
1293
+ delta.set(field, fieldDelta);
1135
1294
  }
1136
- fieldGlobal?.forEach((c) => global.push(c));
1137
- fieldRename?.forEach((r) => rename.push(r));
1138
1295
  }
1139
1296
  return delta;
1140
1297
  }
1141
- function deltaFromNodeChange(change, nodeChanges, fieldKinds, global, rename) {
1298
+ function deltaFromNodeChange(change, nodeChanges, nodeAliases, fieldKinds) {
1142
1299
  if (change.fieldChanges !== undefined) {
1143
- return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds, global, rename);
1300
+ return intoDeltaImpl(change.fieldChanges, nodeChanges, nodeAliases, fieldKinds);
1144
1301
  }
1145
1302
  // TODO: update the API to allow undefined to be returned here
1146
1303
  return new Map();
@@ -1190,30 +1347,22 @@ function getChangeHandler(fieldKinds, kind) {
1190
1347
  return getFieldKind(fieldKinds, kind).changeHandler;
1191
1348
  }
1192
1349
  exports.getChangeHandler = getChangeHandler;
1193
- function newComposeTable(baseChange, newChange, composedNodeToParent) {
1350
+ function newComposeTable(baseChange, newChange, composedRootNodes, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
1194
1351
  return {
1195
- ...newCrossFieldTable(),
1352
+ rebaseVersion: Math.max(baseChange.rebaseVersion, newChange.rebaseVersion),
1353
+ entries: newDetachedEntryMap(),
1196
1354
  baseChange,
1197
1355
  newChange,
1198
1356
  fieldToContext: new Map(),
1199
1357
  newFieldToBaseField: new Map(),
1200
1358
  newToBaseNodeId: (0, index_js_2.newTupleBTree)(),
1201
1359
  composedNodes: new Set(),
1202
- composedNodeToParent,
1203
- pendingCompositions: {
1204
- nodeIdsToCompose: [],
1205
- affectedBaseFields: (0, index_js_2.newTupleBTree)(),
1206
- affectedNewFields: (0, index_js_2.newTupleBTree)(),
1207
- },
1208
- };
1209
- }
1210
- function newCrossFieldTable() {
1211
- return {
1212
- srcTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
1213
- dstTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
1214
- srcDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
1215
- dstDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
1216
- invalidatedFields: new Set(),
1360
+ movedNodeToParent: (0, index_js_2.newTupleBTree)(),
1361
+ composedRootNodes,
1362
+ movedCrossFieldKeys,
1363
+ removedCrossFieldKeys,
1364
+ renamesToDelete: (0, index_js_1.newChangeAtomIdRangeMap)(),
1365
+ pendingCompositions,
1217
1366
  };
1218
1367
  }
1219
1368
  function newConstraintState(violationCount) {
@@ -1221,147 +1370,354 @@ function newConstraintState(violationCount) {
1221
1370
  violationCount,
1222
1371
  };
1223
1372
  }
1224
- class CrossFieldManagerI {
1225
- constructor(crossFieldTable, currentFieldKey, allowInval = true) {
1226
- this.crossFieldTable = crossFieldTable;
1227
- this.currentFieldKey = currentFieldKey;
1228
- this.allowInval = allowInval;
1373
+ class InvertNodeManagerI {
1374
+ constructor(table, fieldId) {
1375
+ this.table = table;
1376
+ this.fieldId = fieldId;
1229
1377
  }
1230
- set(target, revision, id, count, newValue, invalidateDependents) {
1231
- if (invalidateDependents && this.allowInval) {
1232
- const lastChangedId = id + count - 1;
1233
- let firstId = id;
1234
- while (firstId <= lastChangedId) {
1235
- const dependentEntry = (0, crossFieldQueries_js_1.getFirstFromCrossFieldMap)(this.getDependents(target), revision, firstId, lastChangedId - firstId + 1);
1236
- if (dependentEntry.value !== undefined) {
1237
- this.crossFieldTable.invalidatedFields.add(dependentEntry.value);
1378
+ invertDetach(detachId, count, nodeChange, newAttachId) {
1379
+ if (nodeChange !== undefined) {
1380
+ (0, internal_1.assert)(count === 1, "A node change should only affect one node");
1381
+ const attachEntry = firstAttachIdFromDetachId(this.table.change.rootNodes, detachId, count);
1382
+ const attachFieldEntry = this.table.change.crossFieldKeys.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...attachEntry.value }, count);
1383
+ if (attachFieldEntry.value !== undefined) {
1384
+ (0, crossFieldQueries_js_1.setInCrossFieldMap)(this.table.entries, attachEntry.value, count, nodeChange);
1385
+ this.table.invalidatedFields.add(fieldChangeFromId(this.table.change, attachFieldEntry.value));
1386
+ }
1387
+ else {
1388
+ assignRootChange(this.table.invertedRoots, this.table.invertedNodeToParent, attachEntry.value, nodeChange, this.fieldId, this.table.change.rebaseVersion);
1389
+ }
1390
+ }
1391
+ if (!(0, index_js_1.areEqualChangeAtomIds)(detachId, newAttachId)) {
1392
+ for (const entry of doesChangeAttachNodes(this.table.change.crossFieldKeys, detachId, count)) {
1393
+ if (!entry.value) {
1394
+ this.table.attachToDetachId.set(newAttachId, count, detachId);
1395
+ this.table.invertedRoots.detachLocations.set(detachId, count, this.fieldId);
1238
1396
  }
1239
- firstId = (0, index_js_2.brand)(firstId + dependentEntry.length);
1240
1397
  }
1241
1398
  }
1242
- (0, crossFieldQueries_js_1.setInCrossFieldMap)(this.getMap(target), revision, id, count, newValue);
1243
1399
  }
1244
- get(target, revision, id, count, addDependency) {
1245
- if (addDependency) {
1246
- // We assume that if there is already an entry for this ID it is because
1247
- // a field handler has called compose on the same node multiple times.
1248
- // In this case we only want to update the latest version, so we overwrite the dependency.
1249
- (0, crossFieldQueries_js_1.setInCrossFieldMap)(this.getDependents(target), revision, id, count, this.currentFieldKey);
1400
+ invertAttach(attachId, count) {
1401
+ let countToProcess = count;
1402
+ const detachIdEntry = firstDetachIdFromAttachId(this.table.change.rootNodes, attachId, countToProcess);
1403
+ countToProcess = detachIdEntry.length;
1404
+ const detachEntry = getFirstFieldForCrossFieldKey(this.table.change, { target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...detachIdEntry.value }, countToProcess);
1405
+ countToProcess = detachEntry.length;
1406
+ let result;
1407
+ if (detachEntry.value !== undefined) {
1408
+ const moveEntry = this.table.entries.getFirst(attachId, countToProcess);
1409
+ result = { ...moveEntry, value: { nodeChange: moveEntry.value } };
1250
1410
  }
1251
- return (0, crossFieldQueries_js_1.getFirstFromCrossFieldMap)(this.getMap(target), revision, id, count);
1252
- }
1253
- getMap(target) {
1254
- return target === crossFieldQueries_js_1.CrossFieldTarget.Source
1255
- ? this.crossFieldTable.srcTable
1256
- : this.crossFieldTable.dstTable;
1257
- }
1258
- getDependents(target) {
1259
- return target === crossFieldQueries_js_1.CrossFieldTarget.Source
1260
- ? this.crossFieldTable.srcDependents
1261
- : this.crossFieldTable.dstDependents;
1262
- }
1263
- }
1264
- class InvertManager extends CrossFieldManagerI {
1265
- constructor(table, field, fieldId, allowInval = true) {
1266
- super(table, field, allowInval);
1267
- this.fieldId = fieldId;
1268
- }
1269
- onMoveIn(id) {
1270
- setInChangeAtomIdMap(this.table.invertedNodeToParent, id, this.fieldId);
1271
- }
1272
- moveKey(target, revision, id, count) {
1273
- (0, internal_1.assert)(false, 0x9c5 /* Keys should not be moved manually during invert */);
1274
- }
1275
- get table() {
1276
- return this.crossFieldTable;
1411
+ else {
1412
+ // This node is detached in the input context of the original change.
1413
+ const nodeIdEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.change.rootNodes.nodeChanges, detachIdEntry.value, countToProcess);
1414
+ countToProcess = nodeIdEntry.length;
1415
+ result = {
1416
+ value: { nodeChange: nodeIdEntry.value, detachId: detachIdEntry.value },
1417
+ length: countToProcess,
1418
+ };
1419
+ }
1420
+ if (result.value?.nodeChange !== undefined) {
1421
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.invertedNodeToParent, result.value.nodeChange, {
1422
+ field: this.fieldId,
1423
+ });
1424
+ }
1425
+ return result;
1277
1426
  }
1278
1427
  }
1279
- class RebaseManager extends CrossFieldManagerI {
1280
- constructor(table, currentField, fieldId, allowInval = true) {
1281
- super(table, currentField, allowInval);
1428
+ class RebaseNodeManagerI {
1429
+ constructor(table, fieldId, allowInval = true) {
1430
+ this.table = table;
1282
1431
  this.fieldId = fieldId;
1432
+ this.allowInval = allowInval;
1283
1433
  }
1284
- set(target, revision, id, count, newValue, invalidateDependents) {
1285
- if (invalidateDependents && this.allowInval) {
1286
- const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
1287
- target,
1288
- revision,
1289
- localId: id,
1290
- }, count);
1291
- (0, internal_1.assert)(newFieldIds.length === 0, 0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */);
1292
- const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
1293
- target,
1294
- revision,
1295
- localId: id,
1296
- }, count);
1297
- (0, internal_1.assert)(baseFieldIds.length > 0, 0x9c7 /* Cross field key not registered in base or new change */);
1298
- for (const baseFieldId of baseFieldIds) {
1299
- this.table.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
1434
+ getNewChangesForBaseAttach(baseAttachId, count) {
1435
+ let countToProcess = count;
1436
+ const detachEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, countToProcess);
1437
+ countToProcess = detachEntry.length;
1438
+ const nodeEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.newChange.rootNodes.nodeChanges, detachEntry.value, countToProcess);
1439
+ countToProcess = nodeEntry.length;
1440
+ const newNodeId = nodeEntry.value;
1441
+ const newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(detachEntry.value, countToProcess);
1442
+ countToProcess = newRenameEntry.length;
1443
+ let result;
1444
+ // eslint-disable-next-line unicorn/prefer-ternary
1445
+ if (newNodeId !== undefined || newRenameEntry.value !== undefined) {
1446
+ result = {
1447
+ ...newRenameEntry,
1448
+ value: { detachId: newRenameEntry.value, nodeChange: newNodeId },
1449
+ };
1450
+ }
1451
+ else {
1452
+ // This handles the case where the base changeset has moved these nodes,
1453
+ // meaning they were attached in the input context of the base changeset.
1454
+ result = this.table.entries.getFirst(baseAttachId, countToProcess);
1455
+ }
1456
+ // TODO: Consider moving these two checks into a separate method so that this function has no side effects.
1457
+ if (result.value?.detachId !== undefined) {
1458
+ this.table.rebasedDetachLocations.set(result.value.detachId, result.length, this.fieldId);
1459
+ }
1460
+ if (result.value?.nodeChange !== undefined) {
1461
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.rebasedNodeToParent, result.value.nodeChange, {
1462
+ field: this.fieldId,
1463
+ });
1464
+ }
1465
+ return result;
1466
+ }
1467
+ rebaseOverDetach(baseDetachId, count, newDetachId, nodeChange, cellRename) {
1468
+ let countToProcess = count;
1469
+ const attachIdEntry = firstAttachIdFromDetachId(this.table.baseRoots, baseDetachId, countToProcess);
1470
+ const baseAttachId = attachIdEntry.value;
1471
+ countToProcess = attachIdEntry.length;
1472
+ const attachFieldEntry = getFirstFieldForCrossFieldKey(this.table.baseChange, { ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, countToProcess);
1473
+ countToProcess = attachFieldEntry.length;
1474
+ const detachedMoveEntry = this.table.baseChange.rootNodes.outputDetachLocations.getFirst(baseDetachId, countToProcess);
1475
+ countToProcess = detachedMoveEntry.length;
1476
+ const destinationField = attachFieldEntry.value ?? detachedMoveEntry.value;
1477
+ if (destinationField !== undefined) {
1478
+ // The base detach is part of a move (or move of detach location) in the base changeset.
1479
+ (0, crossFieldQueries_js_1.setInCrossFieldMap)(this.table.entries, baseAttachId, countToProcess, {
1480
+ nodeChange,
1481
+ detachId: newDetachId,
1482
+ cellRename,
1483
+ });
1484
+ if (nodeChange !== undefined || newDetachId !== undefined) {
1485
+ this.invalidateBaseFields([destinationField]);
1486
+ }
1487
+ }
1488
+ if (attachFieldEntry.value === undefined) {
1489
+ // These nodes are detached in the output context of the base changeset.
1490
+ if (nodeChange !== undefined) {
1491
+ assignRootChange(this.table.rebasedRootNodes, this.table.rebasedNodeToParent, baseAttachId, nodeChange, this.fieldId, this.table.rebaseVersion);
1492
+ }
1493
+ if (newDetachId !== undefined) {
1494
+ addNodeRename(this.table.rebasedRootNodes, baseAttachId, newDetachId, countToProcess, this.fieldId);
1495
+ }
1496
+ }
1497
+ if (newDetachId !== undefined) {
1498
+ this.table.movedDetaches.set(newDetachId, countToProcess, true);
1499
+ }
1500
+ if (countToProcess < count) {
1501
+ const remainingCount = count - countToProcess;
1502
+ const nextDetachId = newDetachId !== undefined
1503
+ ? (0, index_js_1.offsetChangeAtomId)(newDetachId, countToProcess)
1504
+ : undefined;
1505
+ this.rebaseOverDetach((0, index_js_1.offsetChangeAtomId)(baseDetachId, countToProcess), remainingCount, nextDetachId, nodeChange);
1506
+ }
1507
+ }
1508
+ addDetach(id, count) {
1509
+ this.table.rebasedDetachLocations.set(id, count, this.fieldId);
1510
+ }
1511
+ removeDetach(id, count) {
1512
+ this.table.movedDetaches.set(id, count, true);
1513
+ }
1514
+ doesBaseAttachNodes(id, count) {
1515
+ let countToProcess = count;
1516
+ const attachEntry = getFirstAttachField(this.table.baseChange.crossFieldKeys, id, countToProcess);
1517
+ countToProcess = attachEntry.length;
1518
+ return { start: id, value: attachEntry.value !== undefined, length: countToProcess };
1519
+ }
1520
+ getBaseRename(id, count) {
1521
+ return this.table.baseChange.rootNodes.oldToNewId.getFirst(id, count);
1522
+ }
1523
+ getNewRenameForBaseRename(baseRenameTo, count) {
1524
+ let countToProcess = count;
1525
+ const inputEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseRenameTo, countToProcess);
1526
+ const attachEntry = getFirstAttachField(this.table.baseChange.crossFieldKeys, baseRenameTo, countToProcess);
1527
+ countToProcess = attachEntry.length;
1528
+ if (attachEntry.value !== undefined) {
1529
+ // These nodes are attached in the output context of the base changeset.
1530
+ return { value: undefined, length: countToProcess };
1531
+ }
1532
+ countToProcess = inputEntry.length;
1533
+ const inputId = inputEntry.value;
1534
+ const moveEntry = this.table.entries.getFirst(inputId, countToProcess);
1535
+ countToProcess = moveEntry.length;
1536
+ if (moveEntry.value !== undefined) {
1537
+ return { ...moveEntry, value: moveEntry.value.cellRename ?? moveEntry.value.detachId };
1538
+ }
1539
+ return this.table.newChange.rootNodes.oldToNewId.getFirst(inputId, countToProcess);
1540
+ }
1541
+ invalidateBaseFields(fields) {
1542
+ if (this.allowInval) {
1543
+ for (const fieldId of fields) {
1544
+ this.table.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);
1300
1545
  }
1301
1546
  }
1302
- super.set(target, revision, id, count, newValue, invalidateDependents);
1303
- }
1304
- onMoveIn(id) {
1305
- setInChangeAtomIdMap(this.table.rebasedNodeToParent, id, this.fieldId);
1306
- }
1307
- moveKey(target, revision, id, count) {
1308
- this.table.rebasedCrossFieldKeys.set({ target, revision, localId: id }, count, this.fieldId);
1309
1547
  }
1310
- get table() {
1311
- return this.crossFieldTable;
1548
+ }
1549
+ function assignRootChange(table, nodeToParent, detachId, nodeId, detachLocation, rebaseVersion) {
1550
+ (0, internal_1.assert)(rebaseVersion >= 2 || detachLocation !== undefined, "All root changes need a detach location to support compatibility with older client versions");
1551
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.nodeChanges, detachId, nodeId);
1552
+ if (nodeToParent !== undefined) {
1553
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, nodeId, { root: detachId });
1312
1554
  }
1555
+ table.detachLocations.set(detachId, 1, detachLocation);
1313
1556
  }
1314
- // TODO: Deduplicate this with RebaseTable
1315
- class ComposeManager extends CrossFieldManagerI {
1316
- constructor(table, currentField, fieldId, allowInval = true) {
1317
- super(table, currentField, allowInval);
1557
+ class ComposeNodeManagerI {
1558
+ constructor(table, fieldId, allowInval = true) {
1559
+ this.table = table;
1318
1560
  this.fieldId = fieldId;
1561
+ this.allowInval = allowInval;
1319
1562
  }
1320
- set(target, revision, id, count, newValue, invalidateDependents) {
1321
- if (invalidateDependents && this.allowInval) {
1322
- const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
1323
- target,
1324
- revision,
1325
- localId: id,
1326
- }, count);
1327
- if (newFieldIds.length > 0) {
1328
- for (const newFieldId of newFieldIds) {
1329
- this.table.pendingCompositions.affectedNewFields.set([newFieldId.nodeId?.revision, newFieldId.nodeId?.localId, newFieldId.field], true);
1330
- }
1563
+ getNewChangesForBaseDetach(baseDetachId, count) {
1564
+ let countToProcess = count;
1565
+ const baseAttachEntry = getFirstFieldForCrossFieldKey(this.table.baseChange, { target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...baseDetachId }, countToProcess);
1566
+ countToProcess = baseAttachEntry.length;
1567
+ let result;
1568
+ if (baseAttachEntry.value !== undefined) {
1569
+ // The base detach was part of a move.
1570
+ // We check if we've previously seen a node change at the move destination.
1571
+ const entry = this.table.entries.getFirst(baseDetachId, countToProcess);
1572
+ result = { value: entry.value, length: entry.length };
1573
+ }
1574
+ else {
1575
+ // The detached nodes are still detached in the new change's input context.
1576
+ const rootEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.newChange.rootNodes.nodeChanges, baseDetachId, countToProcess);
1577
+ countToProcess = rootEntry.length;
1578
+ const newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(baseDetachId, countToProcess);
1579
+ countToProcess = newRenameEntry.length;
1580
+ result = {
1581
+ value: { nodeChange: rootEntry.value, detachId: newRenameEntry.value },
1582
+ length: countToProcess,
1583
+ };
1584
+ }
1585
+ // TODO: Consider moving this to a separate method so that this method can be side-effect free.
1586
+ if (result.value?.nodeChange !== undefined) {
1587
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.movedNodeToParent, result.value.nodeChange, {
1588
+ field: this.fieldId,
1589
+ });
1590
+ }
1591
+ return result;
1592
+ }
1593
+ composeAttachDetach(baseAttachId, newDetachId, count) {
1594
+ let countToProcess = count;
1595
+ const newAttachEntry = getFirstAttachField(this.table.newChange.crossFieldKeys, newDetachId, countToProcess);
1596
+ countToProcess = newAttachEntry.length;
1597
+ // Both changes can have the same ID if they came from inverse changesets.
1598
+ // If the new detach is part of a move,
1599
+ // then both input changesets contain the attach cross-field key for this ID.
1600
+ // The new attach may still exist in the composed changeset so we do not remove it here.
1601
+ // The new attach will typically cancel with a base detach,
1602
+ // in which case the cross-field key will be removed in `composeDetachAttach`.
1603
+ const hasNewAttachWithBaseAttachId = (0, index_js_1.areEqualChangeAtomIds)(baseAttachId, newDetachId) && newAttachEntry.value !== undefined;
1604
+ if (!hasNewAttachWithBaseAttachId) {
1605
+ this.table.removedCrossFieldKeys.set({ ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, countToProcess, true);
1606
+ }
1607
+ const baseDetachEntry = getFirstDetachField(this.table.baseChange.crossFieldKeys, baseAttachId, countToProcess);
1608
+ countToProcess = baseDetachEntry.length;
1609
+ const baseRootIdEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, countToProcess);
1610
+ countToProcess = baseRootIdEntry.length;
1611
+ const baseDetachId = baseRootIdEntry.value;
1612
+ if (baseDetachEntry.value !== undefined) {
1613
+ // The base change moves these nodes.
1614
+ const prevEntry = this.table.entries.getFirst(baseAttachId, baseDetachEntry.length).value ?? {};
1615
+ this.table.entries.set(baseAttachId, baseDetachEntry.length, {
1616
+ ...prevEntry,
1617
+ detachId: newDetachId,
1618
+ });
1619
+ // The new detach will replace the base detach, so we remove the key for the base detach, unless they have the same ID.
1620
+ if (!(0, index_js_1.areEqualChangeAtomIds)(baseAttachId, newDetachId)) {
1621
+ this.table.removedCrossFieldKeys.set({ ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
1622
+ }
1623
+ this.table.movedCrossFieldKeys.set({ ...newDetachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, baseDetachEntry.value);
1624
+ this.invalidateBaseFields([baseDetachEntry.value]);
1625
+ }
1626
+ else {
1627
+ const baseDetachLocationEntry = this.table.baseChange.rootNodes.detachLocations.getFirst(baseDetachId, countToProcess);
1628
+ countToProcess = baseDetachLocationEntry.length;
1629
+ // These nodes were detached in the base change's input context,
1630
+ // so the net effect of the two changes is a rename.
1631
+ appendNodeRename(this.table.composedRootNodes, baseAttachId, newDetachId, baseDetachEntry.length, this.table.baseChange.rootNodes, baseDetachLocationEntry.value ?? this.fieldId);
1632
+ this.table.removedCrossFieldKeys.set({ ...newDetachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
1633
+ }
1634
+ if (newAttachEntry.value === undefined) {
1635
+ const newOutputDetachLocationEntry = this.table.newChange.rootNodes.outputDetachLocations.getFirst(newDetachId, countToProcess);
1636
+ countToProcess = newOutputDetachLocationEntry.length;
1637
+ this.table.composedRootNodes.outputDetachLocations.set(newDetachId, countToProcess, newOutputDetachLocationEntry.value ?? this.fieldId);
1638
+ }
1639
+ if (countToProcess < count) {
1640
+ const remainingCount = count - countToProcess;
1641
+ this.composeAttachDetach((0, index_js_1.offsetChangeAtomId)(baseAttachId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newDetachId, countToProcess), remainingCount);
1642
+ }
1643
+ }
1644
+ sendNewChangesToBaseSourceLocation(baseAttachId, newChanges) {
1645
+ const { value: baseDetachId } = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, 1);
1646
+ const detachFields = getFieldsForCrossFieldKey(this.table.baseChange, {
1647
+ ...baseDetachId,
1648
+ target: crossFieldQueries_js_1.CrossFieldTarget.Source,
1649
+ }, 1);
1650
+ if (detachFields.length > 0) {
1651
+ // The base attach is part of a move in the base changeset.
1652
+ const prevEntry = this.table.entries.getFirst(baseDetachId, 1).value ?? {};
1653
+ this.table.entries.set(baseDetachId, 1, { ...prevEntry, nodeChange: newChanges });
1654
+ if (newChanges !== undefined) {
1655
+ this.invalidateBaseFields(detachFields);
1656
+ }
1657
+ }
1658
+ else {
1659
+ const baseNodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(this.table.baseChange.rootNodes.nodeChanges, baseDetachId);
1660
+ if (baseNodeId !== undefined) {
1661
+ addNodesToCompose(this.table, baseNodeId, newChanges);
1331
1662
  }
1332
1663
  else {
1333
- const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
1334
- target,
1335
- revision,
1336
- localId: id,
1337
- }, count);
1338
- (0, internal_1.assert)(baseFieldIds.length > 0, 0x9c8 /* Cross field key not registered in base or new change */);
1339
- for (const baseFieldId of baseFieldIds) {
1340
- this.table.pendingCompositions.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
1341
- }
1664
+ assignRootChange(this.table.composedRootNodes, this.table.movedNodeToParent, baseDetachId, newChanges, this.fieldId, this.table.rebaseVersion);
1342
1665
  }
1343
1666
  }
1344
- super.set(target, revision, id, count, newValue, invalidateDependents);
1345
- }
1346
- onMoveIn(id) {
1347
- setInChangeAtomIdMap(this.table.composedNodeToParent, id, this.fieldId);
1348
1667
  }
1349
- moveKey(target, revision, id, count) {
1350
- throw new Error("Moving cross-field keys during compose is currently unsupported");
1668
+ areSameNodes(baseDetachId, newAttachId, count) {
1669
+ const renamedDetachEntry = firstAttachIdFromDetachId(this.table.composedRootNodes, baseDetachId, count);
1670
+ const isReattachOfSameNodes = (0, index_js_1.areEqualChangeAtomIds)(renamedDetachEntry.value, newAttachId);
1671
+ return { ...renamedDetachEntry, value: isReattachOfSameNodes };
1672
+ }
1673
+ composeDetachAttach(baseDetachId, newAttachId, count, composeToPin) {
1674
+ const areSameEntry = this.areSameNodes(baseDetachId, newAttachId, count);
1675
+ const countToProcess = areSameEntry.length;
1676
+ if (areSameEntry.value) {
1677
+ // These nodes have been moved back to their original location, so the composed changeset should not have any renames for them.
1678
+ // Note that deleting the rename from `this.table.composedRootNodes` would change the result of this method
1679
+ // if it were rerun due to the field being invalidated, so we instead record that the rename should be deleted later.
1680
+ this.table.renamesToDelete.set(baseDetachId, countToProcess, true);
1681
+ }
1682
+ if (composeToPin) {
1683
+ this.table.movedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...newAttachId }, countToProcess, this.fieldId);
1684
+ if (!(0, index_js_1.areEqualChangeAtomIds)(baseDetachId, newAttachId)) {
1685
+ // The pin will have `newAttachId` as both its detach and attach ID.
1686
+ // So we remove `baseDetachId` unless that is equal to the pin's detach ID.
1687
+ this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...baseDetachId }, countToProcess, true);
1688
+ }
1689
+ // Note that while change2 should already have this key, change1 may have a rollback for the same ID in a different location.
1690
+ // In that case, change1's attach should be canceled out by a detach from change2.
1691
+ // Here we make sure that the composed change has the correct location (this field) for the attach ID.
1692
+ this.table.movedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...newAttachId }, countToProcess, this.fieldId);
1693
+ }
1694
+ else {
1695
+ this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...baseDetachId }, countToProcess, true);
1696
+ this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...newAttachId }, countToProcess, true);
1697
+ }
1698
+ if (countToProcess < count) {
1699
+ this.composeAttachDetach((0, index_js_1.offsetChangeAtomId)(baseDetachId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newAttachId, countToProcess), count - countToProcess);
1700
+ }
1351
1701
  }
1352
- get table() {
1353
- return this.crossFieldTable;
1702
+ invalidateBaseFields(fields) {
1703
+ if (this.allowInval) {
1704
+ for (const fieldId of fields) {
1705
+ this.table.pendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);
1706
+ }
1707
+ }
1354
1708
  }
1355
1709
  }
1356
1710
  function makeModularChangeset(props = {
1357
1711
  maxId: -1,
1358
1712
  }) {
1359
1713
  const changeset = {
1714
+ rebaseVersion: props.rebaseVersion ?? 1,
1360
1715
  fieldChanges: props.fieldChanges ?? new Map(),
1361
1716
  nodeChanges: props.nodeChanges ?? (0, index_js_2.newTupleBTree)(),
1717
+ rootNodes: props.rootNodes ?? newRootTable(),
1362
1718
  nodeToParent: props.nodeToParent ?? (0, index_js_2.newTupleBTree)(),
1363
1719
  nodeAliases: props.nodeAliases ?? (0, index_js_2.newTupleBTree)(),
1364
- crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1720
+ crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
1365
1721
  };
1366
1722
  if (props.revisions !== undefined && props.revisions.length > 0) {
1367
1723
  changeset.revisions = props.revisions;
@@ -1394,6 +1750,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1394
1750
  this.transactionDepth = 0;
1395
1751
  this.idAllocator = (0, index_js_2.idAllocatorFromMaxId)();
1396
1752
  }
1753
+ isInTransaction() {
1754
+ return this.transactionDepth > 0;
1755
+ }
1397
1756
  enterTransaction() {
1398
1757
  this.transactionDepth += 1;
1399
1758
  if (this.transactionDepth === 1) {
@@ -1444,7 +1803,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1444
1803
  fieldChange: { fieldKind, change },
1445
1804
  nodeChanges: (0, index_js_2.newTupleBTree)(),
1446
1805
  nodeToParent: (0, index_js_2.newTupleBTree)(),
1447
- crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1806
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
1807
+ rootNodes: newRootTable(),
1448
1808
  idAllocator: this.idAllocator,
1449
1809
  localCrossFieldKeys,
1450
1810
  revision,
@@ -1463,6 +1823,7 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1463
1823
  ? makeModularChangeset({
1464
1824
  maxId: this.idAllocator.getMaxId(),
1465
1825
  builds: change.builds,
1826
+ rootNodes: renameTableFromRenameDescriptions(change.renames ?? []),
1466
1827
  revisions: [{ revision: change.revision }],
1467
1828
  })
1468
1829
  : buildModularChangesetFromField({
@@ -1473,7 +1834,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1473
1834
  },
1474
1835
  nodeChanges: (0, index_js_2.newTupleBTree)(),
1475
1836
  nodeToParent: (0, index_js_2.newTupleBTree)(),
1476
- crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1837
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
1838
+ rootNodes: newRootTable(),
1477
1839
  idAllocator: this.idAllocator,
1478
1840
  localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
1479
1841
  revision: change.revision,
@@ -1502,7 +1864,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1502
1864
  nodeChange,
1503
1865
  nodeChanges: (0, index_js_2.newTupleBTree)(),
1504
1866
  nodeToParent: (0, index_js_2.newTupleBTree)(),
1505
- crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1867
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
1868
+ rootNodes: newRootTable(),
1506
1869
  idAllocator: this.idAllocator,
1507
1870
  revision,
1508
1871
  }), revision));
@@ -1516,7 +1879,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1516
1879
  nodeChange,
1517
1880
  nodeChanges: (0, index_js_2.newTupleBTree)(),
1518
1881
  nodeToParent: (0, index_js_2.newTupleBTree)(),
1519
- crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1882
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
1883
+ rootNodes: newRootTable(),
1520
1884
  idAllocator: this.idAllocator,
1521
1885
  revision,
1522
1886
  }), revision));
@@ -1524,16 +1888,19 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1524
1888
  }
1525
1889
  exports.ModularEditBuilder = ModularEditBuilder;
1526
1890
  function buildModularChangesetFromField(props) {
1527
- const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
1891
+ const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, rootNodes, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
1528
1892
  const fieldChanges = new Map([[path.field, fieldChange]]);
1529
1893
  if (path.parent === undefined) {
1894
+ const field = { nodeId: undefined, field: path.field };
1530
1895
  for (const { key, count } of localCrossFieldKeys) {
1531
- crossFieldKeys.set(key, count, { nodeId: undefined, field: path.field });
1896
+ crossFieldKeys.set(key, count, field);
1532
1897
  }
1533
1898
  if (childId !== undefined) {
1534
- setInChangeAtomIdMap(nodeToParent, childId, {
1535
- nodeId: undefined,
1536
- field: path.field,
1899
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
1900
+ field: {
1901
+ nodeId: undefined,
1902
+ field: path.field,
1903
+ },
1537
1904
  });
1538
1905
  }
1539
1906
  return makeModularChangeset({
@@ -1541,6 +1908,7 @@ function buildModularChangesetFromField(props) {
1541
1908
  nodeChanges,
1542
1909
  nodeToParent,
1543
1910
  crossFieldKeys,
1911
+ rootNodes,
1544
1912
  maxId: idAllocator.getMaxId(),
1545
1913
  revisions: [{ revision }],
1546
1914
  });
@@ -1549,13 +1917,13 @@ function buildModularChangesetFromField(props) {
1549
1917
  fieldChanges,
1550
1918
  };
1551
1919
  const parentId = { localId: (0, index_js_2.brand)(idAllocator.allocate()), revision };
1920
+ const fieldId = { nodeId: parentId, field: path.field };
1552
1921
  for (const { key, count } of localCrossFieldKeys) {
1553
1922
  crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
1554
1923
  }
1555
1924
  if (childId !== undefined) {
1556
- setInChangeAtomIdMap(nodeToParent, childId, {
1557
- nodeId: parentId,
1558
- field: path.field,
1925
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
1926
+ field: fieldId,
1559
1927
  });
1560
1928
  }
1561
1929
  return buildModularChangesetFromNode({
@@ -1564,28 +1932,50 @@ function buildModularChangesetFromField(props) {
1564
1932
  nodeChanges,
1565
1933
  nodeToParent,
1566
1934
  crossFieldKeys,
1935
+ rootNodes,
1567
1936
  idAllocator,
1568
1937
  revision,
1569
1938
  nodeId: parentId,
1570
1939
  });
1571
1940
  }
1941
+ exports.buildModularChangesetFromField = buildModularChangesetFromField;
1572
1942
  function buildModularChangesetFromNode(props) {
1573
1943
  const { path, nodeId = { localId: (0, index_js_2.brand)(props.idAllocator.allocate()), revision: props.revision }, } = props;
1574
- setInChangeAtomIdMap(props.nodeChanges, nodeId, props.nodeChange);
1575
- const fieldChangeset = genericFieldKind_js_1.genericFieldKind.changeHandler.editor.buildChildChanges([
1576
- [path.parentIndex, nodeId],
1577
- ]);
1578
- const fieldChange = {
1579
- fieldKind: genericFieldKind_js_1.genericFieldKind.identifier,
1580
- change: fieldChangeset,
1581
- };
1582
- return buildModularChangesetFromField({
1583
- ...props,
1584
- path: { parent: path.parent, field: path.parentField },
1585
- fieldChange,
1586
- localCrossFieldKeys: [],
1587
- childId: nodeId,
1588
- });
1944
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(props.nodeChanges, nodeId, props.nodeChange);
1945
+ if ((0, index_js_1.isDetachedUpPathRoot)(path)) {
1946
+ props.rootNodes.nodeChanges.set([path.detachedNodeId.major, (0, index_js_2.brand)(path.detachedNodeId.minor)], nodeId);
1947
+ return makeModularChangeset({
1948
+ rootNodes: props.rootNodes,
1949
+ nodeChanges: props.nodeChanges,
1950
+ nodeToParent: props.nodeToParent,
1951
+ crossFieldKeys: props.crossFieldKeys,
1952
+ maxId: props.idAllocator.getMaxId(),
1953
+ revisions: [{ revision: props.revision }],
1954
+ });
1955
+ }
1956
+ else {
1957
+ const fieldChangeset = genericFieldKind_js_1.genericFieldKind.changeHandler.editor.buildChildChanges([
1958
+ [path.parentIndex, nodeId],
1959
+ ]);
1960
+ const fieldChange = {
1961
+ fieldKind: genericFieldKind_js_1.genericFieldKind.identifier,
1962
+ change: fieldChangeset,
1963
+ };
1964
+ return buildModularChangesetFromField({
1965
+ ...props,
1966
+ path: { parent: path.parent, field: path.parentField },
1967
+ fieldChange,
1968
+ localCrossFieldKeys: [],
1969
+ childId: nodeId,
1970
+ });
1971
+ }
1972
+ }
1973
+ function renameTableFromRenameDescriptions(renames) {
1974
+ const table = newRootTable();
1975
+ for (const rename of renames) {
1976
+ addNodeRename(table, rename.oldId, rename.newId, rename.count, rename.detachLocation);
1977
+ }
1978
+ return table;
1589
1979
  }
1590
1980
  function getRevInfoFromTaggedChanges(changes) {
1591
1981
  let maxId = -1;
@@ -1595,20 +1985,6 @@ function getRevInfoFromTaggedChanges(changes) {
1595
1985
  maxId = Math.max(change.maxId ?? -1, maxId);
1596
1986
  revInfos.push(...revisionInfoFromTaggedChange(taggedChange));
1597
1987
  }
1598
- const revisions = new Set();
1599
- const rolledBackRevisions = [];
1600
- for (const info of revInfos) {
1601
- revisions.add(info.revision);
1602
- if (info.rollbackOf !== undefined) {
1603
- rolledBackRevisions.push(info.rollbackOf);
1604
- }
1605
- }
1606
- rolledBackRevisions.reverse();
1607
- for (const revision of rolledBackRevisions) {
1608
- if (!revisions.has(revision)) {
1609
- revInfos.push({ revision });
1610
- }
1611
- }
1612
1988
  return { maxId: (0, index_js_2.brand)(maxId), revInfos };
1613
1989
  }
1614
1990
  function revisionInfoFromTaggedChange(taggedChange) {
@@ -1625,15 +2001,16 @@ function revisionInfoFromTaggedChange(taggedChange) {
1625
2001
  }
1626
2002
  return revInfos;
1627
2003
  }
1628
- function fieldChangeFromId(fields, nodes, id) {
1629
- const fieldMap = fieldMapFromNodeId(fields, nodes, id.nodeId);
2004
+ function fieldChangeFromId(change, id) {
2005
+ const fieldId = normalizeFieldId(id, change.nodeAliases);
2006
+ const fieldMap = fieldMapFromNodeId(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldId.nodeId);
1630
2007
  return fieldMap.get(id.field) ?? (0, internal_1.fail)(0xb25 /* No field exists for the given ID */);
1631
2008
  }
1632
- function fieldMapFromNodeId(rootFieldMap, nodes, nodeId) {
2009
+ function fieldMapFromNodeId(rootFieldMap, nodes, aliases, nodeId) {
1633
2010
  if (nodeId === undefined) {
1634
2011
  return rootFieldMap;
1635
2012
  }
1636
- const node = nodeChangeFromId(nodes, nodeId);
2013
+ const node = nodeChangeFromId(nodes, aliases, nodeId);
1637
2014
  (0, internal_1.assert)(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);
1638
2015
  return node.fieldChanges;
1639
2016
  }
@@ -1644,10 +2021,11 @@ function rebasedFieldIdFromBaseId(table, baseId) {
1644
2021
  return { ...baseId, nodeId: rebasedNodeIdFromBaseNodeId(table, baseId.nodeId) };
1645
2022
  }
1646
2023
  function rebasedNodeIdFromBaseNodeId(table, baseId) {
1647
- return getFromChangeAtomIdMap(table.baseToRebasedNodeId, baseId) ?? baseId;
2024
+ return (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, baseId) ?? baseId;
1648
2025
  }
1649
- function nodeChangeFromId(nodes, id) {
1650
- const node = getFromChangeAtomIdMap(nodes, id);
2026
+ function nodeChangeFromId(nodes, aliases, id) {
2027
+ const normalizedId = normalizeNodeId(id, aliases);
2028
+ const node = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodes, normalizedId);
1651
2029
  (0, internal_1.assert)(node !== undefined, 0x9ca /* Unknown node ID */);
1652
2030
  return node;
1653
2031
  }
@@ -1655,12 +2033,20 @@ function fieldIdFromFieldIdKey([revision, localId, field]) {
1655
2033
  const nodeId = localId !== undefined ? { revision, localId } : undefined;
1656
2034
  return { nodeId, field };
1657
2035
  }
2036
+ function fieldIdKeyFromFieldId(fieldId) {
2037
+ return [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];
2038
+ }
1658
2039
  function cloneNodeChangeset(nodeChangeset) {
1659
2040
  if (nodeChangeset.fieldChanges !== undefined) {
1660
2041
  return { ...nodeChangeset, fieldChanges: new Map(nodeChangeset.fieldChanges) };
1661
2042
  }
1662
2043
  return { ...nodeChangeset };
1663
2044
  }
2045
+ function replaceNodeLocationRevision(location, oldRevisions, newRevision) {
2046
+ return location.field !== undefined
2047
+ ? { field: replaceFieldIdRevision(location.field, oldRevisions, newRevision) }
2048
+ : { root: (0, index_js_1.replaceAtomRevisions)(location.root, oldRevisions, newRevision) };
2049
+ }
1664
2050
  function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
1665
2051
  if (fieldId.nodeId === undefined) {
1666
2052
  return fieldId;
@@ -1670,17 +2056,34 @@ function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
1670
2056
  nodeId: (0, index_js_1.replaceAtomRevisions)(fieldId.nodeId, oldRevisions, newRevision),
1671
2057
  };
1672
2058
  }
1673
- function getParentFieldId(changeset, nodeId) {
1674
- const parentId = getFromChangeAtomIdMap(changeset.nodeToParent, nodeId);
1675
- (0, internal_1.assert)(parentId !== undefined, 0x9cb /* Parent field should be defined */);
1676
- return normalizeFieldId(parentId, changeset.nodeAliases);
2059
+ function getNodeParent(changeset, nodeId) {
2060
+ const normalizedNodeId = normalizeNodeId(nodeId, changeset.nodeAliases);
2061
+ const location = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(changeset.nodeToParent, normalizedNodeId);
2062
+ (0, internal_1.assert)(location !== undefined, 0x9cb /* Parent field should be defined */);
2063
+ if (location.field !== undefined) {
2064
+ return { field: normalizeFieldId(location.field, changeset.nodeAliases) };
2065
+ }
2066
+ return location;
1677
2067
  }
1678
- exports.getParentFieldId = getParentFieldId;
2068
+ exports.getNodeParent = getNodeParent;
1679
2069
  function getFieldsForCrossFieldKey(changeset, key, count) {
1680
2070
  return changeset.crossFieldKeys
1681
2071
  .getAll(key, count)
1682
2072
  .map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
1683
2073
  }
2074
+ function getFirstFieldForCrossFieldKey(changeset, key, count) {
2075
+ const result = changeset.crossFieldKeys.getFirst(key, count);
2076
+ if (result.value === undefined) {
2077
+ return result;
2078
+ }
2079
+ return { ...result, value: normalizeFieldId(result.value, changeset.nodeAliases) };
2080
+ }
2081
+ function normalizeNodeLocation(location, nodeAliases) {
2082
+ if (location.field !== undefined) {
2083
+ return { field: normalizeFieldId(location.field, nodeAliases) };
2084
+ }
2085
+ return location;
2086
+ }
1684
2087
  // This is only exported for use in test utilities.
1685
2088
  function normalizeFieldId(fieldId, nodeAliases) {
1686
2089
  return fieldId.nodeId !== undefined
@@ -1693,25 +2096,455 @@ exports.normalizeFieldId = normalizeFieldId;
1693
2096
  */
1694
2097
  function normalizeNodeId(nodeId, nodeAliases) {
1695
2098
  let currentId = nodeId;
2099
+ let cycleProbeId = nodeId;
1696
2100
  // eslint-disable-next-line no-constant-condition
1697
2101
  while (true) {
1698
- const dealiased = getFromChangeAtomIdMap(nodeAliases, currentId);
2102
+ const dealiased = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, currentId);
1699
2103
  if (dealiased === undefined) {
1700
2104
  return currentId;
1701
2105
  }
1702
2106
  currentId = dealiased;
2107
+ if (cycleProbeId !== undefined) {
2108
+ cycleProbeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, cycleProbeId);
2109
+ }
2110
+ if (cycleProbeId !== undefined) {
2111
+ cycleProbeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, cycleProbeId);
2112
+ }
2113
+ (0, internal_1.assert)(!(0, index_js_1.areEqualChangeAtomIdOpts)(cycleProbeId, currentId), "Alias cycle detected");
1703
2114
  }
1704
2115
  }
2116
+ exports.normalizeNodeId = normalizeNodeId;
1705
2117
  function hasConflicts(change) {
1706
2118
  return (change.constraintViolationCount ?? 0) > 0;
1707
2119
  }
1708
- function getFromChangeAtomIdMap(map, id) {
1709
- return map.get([id.revision, id.localId]);
1710
- }
1711
- function setInChangeAtomIdMap(map, id, value) {
1712
- map.set([id.revision, id.localId], value);
1713
- }
1714
2120
  function areEqualFieldIds(a, b) {
1715
2121
  return (0, index_js_1.areEqualChangeAtomIdOpts)(a.nodeId, b.nodeId) && a.field === b.field;
1716
2122
  }
2123
+ function firstAttachIdFromDetachId(roots, detachId, count) {
2124
+ const result = roots.oldToNewId.getFirst(detachId, count);
2125
+ return { ...result, value: result.value ?? detachId };
2126
+ }
2127
+ function firstDetachIdFromAttachId(roots, attachId, count) {
2128
+ const result = roots.newToOldId.getFirst(attachId, count);
2129
+ return { ...result, start: attachId, value: result.value ?? attachId };
2130
+ }
2131
+ function rebaseCrossFieldKeys(sourceTable, movedDetaches, newDetachLocations) {
2132
+ const rebasedTable = sourceTable.clone();
2133
+ for (const entry of movedDetaches.entries()) {
2134
+ rebasedTable.delete({ ...entry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, entry.length);
2135
+ }
2136
+ for (const entry of newDetachLocations.entries()) {
2137
+ rebasedTable.set({ ...entry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, entry.length, entry.value);
2138
+ }
2139
+ return rebasedTable;
2140
+ }
2141
+ function newRootTable() {
2142
+ return {
2143
+ newToOldId: (0, index_js_1.newChangeAtomIdTransform)(),
2144
+ oldToNewId: (0, index_js_1.newChangeAtomIdTransform)(),
2145
+ nodeChanges: (0, index_js_2.newTupleBTree)(),
2146
+ detachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
2147
+ outputDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
2148
+ };
2149
+ }
2150
+ exports.newRootTable = newRootTable;
2151
+ function rebaseRoots(change, base, affectedBaseFields, nodesToRebase, rebasedNodeToParent, rebaseVersion) {
2152
+ const rebasedRoots = newRootTable();
2153
+ for (const renameEntry of change.rootNodes.oldToNewId.entries()) {
2154
+ rebaseRename(change.rootNodes, rebasedRoots, renameEntry, base, affectedBaseFields);
2155
+ }
2156
+ for (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {
2157
+ const changes = base.rootNodes.nodeChanges.get(detachIdKey);
2158
+ if (changes !== undefined) {
2159
+ nodesToRebase.push([nodeId, changes]);
2160
+ }
2161
+ const detachId = (0, index_js_1.makeChangeAtomId)(detachIdKey[1], detachIdKey[0]);
2162
+ const attachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;
2163
+ const baseAttachEntry = base.crossFieldKeys.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...attachId }, 1);
2164
+ if (baseAttachEntry.value !== undefined) {
2165
+ affectedBaseFields.set(fieldIdKeyFromFieldId(baseAttachEntry.value), true);
2166
+ rebasedNodeToParent.delete(detachIdKey);
2167
+ }
2168
+ else {
2169
+ const renamedDetachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;
2170
+ const baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(renamedDetachId, 1).value;
2171
+ if (baseOutputDetachLocation !== undefined) {
2172
+ affectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);
2173
+ }
2174
+ const detachLocation = baseOutputDetachLocation ??
2175
+ change.rootNodes.detachLocations.getFirst(detachId, 1).value;
2176
+ // Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.
2177
+ // We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`
2178
+ assignRootChange(rebasedRoots, rebasedNodeToParent, renamedDetachId, nodeId, detachLocation, rebaseVersion);
2179
+ }
2180
+ }
2181
+ for (const entry of change.rootNodes.outputDetachLocations.entries()) {
2182
+ rebasedRoots.outputDetachLocations.set(entry.start, entry.length, entry.value);
2183
+ }
2184
+ return rebasedRoots;
2185
+ }
2186
+ function rebaseRename(newRoots, rebasedRoots, renameEntry, base, affectedBaseFields) {
2187
+ let count = renameEntry.length;
2188
+ const baseRenameEntry = firstAttachIdFromDetachId(base.rootNodes, renameEntry.start, count);
2189
+ count = baseRenameEntry.length;
2190
+ const baseAttachEntry = base.crossFieldKeys.getFirst({
2191
+ ...baseRenameEntry.value,
2192
+ target: crossFieldQueries_js_1.CrossFieldTarget.Destination,
2193
+ }, count);
2194
+ count = baseAttachEntry.length;
2195
+ if (baseAttachEntry.value !== undefined) {
2196
+ // This rename represents an intention to detach these nodes.
2197
+ // The rebased change should have a detach in the field where the base change attaches the nodes,
2198
+ // so we need to ensure that field is processed.
2199
+ affectedBaseFields.set(fieldIdKeyFromFieldId(normalizeFieldId(baseAttachEntry.value, base.nodeAliases)), true);
2200
+ }
2201
+ else {
2202
+ const baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(baseRenameEntry.value, 1).value;
2203
+ if (baseOutputDetachLocation !== undefined) {
2204
+ affectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);
2205
+ }
2206
+ const detachEntry = newRoots.detachLocations.getFirst(renameEntry.start, count);
2207
+ count = detachEntry.length;
2208
+ const detachLocation = baseOutputDetachLocation ?? detachEntry.value;
2209
+ // Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.
2210
+ // We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`
2211
+ addNodeRename(rebasedRoots, baseRenameEntry.value, renameEntry.value, count, detachLocation);
2212
+ }
2213
+ const countRemaining = renameEntry.length - count;
2214
+ if (countRemaining > 0) {
2215
+ rebaseRename(newRoots, rebasedRoots, {
2216
+ start: (0, index_js_1.offsetChangeAtomId)(renameEntry.start, count),
2217
+ value: (0, index_js_1.offsetChangeAtomId)(renameEntry.value, count),
2218
+ length: countRemaining,
2219
+ }, base, affectedBaseFields);
2220
+ }
2221
+ }
2222
+ /**
2223
+ * For each root detach location, replaces any node ID from the base changeset
2224
+ * with the corresponding ID in the new changeset.
2225
+ */
2226
+ function fixupRebasedDetachLocations(table) {
2227
+ for (const { start, length, value: detachLocation, } of table.rebasedRootNodes.detachLocations.entries()) {
2228
+ const normalizedDetachLocation = normalizeFieldId(detachLocation, table.baseChange.nodeAliases);
2229
+ if (normalizedDetachLocation.nodeId !== undefined) {
2230
+ const rebasedNodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, normalizedDetachLocation.nodeId);
2231
+ if (rebasedNodeId !== undefined) {
2232
+ table.rebasedRootNodes.detachLocations.set(start, length, {
2233
+ ...normalizedDetachLocation,
2234
+ nodeId: rebasedNodeId,
2235
+ });
2236
+ }
2237
+ }
2238
+ }
2239
+ }
2240
+ function addNodesToCompose(table, id1, id2) {
2241
+ const normalizedId1 = normalizeNodeId(id1, table.baseChange.nodeAliases);
2242
+ const normalizedId2 = normalizeNodeId(id2, table.newChange.nodeAliases);
2243
+ if ((0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.newToBaseNodeId, normalizedId2) === undefined) {
2244
+ (0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.newToBaseNodeId, normalizedId2, normalizedId1);
2245
+ table.pendingCompositions.nodeIdsToCompose.push([normalizedId1, normalizedId2]);
2246
+ }
2247
+ }
2248
+ function composeRevInfos(revisions1, revisions2) {
2249
+ const result = [...(revisions1 ?? []), ...(revisions2 ?? [])];
2250
+ return result;
2251
+ }
2252
+ function composeCrossFieldKeyTables(table1, table2, movedCrossFieldKeys, removedCrossFieldKeys) {
2253
+ const composedTable = index_js_2.RangeMap.union(table1, table2);
2254
+ for (const entry of movedCrossFieldKeys.entries()) {
2255
+ composedTable.set(entry.start, entry.length, entry.value);
2256
+ }
2257
+ for (const entry of removedCrossFieldKeys.entries()) {
2258
+ composedTable.delete(entry.start, entry.length);
2259
+ }
2260
+ return composedTable;
2261
+ }
2262
+ function composeRootTables(change1, change2, composedNodeToParent, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
2263
+ const composedTable = cloneRootTable(change1.rootNodes);
2264
+ for (const renameEntry of change2.rootNodes.oldToNewId.entries()) {
2265
+ composeRename(change1, change2, composedTable, renameEntry.start, renameEntry.value, renameEntry.length, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
2266
+ }
2267
+ for (const [[revision2, id2], nodeId2] of change2.rootNodes.nodeChanges.entries()) {
2268
+ const detachId2 = { revision: revision2, localId: id2 };
2269
+ const detachId1 = firstDetachIdFromAttachId(change1.rootNodes, detachId2, 1).value;
2270
+ const nodeId1 = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(change1.rootNodes.nodeChanges, detachId1);
2271
+ if (nodeId1 !== undefined) {
2272
+ pendingCompositions.nodeIdsToCompose.push([nodeId1, nodeId2]);
2273
+ }
2274
+ else {
2275
+ const fieldId = getFieldsForCrossFieldKey(change1, { ...detachId1, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, 1)[0];
2276
+ if (fieldId !== undefined) {
2277
+ // In this case, this node is attached in the input context of change1,
2278
+ // and is represented in detachFieldId.
2279
+ pendingCompositions.affectedBaseFields.set([fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field], true);
2280
+ }
2281
+ else {
2282
+ assignRootChange(composedTable, composedNodeToParent, detachId1, nodeId2, change1.rootNodes.detachLocations.getFirst(detachId1, 1).value ??
2283
+ change2.rootNodes.detachLocations.getFirst(detachId2, 1).value, Math.max(change1.rebaseVersion, change2.rebaseVersion));
2284
+ }
2285
+ }
2286
+ }
2287
+ for (const outputDetachEntry of change1.rootNodes.outputDetachLocations.entries()) {
2288
+ composeOutputDetachLocation(outputDetachEntry.start, outputDetachEntry.length, outputDetachEntry.value, change2, composedTable);
2289
+ }
2290
+ for (const entry of change2.rootNodes.outputDetachLocations.entries()) {
2291
+ composedTable.outputDetachLocations.set(entry.start, entry.length, entry.value);
2292
+ }
2293
+ return composedTable;
2294
+ }
2295
+ function composeOutputDetachLocation(outputDetachId1, count, detachLocation, change2, composedTable) {
2296
+ let countToProcess = count;
2297
+ const renameEntry = firstAttachIdFromDetachId(change2.rootNodes, outputDetachId1, countToProcess);
2298
+ countToProcess = renameEntry.length;
2299
+ const attachEntry = getFirstAttachField(change2.crossFieldKeys, renameEntry.value, countToProcess);
2300
+ countToProcess = attachEntry.length;
2301
+ composedTable.outputDetachLocations.delete(outputDetachId1, countToProcess);
2302
+ if (attachEntry.value === undefined) {
2303
+ // We update the key for the detach location to the renamed ID of the root in the composed output context.
2304
+ composedTable.outputDetachLocations.set(renameEntry.value, countToProcess, detachLocation);
2305
+ }
2306
+ else {
2307
+ // These nodes are attached by `change2` and thus attached in the composed output context,
2308
+ // so there should be no output detach location.
2309
+ }
2310
+ const countRemaining = count - countToProcess;
2311
+ if (countRemaining > 0) {
2312
+ composeOutputDetachLocation((0, index_js_1.offsetChangeAtomId)(outputDetachId1, countToProcess), countRemaining, detachLocation, change2, composedTable);
2313
+ }
2314
+ }
2315
+ function composeRename(change1, change2, mergedTable, oldId, newId, count, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
2316
+ let countToProcess = count;
2317
+ const detachEntry = getFirstDetachField(change1.crossFieldKeys, oldId, countToProcess);
2318
+ countToProcess = detachEntry.length;
2319
+ if (detachEntry.value !== undefined) {
2320
+ // `change1` detached these nodes,
2321
+ // so we invalidate the detach location so that the detach's ID can be replaced with the new ID.
2322
+ pendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(detachEntry.value), true);
2323
+ if (!(0, index_js_1.areEqualChangeAtomIds)(oldId, newId)) {
2324
+ // `change1`'s detach will be replaced by `change2`'s detach, so we update the cross-field keys.
2325
+ removedCrossFieldKeys.set({ ...oldId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
2326
+ }
2327
+ movedCrossFieldKeys.set({ ...newId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, detachEntry.value);
2328
+ }
2329
+ else {
2330
+ // `change1` may also have a rename to `renameEntry.value`, in which case it must refer to a different node.
2331
+ // That node must have been attached by `change1` and detached by `change2`.
2332
+ // The final rename for that node will be created in `composeAttachDetach`.
2333
+ // We delete any such rename for now to avoid colliding with the rename currently being processed.
2334
+ deleteNodeRenameTo(mergedTable, newId, countToProcess);
2335
+ // The nodes were detached before `change`, so we append this rename.
2336
+ appendNodeRename(mergedTable, oldId, newId, countToProcess, change1.rootNodes, change2.rootNodes.detachLocations.getFirst(oldId, countToProcess).value);
2337
+ }
2338
+ if (countToProcess < count) {
2339
+ composeRename(change1, change2, mergedTable, (0, index_js_1.offsetChangeAtomId)(oldId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newId, countToProcess), count - countToProcess, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
2340
+ }
2341
+ }
2342
+ function cloneRootTable(table) {
2343
+ return {
2344
+ oldToNewId: table.oldToNewId.clone(),
2345
+ newToOldId: table.newToOldId.clone(),
2346
+ nodeChanges: (0, index_js_2.brand)(table.nodeChanges.clone()),
2347
+ detachLocations: table.detachLocations.clone(),
2348
+ outputDetachLocations: table.outputDetachLocations.clone(),
2349
+ };
2350
+ }
2351
+ exports.cloneRootTable = cloneRootTable;
2352
+ function invertRootTable(change, isRollback) {
2353
+ const invertedRoots = newRootTable();
2354
+ for (const [[revision, localId], nodeId] of change.rootNodes.nodeChanges.entries()) {
2355
+ const detachId = { revision, localId };
2356
+ const renamedId = firstAttachIdFromDetachId(change.rootNodes, detachId, 1).value;
2357
+ // This checks whether `change` attaches this node.
2358
+ // If it does, the node is not detached in the input context of the inverse, and so should not be included in the root table.
2359
+ if (change.crossFieldKeys.getFirst({ ...renamedId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, 1)
2360
+ .value === undefined) {
2361
+ assignRootChange(invertedRoots, undefined, renamedId, nodeId, change.rootNodes.detachLocations.getFirst(detachId, 1).value, change.rebaseVersion);
2362
+ }
2363
+ }
2364
+ if (isRollback) {
2365
+ // We only invert renames of nodes which are not attached or detached by this changeset.
2366
+ // When we invert an attach we will create a detach which incorporates the rename.
2367
+ for (const { start: oldId, value: newId, length, } of change.rootNodes.oldToNewId.entries()) {
2368
+ invertRename(change, invertedRoots, oldId, newId, length);
2369
+ }
2370
+ }
2371
+ return invertedRoots;
2372
+ }
2373
+ function invertRename(change, invertedRoots, oldId, newId, length) {
2374
+ for (const detachEntry of doesChangeDetachNodes(change.crossFieldKeys, newId, length)) {
2375
+ (0, internal_1.assert)(!detachEntry.value, "A changeset should not have a rename and detach for the same node.");
2376
+ }
2377
+ let countProcessed = length;
2378
+ const attachEntry = getFirstAttachField(change.crossFieldKeys, newId, countProcessed);
2379
+ countProcessed = attachEntry.length;
2380
+ if (attachEntry.value === undefined) {
2381
+ const outputDetachEntry = change.rootNodes.outputDetachLocations.getFirst(newId, countProcessed);
2382
+ countProcessed = outputDetachEntry.length;
2383
+ const inputDetachEntry = change.rootNodes.detachLocations.getFirst(oldId, countProcessed);
2384
+ countProcessed = inputDetachEntry.length;
2385
+ addNodeRename(invertedRoots, newId, oldId, countProcessed, outputDetachEntry.value ?? inputDetachEntry.value);
2386
+ }
2387
+ if (countProcessed < length) {
2388
+ invertRename(change, invertedRoots, (0, index_js_1.offsetChangeAtomId)(oldId, countProcessed), (0, index_js_1.offsetChangeAtomId)(newId, countProcessed), length - countProcessed);
2389
+ }
2390
+ }
2391
+ function doesChangeAttachNodes(table, id, count) {
2392
+ return table
2393
+ .getAll2({ ...id, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, count)
2394
+ .map((entry) => ({ ...entry, value: entry.value !== undefined }));
2395
+ }
2396
+ function doesChangeDetachNodes(table, id, count) {
2397
+ return table
2398
+ .getAll2({ ...id, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, count)
2399
+ .map((entry) => ({ ...entry, value: entry.value !== undefined }));
2400
+ }
2401
+ function getFirstDetachField(table, id, count) {
2402
+ return table.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...id }, count);
2403
+ }
2404
+ exports.getFirstDetachField = getFirstDetachField;
2405
+ function getFirstAttachField(table, id, count) {
2406
+ return table.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...id }, count);
2407
+ }
2408
+ exports.getFirstAttachField = getFirstAttachField;
2409
+ function addNodeRename(table, oldId, newId, count, detachLocation) {
2410
+ if ((0, index_js_1.areEqualChangeAtomIds)(oldId, newId)) {
2411
+ return;
2412
+ }
2413
+ for (const entry of table.oldToNewId.getAll2(oldId, count)) {
2414
+ (0, internal_1.assert)(entry.value === undefined ||
2415
+ (0, index_js_1.areEqualChangeAtomIds)(entry.value, (0, index_js_1.offsetChangeAtomId)(newId, entry.offset)), "Rename collision detected");
2416
+ }
2417
+ for (const entry of table.newToOldId.getAll2(newId, count)) {
2418
+ (0, internal_1.assert)(entry.value === undefined ||
2419
+ (0, index_js_1.areEqualChangeAtomIds)(entry.value, (0, index_js_1.offsetChangeAtomId)(oldId, entry.offset)), "Rename collision detected");
2420
+ }
2421
+ table.oldToNewId.set(oldId, count, newId);
2422
+ table.newToOldId.set(newId, count, oldId);
2423
+ if (detachLocation !== undefined) {
2424
+ table.detachLocations.set(oldId, count, detachLocation);
2425
+ }
2426
+ }
2427
+ exports.addNodeRename = addNodeRename;
2428
+ /**
2429
+ * Deletes any renames from `id`.
2430
+ */
2431
+ function deleteNodeRenameFrom(roots, id, count) {
2432
+ for (const entry of roots.oldToNewId.getAll(id, count)) {
2433
+ deleteNodeRenameEntry(roots, entry.start, entry.value, entry.length);
2434
+ }
2435
+ }
2436
+ /**
2437
+ * Deletes any renames to `id`.
2438
+ */
2439
+ function deleteNodeRenameTo(roots, id, count) {
2440
+ for (const entry of roots.newToOldId.getAll(id, count)) {
2441
+ deleteNodeRenameEntry(roots, entry.value, entry.start, entry.length);
2442
+ }
2443
+ }
2444
+ function appendNodeRename(composedTable, oldId, newId, count, change1Table, detachLocation) {
2445
+ let countToProcess = count;
2446
+ const rename1Entry = change1Table.newToOldId.getFirst(oldId, countToProcess);
2447
+ countToProcess = rename1Entry.length;
2448
+ if (rename1Entry.value !== undefined) {
2449
+ deleteNodeRenameFrom(composedTable, rename1Entry.value, countToProcess);
2450
+ }
2451
+ addNodeRename(composedTable, rename1Entry.value ?? oldId, newId, countToProcess, detachLocation);
2452
+ tryRemoveDetachLocation(composedTable, newId, countToProcess);
2453
+ if (countToProcess < count) {
2454
+ const countRemaining = count - countToProcess;
2455
+ appendNodeRename(composedTable, (0, index_js_1.offsetChangeAtomId)(oldId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newId, countToProcess), countRemaining, change1Table, detachLocation);
2456
+ }
2457
+ }
2458
+ function tryRemoveDetachLocation(roots, rootId, count) {
2459
+ let countProcessed = count;
2460
+ const renameEntry = roots.oldToNewId.getFirst(rootId, countProcessed);
2461
+ countProcessed = renameEntry.length;
2462
+ const outputDetachEntry = roots.outputDetachLocations.getFirst(rootId, countProcessed);
2463
+ countProcessed = outputDetachEntry.length;
2464
+ const nodeChangeEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(roots.nodeChanges, rootId, countProcessed);
2465
+ countProcessed = nodeChangeEntry.length;
2466
+ if (nodeChangeEntry.value === undefined &&
2467
+ renameEntry.value === undefined &&
2468
+ outputDetachEntry.value === undefined) {
2469
+ roots.detachLocations.delete(rootId, countProcessed);
2470
+ }
2471
+ const countRemaining = count - countProcessed;
2472
+ if (countRemaining > 0) {
2473
+ tryRemoveDetachLocation(roots, (0, index_js_1.offsetChangeAtomId)(rootId, countProcessed), countRemaining);
2474
+ }
2475
+ }
2476
+ /**
2477
+ * Deletes the entry renaming the ID range of length `count` from `oldId` to `newId`.
2478
+ * This function assumes that such an entry exists.
2479
+ */
2480
+ function deleteNodeRenameEntry(roots, oldId, newId, count) {
2481
+ roots.oldToNewId.delete(oldId, count);
2482
+ roots.newToOldId.delete(newId, count);
2483
+ }
2484
+ function replaceRootTableRevision(table, oldRevisions, newRevision, nodeAliases) {
2485
+ const oldToNewId = table.oldToNewId.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision));
2486
+ const newToOldId = table.newToOldId.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision));
2487
+ const nodeChanges = (0, index_js_2.newTupleBTree)([...table.nodeChanges.entries()].map(([[revision, id], nodeId]) => [
2488
+ [oldRevisions.has(revision) ? newRevision : revision, id],
2489
+ (0, index_js_1.replaceAtomRevisions)(normalizeNodeId(nodeId, nodeAliases), oldRevisions, newRevision),
2490
+ ]));
2491
+ const detachLocations = table.detachLocations.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, nodeAliases), oldRevisions, newRevision));
2492
+ const outputDetachLocations = table.outputDetachLocations.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, nodeAliases), oldRevisions, newRevision));
2493
+ return { oldToNewId, newToOldId, nodeChanges, detachLocations, outputDetachLocations };
2494
+ }
2495
+ function newDetachedEntryMap() {
2496
+ return new index_js_2.RangeMap(index_js_1.offsetChangeAtomId, index_js_1.subtractChangeAtomIds, offsetDetachedNodeEntry);
2497
+ }
2498
+ function offsetDetachedNodeEntry(entry, count) {
2499
+ (0, internal_1.assert)(count <= 1 || entry.nodeChange === undefined, "Cannot split an entry with a node change");
2500
+ return entry.detachId !== undefined
2501
+ ? { ...entry, detachId: (0, index_js_1.offsetChangeAtomId)(entry.detachId, count) }
2502
+ : entry;
2503
+ }
2504
+ function getFieldsWithRootMoves(roots, nodeAliases) {
2505
+ const fields = (0, index_js_2.newTupleBTree)();
2506
+ for (const { start: rootId, value: fieldId, length } of roots.detachLocations.entries()) {
2507
+ let isRootMoved = false;
2508
+ for (const renameEntry of roots.oldToNewId.getAll2(rootId, length)) {
2509
+ if (renameEntry.value !== undefined) {
2510
+ isRootMoved = true;
2511
+ }
2512
+ }
2513
+ for (const outputDetachEntry of roots.outputDetachLocations.getAll2(rootId, length)) {
2514
+ if (outputDetachEntry.value !== undefined) {
2515
+ isRootMoved = true;
2516
+ }
2517
+ }
2518
+ if (isRootMoved) {
2519
+ fields.set(fieldIdKeyFromFieldId(normalizeFieldId(fieldId, nodeAliases)), true);
2520
+ }
2521
+ }
2522
+ return fields;
2523
+ }
2524
+ function getFieldToRootChanges(roots, nodeAliases) {
2525
+ const fields = (0, index_js_2.newTupleBTree)();
2526
+ for (const rootIdKey of roots.nodeChanges.keys()) {
2527
+ const rootId = { revision: rootIdKey[0], localId: rootIdKey[1] };
2528
+ const detachLocation = roots.detachLocations.getFirst(rootId, 1).value;
2529
+ if (detachLocation !== undefined) {
2530
+ const fieldIdKey = fieldIdKeyFromFieldId(normalizeFieldId(detachLocation, nodeAliases));
2531
+ let rootsInField = fields.get(fieldIdKey);
2532
+ if (rootsInField === undefined) {
2533
+ rootsInField = [];
2534
+ fields.set(fieldIdKey, rootsInField);
2535
+ }
2536
+ rootsInField.push(rootId);
2537
+ }
2538
+ }
2539
+ return fields;
2540
+ }
2541
+ function muteRootChanges(roots) {
2542
+ return {
2543
+ oldToNewId: (0, index_js_1.newChangeAtomIdTransform)(),
2544
+ newToOldId: (0, index_js_1.newChangeAtomIdTransform)(),
2545
+ nodeChanges: (0, index_js_2.brand)(roots.nodeChanges.clone()),
2546
+ detachLocations: roots.detachLocations.clone(),
2547
+ outputDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
2548
+ };
2549
+ }
1717
2550
  //# sourceMappingURL=modularChangeFamily.js.map