@fluidframework/tree 2.83.0 → 2.90.0-378676

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (781) hide show
  1. package/api-report/tree.alpha.api.md +1 -0
  2. package/dist/core/change-family/changeFamily.d.ts +4 -1
  3. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  4. package/dist/core/change-family/changeFamily.js.map +1 -1
  5. package/dist/core/change-family/index.d.ts +1 -1
  6. package/dist/core/change-family/index.d.ts.map +1 -1
  7. package/dist/core/change-family/index.js.map +1 -1
  8. package/dist/core/index.d.ts +3 -3
  9. package/dist/core/index.d.ts.map +1 -1
  10. package/dist/core/index.js +6 -4
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/core/rebase/changeRebaser.d.ts +6 -1
  13. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  14. package/dist/core/rebase/changeRebaser.js.map +1 -1
  15. package/dist/core/rebase/index.d.ts +1 -1
  16. package/dist/core/rebase/index.d.ts.map +1 -1
  17. package/dist/core/rebase/index.js +2 -1
  18. package/dist/core/rebase/index.js.map +1 -1
  19. package/dist/core/rebase/types.d.ts +1 -0
  20. package/dist/core/rebase/types.d.ts.map +1 -1
  21. package/dist/core/rebase/types.js +5 -1
  22. package/dist/core/rebase/types.js.map +1 -1
  23. package/dist/core/rebase/utils.d.ts.map +1 -1
  24. package/dist/core/rebase/utils.js +25 -7
  25. package/dist/core/rebase/utils.js.map +1 -1
  26. package/dist/core/tree/delta.d.ts +5 -0
  27. package/dist/core/tree/delta.d.ts.map +1 -1
  28. package/dist/core/tree/delta.js.map +1 -1
  29. package/dist/core/tree/detachedFieldIndex.d.ts +13 -1
  30. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  31. package/dist/core/tree/detachedFieldIndex.js +14 -1
  32. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  33. package/dist/core/tree/detachedFieldIndexTypes.d.ts +4 -0
  34. package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  35. package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
  36. package/dist/core/tree/index.d.ts +2 -2
  37. package/dist/core/tree/index.d.ts.map +1 -1
  38. package/dist/core/tree/index.js +4 -3
  39. package/dist/core/tree/index.js.map +1 -1
  40. package/dist/core/tree/pathTree.d.ts +11 -3
  41. package/dist/core/tree/pathTree.d.ts.map +1 -1
  42. package/dist/core/tree/pathTree.js +14 -2
  43. package/dist/core/tree/pathTree.js.map +1 -1
  44. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  45. package/dist/core/tree/visitDelta.js +17 -13
  46. package/dist/core/tree/visitDelta.js.map +1 -1
  47. package/dist/feature-libraries/changeAtomIdBTree.d.ts +3 -2
  48. package/dist/feature-libraries/changeAtomIdBTree.d.ts.map +1 -1
  49. package/dist/feature-libraries/changeAtomIdBTree.js +15 -2
  50. package/dist/feature-libraries/changeAtomIdBTree.js.map +1 -1
  51. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +92 -44
  52. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  53. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +220 -70
  54. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  55. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  56. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +12 -2
  57. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  58. package/dist/feature-libraries/default-schema/index.d.ts +2 -1
  59. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  60. package/dist/feature-libraries/default-schema/index.js +4 -2
  61. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  62. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +40 -0
  63. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
  64. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js +153 -0
  65. package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
  66. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
  67. package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  68. package/dist/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
  69. package/dist/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  70. package/dist/feature-libraries/deltaUtils.d.ts +1 -0
  71. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  72. package/dist/feature-libraries/deltaUtils.js +6 -1
  73. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  74. package/dist/feature-libraries/flex-tree/context.d.ts +9 -0
  75. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  76. package/dist/feature-libraries/flex-tree/context.js +6 -0
  77. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  78. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  79. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  80. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  81. package/dist/feature-libraries/flex-tree/lazyField.d.ts +8 -7
  82. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  83. package/dist/feature-libraries/flex-tree/lazyField.js +39 -8
  84. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  85. package/dist/feature-libraries/index.d.ts +3 -3
  86. package/dist/feature-libraries/index.d.ts.map +1 -1
  87. package/dist/feature-libraries/index.js +8 -4
  88. package/dist/feature-libraries/index.js.map +1 -1
  89. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  90. package/dist/feature-libraries/mitigatedChangeFamily.js +2 -2
  91. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  92. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +100 -24
  93. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  94. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +8 -12
  95. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  96. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +85 -51
  97. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  98. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  99. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  100. package/dist/feature-libraries/modular-schema/genericFieldKind.js +4 -9
  101. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  102. package/dist/feature-libraries/modular-schema/index.d.ts +3 -3
  103. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  104. package/dist/feature-libraries/modular-schema/index.js +2 -3
  105. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  106. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +18 -22
  107. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  108. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +276 -158
  109. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  110. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  111. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js +1 -1
  112. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  113. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.d.ts +15 -0
  114. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.d.ts.map +1 -0
  115. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.js +296 -0
  116. package/dist/feature-libraries/modular-schema/modularChangeCodecV3.js.map +1 -0
  117. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -0
  118. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  119. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -0
  120. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  121. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +56 -22
  122. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  123. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +1390 -462
  124. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  125. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  126. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  127. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +1 -2
  128. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  129. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +3 -3
  130. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  131. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.d.ts +74 -0
  132. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.d.ts.map +1 -0
  133. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.js +35 -0
  134. package/dist/feature-libraries/modular-schema/modularChangeFormatV3.js.map +1 -0
  135. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +49 -10
  136. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  137. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +3 -3
  138. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  139. package/dist/feature-libraries/optional-field/optionalField.d.ts +13 -32
  140. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  141. package/dist/feature-libraries/optional-field/optionalField.js +257 -446
  142. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  143. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
  144. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
  145. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +31 -0
  146. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
  147. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +31 -31
  148. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  149. package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  150. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  151. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  152. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js +57 -28
  153. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  154. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
  155. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
  156. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +57 -0
  157. package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
  158. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  159. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
  160. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  161. package/dist/feature-libraries/optional-field/requiredField.d.ts +3 -2
  162. package/dist/feature-libraries/optional-field/requiredField.d.ts.map +1 -1
  163. package/dist/feature-libraries/optional-field/requiredField.js +6 -1
  164. package/dist/feature-libraries/optional-field/requiredField.js.map +1 -1
  165. package/dist/feature-libraries/sequence-field/compose.d.ts +6 -7
  166. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  167. package/dist/feature-libraries/sequence-field/compose.js +81 -259
  168. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  169. package/dist/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
  170. package/dist/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  171. package/dist/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  172. package/dist/feature-libraries/sequence-field/invert.d.ts +3 -3
  173. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  174. package/dist/feature-libraries/sequence-field/invert.js +65 -167
  175. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  176. package/dist/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  177. package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  178. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  179. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
  180. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  181. package/dist/feature-libraries/sequence-field/moveEffectTable.js +7 -90
  182. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  183. package/dist/feature-libraries/sequence-field/rebase.d.ts +3 -3
  184. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  185. package/dist/feature-libraries/sequence-field/rebase.js +109 -116
  186. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  187. package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  188. package/dist/feature-libraries/sequence-field/replaceRevisions.js +19 -32
  189. package/dist/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  190. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  191. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +1 -2
  192. package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  193. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
  194. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  195. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +388 -187
  196. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  197. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  198. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js +20 -62
  199. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  200. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  201. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  202. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +13 -13
  203. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  204. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
  205. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  206. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +16 -111
  207. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  208. package/dist/feature-libraries/sequence-field/types.d.ts +37 -74
  209. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  210. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  211. package/dist/feature-libraries/sequence-field/utils.d.ts +20 -25
  212. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  213. package/dist/feature-libraries/sequence-field/utils.js +159 -320
  214. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  215. package/dist/packageVersion.d.ts +1 -1
  216. package/dist/packageVersion.d.ts.map +1 -1
  217. package/dist/packageVersion.js +1 -1
  218. package/dist/packageVersion.js.map +1 -1
  219. package/dist/shared-tree/independentView.d.ts.map +1 -1
  220. package/dist/shared-tree/independentView.js +1 -1
  221. package/dist/shared-tree/independentView.js.map +1 -1
  222. package/dist/shared-tree/index.d.ts +1 -1
  223. package/dist/shared-tree/index.d.ts.map +1 -1
  224. package/dist/shared-tree/index.js.map +1 -1
  225. package/dist/shared-tree/schematizeTree.d.ts +4 -4
  226. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  227. package/dist/shared-tree/schematizeTree.js +2 -1
  228. package/dist/shared-tree/schematizeTree.js.map +1 -1
  229. package/dist/shared-tree/schematizingTreeView.d.ts +1 -5
  230. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  231. package/dist/shared-tree/schematizingTreeView.js +21 -35
  232. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  233. package/dist/shared-tree/sharedTree.d.ts +9 -3
  234. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  235. package/dist/shared-tree/sharedTree.js +4 -1
  236. package/dist/shared-tree/sharedTree.js.map +1 -1
  237. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +1 -0
  238. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  239. package/dist/shared-tree/sharedTreeChangeCodecs.js +8 -0
  240. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  241. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +4 -4
  242. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  243. package/dist/shared-tree/sharedTreeChangeFamily.js +2 -2
  244. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  245. package/dist/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
  246. package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  247. package/dist/shared-tree/sharedTreeEditBuilder.js +14 -7
  248. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  249. package/dist/shared-tree/treeCheckout.d.ts +13 -11
  250. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  251. package/dist/shared-tree/treeCheckout.js +56 -6
  252. package/dist/shared-tree/treeCheckout.js.map +1 -1
  253. package/dist/shared-tree-core/branch.d.ts +3 -2
  254. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  255. package/dist/shared-tree-core/branch.js +4 -3
  256. package/dist/shared-tree-core/branch.js.map +1 -1
  257. package/dist/shared-tree-core/editManager.d.ts +2 -2
  258. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  259. package/dist/shared-tree-core/editManager.js +9 -9
  260. package/dist/shared-tree-core/editManager.js.map +1 -1
  261. package/dist/shared-tree-core/editManagerCodecs.d.ts +4 -0
  262. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  263. package/dist/shared-tree-core/editManagerCodecs.js +10 -2
  264. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  265. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +1 -0
  266. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  267. package/dist/shared-tree-core/editManagerFormatCommons.js +6 -0
  268. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  269. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  270. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  271. package/dist/shared-tree-core/editManagerFormatV1toV4.js +1 -0
  272. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  273. package/dist/shared-tree-core/index.d.ts +2 -2
  274. package/dist/shared-tree-core/index.d.ts.map +1 -1
  275. package/dist/shared-tree-core/index.js +3 -1
  276. package/dist/shared-tree-core/index.js.map +1 -1
  277. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  278. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  279. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  280. package/dist/shared-tree-core/messageCodecs.d.ts +4 -0
  281. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  282. package/dist/shared-tree-core/messageCodecs.js +10 -2
  283. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  284. package/dist/shared-tree-core/messageFormat.d.ts +1 -0
  285. package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
  286. package/dist/shared-tree-core/messageFormat.js +6 -0
  287. package/dist/shared-tree-core/messageFormat.js.map +1 -1
  288. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
  289. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  290. package/dist/shared-tree-core/messageFormatV1ToV4.js +1 -0
  291. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  292. package/dist/shared-tree-core/sharedTreeCore.d.ts +1 -0
  293. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  294. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  295. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  296. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +16 -12
  297. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  298. package/dist/simple-tree/core/unhydratedFlexTree.js +59 -8
  299. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  300. package/dist/simple-tree/fieldSchema.d.ts +4 -4
  301. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  302. package/dist/simple-tree/fieldSchema.js.map +1 -1
  303. package/dist/simple-tree/index.d.ts +2 -2
  304. package/dist/simple-tree/index.d.ts.map +1 -1
  305. package/dist/simple-tree/index.js +1 -1
  306. package/dist/simple-tree/index.js.map +1 -1
  307. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  308. package/dist/simple-tree/node-kinds/array/arrayNode.js +5 -3
  309. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  310. package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
  311. package/dist/simple-tree/node-kinds/common.js +1 -1
  312. package/dist/simple-tree/node-kinds/common.js.map +1 -1
  313. package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
  314. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  315. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  316. package/dist/simple-tree/node-kinds/object/objectNode.js +19 -19
  317. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  318. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  319. package/dist/simple-tree/node-kinds/record/recordNode.js +4 -2
  320. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  321. package/dist/simple-tree/prepareForInsertion.d.ts +54 -47
  322. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  323. package/dist/simple-tree/prepareForInsertion.js +183 -125
  324. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  325. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +8 -3
  326. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  327. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +27 -13
  328. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  329. package/dist/treeFactory.d.ts.map +1 -1
  330. package/dist/treeFactory.js +12 -2
  331. package/dist/treeFactory.js.map +1 -1
  332. package/dist/util/index.d.ts +1 -1
  333. package/dist/util/index.d.ts.map +1 -1
  334. package/dist/util/index.js +2 -1
  335. package/dist/util/index.js.map +1 -1
  336. package/dist/util/rangeMap.d.ts +23 -11
  337. package/dist/util/rangeMap.d.ts.map +1 -1
  338. package/dist/util/rangeMap.js +43 -10
  339. package/dist/util/rangeMap.js.map +1 -1
  340. package/lib/core/change-family/changeFamily.d.ts +4 -1
  341. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  342. package/lib/core/change-family/changeFamily.js.map +1 -1
  343. package/lib/core/change-family/index.d.ts +1 -1
  344. package/lib/core/change-family/index.d.ts.map +1 -1
  345. package/lib/core/change-family/index.js.map +1 -1
  346. package/lib/core/index.d.ts +3 -3
  347. package/lib/core/index.d.ts.map +1 -1
  348. package/lib/core/index.js +2 -2
  349. package/lib/core/index.js.map +1 -1
  350. package/lib/core/rebase/changeRebaser.d.ts +6 -1
  351. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  352. package/lib/core/rebase/changeRebaser.js.map +1 -1
  353. package/lib/core/rebase/index.d.ts +1 -1
  354. package/lib/core/rebase/index.d.ts.map +1 -1
  355. package/lib/core/rebase/index.js +1 -1
  356. package/lib/core/rebase/index.js.map +1 -1
  357. package/lib/core/rebase/types.d.ts +1 -0
  358. package/lib/core/rebase/types.d.ts.map +1 -1
  359. package/lib/core/rebase/types.js +3 -0
  360. package/lib/core/rebase/types.js.map +1 -1
  361. package/lib/core/rebase/utils.d.ts.map +1 -1
  362. package/lib/core/rebase/utils.js +25 -7
  363. package/lib/core/rebase/utils.js.map +1 -1
  364. package/lib/core/tree/delta.d.ts +5 -0
  365. package/lib/core/tree/delta.d.ts.map +1 -1
  366. package/lib/core/tree/delta.js.map +1 -1
  367. package/lib/core/tree/detachedFieldIndex.d.ts +13 -1
  368. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  369. package/lib/core/tree/detachedFieldIndex.js +15 -2
  370. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  371. package/lib/core/tree/detachedFieldIndexTypes.d.ts +4 -0
  372. package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
  373. package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
  374. package/lib/core/tree/index.d.ts +2 -2
  375. package/lib/core/tree/index.d.ts.map +1 -1
  376. package/lib/core/tree/index.js +1 -1
  377. package/lib/core/tree/index.js.map +1 -1
  378. package/lib/core/tree/pathTree.d.ts +11 -3
  379. package/lib/core/tree/pathTree.d.ts.map +1 -1
  380. package/lib/core/tree/pathTree.js +12 -1
  381. package/lib/core/tree/pathTree.js.map +1 -1
  382. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  383. package/lib/core/tree/visitDelta.js +17 -13
  384. package/lib/core/tree/visitDelta.js.map +1 -1
  385. package/lib/feature-libraries/changeAtomIdBTree.d.ts +3 -2
  386. package/lib/feature-libraries/changeAtomIdBTree.d.ts.map +1 -1
  387. package/lib/feature-libraries/changeAtomIdBTree.js +15 -3
  388. package/lib/feature-libraries/changeAtomIdBTree.js.map +1 -1
  389. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +92 -44
  390. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  391. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +217 -69
  392. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  393. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  394. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +12 -2
  395. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  396. package/lib/feature-libraries/default-schema/index.d.ts +2 -1
  397. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  398. package/lib/feature-libraries/default-schema/index.js +2 -1
  399. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  400. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +40 -0
  401. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
  402. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js +149 -0
  403. package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
  404. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
  405. package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
  406. package/lib/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
  407. package/lib/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
  408. package/lib/feature-libraries/deltaUtils.d.ts +1 -0
  409. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  410. package/lib/feature-libraries/deltaUtils.js +5 -1
  411. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  412. package/lib/feature-libraries/flex-tree/context.d.ts +9 -0
  413. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  414. package/lib/feature-libraries/flex-tree/context.js +6 -0
  415. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  416. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
  417. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  418. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  419. package/lib/feature-libraries/flex-tree/lazyField.d.ts +8 -7
  420. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  421. package/lib/feature-libraries/flex-tree/lazyField.js +40 -9
  422. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  423. package/lib/feature-libraries/index.d.ts +3 -3
  424. package/lib/feature-libraries/index.d.ts.map +1 -1
  425. package/lib/feature-libraries/index.js +3 -3
  426. package/lib/feature-libraries/index.js.map +1 -1
  427. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  428. package/lib/feature-libraries/mitigatedChangeFamily.js +2 -2
  429. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  430. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +100 -24
  431. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  432. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +7 -10
  433. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  434. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +85 -51
  435. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  436. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  437. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  438. package/lib/feature-libraries/modular-schema/genericFieldKind.js +4 -9
  439. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  440. package/lib/feature-libraries/modular-schema/index.d.ts +3 -3
  441. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  442. package/lib/feature-libraries/modular-schema/index.js +1 -1
  443. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  444. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +18 -22
  445. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  446. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +267 -144
  447. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  448. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  449. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js +1 -1
  450. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  451. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.d.ts +15 -0
  452. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.d.ts.map +1 -0
  453. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.js +292 -0
  454. package/lib/feature-libraries/modular-schema/modularChangeCodecV3.js.map +1 -0
  455. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -0
  456. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  457. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +8 -0
  458. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  459. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +56 -22
  460. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  461. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +1387 -468
  462. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  463. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  464. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  465. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +1 -2
  466. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  467. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +1 -1
  468. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  469. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.d.ts +74 -0
  470. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.d.ts.map +1 -0
  471. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.js +32 -0
  472. package/lib/feature-libraries/modular-schema/modularChangeFormatV3.js.map +1 -0
  473. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +49 -10
  474. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  475. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +1 -1
  476. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  477. package/lib/feature-libraries/optional-field/optionalField.d.ts +13 -32
  478. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  479. package/lib/feature-libraries/optional-field/optionalField.js +254 -442
  480. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  481. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
  482. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
  483. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +27 -0
  484. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
  485. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +31 -31
  486. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
  487. package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
  488. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
  489. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  490. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js +55 -26
  491. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  492. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
  493. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
  494. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +53 -0
  495. package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
  496. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  497. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
  498. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  499. package/lib/feature-libraries/optional-field/requiredField.d.ts +3 -2
  500. package/lib/feature-libraries/optional-field/requiredField.d.ts.map +1 -1
  501. package/lib/feature-libraries/optional-field/requiredField.js +5 -1
  502. package/lib/feature-libraries/optional-field/requiredField.js.map +1 -1
  503. package/lib/feature-libraries/sequence-field/compose.d.ts +6 -7
  504. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  505. package/lib/feature-libraries/sequence-field/compose.js +83 -261
  506. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  507. package/lib/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
  508. package/lib/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
  509. package/lib/feature-libraries/sequence-field/helperTypes.js.map +1 -1
  510. package/lib/feature-libraries/sequence-field/invert.d.ts +3 -3
  511. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  512. package/lib/feature-libraries/sequence-field/invert.js +67 -169
  513. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  514. package/lib/feature-libraries/sequence-field/markQueue.d.ts +2 -2
  515. package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  516. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  517. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
  518. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  519. package/lib/feature-libraries/sequence-field/moveEffectTable.js +6 -84
  520. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  521. package/lib/feature-libraries/sequence-field/rebase.d.ts +3 -3
  522. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  523. package/lib/feature-libraries/sequence-field/rebase.js +111 -118
  524. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  525. package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
  526. package/lib/feature-libraries/sequence-field/replaceRevisions.js +19 -32
  527. package/lib/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
  528. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
  529. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +2 -3
  530. package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
  531. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
  532. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  533. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +379 -182
  534. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  535. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  536. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js +21 -63
  537. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  538. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
  539. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  540. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +13 -13
  541. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  542. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
  543. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  544. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +16 -111
  545. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  546. package/lib/feature-libraries/sequence-field/types.d.ts +37 -74
  547. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  548. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  549. package/lib/feature-libraries/sequence-field/utils.d.ts +20 -25
  550. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  551. package/lib/feature-libraries/sequence-field/utils.js +155 -313
  552. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  553. package/lib/packageVersion.d.ts +1 -1
  554. package/lib/packageVersion.d.ts.map +1 -1
  555. package/lib/packageVersion.js +1 -1
  556. package/lib/packageVersion.js.map +1 -1
  557. package/lib/shared-tree/independentView.d.ts.map +1 -1
  558. package/lib/shared-tree/independentView.js +1 -1
  559. package/lib/shared-tree/independentView.js.map +1 -1
  560. package/lib/shared-tree/index.d.ts +1 -1
  561. package/lib/shared-tree/index.d.ts.map +1 -1
  562. package/lib/shared-tree/index.js.map +1 -1
  563. package/lib/shared-tree/schematizeTree.d.ts +4 -4
  564. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  565. package/lib/shared-tree/schematizeTree.js +3 -2
  566. package/lib/shared-tree/schematizeTree.js.map +1 -1
  567. package/lib/shared-tree/schematizingTreeView.d.ts +1 -5
  568. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  569. package/lib/shared-tree/schematizingTreeView.js +24 -38
  570. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  571. package/lib/shared-tree/sharedTree.d.ts +9 -3
  572. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  573. package/lib/shared-tree/sharedTree.js +4 -1
  574. package/lib/shared-tree/sharedTree.js.map +1 -1
  575. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +1 -0
  576. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  577. package/lib/shared-tree/sharedTreeChangeCodecs.js +8 -0
  578. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  579. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +4 -4
  580. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  581. package/lib/shared-tree/sharedTreeChangeFamily.js +3 -3
  582. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  583. package/lib/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
  584. package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  585. package/lib/shared-tree/sharedTreeEditBuilder.js +12 -6
  586. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  587. package/lib/shared-tree/treeCheckout.d.ts +13 -11
  588. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  589. package/lib/shared-tree/treeCheckout.js +59 -9
  590. package/lib/shared-tree/treeCheckout.js.map +1 -1
  591. package/lib/shared-tree-core/branch.d.ts +3 -2
  592. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  593. package/lib/shared-tree-core/branch.js +4 -3
  594. package/lib/shared-tree-core/branch.js.map +1 -1
  595. package/lib/shared-tree-core/editManager.d.ts +2 -2
  596. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  597. package/lib/shared-tree-core/editManager.js +9 -9
  598. package/lib/shared-tree-core/editManager.js.map +1 -1
  599. package/lib/shared-tree-core/editManagerCodecs.d.ts +4 -0
  600. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  601. package/lib/shared-tree-core/editManagerCodecs.js +8 -1
  602. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  603. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +1 -0
  604. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  605. package/lib/shared-tree-core/editManagerFormatCommons.js +6 -0
  606. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  607. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
  608. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  609. package/lib/shared-tree-core/editManagerFormatV1toV4.js +1 -0
  610. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  611. package/lib/shared-tree-core/index.d.ts +2 -2
  612. package/lib/shared-tree-core/index.d.ts.map +1 -1
  613. package/lib/shared-tree-core/index.js +2 -2
  614. package/lib/shared-tree-core/index.js.map +1 -1
  615. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
  616. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  617. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  618. package/lib/shared-tree-core/messageCodecs.d.ts +4 -0
  619. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  620. package/lib/shared-tree-core/messageCodecs.js +8 -1
  621. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  622. package/lib/shared-tree-core/messageFormat.d.ts +1 -0
  623. package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
  624. package/lib/shared-tree-core/messageFormat.js +6 -0
  625. package/lib/shared-tree-core/messageFormat.js.map +1 -1
  626. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
  627. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  628. package/lib/shared-tree-core/messageFormatV1ToV4.js +1 -0
  629. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  630. package/lib/shared-tree-core/sharedTreeCore.d.ts +1 -0
  631. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  632. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  633. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  634. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +16 -12
  635. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  636. package/lib/simple-tree/core/unhydratedFlexTree.js +58 -8
  637. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  638. package/lib/simple-tree/fieldSchema.d.ts +4 -4
  639. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  640. package/lib/simple-tree/fieldSchema.js.map +1 -1
  641. package/lib/simple-tree/index.d.ts +2 -2
  642. package/lib/simple-tree/index.d.ts.map +1 -1
  643. package/lib/simple-tree/index.js +1 -1
  644. package/lib/simple-tree/index.js.map +1 -1
  645. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  646. package/lib/simple-tree/node-kinds/array/arrayNode.js +6 -4
  647. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  648. package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
  649. package/lib/simple-tree/node-kinds/common.js +2 -2
  650. package/lib/simple-tree/node-kinds/common.js.map +1 -1
  651. package/lib/simple-tree/node-kinds/map/mapNode.js +2 -2
  652. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  653. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  654. package/lib/simple-tree/node-kinds/object/objectNode.js +20 -20
  655. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  656. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  657. package/lib/simple-tree/node-kinds/record/recordNode.js +4 -2
  658. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  659. package/lib/simple-tree/prepareForInsertion.d.ts +54 -47
  660. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  661. package/lib/simple-tree/prepareForInsertion.js +184 -125
  662. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  663. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +8 -3
  664. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  665. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +23 -10
  666. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  667. package/lib/treeFactory.d.ts.map +1 -1
  668. package/lib/treeFactory.js +13 -3
  669. package/lib/treeFactory.js.map +1 -1
  670. package/lib/util/index.d.ts +1 -1
  671. package/lib/util/index.d.ts.map +1 -1
  672. package/lib/util/index.js +1 -1
  673. package/lib/util/index.js.map +1 -1
  674. package/lib/util/rangeMap.d.ts +23 -11
  675. package/lib/util/rangeMap.d.ts.map +1 -1
  676. package/lib/util/rangeMap.js +41 -9
  677. package/lib/util/rangeMap.js.map +1 -1
  678. package/package.json +21 -21
  679. package/src/core/change-family/changeFamily.ts +5 -0
  680. package/src/core/change-family/index.ts +1 -0
  681. package/src/core/index.ts +4 -1
  682. package/src/core/rebase/changeRebaser.ts +6 -1
  683. package/src/core/rebase/index.ts +1 -0
  684. package/src/core/rebase/types.ts +4 -0
  685. package/src/core/rebase/utils.ts +31 -7
  686. package/src/core/tree/delta.ts +6 -0
  687. package/src/core/tree/detachedFieldIndex.ts +29 -1
  688. package/src/core/tree/detachedFieldIndexTypes.ts +5 -0
  689. package/src/core/tree/index.ts +13 -12
  690. package/src/core/tree/pathTree.ts +16 -4
  691. package/src/core/tree/visitDelta.ts +31 -11
  692. package/src/feature-libraries/changeAtomIdBTree.ts +28 -3
  693. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +369 -127
  694. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +13 -4
  695. package/src/feature-libraries/default-schema/index.ts +16 -5
  696. package/src/feature-libraries/default-schema/locationBasedEditBuilder.ts +231 -0
  697. package/src/feature-libraries/default-schema/mappedEditBuilder.ts +35 -9
  698. package/src/feature-libraries/deltaUtils.ts +6 -1
  699. package/src/feature-libraries/flex-tree/context.ts +17 -0
  700. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +7 -8
  701. package/src/feature-libraries/flex-tree/lazyField.ts +65 -24
  702. package/src/feature-libraries/index.ts +22 -9
  703. package/src/feature-libraries/mitigatedChangeFamily.ts +3 -1
  704. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +144 -47
  705. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +113 -58
  706. package/src/feature-libraries/modular-schema/genericFieldKind.ts +7 -18
  707. package/src/feature-libraries/modular-schema/index.ts +16 -16
  708. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +623 -348
  709. package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +1 -0
  710. package/src/feature-libraries/modular-schema/modularChangeCodecV3.ts +649 -0
  711. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +14 -0
  712. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +2694 -748
  713. package/src/feature-libraries/modular-schema/modularChangeFormatV1.ts +1 -0
  714. package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +1 -1
  715. package/src/feature-libraries/modular-schema/modularChangeFormatV3.ts +67 -0
  716. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +62 -10
  717. package/src/feature-libraries/optional-field/optionalField.ts +359 -568
  718. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV3.ts +45 -0
  719. package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +31 -35
  720. package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +89 -35
  721. package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +94 -0
  722. package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -1
  723. package/src/feature-libraries/optional-field/requiredField.ts +15 -2
  724. package/src/feature-libraries/sequence-field/compose.ts +137 -522
  725. package/src/feature-libraries/sequence-field/helperTypes.ts +34 -19
  726. package/src/feature-libraries/sequence-field/invert.ts +102 -228
  727. package/src/feature-libraries/sequence-field/markQueue.ts +2 -2
  728. package/src/feature-libraries/sequence-field/moveEffectTable.ts +8 -195
  729. package/src/feature-libraries/sequence-field/rebase.ts +171 -207
  730. package/src/feature-libraries/sequence-field/replaceRevisions.ts +26 -52
  731. package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +8 -3
  732. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +677 -229
  733. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +56 -70
  734. package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +28 -30
  735. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +21 -131
  736. package/src/feature-libraries/sequence-field/types.ts +40 -79
  737. package/src/feature-libraries/sequence-field/utils.ts +211 -370
  738. package/src/packageVersion.ts +1 -1
  739. package/src/shared-tree/independentView.ts +12 -6
  740. package/src/shared-tree/index.ts +3 -2
  741. package/src/shared-tree/schematizeTree.ts +21 -8
  742. package/src/shared-tree/schematizingTreeView.ts +38 -68
  743. package/src/shared-tree/sharedTree.ts +30 -15
  744. package/src/shared-tree/sharedTreeChangeCodecs.ts +8 -0
  745. package/src/shared-tree/sharedTreeChangeFamily.ts +7 -4
  746. package/src/shared-tree/sharedTreeEditBuilder.ts +43 -8
  747. package/src/shared-tree/treeCheckout.ts +93 -17
  748. package/src/shared-tree-core/branch.ts +8 -2
  749. package/src/shared-tree-core/editManager.ts +16 -2
  750. package/src/shared-tree-core/editManagerCodecs.ts +11 -1
  751. package/src/shared-tree-core/editManagerFormatCommons.ts +6 -0
  752. package/src/shared-tree-core/editManagerFormatV1toV4.ts +3 -1
  753. package/src/shared-tree-core/index.ts +2 -0
  754. package/src/shared-tree-core/messageCodecV1ToV4.ts +2 -1
  755. package/src/shared-tree-core/messageCodecs.ts +11 -1
  756. package/src/shared-tree-core/messageFormat.ts +6 -0
  757. package/src/shared-tree-core/messageFormatV1ToV4.ts +3 -1
  758. package/src/shared-tree-core/sharedTreeCore.ts +4 -1
  759. package/src/simple-tree/core/unhydratedFlexTree.ts +82 -35
  760. package/src/simple-tree/fieldSchema.ts +6 -4
  761. package/src/simple-tree/index.ts +2 -1
  762. package/src/simple-tree/node-kinds/array/arrayNode.ts +7 -5
  763. package/src/simple-tree/node-kinds/common.ts +2 -5
  764. package/src/simple-tree/node-kinds/map/mapNode.ts +4 -4
  765. package/src/simple-tree/node-kinds/object/objectNode.ts +26 -26
  766. package/src/simple-tree/node-kinds/record/recordNode.ts +10 -9
  767. package/src/simple-tree/prepareForInsertion.ts +342 -200
  768. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +35 -15
  769. package/src/treeFactory.ts +16 -4
  770. package/src/util/index.ts +3 -0
  771. package/src/util/rangeMap.ts +68 -26
  772. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
  773. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
  774. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -50
  775. package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
  776. package/docs/main/sequence-field/move-composition.md +0 -46
  777. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
  778. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
  779. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -46
  780. package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
  781. package/src/feature-libraries/sequence-field/relevantRemovedRoots.ts +0 -57
@@ -3,65 +3,89 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, oob, fail } from "@fluidframework/core-utils/internal";
6
+ import { assert, fail, oob } from "@fluidframework/core-utils/internal";
7
7
  import type { TAnySchema } from "@sinclair/typebox";
8
8
 
9
9
  import {
10
+ extractJsonValidator,
11
+ withSchemaValidation,
10
12
  type ICodecOptions,
11
13
  type IJsonCodec,
12
14
  type SchemaValidationFunction,
13
- extractJsonValidator,
14
- withSchemaValidation,
15
15
  } from "../../codec/index.js";
16
- import type {
17
- ChangeEncodingContext,
18
- ChangesetLocalId,
19
- EncodedRevisionTag,
20
- FieldKey,
21
- FieldKindIdentifier,
22
- ITreeCursorSynchronous,
23
- RevisionInfo,
24
- RevisionTag,
16
+ import {
17
+ newChangeAtomIdTransform,
18
+ type ChangeAtomId,
19
+ type ChangeAtomIdRangeMap,
20
+ type ChangeEncodingContext,
21
+ type ChangesetLocalId,
22
+ type EncodedRevisionTag,
23
+ type FieldKey,
24
+ type FieldKindIdentifier,
25
+ type ITreeCursorSynchronous,
26
+ type RevisionInfo,
27
+ type RevisionTag,
25
28
  } from "../../core/index.js";
26
29
  import {
30
+ brand,
31
+ idAllocatorFromMaxId,
27
32
  type IdAllocator,
28
33
  type JsonCompatibleReadOnly,
29
34
  type Mutable,
30
- brand,
31
- idAllocatorFromMaxId,
35
+ type RangeQueryEntry,
36
+ type RangeQueryResult,
37
+ type TupleBTree,
32
38
  } from "../../util/index.js";
33
- import { newChangeAtomIdBTree, type ChangeAtomIdBTree } from "../changeAtomIdBTree.js";
34
39
  import {
35
- type FieldBatchCodec,
36
- type TreeChunk,
40
+ newChangeAtomIdBTree,
41
+ setInChangeAtomIdMap,
42
+ type ChangeAtomIdBTree,
43
+ } from "../changeAtomIdBTree.js";
44
+ import {
37
45
  chunkFieldSingle,
38
46
  defaultChunkPolicy,
47
+ type FieldBatchCodec,
48
+ type TreeChunk,
39
49
  } from "../chunked-forest/index.js";
40
50
  import { TreeCompressionStrategy } from "../treeCompressionUtils.js";
41
51
 
42
52
  import type { FieldChangeEncodingContext, FieldChangeHandler } from "./fieldChangeHandler.js";
53
+ import type { FlexFieldKind } from "./fieldKind.js";
43
54
  import type {
44
55
  FieldKindConfiguration,
45
56
  FieldKindConfigurationEntry,
46
57
  } from "./fieldKindConfiguration.js";
47
58
  import { genericFieldKind } from "./genericFieldKind.js";
48
59
  import {
49
- type EncodedBuilds,
50
- type EncodedBuildsArray,
51
- type EncodedFieldChange,
52
- type EncodedFieldChangeMap,
53
- EncodedModularChangesetV1,
54
- type EncodedNodeChangeset,
55
- type EncodedRevisionInfo,
60
+ addNodeRename,
61
+ getFirstAttachField,
62
+ getFirstDetachField,
63
+ newFieldIdKeyBTree,
64
+ newRootTable,
65
+ normalizeFieldId,
66
+ validateChangeset,
67
+ type FieldIdKey,
68
+ } from "./modularChangeFamily.js";
69
+ import { EncodedModularChangesetV1 } from "./modularChangeFormatV1.js";
70
+ import type {
71
+ EncodedBuilds,
72
+ EncodedBuildsArray,
73
+ EncodedFieldChange,
74
+ EncodedFieldChangeMap,
75
+ EncodedNodeChangeset,
76
+ EncodedRevisionInfo,
56
77
  } from "./modularChangeFormatV1.js";
57
78
  import {
58
- type FieldChangeset,
59
- newCrossFieldKeyTable,
79
+ newCrossFieldRangeTable,
80
+ type CrossFieldKeyTable,
60
81
  type FieldChangeMap,
82
+ type FieldChangeset,
61
83
  type FieldId,
62
84
  type ModularChangeset,
63
85
  type NodeChangeset,
64
86
  type NodeId,
87
+ type NodeLocation,
88
+ type RootNodeTable,
65
89
  } from "./modularChangeTypes.js";
66
90
 
67
91
  type ModularChangeCodec = IJsonCodec<
@@ -78,6 +102,13 @@ type FieldCodec = IJsonCodec<
78
102
  FieldChangeEncodingContext
79
103
  >;
80
104
 
105
+ interface FieldRootChanges {
106
+ readonly nodeChanges: ChangeAtomIdBTree<NodeId>;
107
+ readonly renames: ChangeAtomIdRangeMap<ChangeAtomId>;
108
+ }
109
+
110
+ type FieldRootMap = TupleBTree<FieldIdKey, FieldRootChanges>;
111
+
81
112
  type FieldChangesetCodecs = Map<
82
113
  FieldKindIdentifier,
83
114
  {
@@ -86,42 +117,65 @@ type FieldChangesetCodecs = Map<
86
117
  }
87
118
  >;
88
119
 
89
- export function getFieldChangesetCodec(
90
- fieldKind: FieldKindIdentifier,
91
- fieldChangesetCodecs: FieldChangesetCodecs,
92
- ): {
93
- compiledSchema?: SchemaValidationFunction<TAnySchema>;
94
- codec: FieldCodec;
95
- } {
96
- const entry = fieldChangesetCodecs.get(fieldKind);
97
- assert(entry !== undefined, 0x5ea /* Tried to encode unsupported fieldKind */);
98
- return entry;
99
- }
100
-
101
- export function encodeFieldChangesForJson(
102
- change: FieldChangeMap,
103
- context: ChangeEncodingContext,
104
- nodeChanges: ChangeAtomIdBTree<NodeChangeset>,
105
- fieldChangesetCodecs: FieldChangesetCodecs,
106
- ): EncodedFieldChangeMap {
107
- const fieldContext: FieldChangeEncodingContext = {
108
- baseContext: context,
120
+ export function getFieldChangesetCodecs(
121
+ fieldKinds: FieldKindConfiguration,
122
+ revisionTagCodec: IJsonCodec<
123
+ RevisionTag,
124
+ EncodedRevisionTag,
125
+ EncodedRevisionTag,
126
+ ChangeEncodingContext
127
+ >,
128
+ codecOptions: ICodecOptions,
129
+ ): Map<
130
+ FieldKindIdentifier,
131
+ { compiledSchema?: SchemaValidationFunction<TAnySchema>; codec: FieldCodec }
132
+ > {
133
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
134
+ const getMapEntry = ({ kind, formatVersion }: FieldKindConfigurationEntry) => {
135
+ const codec = kind.changeHandler.codecsFactory(revisionTagCodec).resolve(formatVersion);
136
+ return {
137
+ codec,
138
+ compiledSchema: codec.encodedSchema
139
+ ? extractJsonValidator(codecOptions.jsonValidator).compile(codec.encodedSchema)
140
+ : undefined,
141
+ };
142
+ };
109
143
 
110
- encodeNode: (nodeId: NodeId): EncodedNodeChangeset => {
111
- const node = nodeChanges.get([nodeId.revision, nodeId.localId]);
112
- assert(node !== undefined, 0x92e /* Unknown node ID */);
113
- return encodeNodeChangesForJson(node, fieldContext, fieldChangesetCodecs);
114
- },
144
+ /**
145
+ * The codec version for the generic field kind.
146
+ */
147
+ const genericFieldKindFormatVersion = 1;
148
+ const fieldChangesetCodecs: Map<
149
+ FieldKindIdentifier,
150
+ {
151
+ compiledSchema?: SchemaValidationFunction<TAnySchema>;
152
+ codec: FieldCodec;
153
+ }
154
+ > = new Map([
155
+ [
156
+ genericFieldKind.identifier,
157
+ getMapEntry({ kind: genericFieldKind, formatVersion: genericFieldKindFormatVersion }),
158
+ ],
159
+ ]);
115
160
 
116
- decodeNode: () => fail(0xb1e /* Should not decode nodes during field encoding */),
117
- };
161
+ // eslint-disable-next-line unicorn/no-array-for-each -- Map.forEach with (value, key) signature; codec initialization
162
+ fieldKinds.forEach((entry, identifier) => {
163
+ fieldChangesetCodecs.set(identifier, getMapEntry(entry));
164
+ });
118
165
 
119
- return encodeFieldChangesForJsonI(change, fieldContext, fieldChangesetCodecs);
166
+ return fieldChangesetCodecs;
120
167
  }
121
168
 
122
- export function encodeFieldChangesForJsonI(
169
+ function encodeFieldChangesForJson(
123
170
  change: FieldChangeMap,
124
- context: FieldChangeEncodingContext,
171
+ parentId: NodeId | undefined,
172
+ fieldToRoots: FieldRootMap,
173
+ context: ChangeEncodingContext,
174
+ encodeNode: NodeEncoder,
175
+ getInputRootId: ChangeAtomMappingQuery,
176
+ isAttachId: ChangeAtomIdRangeQuery,
177
+ isDetachId: ChangeAtomIdRangeQuery,
178
+ getCellIdForMove: ChangeAtomMappingQuery,
125
179
  fieldChangesetCodecs: FieldChangesetCodecs,
126
180
  ): EncodedFieldChangeMap {
127
181
  const encodedFields: EncodedFieldChangeMap = [];
@@ -131,7 +185,27 @@ export function encodeFieldChangesForJsonI(
131
185
  fieldChange.fieldKind,
132
186
  fieldChangesetCodecs,
133
187
  );
134
- const encodedChange = codec.encode(fieldChange.change, context);
188
+ const rootChanges = fieldToRoots.get([parentId?.revision, parentId?.localId, field]);
189
+
190
+ const fieldContext: FieldChangeEncodingContext = {
191
+ baseContext: context,
192
+ rootNodeChanges: rootChanges?.nodeChanges ?? newChangeAtomIdBTree(),
193
+ rootRenames: rootChanges?.renames ?? newChangeAtomIdTransform(),
194
+
195
+ encodeNode,
196
+ getInputRootId,
197
+ isAttachId,
198
+ isDetachId,
199
+ getCellIdForMove,
200
+
201
+ decodeNode: () => fail(0xb1e /* Should not decode nodes during field encoding */),
202
+ decodeRootNodeChange: () => fail("Should not be called during encoding"),
203
+ decodeRootRename: () => fail("Should not be called during encoding"),
204
+ decodeMoveAndDetach: () => fail("Should not be called during encoding"),
205
+ generateId: () => fail("Should not be called during encoding"),
206
+ };
207
+
208
+ const encodedChange = codec.encode(fieldChange.change, fieldContext);
135
209
  if (compiledSchema !== undefined && !compiledSchema.check(encodedChange)) {
136
210
  fail(0xb1f /* Encoded change didn't pass schema validation. */);
137
211
  }
@@ -149,9 +223,25 @@ export function encodeFieldChangesForJsonI(
149
223
  return encodedFields;
150
224
  }
151
225
 
152
- export function encodeNodeChangesForJson(
226
+ type ChangeAtomMappingQuery = (
227
+ id: ChangeAtomId,
228
+ count: number,
229
+ ) => RangeQueryResult<ChangeAtomId | undefined>;
230
+
231
+ type ChangeAtomIdRangeQuery = (id: ChangeAtomId, count: number) => RangeQueryResult<boolean>;
232
+ type NodeEncoder = (nodeId: NodeId) => EncodedNodeChangeset;
233
+ type NodeDecoder = (encoded: EncodedNodeChangeset, fieldId: NodeLocation) => NodeId;
234
+
235
+ function encodeNodeChangesForJson(
153
236
  change: NodeChangeset,
154
- context: FieldChangeEncodingContext,
237
+ id: NodeId,
238
+ fieldToRoots: FieldRootMap,
239
+ context: ChangeEncodingContext,
240
+ encodeNode: NodeEncoder,
241
+ getInputRootId: ChangeAtomMappingQuery,
242
+ isAttachId: ChangeAtomIdRangeQuery,
243
+ isDetachId: ChangeAtomIdRangeQuery,
244
+ getCellIdForMove: ChangeAtomMappingQuery,
155
245
  fieldChangesetCodecs: FieldChangesetCodecs,
156
246
  ): EncodedNodeChangeset {
157
247
  const encodedChange: EncodedNodeChangeset = {};
@@ -159,9 +249,16 @@ export function encodeNodeChangesForJson(
159
249
  const { fieldChanges, nodeExistsConstraint } = change;
160
250
 
161
251
  if (fieldChanges !== undefined) {
162
- encodedChange.fieldChanges = encodeFieldChangesForJsonI(
252
+ encodedChange.fieldChanges = encodeFieldChangesForJson(
163
253
  fieldChanges,
254
+ id,
255
+ fieldToRoots,
164
256
  context,
257
+ encodeNode,
258
+ getInputRootId,
259
+ isAttachId,
260
+ isDetachId,
261
+ getCellIdForMove,
165
262
  fieldChangesetCodecs,
166
263
  );
167
264
  }
@@ -173,11 +270,25 @@ export function encodeNodeChangesForJson(
173
270
  return encodedChange;
174
271
  }
175
272
 
176
- export function decodeFieldChangesFromJson(
273
+ function getFieldChangesetCodec(
274
+ fieldKind: FieldKindIdentifier,
275
+ fieldChangesetCodecs: FieldChangesetCodecs,
276
+ ): {
277
+ compiledSchema?: SchemaValidationFunction<TAnySchema>;
278
+ codec: FieldCodec;
279
+ } {
280
+ const entry = fieldChangesetCodecs.get(fieldKind);
281
+ assert(entry !== undefined, 0x5ea /* Tried to encode unsupported fieldKind */);
282
+ return entry;
283
+ }
284
+
285
+ function decodeFieldChangesFromJson(
177
286
  encodedChange: EncodedFieldChangeMap,
178
287
  parentId: NodeId | undefined,
179
- decoded: ModularChangeset,
288
+ decodedCrossFieldKeys: CrossFieldKeyTable,
289
+ decodedRootTable: RootNodeTable,
180
290
  context: ChangeEncodingContext,
291
+ decodeNode: NodeDecoder,
181
292
  idAllocator: IdAllocator,
182
293
  fieldKinds: FieldKindConfiguration,
183
294
  fieldChangesetCodecs: FieldChangesetCodecs,
@@ -199,29 +310,40 @@ export function decodeFieldChangesFromJson(
199
310
 
200
311
  const fieldContext: FieldChangeEncodingContext = {
201
312
  baseContext: context,
313
+ rootNodeChanges: newChangeAtomIdBTree(),
314
+ rootRenames: newChangeAtomIdTransform(),
202
315
 
203
316
  encodeNode: () => fail(0xb21 /* Should not encode nodes during field decoding */),
317
+ getInputRootId: () => fail("Should not query during decoding"),
318
+ isAttachId: () => fail("Should not query during decoding"),
319
+ isDetachId: () => fail("Should not query during decoding"),
320
+ getCellIdForMove: () => fail("Should not query during decoding"),
204
321
 
205
322
  decodeNode: (encodedNode: EncodedNodeChangeset): NodeId => {
206
- const nodeId: NodeId = {
207
- revision: context.revision,
208
- localId: brand(idAllocator.allocate()),
209
- };
210
-
211
- const node = decodeNodeChangesetFromJson(
212
- encodedNode,
213
- nodeId,
214
- decoded,
215
- context,
216
- idAllocator,
217
- fieldKinds,
218
- fieldChangesetCodecs,
323
+ return decodeNode(encodedNode, { field: fieldId });
324
+ },
325
+
326
+ decodeRootNodeChange: (detachId, encodedNode): void => {
327
+ setInChangeAtomIdMap(
328
+ decodedRootTable.nodeChanges,
329
+ detachId,
330
+ decodeNode(encodedNode, { root: detachId }),
219
331
  );
332
+ decodedRootTable.detachLocations.set(detachId, 1, fieldId);
333
+ },
334
+
335
+ decodeRootRename: (oldId, newId, count): void => {
336
+ addNodeRename(decodedRootTable, oldId, newId, count, fieldId);
337
+ },
220
338
 
221
- decoded.nodeChanges.set([nodeId.revision, nodeId.localId], node);
222
- decoded.nodeToParent.set([nodeId.revision, nodeId.localId], fieldId);
223
- return nodeId;
339
+ decodeMoveAndDetach: (detachId, count): void => {
340
+ decodedRootTable.outputDetachLocations.set(detachId, count, fieldId);
224
341
  },
342
+
343
+ generateId: (): ChangeAtomId => ({
344
+ revision: context.revision,
345
+ localId: brand(idAllocator.allocate()),
346
+ }),
225
347
  };
226
348
 
227
349
  const fieldChangeset = codec.decode(field.change, fieldContext);
@@ -231,7 +353,7 @@ export function decodeFieldChangesFromJson(
231
353
  );
232
354
 
233
355
  for (const { key, count } of crossFieldKeys) {
234
- decoded.crossFieldKeys.set(key, count, fieldId);
356
+ decodedCrossFieldKeys.set(key, count, fieldId);
235
357
  }
236
358
 
237
359
  const fieldKey: FieldKey = brand<FieldKey>(field.fieldKey);
@@ -245,24 +367,28 @@ export function decodeFieldChangesFromJson(
245
367
  return decodedFields;
246
368
  }
247
369
 
248
- export function decodeNodeChangesetFromJson(
370
+ function decodeNodeChangesetFromJson(
249
371
  encodedChange: EncodedNodeChangeset,
250
372
  id: NodeId,
251
- decoded: ModularChangeset,
373
+ decodedCrossFieldKeys: CrossFieldKeyTable,
374
+ decodedRootTable: RootNodeTable,
252
375
  context: ChangeEncodingContext,
376
+ decodeNode: NodeDecoder,
253
377
  idAllocator: IdAllocator,
254
378
  fieldKinds: FieldKindConfiguration,
255
379
  fieldChangesetCodecs: FieldChangesetCodecs,
256
380
  ): NodeChangeset {
257
- const decodedChange: NodeChangeset = {};
381
+ const decodedChange: Mutable<NodeChangeset> = {};
258
382
  const { fieldChanges, nodeExistsConstraint } = encodedChange;
259
383
 
260
384
  if (fieldChanges !== undefined) {
261
385
  decodedChange.fieldChanges = decodeFieldChangesFromJson(
262
386
  fieldChanges,
263
387
  id,
264
- decoded,
388
+ decodedCrossFieldKeys,
389
+ decodedRootTable,
265
390
  context,
391
+ decodeNode,
266
392
  idAllocator,
267
393
  fieldKinds,
268
394
  fieldChangesetCodecs,
@@ -276,63 +402,6 @@ export function decodeNodeChangesetFromJson(
276
402
  return decodedChange;
277
403
  }
278
404
 
279
- export function encodeDetachedNodes(
280
- detachedNodes: ChangeAtomIdBTree<TreeChunk> | undefined,
281
- context: ChangeEncodingContext,
282
- revisionTagCodec: IJsonCodec<
283
- RevisionTag,
284
- EncodedRevisionTag,
285
- EncodedRevisionTag,
286
- ChangeEncodingContext
287
- >,
288
- fieldsCodec: FieldBatchCodec,
289
- chunkCompressionStrategy: TreeCompressionStrategy,
290
- ): EncodedBuilds | undefined {
291
- if (detachedNodes === undefined) {
292
- return undefined;
293
- }
294
-
295
- const treesToEncode: ITreeCursorSynchronous[] = [];
296
- const buildsArray: EncodedBuildsArray = [];
297
-
298
- let buildsForRevision:
299
- | [[ChangesetLocalId, number][], EncodedRevisionTag]
300
- | [[ChangesetLocalId, number][]]
301
- | undefined;
302
-
303
- for (const [[revision, id], chunk] of detachedNodes.entries()) {
304
- const encodedRevision = encodeRevisionOpt(revisionTagCodec, revision, context);
305
-
306
- if (buildsForRevision === undefined || buildsForRevision[1] !== encodedRevision) {
307
- if (buildsForRevision !== undefined) {
308
- buildsArray.push(buildsForRevision);
309
- }
310
-
311
- buildsForRevision = encodedRevision === undefined ? [[]] : [[], encodedRevision];
312
- }
313
-
314
- treesToEncode.push(chunk.cursor());
315
- const treeIndexInBatch = treesToEncode.length - 1;
316
- buildsForRevision?.[0].push([id, treeIndexInBatch]);
317
- }
318
-
319
- if (buildsForRevision !== undefined) {
320
- buildsArray.push(buildsForRevision);
321
- }
322
-
323
- return buildsArray.length === 0
324
- ? undefined
325
- : {
326
- builds: buildsArray,
327
- trees: fieldsCodec.encode(treesToEncode, {
328
- encodeType: chunkCompressionStrategy,
329
- schema: context.schema,
330
- originatorId: context.originatorId,
331
- idCompressor: context.idCompressor,
332
- }),
333
- };
334
- }
335
-
336
405
  export function decodeDetachedNodes(
337
406
  encoded: EncodedBuilds | undefined,
338
407
  context: ChangeEncodingContext,
@@ -382,46 +451,6 @@ export function decodeDetachedNodes(
382
451
  return map;
383
452
  }
384
453
 
385
- export function encodeRevisionInfos(
386
- revisions: readonly RevisionInfo[],
387
- context: ChangeEncodingContext,
388
- revisionTagCodec: IJsonCodec<
389
- RevisionTag,
390
- EncodedRevisionTag,
391
- EncodedRevisionTag,
392
- ChangeEncodingContext
393
- >,
394
- ): EncodedRevisionInfo[] | undefined {
395
- if (context.revision !== undefined) {
396
- assert(
397
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Using optional chaining here would change behavior: `revisions[0]?.rollbackOf === undefined` is true when revisions[0] is undefined, but this check requires revisions[0] to be defined. As currently written, such a change would be safe because context.revision is included in the check and from a couple lines above is confirmed not undefined. But this more verbose form is clearer.
398
- revisions.length === 1 &&
399
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
400
- revisions[0] !== undefined &&
401
- revisions[0].revision === context.revision &&
402
- revisions[0].rollbackOf === undefined,
403
- 0x964 /* A tagged change should only contain the tagged revision */,
404
- );
405
-
406
- return undefined;
407
- }
408
-
409
- const encodedRevisions = [];
410
- for (const revision of revisions) {
411
- const encodedRevision: Mutable<EncodedRevisionInfo> = {
412
- revision: revisionTagCodec.encode(revision.revision, context),
413
- };
414
-
415
- if (revision.rollbackOf !== undefined) {
416
- encodedRevision.rollbackOf = revisionTagCodec.encode(revision.rollbackOf, context);
417
- }
418
-
419
- encodedRevisions.push(encodedRevision);
420
- }
421
-
422
- return encodedRevisions;
423
- }
424
-
425
454
  export function decodeRevisionInfos(
426
455
  revisions: readonly EncodedRevisionInfo[] | undefined,
427
456
  context: ChangeEncodingContext,
@@ -452,16 +481,8 @@ export function decodeRevisionInfos(
452
481
  return decodedRevisions;
453
482
  }
454
483
 
455
- export function encodeChange(
456
- change: ModularChangeset,
457
- context: ChangeEncodingContext,
458
- fieldChangesetCodecs: Map<
459
- FieldKindIdentifier,
460
- {
461
- compiledSchema?: SchemaValidationFunction<TAnySchema>;
462
- codec: FieldCodec;
463
- }
464
- >,
484
+ export function makeModularChangeCodecV1(
485
+ fieldKinds: FieldKindConfiguration,
465
486
  revisionTagCodec: IJsonCodec<
466
487
  RevisionTag,
467
488
  EncodedRevisionTag,
@@ -469,51 +490,51 @@ export function encodeChange(
469
490
  ChangeEncodingContext
470
491
  >,
471
492
  fieldsCodec: FieldBatchCodec,
472
- chunkCompressionStrategy: TreeCompressionStrategy,
473
- ): EncodedModularChangesetV1 {
474
- // Destroys only exist in rollback changesets, which are never sent.
475
- assert(change.destroys === undefined, 0x899 /* Unexpected changeset with destroys */);
476
- return {
477
- maxId: change.maxId,
478
- revisions:
479
- change.revisions === undefined
480
- ? undefined
481
- : encodeRevisionInfos(change.revisions, context, revisionTagCodec),
482
- changes: encodeFieldChangesForJson(
483
- change.fieldChanges,
484
- context,
485
- change.nodeChanges,
486
- fieldChangesetCodecs,
487
- ),
488
- builds: encodeDetachedNodes(
489
- change.builds,
490
- context,
491
- revisionTagCodec,
492
- fieldsCodec,
493
- chunkCompressionStrategy,
494
- ),
495
- refreshers: encodeDetachedNodes(
496
- change.refreshers,
497
- context,
498
- revisionTagCodec,
499
- fieldsCodec,
500
- chunkCompressionStrategy,
501
- ),
502
- violations: change.constraintViolationCount,
503
- };
504
- }
505
-
506
- export function decodeChange(
507
- encodedChange: EncodedModularChangesetV1,
508
- context: ChangeEncodingContext,
493
+ codecOptions: ICodecOptions,
494
+ chunkCompressionStrategy: TreeCompressionStrategy = TreeCompressionStrategy.Compressed,
495
+ ): ModularChangeCodec {
496
+ const fieldChangesetCodecs = getFieldChangesetCodecs(
497
+ fieldKinds,
498
+ revisionTagCodec,
499
+ codecOptions,
500
+ );
501
+
502
+ const modularChangeCodec: ModularChangeCodec = {
503
+ encode: (change, context) =>
504
+ encodeChange(
505
+ change,
506
+ context,
507
+ fieldKinds,
508
+ fieldChangesetCodecs,
509
+ revisionTagCodec,
510
+ fieldsCodec,
511
+ chunkCompressionStrategy,
512
+ ),
513
+
514
+ decode: (encodedChange, context) =>
515
+ decodeChange(
516
+ encodedChange,
517
+ context,
518
+ fieldKinds,
519
+ fieldChangesetCodecs,
520
+ revisionTagCodec,
521
+ fieldsCodec,
522
+ chunkCompressionStrategy,
523
+ ),
524
+ };
525
+
526
+ return withSchemaValidation(
527
+ EncodedModularChangesetV1,
528
+ modularChangeCodec,
529
+ codecOptions.jsonValidator,
530
+ );
531
+ }
532
+
533
+ export function encodeChange(
534
+ change: ModularChangeset,
535
+ context: ChangeEncodingContext,
509
536
  fieldKinds: FieldKindConfiguration,
510
- fieldChangesetCodecs: Map<
511
- FieldKindIdentifier,
512
- {
513
- compiledSchema?: SchemaValidationFunction<TAnySchema>;
514
- codec: FieldCodec;
515
- }
516
- >,
537
+ fieldChangesetCodecs: FieldChangesetCodecs,
517
538
  revisionTagCodec: IJsonCodec<
518
539
  RevisionTag,
519
540
  EncodedRevisionTag,
@@ -522,113 +543,137 @@ export function decodeChange(
522
543
  >,
523
544
  fieldsCodec: FieldBatchCodec,
524
545
  chunkCompressionStrategy: TreeCompressionStrategy,
525
- ): Mutable<ModularChangeset> {
526
- const decoded: Mutable<ModularChangeset> = {
527
- fieldChanges: new Map(),
528
- nodeChanges: newChangeAtomIdBTree(),
529
- nodeToParent: newChangeAtomIdBTree(),
530
- nodeAliases: newChangeAtomIdBTree(),
531
- crossFieldKeys: newCrossFieldKeyTable(),
546
+ ): EncodedModularChangesetV1 {
547
+ const fieldToRoots = getFieldToRoots(change.rootNodes, change.nodeAliases);
548
+ const isAttachId = (id: ChangeAtomId, count: number): RangeQueryResult<boolean> => {
549
+ const attachEntry = getFirstAttachField(change.crossFieldKeys, id, count);
550
+ return { ...attachEntry, value: attachEntry.value !== undefined };
532
551
  };
533
552
 
534
- decoded.fieldChanges = decodeFieldChangesFromJson(
535
- encodedChange.changes,
536
- undefined,
537
- decoded,
538
- context,
539
- idAllocatorFromMaxId(encodedChange.maxId),
540
- fieldKinds,
541
- fieldChangesetCodecs,
542
- );
553
+ const isDetachId = (
554
+ id: ChangeAtomId,
555
+ count: number,
556
+ ): RangeQueryEntry<ChangeAtomId, boolean> => {
557
+ const detachEntry = getFirstDetachField(change.crossFieldKeys, id, count);
558
+ const renameEntry = change.rootNodes.oldToNewId.getFirst(id, detachEntry.length);
559
+ const isDetach = (detachEntry.value ?? renameEntry.value) !== undefined;
560
+ return { start: id, value: isDetach, length: renameEntry.length };
561
+ };
543
562
 
544
- if (encodedChange.builds !== undefined) {
545
- decoded.builds = decodeDetachedNodes(
546
- encodedChange.builds,
563
+ const moveIdToCellId = getMoveIdToCellId(change, fieldKinds, fieldToRoots);
564
+ const getCellIdForMove = (
565
+ id: ChangeAtomId,
566
+ count: number,
567
+ ): RangeQueryResult<ChangeAtomId | undefined> => moveIdToCellId.getFirst(id, count);
568
+
569
+ const getInputRootId = (
570
+ id: ChangeAtomId,
571
+ count: number,
572
+ ): RangeQueryResult<ChangeAtomId | undefined> => {
573
+ return change.rootNodes.newToOldId.getFirst(id, count);
574
+ };
575
+
576
+ const encodeNode = (nodeId: NodeId): EncodedNodeChangeset => {
577
+ // TODO: Handle node aliasing.
578
+ const node = change.nodeChanges.get([nodeId.revision, nodeId.localId]);
579
+ assert(node !== undefined, 0x92e /* Unknown node ID */);
580
+ return encodeNodeChangesForJson(
581
+ node,
582
+ nodeId,
583
+ fieldToRoots,
584
+ context,
585
+ encodeNode,
586
+ getInputRootId,
587
+ isAttachId,
588
+ isDetachId,
589
+ getCellIdForMove,
590
+ fieldChangesetCodecs,
591
+ );
592
+ };
593
+
594
+ // Destroys only exist in rollback changesets, which are never sent.
595
+ assert(change.destroys === undefined, 0x899 /* Unexpected changeset with destroys */);
596
+ const encoded: EncodedModularChangesetV1 = {
597
+ maxId: change.maxId,
598
+ revisions:
599
+ change.revisions === undefined
600
+ ? undefined
601
+ : encodeRevisionInfos(change.revisions, context, revisionTagCodec),
602
+ changes: encodeFieldChangesForJson(
603
+ change.fieldChanges,
604
+ undefined,
605
+ fieldToRoots,
606
+ context,
607
+ encodeNode,
608
+ getInputRootId,
609
+ isAttachId,
610
+ isDetachId,
611
+ getCellIdForMove,
612
+ fieldChangesetCodecs,
613
+ ),
614
+ builds: encodeDetachedNodes(
615
+ change.builds,
547
616
  context,
548
617
  revisionTagCodec,
549
618
  fieldsCodec,
550
619
  chunkCompressionStrategy,
551
- );
552
- }
553
- if (encodedChange.refreshers !== undefined) {
554
- decoded.refreshers = decodeDetachedNodes(
555
- encodedChange.refreshers,
620
+ ),
621
+ refreshers: encodeDetachedNodes(
622
+ change.refreshers,
556
623
  context,
557
624
  revisionTagCodec,
558
625
  fieldsCodec,
559
626
  chunkCompressionStrategy,
560
- );
561
- }
562
-
563
- if (encodedChange.violations !== undefined) {
564
- decoded.constraintViolationCount = encodedChange.violations;
565
- }
627
+ ),
628
+ violations: change.constraintViolationCount,
629
+ };
566
630
 
567
- const decodedRevInfos = decodeRevisionInfos(
568
- encodedChange.revisions,
569
- context,
570
- revisionTagCodec,
571
- );
572
- if (decodedRevInfos !== undefined) {
573
- decoded.revisions = decodedRevInfos;
574
- }
575
- if (encodedChange.maxId !== undefined) {
576
- decoded.maxId = encodedChange.maxId;
577
- }
578
- return decoded;
631
+ return encoded;
579
632
  }
580
633
 
581
- export function getFieldChangesetCodecs(
582
- fieldKinds: FieldKindConfiguration,
634
+ export function encodeRevisionInfos(
635
+ revisions: readonly RevisionInfo[],
636
+ context: ChangeEncodingContext,
583
637
  revisionTagCodec: IJsonCodec<
584
638
  RevisionTag,
585
639
  EncodedRevisionTag,
586
640
  EncodedRevisionTag,
587
641
  ChangeEncodingContext
588
642
  >,
589
- codecOptions: ICodecOptions,
590
- ): Map<
591
- FieldKindIdentifier,
592
- { compiledSchema?: SchemaValidationFunction<TAnySchema>; codec: FieldCodec }
593
- > {
594
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
595
- const getMapEntry = ({ kind, formatVersion }: FieldKindConfigurationEntry) => {
596
- const codec = kind.changeHandler.codecsFactory(revisionTagCodec).resolve(formatVersion);
597
- return {
598
- codec,
599
- compiledSchema: codec.encodedSchema
600
- ? extractJsonValidator(codecOptions.jsonValidator).compile(codec.encodedSchema)
601
- : undefined,
643
+ ): EncodedRevisionInfo[] | undefined {
644
+ if (context.revision !== undefined) {
645
+ assert(
646
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Using optional chaining here would change behavior: `revisions[0]?.rollbackOf === undefined` is true when revisions[0] is undefined, but this check requires revisions[0] to be defined. As currently written, such a change would be safe because context.revision is included in the check and from a couple lines above is confirmed not undefined. But this more verbose form is clearer.
647
+ revisions.length === 1 &&
648
+ // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
649
+ revisions[0] !== undefined &&
650
+ revisions[0].revision === context.revision &&
651
+ revisions[0].rollbackOf === undefined,
652
+ 0x964 /* A tagged change should only contain the tagged revision */,
653
+ );
654
+
655
+ return undefined;
656
+ }
657
+
658
+ const encodedRevisions = [];
659
+ for (const revision of revisions) {
660
+ const encodedRevision: Mutable<EncodedRevisionInfo> = {
661
+ revision: revisionTagCodec.encode(revision.revision, context),
602
662
  };
603
- };
604
663
 
605
- /**
606
- * The codec version for the generic field kind.
607
- */
608
- const genericFieldKindFormatVersion = 1;
609
- const fieldChangesetCodecs: Map<
610
- FieldKindIdentifier,
611
- {
612
- compiledSchema?: SchemaValidationFunction<TAnySchema>;
613
- codec: FieldCodec;
664
+ if (revision.rollbackOf !== undefined) {
665
+ encodedRevision.rollbackOf = revisionTagCodec.encode(revision.rollbackOf, context);
614
666
  }
615
- > = new Map([
616
- [
617
- genericFieldKind.identifier,
618
- getMapEntry({ kind: genericFieldKind, formatVersion: genericFieldKindFormatVersion }),
619
- ],
620
- ]);
621
667
 
622
- // eslint-disable-next-line unicorn/no-array-for-each -- Map.forEach with (value, key) signature; codec initialization
623
- fieldKinds.forEach((entry, identifier) => {
624
- fieldChangesetCodecs.set(identifier, getMapEntry(entry));
625
- });
668
+ encodedRevisions.push(encodedRevision);
669
+ }
626
670
 
627
- return fieldChangesetCodecs;
671
+ return encodedRevisions;
628
672
  }
629
673
 
630
- export function makeModularChangeCodecV1(
631
- fieldKinds: FieldKindConfiguration,
674
+ export function encodeDetachedNodes(
675
+ detachedNodes: ChangeAtomIdBTree<TreeChunk> | undefined,
676
+ context: ChangeEncodingContext,
632
677
  revisionTagCodec: IJsonCodec<
633
678
  RevisionTag,
634
679
  EncodedRevisionTag,
@@ -636,42 +681,51 @@ export function makeModularChangeCodecV1(
636
681
  ChangeEncodingContext
637
682
  >,
638
683
  fieldsCodec: FieldBatchCodec,
639
- codecOptions: ICodecOptions,
640
- chunkCompressionStrategy: TreeCompressionStrategy = TreeCompressionStrategy.Compressed,
641
- ): ModularChangeCodec {
642
- const fieldChangesetCodecs = getFieldChangesetCodecs(
643
- fieldKinds,
644
- revisionTagCodec,
645
- codecOptions,
646
- );
684
+ chunkCompressionStrategy: TreeCompressionStrategy,
685
+ ): EncodedBuilds | undefined {
686
+ if (detachedNodes === undefined) {
687
+ return undefined;
688
+ }
647
689
 
648
- const modularChangeCodec: ModularChangeCodec = {
649
- encode: (change, context) =>
650
- encodeChange(
651
- change,
652
- context,
653
- fieldChangesetCodecs,
654
- revisionTagCodec,
655
- fieldsCodec,
656
- chunkCompressionStrategy,
657
- ),
658
- decode: (encodedChange, context) =>
659
- decodeChange(
660
- encodedChange,
661
- context,
662
- fieldKinds,
663
- fieldChangesetCodecs,
664
- revisionTagCodec,
665
- fieldsCodec,
666
- chunkCompressionStrategy,
667
- ),
668
- };
690
+ const treesToEncode: ITreeCursorSynchronous[] = [];
691
+ const buildsArray: EncodedBuildsArray = [];
669
692
 
670
- return withSchemaValidation(
671
- EncodedModularChangesetV1,
672
- modularChangeCodec,
673
- codecOptions.jsonValidator,
674
- );
693
+ let buildsForRevision:
694
+ | [[ChangesetLocalId, number][], EncodedRevisionTag]
695
+ | [[ChangesetLocalId, number][]]
696
+ | undefined;
697
+
698
+ for (const [[revision, id], chunk] of detachedNodes.entries()) {
699
+ const encodedRevision = encodeRevisionOpt(revisionTagCodec, revision, context);
700
+
701
+ if (buildsForRevision === undefined || buildsForRevision[1] !== encodedRevision) {
702
+ if (buildsForRevision !== undefined) {
703
+ buildsArray.push(buildsForRevision);
704
+ }
705
+
706
+ buildsForRevision = encodedRevision === undefined ? [[]] : [[], encodedRevision];
707
+ }
708
+
709
+ treesToEncode.push(chunk.cursor());
710
+ const treeIndexInBatch = treesToEncode.length - 1;
711
+ buildsForRevision?.[0].push([id, treeIndexInBatch]);
712
+ }
713
+
714
+ if (buildsForRevision !== undefined) {
715
+ buildsArray.push(buildsForRevision);
716
+ }
717
+
718
+ return buildsArray.length === 0
719
+ ? undefined
720
+ : {
721
+ builds: buildsArray,
722
+ trees: fieldsCodec.encode(treesToEncode, {
723
+ encodeType: chunkCompressionStrategy,
724
+ schema: context.schema,
725
+ originatorId: context.originatorId,
726
+ idCompressor: context.idCompressor,
727
+ }),
728
+ };
675
729
  }
676
730
 
677
731
  function getChangeHandler(
@@ -703,3 +757,224 @@ function encodeRevisionOpt(
703
757
 
704
758
  return revision === context.revision ? undefined : revisionCodec.encode(revision, context);
705
759
  }
760
+
761
+ function getFieldToRoots(
762
+ rootTable: RootNodeTable,
763
+ aliases: ChangeAtomIdBTree<NodeId>,
764
+ ): FieldRootMap {
765
+ const fieldToRoots: FieldRootMap = newFieldIdKeyBTree();
766
+ for (const [[revision, localId], nodeId] of rootTable.nodeChanges.entries()) {
767
+ const detachId: ChangeAtomId = { revision, localId };
768
+ const fieldId = rootTable.detachLocations.getFirst(detachId, 1).value;
769
+ if (fieldId === undefined) {
770
+ fail("Untracked root change");
771
+ } else {
772
+ setInChangeAtomIdMap(
773
+ getOrAddInFieldRootMap(fieldToRoots, normalizeFieldId(fieldId, aliases)).nodeChanges,
774
+ detachId,
775
+ nodeId,
776
+ );
777
+ }
778
+ }
779
+
780
+ for (const entry of rootTable.oldToNewId.entries()) {
781
+ const fieldId = rootTable.detachLocations.getFirst(entry.start, 1).value;
782
+ if (fieldId === undefined) {
783
+ fail("Untracked root change");
784
+ } else {
785
+ getOrAddInFieldRootMap(fieldToRoots, normalizeFieldId(fieldId, aliases)).renames.set(
786
+ entry.start,
787
+ entry.length,
788
+ entry.value,
789
+ );
790
+ }
791
+ }
792
+
793
+ return fieldToRoots;
794
+ }
795
+
796
+ function getOrAddInFieldRootMap(map: FieldRootMap, fieldId: FieldId): FieldRootChanges {
797
+ const key: FieldIdKey = [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];
798
+ const rootChanges = map.get(key);
799
+ if (rootChanges !== undefined) {
800
+ return rootChanges;
801
+ }
802
+
803
+ const newRootChanges: FieldRootChanges = {
804
+ nodeChanges: newChangeAtomIdBTree(),
805
+ renames: newChangeAtomIdTransform(),
806
+ };
807
+ map.set(key, newRootChanges);
808
+ return newRootChanges;
809
+ }
810
+
811
+ export function getMoveIdToCellId(
812
+ change: ModularChangeset,
813
+ fieldKinds: FieldKindConfiguration,
814
+ fieldToRoot: FieldRootMap,
815
+ ): ChangeAtomIdRangeMap<ChangeAtomId> {
816
+ const map = newChangeAtomIdTransform();
817
+ getMoveIdToCellIdsForFieldChanges(
818
+ change.fieldChanges,
819
+ undefined,
820
+ fieldKinds,
821
+ fieldToRoot,
822
+ map,
823
+ );
824
+ for (const [nodeId, nodeChange] of change.nodeChanges.entries()) {
825
+ if (nodeChange.fieldChanges !== undefined) {
826
+ getMoveIdToCellIdsForFieldChanges(
827
+ nodeChange.fieldChanges,
828
+ { revision: nodeId[0], localId: nodeId[1] },
829
+ fieldKinds,
830
+ fieldToRoot,
831
+ map,
832
+ );
833
+ }
834
+ }
835
+ return map;
836
+ }
837
+
838
+ function getMoveIdToCellIdsForFieldChanges(
839
+ changes: FieldChangeMap,
840
+ nodeId: NodeId | undefined,
841
+ fieldKinds: FieldKindConfiguration,
842
+ fieldToRoots: FieldRootMap,
843
+ moveIdToCellId: ChangeAtomIdRangeMap<ChangeAtomId>,
844
+ ): void {
845
+ for (const [fieldKey, field] of changes.entries()) {
846
+ for (const entry of getChangeHandler(fieldKinds, field.fieldKind).getDetachCellIds(
847
+ field.change,
848
+ fieldToRoots.get([nodeId?.revision, nodeId?.localId, fieldKey])?.renames ??
849
+ newChangeAtomIdTransform(),
850
+ )) {
851
+ moveIdToCellId.set(entry.detachId, entry.count, entry.cellId);
852
+ }
853
+ }
854
+ }
855
+
856
+ export function decodeChange(
857
+ encodedChange: EncodedModularChangesetV1,
858
+ context: ChangeEncodingContext,
859
+ fieldKinds: FieldKindConfiguration,
860
+ fieldChangesetCodecs: Map<
861
+ FieldKindIdentifier,
862
+ {
863
+ compiledSchema?: SchemaValidationFunction<TAnySchema>;
864
+ codec: FieldCodec;
865
+ }
866
+ >,
867
+ revisionTagCodec: IJsonCodec<
868
+ RevisionTag,
869
+ EncodedRevisionTag,
870
+ EncodedRevisionTag,
871
+ ChangeEncodingContext
872
+ >,
873
+ fieldsCodec: FieldBatchCodec,
874
+ chunkCompressionStrategy: TreeCompressionStrategy,
875
+ ): Mutable<ModularChangeset> {
876
+ const idAllocator = idAllocatorFromMaxId(encodedChange.maxId);
877
+ const nodeChanges: ChangeAtomIdBTree<NodeChangeset> = newChangeAtomIdBTree();
878
+ const nodeToParent: ChangeAtomIdBTree<NodeLocation> = newChangeAtomIdBTree();
879
+ const crossFieldKeys: CrossFieldKeyTable = newCrossFieldRangeTable();
880
+ const rootNodes = newRootTable();
881
+
882
+ const decodeNode: NodeDecoder = (
883
+ encodedNode: EncodedNodeChangeset,
884
+ fieldId: NodeLocation,
885
+ ): NodeId => {
886
+ const nodeId: NodeId = {
887
+ revision: context.revision,
888
+ localId: brand(idAllocator.allocate()),
889
+ };
890
+
891
+ const node = decodeNodeChangesetFromJson(
892
+ encodedNode,
893
+ nodeId,
894
+ crossFieldKeys,
895
+ rootNodes,
896
+ context,
897
+ decodeNode,
898
+ idAllocator,
899
+ fieldKinds,
900
+ fieldChangesetCodecs,
901
+ );
902
+
903
+ nodeChanges.set([nodeId.revision, nodeId.localId], node);
904
+
905
+ if (fieldId !== undefined) {
906
+ nodeToParent.set([nodeId.revision, nodeId.localId], fieldId);
907
+ }
908
+
909
+ return nodeId;
910
+ };
911
+
912
+ const decoded: Mutable<ModularChangeset> = {
913
+ rebaseVersion: 1,
914
+ fieldChanges: decodeFieldChangesFromJson(
915
+ encodedChange.changes,
916
+ undefined,
917
+ crossFieldKeys,
918
+ rootNodes,
919
+ context,
920
+ decodeNode,
921
+ idAllocator,
922
+ fieldKinds,
923
+ fieldChangesetCodecs,
924
+ ),
925
+ nodeChanges,
926
+ rootNodes,
927
+ nodeToParent,
928
+ nodeAliases: newChangeAtomIdBTree(),
929
+ crossFieldKeys,
930
+ };
931
+
932
+ if (encodedChange.builds !== undefined) {
933
+ decoded.builds = decodeDetachedNodes(
934
+ encodedChange.builds,
935
+ context,
936
+ revisionTagCodec,
937
+ fieldsCodec,
938
+ chunkCompressionStrategy,
939
+ );
940
+ }
941
+ if (encodedChange.refreshers !== undefined) {
942
+ decoded.refreshers = decodeDetachedNodes(
943
+ encodedChange.refreshers,
944
+ context,
945
+ revisionTagCodec,
946
+ fieldsCodec,
947
+ chunkCompressionStrategy,
948
+ );
949
+ }
950
+
951
+ if (encodedChange.violations !== undefined) {
952
+ decoded.constraintViolationCount = encodedChange.violations;
953
+ }
954
+
955
+ const decodedRevInfos = decodeRevisionInfos(
956
+ encodedChange.revisions,
957
+ context,
958
+ revisionTagCodec,
959
+ );
960
+ if (decodedRevInfos !== undefined) {
961
+ decoded.revisions = decodedRevInfos;
962
+ }
963
+ if (encodedChange.maxId !== undefined) {
964
+ decoded.maxId = encodedChange.maxId;
965
+ }
966
+
967
+ // XXX: This is an expensive assert which should be removed before merging.
968
+ validateChangeset(decoded, fieldKindsFromConfiguration(fieldKinds));
969
+ return decoded;
970
+ }
971
+
972
+ function fieldKindsFromConfiguration(
973
+ configuration: FieldKindConfiguration,
974
+ ): ReadonlyMap<FieldKindIdentifier, FlexFieldKind> {
975
+ const map = new Map();
976
+ for (const [id, entry] of configuration.entries()) {
977
+ map.set(id, entry.kind);
978
+ }
979
+ return map;
980
+ }