@fluidframework/tree 2.74.0-370705 → 2.80.0

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