@fluidframework/tree 2.4.0-297027 → 2.4.0-299374

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 (559) hide show
  1. package/.dependency-cruiser-known-violations.json +0 -14
  2. package/.vscode/settings.json +9 -1
  3. package/api-report/tree.alpha.api.md +178 -21
  4. package/api-report/tree.beta.api.md +46 -21
  5. package/api-report/tree.legacy.alpha.api.md +46 -21
  6. package/api-report/tree.legacy.public.api.md +46 -21
  7. package/api-report/tree.public.api.md +46 -21
  8. package/dist/alpha.d.ts +29 -1
  9. package/dist/beta.d.ts +2 -0
  10. package/dist/codec/codec.d.ts +4 -4
  11. package/dist/codec/codec.js.map +1 -1
  12. package/dist/codec/noopValidator.d.ts +1 -1
  13. package/dist/codec/noopValidator.js +1 -1
  14. package/dist/codec/noopValidator.js.map +1 -1
  15. package/dist/core/change-family/changeFamily.d.ts +2 -2
  16. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  17. package/dist/core/change-family/changeFamily.js.map +1 -1
  18. package/dist/core/change-family/editBuilder.d.ts +3 -2
  19. package/dist/core/change-family/editBuilder.d.ts.map +1 -1
  20. package/dist/core/change-family/editBuilder.js.map +1 -1
  21. package/dist/core/rebase/changeRebaser.d.ts +2 -1
  22. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  23. package/dist/core/rebase/changeRebaser.js.map +1 -1
  24. package/dist/core/rebase/utils.js +1 -1
  25. package/dist/core/rebase/utils.js.map +1 -1
  26. package/dist/core/tree/anchorSet.d.ts +159 -2
  27. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  28. package/dist/core/tree/anchorSet.js +54 -12
  29. package/dist/core/tree/anchorSet.js.map +1 -1
  30. package/dist/external-utilities/typeboxValidator.d.ts +1 -1
  31. package/dist/external-utilities/typeboxValidator.js +1 -1
  32. package/dist/external-utilities/typeboxValidator.js.map +1 -1
  33. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +4 -3
  34. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  35. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +41 -30
  36. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  37. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -6
  38. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  39. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  40. package/dist/feature-libraries/flex-tree/lazyField.d.ts +4 -0
  41. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  42. package/dist/feature-libraries/flex-tree/lazyField.js +38 -6
  43. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  44. package/dist/feature-libraries/index.d.ts +0 -1
  45. package/dist/feature-libraries/index.d.ts.map +1 -1
  46. package/dist/feature-libraries/index.js +46 -49
  47. package/dist/feature-libraries/index.js.map +1 -1
  48. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  49. package/dist/feature-libraries/mitigatedChangeFamily.js +4 -4
  50. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  51. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +1 -1
  52. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  53. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  54. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +12 -8
  55. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  56. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +179 -60
  57. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  58. package/dist/feature-libraries/optional-field/optionalField.d.ts +10 -9
  59. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  60. package/dist/feature-libraries/optional-field/optionalField.js +9 -7
  61. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  62. package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts +3 -10
  63. package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
  64. package/dist/feature-libraries/schema-index/schemaSummarizer.js +1 -8
  65. package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  66. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  67. package/dist/feature-libraries/sequence-field/compose.js +32 -20
  68. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  69. package/dist/feature-libraries/sequence-field/invert.d.ts +6 -1
  70. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  71. package/dist/feature-libraries/sequence-field/invert.js +25 -9
  72. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  73. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +17 -16
  74. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  75. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +19 -11
  76. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  77. package/dist/feature-libraries/treeCompressionUtils.d.ts +1 -1
  78. package/dist/feature-libraries/treeCompressionUtils.js +1 -1
  79. package/dist/feature-libraries/treeCompressionUtils.js.map +1 -1
  80. package/dist/index.d.ts +6 -5
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +4 -2
  83. package/dist/index.js.map +1 -1
  84. package/dist/internalTypes.d.ts +2 -2
  85. package/dist/internalTypes.d.ts.map +1 -1
  86. package/dist/internalTypes.js.map +1 -1
  87. package/dist/legacy.d.ts +2 -0
  88. package/dist/packageVersion.d.ts +1 -1
  89. package/dist/packageVersion.js +1 -1
  90. package/dist/packageVersion.js.map +1 -1
  91. package/dist/public.d.ts +2 -0
  92. package/dist/shared-tree/index.d.ts +2 -1
  93. package/dist/shared-tree/index.d.ts.map +1 -1
  94. package/dist/shared-tree/index.js +5 -1
  95. package/dist/shared-tree/index.js.map +1 -1
  96. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  97. package/dist/shared-tree/schematizingTreeView.js +1 -14
  98. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  99. package/dist/shared-tree/sharedTree.d.ts +24 -9
  100. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  101. package/dist/shared-tree/sharedTree.js +21 -9
  102. package/dist/shared-tree/sharedTree.js.map +1 -1
  103. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +2 -2
  104. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  105. package/dist/shared-tree/sharedTreeChangeFamily.js +4 -4
  106. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  107. package/dist/shared-tree/sharedTreeEditBuilder.d.ts +2 -2
  108. package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  109. package/dist/shared-tree/sharedTreeEditBuilder.js +15 -11
  110. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  111. package/dist/shared-tree/treeApi.d.ts +6 -6
  112. package/dist/shared-tree/treeApi.d.ts.map +1 -1
  113. package/dist/shared-tree/treeApi.js.map +1 -1
  114. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  115. package/dist/shared-tree/treeCheckout.js +4 -3
  116. package/dist/shared-tree/treeCheckout.js.map +1 -1
  117. package/dist/shared-tree-core/branch.d.ts +2 -3
  118. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  119. package/dist/shared-tree-core/branch.js +10 -11
  120. package/dist/shared-tree-core/branch.js.map +1 -1
  121. package/dist/shared-tree-core/defaultResubmitMachine.d.ts +5 -5
  122. package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  123. package/dist/shared-tree-core/defaultResubmitMachine.js +4 -4
  124. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  125. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  126. package/dist/shared-tree-core/editManager.js +1 -1
  127. package/dist/shared-tree-core/editManager.js.map +1 -1
  128. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  129. package/dist/shared-tree-core/sharedTreeCore.js +2 -2
  130. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  131. package/dist/simple-tree/api/conciseTree.d.ts +29 -0
  132. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -0
  133. package/dist/simple-tree/api/conciseTree.js +25 -0
  134. package/dist/simple-tree/api/conciseTree.js.map +1 -0
  135. package/dist/simple-tree/api/customTree.d.ts +44 -0
  136. package/dist/simple-tree/api/customTree.d.ts.map +1 -0
  137. package/dist/simple-tree/api/customTree.js +63 -0
  138. package/dist/simple-tree/api/customTree.js.map +1 -0
  139. package/dist/simple-tree/api/index.d.ts +7 -2
  140. package/dist/simple-tree/api/index.d.ts.map +1 -1
  141. package/dist/simple-tree/api/index.js +5 -1
  142. package/dist/simple-tree/api/index.js.map +1 -1
  143. package/dist/simple-tree/api/schemaCreationUtilities.d.ts +41 -26
  144. package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  145. package/dist/simple-tree/api/schemaCreationUtilities.js +43 -15
  146. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  147. package/dist/simple-tree/api/schemaFactory.d.ts +1 -2
  148. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  149. package/dist/simple-tree/api/schemaFactory.js +8 -8
  150. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  151. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -2
  152. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  153. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  154. package/dist/simple-tree/api/storedSchema.d.ts +78 -0
  155. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -0
  156. package/dist/simple-tree/api/storedSchema.js +107 -0
  157. package/dist/simple-tree/api/storedSchema.js.map +1 -0
  158. package/dist/simple-tree/api/testRecursiveDomain.d.ts +10 -10
  159. package/dist/simple-tree/api/tree.d.ts +12 -3
  160. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  161. package/dist/simple-tree/api/tree.js.map +1 -1
  162. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  163. package/dist/simple-tree/api/treeNodeApi.js +5 -5
  164. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  165. package/dist/simple-tree/{typesUnsafe.d.ts → api/typesUnsafe.d.ts} +58 -10
  166. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -0
  167. package/dist/simple-tree/api/typesUnsafe.js.map +1 -0
  168. package/dist/simple-tree/api/verboseTree.d.ts +6 -20
  169. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  170. package/dist/simple-tree/api/verboseTree.js +10 -48
  171. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  172. package/dist/simple-tree/arrayNode.d.ts +14 -3
  173. package/dist/simple-tree/arrayNode.d.ts.map +1 -1
  174. package/dist/simple-tree/arrayNode.js +1 -2
  175. package/dist/simple-tree/arrayNode.js.map +1 -1
  176. package/dist/simple-tree/core/index.d.ts +1 -1
  177. package/dist/simple-tree/core/index.d.ts.map +1 -1
  178. package/dist/simple-tree/core/index.js +2 -1
  179. package/dist/simple-tree/core/index.js.map +1 -1
  180. package/dist/simple-tree/core/treeNodeKernel.d.ts +9 -0
  181. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  182. package/dist/simple-tree/core/treeNodeKernel.js +14 -1
  183. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  184. package/dist/simple-tree/core/treeNodeSchema.d.ts +6 -5
  185. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  186. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  187. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  188. package/dist/simple-tree/core/unhydratedFlexTree.js +3 -1
  189. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  190. package/dist/simple-tree/core/withType.d.ts +3 -1
  191. package/dist/simple-tree/core/withType.d.ts.map +1 -1
  192. package/dist/simple-tree/core/withType.js.map +1 -1
  193. package/dist/simple-tree/flexList.d.ts.map +1 -0
  194. package/dist/simple-tree/flexList.js.map +1 -0
  195. package/dist/simple-tree/index.d.ts +6 -7
  196. package/dist/simple-tree/index.d.ts.map +1 -1
  197. package/dist/simple-tree/index.js +5 -3
  198. package/dist/simple-tree/index.js.map +1 -1
  199. package/dist/simple-tree/mapNode.d.ts.map +1 -1
  200. package/dist/simple-tree/mapNode.js +2 -3
  201. package/dist/simple-tree/mapNode.js.map +1 -1
  202. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  203. package/dist/simple-tree/objectNode.js +3 -4
  204. package/dist/simple-tree/objectNode.js.map +1 -1
  205. package/dist/simple-tree/schemaTypes.d.ts +60 -7
  206. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  207. package/dist/simple-tree/schemaTypes.js +11 -6
  208. package/dist/simple-tree/schemaTypes.js.map +1 -1
  209. package/dist/simple-tree/toFlexSchema.d.ts.map +1 -1
  210. package/dist/simple-tree/toFlexSchema.js +13 -15
  211. package/dist/simple-tree/toFlexSchema.js.map +1 -1
  212. package/dist/simple-tree/toMapTree.d.ts +4 -2
  213. package/dist/simple-tree/toMapTree.d.ts.map +1 -1
  214. package/dist/simple-tree/toMapTree.js +3 -3
  215. package/dist/simple-tree/toMapTree.js.map +1 -1
  216. package/dist/simple-tree/treeNodeValid.d.ts.map +1 -1
  217. package/dist/simple-tree/treeNodeValid.js +2 -1
  218. package/dist/simple-tree/treeNodeValid.js.map +1 -1
  219. package/dist/treeFactory.d.ts +1 -0
  220. package/dist/treeFactory.d.ts.map +1 -1
  221. package/dist/treeFactory.js +1 -0
  222. package/dist/treeFactory.js.map +1 -1
  223. package/dist/util/utils.d.ts +10 -8
  224. package/dist/util/utils.d.ts.map +1 -1
  225. package/dist/util/utils.js.map +1 -1
  226. package/docs/main/detached-trees.md +8 -8
  227. package/lib/alpha.d.ts +29 -1
  228. package/lib/beta.d.ts +2 -0
  229. package/lib/codec/codec.d.ts +4 -4
  230. package/lib/codec/codec.js.map +1 -1
  231. package/lib/codec/noopValidator.d.ts +1 -1
  232. package/lib/codec/noopValidator.js +1 -1
  233. package/lib/codec/noopValidator.js.map +1 -1
  234. package/lib/core/change-family/changeFamily.d.ts +2 -2
  235. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  236. package/lib/core/change-family/changeFamily.js.map +1 -1
  237. package/lib/core/change-family/editBuilder.d.ts +3 -2
  238. package/lib/core/change-family/editBuilder.d.ts.map +1 -1
  239. package/lib/core/change-family/editBuilder.js.map +1 -1
  240. package/lib/core/rebase/changeRebaser.d.ts +2 -1
  241. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  242. package/lib/core/rebase/changeRebaser.js.map +1 -1
  243. package/lib/core/rebase/utils.js +1 -1
  244. package/lib/core/rebase/utils.js.map +1 -1
  245. package/lib/core/tree/anchorSet.d.ts +159 -2
  246. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  247. package/lib/core/tree/anchorSet.js +54 -12
  248. package/lib/core/tree/anchorSet.js.map +1 -1
  249. package/lib/external-utilities/typeboxValidator.d.ts +1 -1
  250. package/lib/external-utilities/typeboxValidator.js +1 -1
  251. package/lib/external-utilities/typeboxValidator.js.map +1 -1
  252. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +4 -3
  253. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  254. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +41 -30
  255. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  256. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -6
  257. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  258. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  259. package/lib/feature-libraries/flex-tree/lazyField.d.ts +4 -0
  260. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  261. package/lib/feature-libraries/flex-tree/lazyField.js +36 -5
  262. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  263. package/lib/feature-libraries/index.d.ts +0 -1
  264. package/lib/feature-libraries/index.d.ts.map +1 -1
  265. package/lib/feature-libraries/index.js +0 -1
  266. package/lib/feature-libraries/index.js.map +1 -1
  267. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  268. package/lib/feature-libraries/mitigatedChangeFamily.js +4 -4
  269. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  270. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +1 -1
  271. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  272. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  273. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +12 -8
  274. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  275. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +180 -61
  276. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  277. package/lib/feature-libraries/optional-field/optionalField.d.ts +10 -9
  278. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  279. package/lib/feature-libraries/optional-field/optionalField.js +9 -7
  280. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  281. package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts +3 -10
  282. package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
  283. package/lib/feature-libraries/schema-index/schemaSummarizer.js +1 -8
  284. package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  285. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  286. package/lib/feature-libraries/sequence-field/compose.js +32 -20
  287. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  288. package/lib/feature-libraries/sequence-field/invert.d.ts +6 -1
  289. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  290. package/lib/feature-libraries/sequence-field/invert.js +25 -9
  291. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  292. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +17 -16
  293. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  294. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +19 -11
  295. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  296. package/lib/feature-libraries/treeCompressionUtils.d.ts +1 -1
  297. package/lib/feature-libraries/treeCompressionUtils.js +1 -1
  298. package/lib/feature-libraries/treeCompressionUtils.js.map +1 -1
  299. package/lib/index.d.ts +6 -5
  300. package/lib/index.d.ts.map +1 -1
  301. package/lib/index.js +3 -3
  302. package/lib/index.js.map +1 -1
  303. package/lib/internalTypes.d.ts +2 -2
  304. package/lib/internalTypes.d.ts.map +1 -1
  305. package/lib/internalTypes.js.map +1 -1
  306. package/lib/legacy.d.ts +2 -0
  307. package/lib/packageVersion.d.ts +1 -1
  308. package/lib/packageVersion.js +1 -1
  309. package/lib/packageVersion.js.map +1 -1
  310. package/lib/public.d.ts +2 -0
  311. package/lib/shared-tree/index.d.ts +2 -1
  312. package/lib/shared-tree/index.d.ts.map +1 -1
  313. package/lib/shared-tree/index.js +2 -1
  314. package/lib/shared-tree/index.js.map +1 -1
  315. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  316. package/lib/shared-tree/schematizingTreeView.js +2 -15
  317. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  318. package/lib/shared-tree/sharedTree.d.ts +24 -9
  319. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  320. package/lib/shared-tree/sharedTree.js +20 -9
  321. package/lib/shared-tree/sharedTree.js.map +1 -1
  322. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +2 -2
  323. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  324. package/lib/shared-tree/sharedTreeChangeFamily.js +4 -4
  325. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  326. package/lib/shared-tree/sharedTreeEditBuilder.d.ts +2 -2
  327. package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  328. package/lib/shared-tree/sharedTreeEditBuilder.js +15 -11
  329. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  330. package/lib/shared-tree/treeApi.d.ts +6 -6
  331. package/lib/shared-tree/treeApi.d.ts.map +1 -1
  332. package/lib/shared-tree/treeApi.js.map +1 -1
  333. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  334. package/lib/shared-tree/treeCheckout.js +5 -4
  335. package/lib/shared-tree/treeCheckout.js.map +1 -1
  336. package/lib/shared-tree-core/branch.d.ts +2 -3
  337. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  338. package/lib/shared-tree-core/branch.js +11 -12
  339. package/lib/shared-tree-core/branch.js.map +1 -1
  340. package/lib/shared-tree-core/defaultResubmitMachine.d.ts +5 -5
  341. package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  342. package/lib/shared-tree-core/defaultResubmitMachine.js +4 -4
  343. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  344. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  345. package/lib/shared-tree-core/editManager.js +2 -2
  346. package/lib/shared-tree-core/editManager.js.map +1 -1
  347. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  348. package/lib/shared-tree-core/sharedTreeCore.js +2 -2
  349. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  350. package/lib/simple-tree/api/conciseTree.d.ts +29 -0
  351. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -0
  352. package/lib/simple-tree/api/conciseTree.js +21 -0
  353. package/lib/simple-tree/api/conciseTree.js.map +1 -0
  354. package/lib/simple-tree/api/customTree.d.ts +44 -0
  355. package/lib/simple-tree/api/customTree.d.ts.map +1 -0
  356. package/lib/simple-tree/api/customTree.js +59 -0
  357. package/lib/simple-tree/api/customTree.js.map +1 -0
  358. package/lib/simple-tree/api/index.d.ts +7 -2
  359. package/lib/simple-tree/api/index.d.ts.map +1 -1
  360. package/lib/simple-tree/api/index.js +1 -0
  361. package/lib/simple-tree/api/index.js.map +1 -1
  362. package/lib/simple-tree/api/schemaCreationUtilities.d.ts +41 -26
  363. package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  364. package/lib/simple-tree/api/schemaCreationUtilities.js +43 -15
  365. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  366. package/lib/simple-tree/api/schemaFactory.d.ts +1 -2
  367. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  368. package/lib/simple-tree/api/schemaFactory.js +1 -1
  369. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  370. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -2
  371. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  372. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  373. package/lib/simple-tree/api/storedSchema.d.ts +78 -0
  374. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -0
  375. package/lib/simple-tree/api/storedSchema.js +101 -0
  376. package/lib/simple-tree/api/storedSchema.js.map +1 -0
  377. package/lib/simple-tree/api/testRecursiveDomain.d.ts +10 -10
  378. package/lib/simple-tree/api/tree.d.ts +12 -3
  379. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  380. package/lib/simple-tree/api/tree.js.map +1 -1
  381. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  382. package/lib/simple-tree/api/treeNodeApi.js +3 -3
  383. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  384. package/lib/simple-tree/{typesUnsafe.d.ts → api/typesUnsafe.d.ts} +58 -10
  385. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -0
  386. package/lib/simple-tree/api/typesUnsafe.js.map +1 -0
  387. package/lib/simple-tree/api/verboseTree.d.ts +6 -20
  388. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  389. package/lib/simple-tree/api/verboseTree.js +11 -49
  390. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  391. package/lib/simple-tree/arrayNode.d.ts +14 -3
  392. package/lib/simple-tree/arrayNode.d.ts.map +1 -1
  393. package/lib/simple-tree/arrayNode.js +1 -2
  394. package/lib/simple-tree/arrayNode.js.map +1 -1
  395. package/lib/simple-tree/core/index.d.ts +1 -1
  396. package/lib/simple-tree/core/index.d.ts.map +1 -1
  397. package/lib/simple-tree/core/index.js +1 -1
  398. package/lib/simple-tree/core/index.js.map +1 -1
  399. package/lib/simple-tree/core/treeNodeKernel.d.ts +9 -0
  400. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  401. package/lib/simple-tree/core/treeNodeKernel.js +12 -0
  402. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  403. package/lib/simple-tree/core/treeNodeSchema.d.ts +6 -5
  404. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  405. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  406. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  407. package/lib/simple-tree/core/unhydratedFlexTree.js +3 -1
  408. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  409. package/lib/simple-tree/core/withType.d.ts +3 -1
  410. package/lib/simple-tree/core/withType.d.ts.map +1 -1
  411. package/lib/simple-tree/core/withType.js.map +1 -1
  412. package/lib/simple-tree/flexList.d.ts.map +1 -0
  413. package/lib/simple-tree/flexList.js.map +1 -0
  414. package/lib/simple-tree/index.d.ts +6 -7
  415. package/lib/simple-tree/index.d.ts.map +1 -1
  416. package/lib/simple-tree/index.js +3 -4
  417. package/lib/simple-tree/index.js.map +1 -1
  418. package/lib/simple-tree/mapNode.d.ts.map +1 -1
  419. package/lib/simple-tree/mapNode.js +1 -2
  420. package/lib/simple-tree/mapNode.js.map +1 -1
  421. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  422. package/lib/simple-tree/objectNode.js +1 -2
  423. package/lib/simple-tree/objectNode.js.map +1 -1
  424. package/lib/simple-tree/schemaTypes.d.ts +60 -7
  425. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  426. package/lib/simple-tree/schemaTypes.js +6 -1
  427. package/lib/simple-tree/schemaTypes.js.map +1 -1
  428. package/lib/simple-tree/toFlexSchema.d.ts.map +1 -1
  429. package/lib/simple-tree/toFlexSchema.js +1 -3
  430. package/lib/simple-tree/toFlexSchema.js.map +1 -1
  431. package/lib/simple-tree/toMapTree.d.ts +4 -2
  432. package/lib/simple-tree/toMapTree.d.ts.map +1 -1
  433. package/lib/simple-tree/toMapTree.js +3 -3
  434. package/lib/simple-tree/toMapTree.js.map +1 -1
  435. package/lib/simple-tree/treeNodeValid.d.ts.map +1 -1
  436. package/lib/simple-tree/treeNodeValid.js +2 -1
  437. package/lib/simple-tree/treeNodeValid.js.map +1 -1
  438. package/lib/treeFactory.d.ts +1 -0
  439. package/lib/treeFactory.d.ts.map +1 -1
  440. package/lib/treeFactory.js +1 -0
  441. package/lib/treeFactory.js.map +1 -1
  442. package/lib/util/utils.d.ts +10 -8
  443. package/lib/util/utils.d.ts.map +1 -1
  444. package/lib/util/utils.js.map +1 -1
  445. package/package.json +44 -27
  446. package/src/codec/codec.ts +4 -4
  447. package/src/codec/noopValidator.ts +1 -1
  448. package/src/core/change-family/changeFamily.ts +5 -2
  449. package/src/core/change-family/editBuilder.ts +3 -2
  450. package/src/core/rebase/changeRebaser.ts +6 -1
  451. package/src/core/rebase/utils.ts +1 -1
  452. package/src/core/tree/anchorSet.ts +63 -13
  453. package/src/external-utilities/typeboxValidator.ts +1 -1
  454. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +92 -47
  455. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +7 -7
  456. package/src/feature-libraries/flex-tree/lazyField.ts +44 -7
  457. package/src/feature-libraries/index.ts +0 -10
  458. package/src/feature-libraries/mitigatedChangeFamily.ts +11 -4
  459. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +1 -0
  460. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +218 -175
  461. package/src/feature-libraries/optional-field/optionalField.ts +21 -17
  462. package/src/feature-libraries/schema-index/schemaSummarizer.ts +2 -10
  463. package/src/feature-libraries/sequence-field/compose.ts +67 -58
  464. package/src/feature-libraries/sequence-field/invert.ts +30 -6
  465. package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +65 -19
  466. package/src/feature-libraries/treeCompressionUtils.ts +1 -1
  467. package/src/index.ts +26 -6
  468. package/src/internalTypes.ts +4 -1
  469. package/src/packageVersion.ts +1 -1
  470. package/src/shared-tree/index.ts +5 -0
  471. package/src/shared-tree/schematizingTreeView.ts +7 -16
  472. package/src/shared-tree/sharedTree.ts +55 -23
  473. package/src/shared-tree/sharedTreeChangeFamily.ts +5 -1
  474. package/src/shared-tree/sharedTreeEditBuilder.ts +23 -12
  475. package/src/shared-tree/treeApi.ts +19 -9
  476. package/src/shared-tree/treeCheckout.ts +7 -6
  477. package/src/shared-tree-core/branch.ts +11 -14
  478. package/src/shared-tree-core/defaultResubmitMachine.ts +4 -4
  479. package/src/shared-tree-core/editManager.ts +2 -1
  480. package/src/shared-tree-core/sharedTreeCore.ts +4 -2
  481. package/src/simple-tree/api/conciseTree.ts +58 -0
  482. package/src/simple-tree/api/customTree.ts +119 -0
  483. package/src/simple-tree/api/index.ts +39 -1
  484. package/src/simple-tree/api/schemaCreationUtilities.ts +55 -36
  485. package/src/simple-tree/api/schemaFactory.ts +4 -6
  486. package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -2
  487. package/src/simple-tree/api/storedSchema.ts +126 -0
  488. package/src/simple-tree/api/tree.ts +24 -2
  489. package/src/simple-tree/api/treeNodeApi.ts +3 -8
  490. package/src/simple-tree/{typesUnsafe.ts → api/typesUnsafe.ts} +95 -21
  491. package/src/simple-tree/api/verboseTree.ts +21 -76
  492. package/src/simple-tree/arrayNode.ts +35 -15
  493. package/src/simple-tree/core/index.ts +1 -0
  494. package/src/simple-tree/core/treeNodeKernel.ts +13 -0
  495. package/src/simple-tree/core/treeNodeSchema.ts +7 -5
  496. package/src/simple-tree/core/unhydratedFlexTree.ts +6 -1
  497. package/src/simple-tree/core/withType.ts +10 -1
  498. package/src/simple-tree/index.ts +41 -21
  499. package/src/simple-tree/mapNode.ts +1 -1
  500. package/src/simple-tree/objectNode.ts +1 -1
  501. package/src/simple-tree/schemaTypes.ts +70 -11
  502. package/src/simple-tree/toFlexSchema.ts +1 -3
  503. package/src/simple-tree/toMapTree.ts +7 -4
  504. package/src/simple-tree/treeNodeValid.ts +2 -1
  505. package/src/treeFactory.ts +1 -0
  506. package/src/util/utils.ts +10 -8
  507. package/dist/feature-libraries/flex-tree/unboxed.d.ts +0 -12
  508. package/dist/feature-libraries/flex-tree/unboxed.d.ts.map +0 -1
  509. package/dist/feature-libraries/flex-tree/unboxed.js +0 -20
  510. package/dist/feature-libraries/flex-tree/unboxed.js.map +0 -1
  511. package/dist/feature-libraries/typed-schema/flexList.d.ts.map +0 -1
  512. package/dist/feature-libraries/typed-schema/flexList.js.map +0 -1
  513. package/dist/feature-libraries/typed-schema/index.d.ts +0 -7
  514. package/dist/feature-libraries/typed-schema/index.d.ts.map +0 -1
  515. package/dist/feature-libraries/typed-schema/index.js +0 -12
  516. package/dist/feature-libraries/typed-schema/index.js.map +0 -1
  517. package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts +0 -14
  518. package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +0 -1
  519. package/dist/feature-libraries/typed-schema/typedTreeSchema.js +0 -7
  520. package/dist/feature-libraries/typed-schema/typedTreeSchema.js.map +0 -1
  521. package/dist/simple-tree/proxyBinding.d.ts +0 -15
  522. package/dist/simple-tree/proxyBinding.d.ts.map +0 -1
  523. package/dist/simple-tree/proxyBinding.js +0 -22
  524. package/dist/simple-tree/proxyBinding.js.map +0 -1
  525. package/dist/simple-tree/typesUnsafe.d.ts.map +0 -1
  526. package/dist/simple-tree/typesUnsafe.js.map +0 -1
  527. package/lib/feature-libraries/flex-tree/unboxed.d.ts +0 -12
  528. package/lib/feature-libraries/flex-tree/unboxed.d.ts.map +0 -1
  529. package/lib/feature-libraries/flex-tree/unboxed.js +0 -16
  530. package/lib/feature-libraries/flex-tree/unboxed.js.map +0 -1
  531. package/lib/feature-libraries/typed-schema/flexList.d.ts.map +0 -1
  532. package/lib/feature-libraries/typed-schema/flexList.js.map +0 -1
  533. package/lib/feature-libraries/typed-schema/index.d.ts +0 -7
  534. package/lib/feature-libraries/typed-schema/index.d.ts.map +0 -1
  535. package/lib/feature-libraries/typed-schema/index.js +0 -6
  536. package/lib/feature-libraries/typed-schema/index.js.map +0 -1
  537. package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts +0 -14
  538. package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +0 -1
  539. package/lib/feature-libraries/typed-schema/typedTreeSchema.js +0 -6
  540. package/lib/feature-libraries/typed-schema/typedTreeSchema.js.map +0 -1
  541. package/lib/simple-tree/proxyBinding.d.ts +0 -15
  542. package/lib/simple-tree/proxyBinding.d.ts.map +0 -1
  543. package/lib/simple-tree/proxyBinding.js +0 -18
  544. package/lib/simple-tree/proxyBinding.js.map +0 -1
  545. package/lib/simple-tree/typesUnsafe.d.ts.map +0 -1
  546. package/lib/simple-tree/typesUnsafe.js.map +0 -1
  547. package/src/feature-libraries/flex-tree/unboxed.ts +0 -24
  548. package/src/feature-libraries/typed-schema/README.md +0 -6
  549. package/src/feature-libraries/typed-schema/index.ts +0 -16
  550. package/src/feature-libraries/typed-schema/typedTreeSchema.ts +0 -14
  551. package/src/simple-tree/proxyBinding.ts +0 -20
  552. /package/dist/simple-tree/{typesUnsafe.js → api/typesUnsafe.js} +0 -0
  553. /package/dist/{feature-libraries/typed-schema → simple-tree}/flexList.d.ts +0 -0
  554. /package/dist/{feature-libraries/typed-schema → simple-tree}/flexList.js +0 -0
  555. /package/lib/simple-tree/{typesUnsafe.js → api/typesUnsafe.js} +0 -0
  556. /package/lib/{feature-libraries/typed-schema → simple-tree}/flexList.d.ts +0 -0
  557. /package/lib/{feature-libraries/typed-schema → simple-tree}/flexList.js +0 -0
  558. /package/src/simple-tree/{ProxyBinding.md → core/TreeNodeBinding.md} +0 -0
  559. /package/src/{feature-libraries/typed-schema → simple-tree}/flexList.ts +0 -0
@@ -266,6 +266,7 @@ export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
266
266
  change: OptionalChangeset,
267
267
  isRollback: boolean,
268
268
  genId: IdAllocator<ChangesetLocalId>,
269
+ revision: RevisionTag | undefined,
269
270
  ): OptionalChangeset => {
270
271
  const { moves, childChanges } = change;
271
272
 
@@ -298,11 +299,13 @@ export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
298
299
  change.valueReplace.src === undefined
299
300
  ? {
300
301
  isEmpty: true,
301
- dst: makeChangeAtomId(genId.allocate()),
302
+ dst: makeChangeAtomId(genId.allocate(), revision),
302
303
  }
303
304
  : {
304
305
  isEmpty: false,
305
- dst: isRollback ? change.valueReplace.src : makeChangeAtomId(genId.allocate()),
306
+ dst: isRollback
307
+ ? change.valueReplace.src
308
+ : makeChangeAtomId(genId.allocate(), revision),
306
309
  };
307
310
  if (change.valueReplace.isEmpty === false) {
308
311
  replace.src = change.valueReplace.dst;
@@ -312,7 +315,7 @@ export const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {
312
315
  inverted.valueReplace = {
313
316
  isEmpty: false,
314
317
  src: "self",
315
- dst: makeChangeAtomId(genId.allocate()),
318
+ dst: makeChangeAtomId(genId.allocate(), revision),
316
319
  };
317
320
  }
318
321
  }
@@ -581,52 +584,53 @@ export function taggedRegister(id: RegisterId, revision: RevisionTag | undefined
581
584
 
582
585
  export interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {
583
586
  /**
584
- * Creates a change which replaces the field with `newContent`
585
- * @param newContent - the new content for the field
587
+ * Creates a change which will replace the content already in the field (if any at the time the change applies)
588
+ * with new content.
589
+ * The content in the field will be moved to the `ids.detach` register.
590
+ * The content in the `ids.detach` register will be moved to into the field.
586
591
  * @param wasEmpty - whether the field is empty when creating this change
587
- * @param changeId - the ID associated with the replacement of the current content.
588
- * @param buildId - the ID associated with the creation of the `newContent`.
592
+ * @param ids - the "fill" and "detach" ids associated with the change.
589
593
  */
590
594
  set(
591
595
  wasEmpty: boolean,
592
596
  ids: {
593
- fill: ChangesetLocalId;
594
- detach: ChangesetLocalId;
597
+ fill: ChangeAtomId;
598
+ detach: ChangeAtomId;
595
599
  },
596
600
  ): OptionalChangeset;
597
601
 
598
602
  /**
599
603
  * Creates a change which clears the field's contents (if any).
600
604
  * @param wasEmpty - whether the field is empty when creating this change
601
- * @param changeId - the ID associated with the detach.
605
+ * @param detachId - the ID of the register that existing field content (if any) will be moved to.
602
606
  */
603
- clear(wasEmpty: boolean, id: ChangesetLocalId): OptionalChangeset;
607
+ clear(wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;
604
608
  }
605
609
 
606
610
  export const optionalFieldEditor: OptionalFieldEditor = {
607
611
  set: (
608
612
  wasEmpty: boolean,
609
613
  ids: {
610
- fill: ChangesetLocalId;
614
+ fill: ChangeAtomId;
611
615
  // Should be interpreted as a set of an empty field if undefined.
612
- detach: ChangesetLocalId;
616
+ detach: ChangeAtomId;
613
617
  },
614
618
  ): OptionalChangeset => ({
615
619
  moves: [],
616
620
  childChanges: [],
617
621
  valueReplace: {
618
622
  isEmpty: wasEmpty,
619
- src: { localId: ids.fill },
620
- dst: { localId: ids.detach },
623
+ src: ids.fill,
624
+ dst: ids.detach,
621
625
  },
622
626
  }),
623
627
 
624
- clear: (wasEmpty: boolean, detachId: ChangesetLocalId): OptionalChangeset => ({
628
+ clear: (wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({
625
629
  moves: [],
626
630
  childChanges: [],
627
631
  valueReplace: {
628
632
  isEmpty: wasEmpty,
629
- dst: { localId: detachId },
633
+ dst: detachId,
630
634
  },
631
635
  }),
632
636
 
@@ -29,7 +29,6 @@ import type {
29
29
  SummaryElementParser,
30
30
  SummaryElementStringifier,
31
31
  } from "../../shared-tree-core/index.js";
32
- import type { JsonCompatible } from "../../util/index.js";
33
32
  import type { CollabWindow } from "../incrementalSummarizationUtils.js";
34
33
 
35
34
  import { encodeRepo, makeSchemaCodec } from "./codec.js";
@@ -127,18 +126,11 @@ export class SchemaSummarizer implements Summarizable {
127
126
  }
128
127
 
129
128
  /**
130
- * Dumps schema into a deterministic JSON compatible semi-human readable but unspecified format.
129
+ * Dumps schema into a deterministic JSON compatible semi-human readable format.
131
130
  *
132
131
  * @remarks
133
132
  * This can be used to help inspect schema for debugging, and to save a snapshot of schema to help detect and review changes to an applications schema.
134
- *
135
- * This format may change across major versions of this package: such changes are considered breaking.
136
- * Beyond that, no compatibility guarantee is provided for this format: it should never be relied upon to load data, it should only be used for comparing outputs from this function.
137
- * @privateRemarks
138
- * This currently uses the schema summary format, but that could be changed to something more human readable (particularly if the encoded format becomes less human readable).
139
- * This intentionally does not leak the format types in the API.
140
- * @internal
141
133
  */
142
- export function encodeTreeSchema(schema: TreeStoredSchema): JsonCompatible {
134
+ export function encodeTreeSchema(schema: TreeStoredSchema): Format {
143
135
  return encodeRepo(schema);
144
136
  }
@@ -34,6 +34,7 @@ import {
34
34
  setMoveEffect,
35
35
  } from "./moveEffectTable.js";
36
36
  import {
37
+ type Attach,
37
38
  type CellMark,
38
39
  type Changeset,
39
40
  type Detach,
@@ -277,13 +278,16 @@ function composeMarksIgnoreChild(
277
278
  const baseAttachAndDetach = asAttachAndDetach(baseMark);
278
279
  const newOutputId = getOutputCellId(newAttachAndDetach);
279
280
 
281
+ const originalAttach = { ...baseAttachAndDetach.attach };
282
+ const finalDetach = { ...newAttachAndDetach.detach };
283
+
284
+ handleMovePivot(baseMark.count, originalAttach, finalDetach, moveEffects);
285
+
280
286
  if (areEqualCellIds(newOutputId, baseAttachAndDetach.cellId)) {
281
287
  return { count: baseAttachAndDetach.count, cellId: baseAttachAndDetach.cellId };
282
288
  }
283
289
 
284
290
  // `newMark`'s attach portion cancels with `baseMark`'s detach portion.
285
- const originalAttach = { ...baseAttachAndDetach.attach };
286
- const finalDetach = { ...newAttachAndDetach.detach };
287
291
  const detachRevision = finalDetach.revision;
288
292
  if (detachRevision !== undefined) {
289
293
  finalDetach.revision = detachRevision;
@@ -368,76 +372,81 @@ function composeMarksIgnoreChild(
368
372
  const attach = extractMarkEffect(baseMark);
369
373
  const detach = extractMarkEffect(newMark);
370
374
 
371
- if (isMoveIn(attach) && isMoveOut(detach)) {
372
- const finalSource = getEndpoint(attach);
373
- const finalDest = getEndpoint(detach);
375
+ handleMovePivot(baseMark.count, attach, detach, moveEffects);
374
376
 
375
- setEndpoint(
376
- moveEffects,
377
- CrossFieldTarget.Source,
378
- finalSource,
379
- baseMark.count,
380
- finalDest,
381
- );
377
+ if (areEqualCellIds(getOutputCellId(newMark), baseMark.cellId)) {
378
+ // The output and input cell IDs are the same, so this mark has no effect.
379
+ return { count: baseMark.count, cellId: baseMark.cellId };
380
+ }
381
+ return normalizeCellRename(baseMark.cellId, baseMark.count, attach, detach);
382
+ } else {
383
+ const length = baseMark.count;
384
+ return createNoopMark(length, undefined);
385
+ }
386
+ }
382
387
 
383
- const truncatedEndpoint1 = getTruncatedEndpointForInner(
384
- moveEffects,
385
- CrossFieldTarget.Destination,
386
- attach.revision,
387
- attach.id,
388
- baseMark.count,
389
- );
388
+ /**
389
+ * Checks if `baseAttach` and `newDetach` are both moves, and if so updates their move endpoints as appropriate,
390
+ * and removes their `finalEndpoint` endpoint fields. Note that can mutate `baseAttach` and `newDetach`.
391
+ * If the effects are not both moves this function does nothing.
392
+ * @param count - The number of cells targeted
393
+ * @param baseAttach - The base attach effect at this location
394
+ * @param newDetach - The new detach effect at this location
395
+ */
396
+ function handleMovePivot(
397
+ count: number,
398
+ baseAttach: Attach,
399
+ newDetach: Detach,
400
+ moveEffects: MoveEffectTable,
401
+ ): void {
402
+ if (isMoveIn(baseAttach) && isMoveOut(newDetach)) {
403
+ const finalSource = getEndpoint(baseAttach);
404
+ const finalDest = getEndpoint(newDetach);
390
405
 
391
- if (truncatedEndpoint1 !== undefined) {
392
- setTruncatedEndpoint(
393
- moveEffects,
394
- CrossFieldTarget.Destination,
395
- finalDest,
396
- baseMark.count,
397
- truncatedEndpoint1,
398
- );
399
- }
406
+ setEndpoint(moveEffects, CrossFieldTarget.Source, finalSource, count, finalDest);
400
407
 
401
- setEndpoint(
408
+ const truncatedEndpoint1 = getTruncatedEndpointForInner(
409
+ moveEffects,
410
+ CrossFieldTarget.Destination,
411
+ baseAttach.revision,
412
+ baseAttach.id,
413
+ count,
414
+ );
415
+
416
+ if (truncatedEndpoint1 !== undefined) {
417
+ setTruncatedEndpoint(
402
418
  moveEffects,
403
419
  CrossFieldTarget.Destination,
404
420
  finalDest,
405
- baseMark.count,
406
- finalSource,
421
+ count,
422
+ truncatedEndpoint1,
407
423
  );
424
+ }
425
+
426
+ setEndpoint(moveEffects, CrossFieldTarget.Destination, finalDest, count, finalSource);
408
427
 
409
- const truncatedEndpoint2 = getTruncatedEndpointForInner(
428
+ const truncatedEndpoint2 = getTruncatedEndpointForInner(
429
+ moveEffects,
430
+ CrossFieldTarget.Source,
431
+ newDetach.revision,
432
+ newDetach.id,
433
+ count,
434
+ );
435
+
436
+ if (truncatedEndpoint2 !== undefined) {
437
+ setTruncatedEndpoint(
410
438
  moveEffects,
411
439
  CrossFieldTarget.Source,
412
- detach.revision,
413
- detach.id,
414
- baseMark.count,
440
+ finalSource,
441
+ count,
442
+ truncatedEndpoint2,
415
443
  );
416
-
417
- if (truncatedEndpoint2 !== undefined) {
418
- setTruncatedEndpoint(
419
- moveEffects,
420
- CrossFieldTarget.Source,
421
- finalSource,
422
- baseMark.count,
423
- truncatedEndpoint2,
424
- );
425
- }
426
-
427
- // The `finalEndpoint` field of AttachAndDetach move effect pairs is not used,
428
- // so we remove it as a normalization.
429
- delete attach.finalEndpoint;
430
- delete detach.finalEndpoint;
431
444
  }
432
445
 
433
- if (areEqualCellIds(getOutputCellId(newMark), baseMark.cellId)) {
434
- // The output and input cell IDs are the same, so this mark has no effect.
435
- return { count: baseMark.count, cellId: baseMark.cellId };
436
- }
437
- return normalizeCellRename(baseMark.cellId, baseMark.count, attach, detach);
438
- } else {
439
- const length = baseMark.count;
440
- return createNoopMark(length, undefined);
446
+ // The `finalEndpoint` field of AttachAndDetach move effect pairs is not used,
447
+ // so we remove it as a normalization.
448
+ delete baseAttach.finalEndpoint;
449
+ delete newDetach.finalEndpoint;
441
450
  }
442
451
  }
443
452
 
@@ -46,6 +46,10 @@ import {
46
46
  /**
47
47
  * Inverts a given changeset.
48
48
  * @param change - The changeset to produce the inverse of.
49
+ * @param isRollback - Whether the inverse is being produced for a rollback.
50
+ * @param genId - The ID allocator to use for generating new IDs.
51
+ * @param revision - The revision to use for the inverse changeset.
52
+ * @param crossFieldManager - The cross-field manager to use for tracking cross-field changes.
49
53
  * @returns The inverse of the given `change` such that the inverse can be applied after `change`.
50
54
  *
51
55
  * WARNING! This implementation is incomplete:
@@ -55,20 +59,27 @@ export function invert(
55
59
  change: Changeset,
56
60
  isRollback: boolean,
57
61
  genId: IdAllocator,
62
+ revision: RevisionTag | undefined,
58
63
  crossFieldManager: CrossFieldManager,
59
64
  ): Changeset {
60
- return invertMarkList(change, isRollback, crossFieldManager as CrossFieldManager<NodeId>);
65
+ return invertMarkList(
66
+ change,
67
+ isRollback,
68
+ crossFieldManager as CrossFieldManager<NodeId>,
69
+ revision,
70
+ );
61
71
  }
62
72
 
63
73
  function invertMarkList(
64
74
  markList: MarkList,
65
75
  isRollback: boolean,
66
76
  crossFieldManager: CrossFieldManager<NodeId>,
77
+ revision: RevisionTag | undefined,
67
78
  ): MarkList {
68
79
  const inverseMarkList = new MarkListFactory();
69
80
 
70
81
  for (const mark of markList) {
71
- const inverseMarks = invertMark(mark, isRollback, crossFieldManager);
82
+ const inverseMarks = invertMark(mark, isRollback, crossFieldManager, revision);
72
83
  inverseMarkList.push(...inverseMarks);
73
84
  }
74
85
 
@@ -79,6 +90,7 @@ function invertMark(
79
90
  mark: Mark,
80
91
  isRollback: boolean,
81
92
  crossFieldManager: CrossFieldManager<NodeId>,
93
+ revision: RevisionTag | undefined,
82
94
  ): Mark[] {
83
95
  if (!isImpactful(mark)) {
84
96
  const inputId = getInputCellId(mark);
@@ -115,6 +127,7 @@ function invertMark(
115
127
  id: mark.id,
116
128
  cellId: outputId,
117
129
  count: mark.count,
130
+ revision,
118
131
  };
119
132
  } else {
120
133
  inverse = {
@@ -122,6 +135,7 @@ function invertMark(
122
135
  id: mark.id,
123
136
  cellId: outputId,
124
137
  count: mark.count,
138
+ revision,
125
139
  };
126
140
  if (isRollback) {
127
141
  inverse.idOverride = inputId;
@@ -136,6 +150,7 @@ function invertMark(
136
150
  type: "Remove",
137
151
  count: mark.count,
138
152
  id: inputId.localId,
153
+ revision,
139
154
  };
140
155
 
141
156
  if (isRollback) {
@@ -168,10 +183,14 @@ function invertMark(
168
183
  const moveIn: MoveIn = {
169
184
  type: "MoveIn",
170
185
  id: mark.id,
186
+ revision,
171
187
  };
172
188
 
173
189
  if (mark.finalEndpoint !== undefined) {
174
- moveIn.finalEndpoint = { localId: mark.finalEndpoint.localId };
190
+ moveIn.finalEndpoint = {
191
+ localId: mark.finalEndpoint.localId,
192
+ revision: mark.revision,
193
+ };
175
194
  }
176
195
  let effect: MarkEffect = moveIn;
177
196
  const inputId = getInputCellId(mark);
@@ -179,6 +198,7 @@ function invertMark(
179
198
  const detach: Mutable<Detach> = {
180
199
  type: "Remove",
181
200
  id: mark.id,
201
+ revision,
182
202
  };
183
203
  if (isRollback) {
184
204
  detach.idOverride = inputId;
@@ -198,6 +218,7 @@ function invertMark(
198
218
  type: "MoveOut",
199
219
  id: mark.id,
200
220
  count: mark.count,
221
+ revision,
201
222
  };
202
223
 
203
224
  if (isRollback) {
@@ -205,7 +226,10 @@ function invertMark(
205
226
  }
206
227
 
207
228
  if (mark.finalEndpoint) {
208
- invertedMark.finalEndpoint = { localId: mark.finalEndpoint.localId };
229
+ invertedMark.finalEndpoint = {
230
+ localId: mark.finalEndpoint.localId,
231
+ revision: mark.revision,
232
+ };
209
233
  }
210
234
  return applyMovedChanges(invertedMark, mark.revision, crossFieldManager);
211
235
  }
@@ -225,8 +249,8 @@ function invertMark(
225
249
  changes: mark.changes,
226
250
  ...mark.detach,
227
251
  };
228
- const attachInverses = invertMark(attach, isRollback, crossFieldManager);
229
- const detachInverses = invertMark(detach, isRollback, crossFieldManager);
252
+ const attachInverses = invertMark(attach, isRollback, crossFieldManager, revision);
253
+ const detachInverses = invertMark(detach, isRollback, crossFieldManager, revision);
230
254
 
231
255
  if (detachInverses.length === 0) {
232
256
  return attachInverses;
@@ -5,7 +5,7 @@
5
5
 
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
- import type { ChangesetLocalId } from "../../core/index.js";
8
+ import type { ChangesetLocalId, RevisionTag } from "../../core/index.js";
9
9
  import type { FieldEditor, NodeId } from "../modular-schema/index.js";
10
10
 
11
11
  import { MarkListFactory } from "./markListFactory.js";
@@ -22,9 +22,15 @@ import type {
22
22
  import { splitMark } from "./utils.js";
23
23
 
24
24
  export interface SequenceFieldEditor extends FieldEditor<Changeset> {
25
- insert(index: number, count: number, firstId: ChangesetLocalId): Changeset;
26
- remove(index: number, count: number, id: ChangesetLocalId): Changeset;
27
- revive(index: number, count: number, detachEvent: CellId, isIntention?: true): Changeset;
25
+ insert(index: number, count: number, firstId: CellId, revision: RevisionTag): Changeset;
26
+ remove(index: number, count: number, id: ChangesetLocalId, revision: RevisionTag): Changeset;
27
+ revive(
28
+ index: number,
29
+ count: number,
30
+ detachEvent: CellId,
31
+ revision: RevisionTag,
32
+ isIntention?: true,
33
+ ): Changeset;
28
34
 
29
35
  /**
30
36
  *
@@ -32,22 +38,30 @@ export interface SequenceFieldEditor extends FieldEditor<Changeset> {
32
38
  * @param count - The number of nodes to move
33
39
  * @param destIndex - The index the nodes should be moved to, interpreted before detaching the moved nodes
34
40
  * @param detachCellId - The local ID to assign to the first cell being emptied by the move
35
- * @param attachCellId - The local ID to assign to the first cell being filled by the move
41
+ * @param attachCellId - The ID to assign to the first cell being filled by the move
42
+ * @param revision - The revision to assign to the move marks
36
43
  */
37
44
  move(
38
45
  sourceIndex: number,
39
46
  count: number,
40
47
  destIndex: number,
41
48
  detachCellId: ChangesetLocalId,
42
- attachCellId: ChangesetLocalId,
49
+ attachCellId: CellId,
50
+ revision: RevisionTag,
43
51
  ): Changeset;
44
52
 
45
- moveOut(sourceIndex: number, count: number, id: ChangesetLocalId): Changeset;
53
+ moveOut(
54
+ sourceIndex: number,
55
+ count: number,
56
+ id: ChangesetLocalId,
57
+ revision: RevisionTag,
58
+ ): Changeset;
46
59
  moveIn(
47
60
  destIndex: number,
48
61
  count: number,
49
62
  moveId: ChangesetLocalId,
50
- attachCellId: ChangesetLocalId,
63
+ attachCellId: CellId,
64
+ revision: RevisionTag,
51
65
  ): Changeset;
52
66
 
53
67
  return(
@@ -56,31 +70,49 @@ export interface SequenceFieldEditor extends FieldEditor<Changeset> {
56
70
  destIndex: number,
57
71
  detachCellId: CellId,
58
72
  attachCellId: CellId,
73
+ revision: RevisionTag,
59
74
  ): Changeset;
60
75
  }
61
76
 
62
77
  export const sequenceFieldEditor = {
63
78
  buildChildChange: (index: number, change: NodeId): Changeset =>
64
79
  markAtIndex(index, { count: 1, changes: change }),
65
- insert: (index: number, count: number, firstId: ChangesetLocalId): Changeset => {
80
+ insert: (
81
+ index: number,
82
+ count: number,
83
+ firstId: CellId,
84
+ revision: RevisionTag | undefined,
85
+ ): Changeset => {
66
86
  const mark: CellMark<Insert> = {
67
87
  type: "Insert",
68
- id: firstId,
88
+ id: firstId.localId,
69
89
  count,
70
- cellId: { localId: firstId },
90
+ cellId: firstId,
91
+ revision,
71
92
  };
72
93
  return markAtIndex(index, mark);
73
94
  },
74
- remove: (index: number, count: number, id: ChangesetLocalId): Changeset =>
75
- count === 0 ? [] : markAtIndex(index, { type: "Remove", count, id }),
95
+ remove: (
96
+ index: number,
97
+ count: number,
98
+ id: ChangesetLocalId,
99
+ revision: RevisionTag | undefined,
100
+ ): Changeset =>
101
+ count === 0 ? [] : markAtIndex(index, { type: "Remove", count, id, revision }),
76
102
 
77
- revive: (index: number, count: number, detachEvent: CellId): Changeset => {
103
+ revive: (
104
+ index: number,
105
+ count: number,
106
+ detachEvent: CellId,
107
+ revision: RevisionTag | undefined,
108
+ ): Changeset => {
78
109
  assert(detachEvent.revision !== undefined, 0x724 /* Detach event must have a revision */);
79
110
  const mark: CellMark<Insert> = {
80
111
  type: "Insert",
81
112
  id: detachEvent.localId,
82
113
  count,
83
114
  cellId: detachEvent,
115
+ revision,
84
116
  };
85
117
  return count === 0 ? [] : markAtIndex(index, mark);
86
118
  },
@@ -90,27 +122,36 @@ export const sequenceFieldEditor = {
90
122
  count: number,
91
123
  destIndex: number,
92
124
  detachCellId: ChangesetLocalId,
93
- attachCellId: ChangesetLocalId,
125
+ attachCellId: CellId,
126
+ revision: RevisionTag | undefined,
94
127
  ): Changeset {
95
128
  const moveIn: Mark = {
96
129
  type: "MoveIn",
97
130
  id: detachCellId,
98
131
  count,
99
- cellId: { localId: attachCellId },
132
+ cellId: attachCellId,
133
+ revision,
100
134
  };
101
135
  const moveOut: Mark = {
102
136
  type: "MoveOut",
103
137
  id: detachCellId,
104
138
  count,
139
+ revision,
105
140
  };
106
141
  return moveMarksToMarkList(sourceIndex, count, destIndex, moveOut, moveIn);
107
142
  },
108
143
 
109
- moveOut(sourceIndex: number, count: number, detachCellId: ChangesetLocalId): Changeset {
144
+ moveOut(
145
+ sourceIndex: number,
146
+ count: number,
147
+ detachCellId: ChangesetLocalId,
148
+ revision: RevisionTag,
149
+ ): Changeset {
110
150
  const moveOut: Mark = {
111
151
  type: "MoveOut",
112
152
  id: detachCellId,
113
153
  count,
154
+ revision,
114
155
  };
115
156
  return markAtIndex(sourceIndex, moveOut);
116
157
  },
@@ -119,13 +160,15 @@ export const sequenceFieldEditor = {
119
160
  destIndex: number,
120
161
  count: number,
121
162
  moveId: ChangesetLocalId,
122
- attachCellId: ChangesetLocalId,
163
+ attachCellId: CellId,
164
+ revision: RevisionTag,
123
165
  ): Changeset {
124
166
  const moveIn: Mark = {
125
167
  type: "MoveIn",
126
168
  id: moveId,
127
169
  count,
128
- cellId: { localId: attachCellId },
170
+ cellId: attachCellId,
171
+ revision,
129
172
  };
130
173
  return markAtIndex(destIndex, moveIn);
131
174
  },
@@ -136,12 +179,14 @@ export const sequenceFieldEditor = {
136
179
  destIndex: number,
137
180
  detachCellId: CellId,
138
181
  attachCellId: CellId,
182
+ revision: RevisionTag | undefined,
139
183
  ): Changeset {
140
184
  const moveOut: CellMark<MoveOut> = {
141
185
  type: "MoveOut",
142
186
  id: attachCellId.localId,
143
187
  idOverride: detachCellId,
144
188
  count,
189
+ revision,
145
190
  };
146
191
 
147
192
  const returnTo: CellMark<MoveIn> = {
@@ -149,6 +194,7 @@ export const sequenceFieldEditor = {
149
194
  id: attachCellId.localId,
150
195
  count,
151
196
  cellId: attachCellId,
197
+ revision,
152
198
  };
153
199
 
154
200
  return moveMarksToMarkList(sourceIndex, count, destIndex, moveOut, returnTo);
@@ -7,7 +7,7 @@
7
7
  * Selects which heuristics to use when encoding tree content.
8
8
  * All encoding options here are compatible with the same decoder:
9
9
  * the selection here does not impact compatibility.
10
- * @internal
10
+ * @alpha
11
11
  */
12
12
  export enum TreeCompressionStrategy {
13
13
  /**