@fluidframework/tree 2.111.0 → 2.113.0-411909

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 (490) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/api-report/tree.alpha.api.md +71 -7
  3. package/api-report/tree.beta.api.md +1 -1
  4. package/api-report/tree.legacy.beta.api.md +1 -1
  5. package/api-report/tree.legacy.public.api.md +1 -1
  6. package/api-report/tree.public.api.md +1 -1
  7. package/dist/componentApi.d.ts +198 -0
  8. package/dist/componentApi.d.ts.map +1 -0
  9. package/dist/componentApi.js +138 -0
  10. package/dist/componentApi.js.map +1 -0
  11. package/dist/entrypoints/alpha.d.ts +1 -1
  12. package/dist/entrypoints/alpha.d.ts.map +1 -1
  13. package/dist/entrypoints/alpha.js +5 -2
  14. package/dist/entrypoints/alpha.js.map +1 -1
  15. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +1 -25
  16. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  17. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  18. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +1 -2
  19. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  20. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  21. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +6 -18
  22. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  23. package/dist/feature-libraries/chunked-forest/codec/codecs.js +9 -16
  24. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  25. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
  26. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  27. package/dist/feature-libraries/index.d.ts +2 -2
  28. package/dist/feature-libraries/index.d.ts.map +1 -1
  29. package/dist/feature-libraries/index.js +3 -2
  30. package/dist/feature-libraries/index.js.map +1 -1
  31. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +39 -7
  32. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  33. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +22 -2
  34. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  35. package/dist/feature-libraries/modular-schema/genericFieldKind.js +1 -1
  36. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  37. package/dist/feature-libraries/modular-schema/index.d.ts +2 -1
  38. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  39. package/dist/feature-libraries/modular-schema/index.js +4 -1
  40. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  41. package/dist/feature-libraries/modular-schema/minimizeModularChange.d.ts +25 -0
  42. package/dist/feature-libraries/modular-schema/minimizeModularChange.d.ts.map +1 -0
  43. package/dist/feature-libraries/modular-schema/minimizeModularChange.js +29 -0
  44. package/dist/feature-libraries/modular-schema/minimizeModularChange.js.map +1 -0
  45. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  46. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +8 -1
  47. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  48. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  49. package/dist/feature-libraries/optional-field/optionalField.js +26 -3
  50. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  51. package/dist/feature-libraries/schemaChecker.d.ts +22 -3
  52. package/dist/feature-libraries/schemaChecker.d.ts.map +1 -1
  53. package/dist/feature-libraries/schemaChecker.js +48 -5
  54. package/dist/feature-libraries/schemaChecker.js.map +1 -1
  55. package/dist/feature-libraries/sequence-field/filterEdits.d.ts +12 -0
  56. package/dist/feature-libraries/sequence-field/filterEdits.d.ts.map +1 -0
  57. package/dist/feature-libraries/sequence-field/filterEdits.js +111 -0
  58. package/dist/feature-libraries/sequence-field/filterEdits.js.map +1 -0
  59. package/dist/feature-libraries/sequence-field/markQueue.d.ts +8 -3
  60. package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  61. package/dist/feature-libraries/sequence-field/markQueue.js +22 -8
  62. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  63. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  64. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  65. package/dist/feature-libraries/sequence-field/moveEffectTable.js +2 -6
  66. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  67. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +7 -6
  68. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  69. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +2 -4
  70. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  71. package/dist/index.d.ts +3 -2
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +6 -2
  74. package/dist/index.js.map +1 -1
  75. package/dist/packageVersion.d.ts +1 -1
  76. package/dist/packageVersion.d.ts.map +1 -1
  77. package/dist/packageVersion.js +1 -1
  78. package/dist/packageVersion.js.map +1 -1
  79. package/dist/shared-tree/independentView.d.ts +17 -4
  80. package/dist/shared-tree/independentView.d.ts.map +1 -1
  81. package/dist/shared-tree/independentView.js +11 -5
  82. package/dist/shared-tree/independentView.js.map +1 -1
  83. package/dist/shared-tree/index.d.ts +2 -1
  84. package/dist/shared-tree/index.d.ts.map +1 -1
  85. package/dist/shared-tree/index.js +3 -1
  86. package/dist/shared-tree/index.js.map +1 -1
  87. package/dist/shared-tree/schematizingTreeView.d.ts +9 -0
  88. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  89. package/dist/shared-tree/schematizingTreeView.js +29 -14
  90. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  91. package/dist/shared-tree/serializedChange.d.ts +41 -0
  92. package/dist/shared-tree/serializedChange.d.ts.map +1 -0
  93. package/dist/shared-tree/serializedChange.js +87 -0
  94. package/dist/shared-tree/serializedChange.js.map +1 -0
  95. package/dist/shared-tree/sharedTree.d.ts +13 -0
  96. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  97. package/dist/shared-tree/sharedTree.js +2 -0
  98. package/dist/shared-tree/sharedTree.js.map +1 -1
  99. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +7 -0
  100. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  101. package/dist/shared-tree/sharedTreeChangeFamily.js +8 -1
  102. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  103. package/dist/shared-tree/transactionMinimize.d.ts +35 -0
  104. package/dist/shared-tree/transactionMinimize.d.ts.map +1 -0
  105. package/dist/shared-tree/transactionMinimize.js +65 -0
  106. package/dist/shared-tree/transactionMinimize.js.map +1 -0
  107. package/dist/shared-tree/treeCheckout.d.ts +3 -1
  108. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  109. package/dist/shared-tree/treeCheckout.js +36 -62
  110. package/dist/shared-tree/treeCheckout.js.map +1 -1
  111. package/dist/shared-tree-core/editManager.d.ts +6 -3
  112. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  113. package/dist/shared-tree-core/editManager.js +35 -14
  114. package/dist/shared-tree-core/editManager.js.map +1 -1
  115. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +1 -1
  116. package/dist/shared-tree-core/editManagerFormatCommons.js +1 -1
  117. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  118. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts +1 -1
  119. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  120. package/dist/shared-tree-core/messageCodecVSharedBranches.js +8 -2
  121. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  122. package/dist/shared-tree-core/messageFormat.d.ts +1 -1
  123. package/dist/shared-tree-core/messageFormat.js +1 -1
  124. package/dist/shared-tree-core/messageFormat.js.map +1 -1
  125. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts +10 -1
  126. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  127. package/dist/shared-tree-core/messageFormatVSharedBranches.js +1 -0
  128. package/dist/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  129. package/dist/shared-tree-core/messageTypes.d.ts +1 -0
  130. package/dist/shared-tree-core/messageTypes.d.ts.map +1 -1
  131. package/dist/shared-tree-core/messageTypes.js.map +1 -1
  132. package/dist/shared-tree-core/sharedTreeCore.d.ts +9 -3
  133. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  134. package/dist/shared-tree-core/sharedTreeCore.js +24 -11
  135. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  136. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  137. package/dist/shared-tree-core/transaction.js +16 -2
  138. package/dist/shared-tree-core/transaction.js.map +1 -1
  139. package/dist/simple-tree/api/configuration.d.ts +32 -2
  140. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  141. package/dist/simple-tree/api/configuration.js +3 -1
  142. package/dist/simple-tree/api/configuration.js.map +1 -1
  143. package/dist/simple-tree/api/index.d.ts +2 -2
  144. package/dist/simple-tree/api/index.d.ts.map +1 -1
  145. package/dist/simple-tree/api/index.js +2 -2
  146. package/dist/simple-tree/api/index.js.map +1 -1
  147. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +13 -25
  148. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  149. package/dist/simple-tree/api/schemaCompatibilityTester.js +34 -45
  150. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  151. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +56 -15
  152. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  153. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  154. package/dist/simple-tree/api/schemaFactoryBeta.d.ts +0 -3
  155. package/dist/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  156. package/dist/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  157. package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts.map +1 -1
  158. package/dist/simple-tree/api/snapshotCompatibilityChecker.js +1 -2
  159. package/dist/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  160. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  161. package/dist/simple-tree/api/storedSchema.js +1 -2
  162. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  163. package/dist/simple-tree/api/tree.d.ts +80 -3
  164. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  165. package/dist/simple-tree/api/tree.js.map +1 -1
  166. package/dist/simple-tree/api/typesUnsafe.d.ts +2 -2
  167. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  168. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  169. package/dist/simple-tree/core/index.d.ts +1 -1
  170. package/dist/simple-tree/core/index.d.ts.map +1 -1
  171. package/dist/simple-tree/core/index.js +2 -1
  172. package/dist/simple-tree/core/index.js.map +1 -1
  173. package/dist/simple-tree/core/toStored.d.ts +72 -6
  174. package/dist/simple-tree/core/toStored.d.ts.map +1 -1
  175. package/dist/simple-tree/core/toStored.js +25 -1
  176. package/dist/simple-tree/core/toStored.js.map +1 -1
  177. package/dist/simple-tree/index.d.ts +3 -3
  178. package/dist/simple-tree/index.d.ts.map +1 -1
  179. package/dist/simple-tree/index.js +5 -6
  180. package/dist/simple-tree/index.js.map +1 -1
  181. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +83 -4
  182. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  183. package/dist/simple-tree/node-kinds/array/arrayNode.js +39 -0
  184. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  185. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  186. package/dist/simple-tree/prepareForInsertion.js +9 -0
  187. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  188. package/dist/simple-tree/simpleSchemaFormatV1.js +1 -1
  189. package/dist/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  190. package/dist/simple-tree/toStoredSchema.d.ts +11 -27
  191. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  192. package/dist/simple-tree/toStoredSchema.js +25 -33
  193. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  194. package/dist/treeFactory.js +1 -1
  195. package/dist/treeFactory.js.map +1 -1
  196. package/dist/util/breakable.d.ts +16 -1
  197. package/dist/util/breakable.d.ts.map +1 -1
  198. package/dist/util/breakable.js +9 -1
  199. package/dist/util/breakable.js.map +1 -1
  200. package/dist/util/compressedIds.d.ts +69 -2
  201. package/dist/util/compressedIds.d.ts.map +1 -1
  202. package/dist/util/compressedIds.js +32 -1
  203. package/dist/util/compressedIds.js.map +1 -1
  204. package/dist/util/index.d.ts +2 -2
  205. package/dist/util/index.d.ts.map +1 -1
  206. package/dist/util/index.js +2 -2
  207. package/dist/util/index.js.map +1 -1
  208. package/dist/util/nestedMap.d.ts.map +1 -1
  209. package/dist/util/nestedMap.js +16 -3
  210. package/dist/util/nestedMap.js.map +1 -1
  211. package/dist/util/nestedSet.d.ts +1 -1
  212. package/dist/util/nestedSet.d.ts.map +1 -1
  213. package/dist/util/nestedSet.js.map +1 -1
  214. package/dist/util/utils.d.ts +0 -6
  215. package/dist/util/utils.d.ts.map +1 -1
  216. package/dist/util/utils.js +1 -15
  217. package/dist/util/utils.js.map +1 -1
  218. package/docs/main/runtime-schema-upgrade.md +208 -0
  219. package/lib/componentApi.d.ts +198 -0
  220. package/lib/componentApi.d.ts.map +1 -0
  221. package/lib/componentApi.js +135 -0
  222. package/lib/componentApi.js.map +1 -0
  223. package/lib/entrypoints/alpha.d.ts +1 -1
  224. package/lib/entrypoints/alpha.d.ts.map +1 -1
  225. package/lib/entrypoints/alpha.js +1 -1
  226. package/lib/entrypoints/alpha.js.map +1 -1
  227. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +1 -25
  228. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  229. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +1 -1
  230. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  231. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +1 -2
  232. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  233. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  234. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +6 -18
  235. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  236. package/lib/feature-libraries/chunked-forest/codec/codecs.js +10 -17
  237. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  238. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
  239. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  240. package/lib/feature-libraries/index.d.ts +2 -2
  241. package/lib/feature-libraries/index.d.ts.map +1 -1
  242. package/lib/feature-libraries/index.js +1 -1
  243. package/lib/feature-libraries/index.js.map +1 -1
  244. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +39 -7
  245. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  246. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +21 -1
  247. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  248. package/lib/feature-libraries/modular-schema/genericFieldKind.js +1 -1
  249. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  250. package/lib/feature-libraries/modular-schema/index.d.ts +2 -1
  251. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  252. package/lib/feature-libraries/modular-schema/index.js +2 -1
  253. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  254. package/lib/feature-libraries/modular-schema/minimizeModularChange.d.ts +25 -0
  255. package/lib/feature-libraries/modular-schema/minimizeModularChange.d.ts.map +1 -0
  256. package/lib/feature-libraries/modular-schema/minimizeModularChange.js +25 -0
  257. package/lib/feature-libraries/modular-schema/minimizeModularChange.js.map +1 -0
  258. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  259. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +9 -2
  260. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  261. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  262. package/lib/feature-libraries/optional-field/optionalField.js +27 -4
  263. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  264. package/lib/feature-libraries/schemaChecker.d.ts +22 -3
  265. package/lib/feature-libraries/schemaChecker.d.ts.map +1 -1
  266. package/lib/feature-libraries/schemaChecker.js +48 -5
  267. package/lib/feature-libraries/schemaChecker.js.map +1 -1
  268. package/lib/feature-libraries/sequence-field/filterEdits.d.ts +12 -0
  269. package/lib/feature-libraries/sequence-field/filterEdits.d.ts.map +1 -0
  270. package/lib/feature-libraries/sequence-field/filterEdits.js +107 -0
  271. package/lib/feature-libraries/sequence-field/filterEdits.js.map +1 -0
  272. package/lib/feature-libraries/sequence-field/markQueue.d.ts +8 -3
  273. package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
  274. package/lib/feature-libraries/sequence-field/markQueue.js +22 -9
  275. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  276. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  277. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  278. package/lib/feature-libraries/sequence-field/moveEffectTable.js +2 -6
  279. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  280. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +7 -6
  281. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  282. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +2 -4
  283. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  284. package/lib/index.d.ts +3 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +3 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/packageVersion.d.ts +1 -1
  289. package/lib/packageVersion.d.ts.map +1 -1
  290. package/lib/packageVersion.js +1 -1
  291. package/lib/packageVersion.js.map +1 -1
  292. package/lib/shared-tree/independentView.d.ts +17 -4
  293. package/lib/shared-tree/independentView.d.ts.map +1 -1
  294. package/lib/shared-tree/independentView.js +9 -3
  295. package/lib/shared-tree/independentView.js.map +1 -1
  296. package/lib/shared-tree/index.d.ts +2 -1
  297. package/lib/shared-tree/index.d.ts.map +1 -1
  298. package/lib/shared-tree/index.js +1 -0
  299. package/lib/shared-tree/index.js.map +1 -1
  300. package/lib/shared-tree/schematizingTreeView.d.ts +9 -0
  301. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  302. package/lib/shared-tree/schematizingTreeView.js +31 -16
  303. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  304. package/lib/shared-tree/serializedChange.d.ts +41 -0
  305. package/lib/shared-tree/serializedChange.d.ts.map +1 -0
  306. package/lib/shared-tree/serializedChange.js +84 -0
  307. package/lib/shared-tree/serializedChange.js.map +1 -0
  308. package/lib/shared-tree/sharedTree.d.ts +13 -0
  309. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  310. package/lib/shared-tree/sharedTree.js +2 -0
  311. package/lib/shared-tree/sharedTree.js.map +1 -1
  312. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +7 -0
  313. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  314. package/lib/shared-tree/sharedTreeChangeFamily.js +7 -1
  315. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  316. package/lib/shared-tree/transactionMinimize.d.ts +35 -0
  317. package/lib/shared-tree/transactionMinimize.d.ts.map +1 -0
  318. package/lib/shared-tree/transactionMinimize.js +62 -0
  319. package/lib/shared-tree/transactionMinimize.js.map +1 -0
  320. package/lib/shared-tree/treeCheckout.d.ts +3 -1
  321. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  322. package/lib/shared-tree/treeCheckout.js +18 -44
  323. package/lib/shared-tree/treeCheckout.js.map +1 -1
  324. package/lib/shared-tree-core/editManager.d.ts +6 -3
  325. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  326. package/lib/shared-tree-core/editManager.js +36 -15
  327. package/lib/shared-tree-core/editManager.js.map +1 -1
  328. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +1 -1
  329. package/lib/shared-tree-core/editManagerFormatCommons.js +1 -1
  330. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  331. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts +1 -1
  332. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  333. package/lib/shared-tree-core/messageCodecVSharedBranches.js +8 -2
  334. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  335. package/lib/shared-tree-core/messageFormat.d.ts +1 -1
  336. package/lib/shared-tree-core/messageFormat.js +1 -1
  337. package/lib/shared-tree-core/messageFormat.js.map +1 -1
  338. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts +10 -1
  339. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  340. package/lib/shared-tree-core/messageFormatVSharedBranches.js +1 -0
  341. package/lib/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  342. package/lib/shared-tree-core/messageTypes.d.ts +1 -0
  343. package/lib/shared-tree-core/messageTypes.d.ts.map +1 -1
  344. package/lib/shared-tree-core/messageTypes.js.map +1 -1
  345. package/lib/shared-tree-core/sharedTreeCore.d.ts +9 -3
  346. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  347. package/lib/shared-tree-core/sharedTreeCore.js +25 -12
  348. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  349. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  350. package/lib/shared-tree-core/transaction.js +16 -2
  351. package/lib/shared-tree-core/transaction.js.map +1 -1
  352. package/lib/simple-tree/api/configuration.d.ts +32 -2
  353. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  354. package/lib/simple-tree/api/configuration.js +4 -2
  355. package/lib/simple-tree/api/configuration.js.map +1 -1
  356. package/lib/simple-tree/api/index.d.ts +2 -2
  357. package/lib/simple-tree/api/index.d.ts.map +1 -1
  358. package/lib/simple-tree/api/index.js +1 -1
  359. package/lib/simple-tree/api/index.js.map +1 -1
  360. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +13 -25
  361. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  362. package/lib/simple-tree/api/schemaCompatibilityTester.js +32 -43
  363. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  364. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +56 -15
  365. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  366. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  367. package/lib/simple-tree/api/schemaFactoryBeta.d.ts +0 -3
  368. package/lib/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  369. package/lib/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  370. package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts.map +1 -1
  371. package/lib/simple-tree/api/snapshotCompatibilityChecker.js +2 -3
  372. package/lib/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
  373. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  374. package/lib/simple-tree/api/storedSchema.js +2 -3
  375. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  376. package/lib/simple-tree/api/tree.d.ts +80 -3
  377. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  378. package/lib/simple-tree/api/tree.js.map +1 -1
  379. package/lib/simple-tree/api/typesUnsafe.d.ts +2 -2
  380. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  381. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  382. package/lib/simple-tree/core/index.d.ts +1 -1
  383. package/lib/simple-tree/core/index.d.ts.map +1 -1
  384. package/lib/simple-tree/core/index.js +1 -1
  385. package/lib/simple-tree/core/index.js.map +1 -1
  386. package/lib/simple-tree/core/toStored.d.ts +72 -6
  387. package/lib/simple-tree/core/toStored.d.ts.map +1 -1
  388. package/lib/simple-tree/core/toStored.js +24 -0
  389. package/lib/simple-tree/core/toStored.js.map +1 -1
  390. package/lib/simple-tree/index.d.ts +3 -3
  391. package/lib/simple-tree/index.d.ts.map +1 -1
  392. package/lib/simple-tree/index.js +3 -3
  393. package/lib/simple-tree/index.js.map +1 -1
  394. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +83 -4
  395. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  396. package/lib/simple-tree/node-kinds/array/arrayNode.js +39 -0
  397. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  398. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  399. package/lib/simple-tree/prepareForInsertion.js +9 -0
  400. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  401. package/lib/simple-tree/simpleSchemaFormatV1.js +1 -1
  402. package/lib/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  403. package/lib/simple-tree/toStoredSchema.d.ts +11 -27
  404. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  405. package/lib/simple-tree/toStoredSchema.js +24 -33
  406. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  407. package/lib/treeFactory.js +1 -1
  408. package/lib/treeFactory.js.map +1 -1
  409. package/lib/util/breakable.d.ts +16 -1
  410. package/lib/util/breakable.d.ts.map +1 -1
  411. package/lib/util/breakable.js +9 -1
  412. package/lib/util/breakable.js.map +1 -1
  413. package/lib/util/compressedIds.d.ts +69 -2
  414. package/lib/util/compressedIds.d.ts.map +1 -1
  415. package/lib/util/compressedIds.js +30 -0
  416. package/lib/util/compressedIds.js.map +1 -1
  417. package/lib/util/index.d.ts +2 -2
  418. package/lib/util/index.d.ts.map +1 -1
  419. package/lib/util/index.js +2 -2
  420. package/lib/util/index.js.map +1 -1
  421. package/lib/util/nestedMap.d.ts.map +1 -1
  422. package/lib/util/nestedMap.js +17 -4
  423. package/lib/util/nestedMap.js.map +1 -1
  424. package/lib/util/nestedSet.d.ts +1 -1
  425. package/lib/util/nestedSet.d.ts.map +1 -1
  426. package/lib/util/nestedSet.js.map +1 -1
  427. package/lib/util/utils.d.ts +0 -6
  428. package/lib/util/utils.d.ts.map +1 -1
  429. package/lib/util/utils.js +0 -13
  430. package/lib/util/utils.js.map +1 -1
  431. package/package.json +22 -22
  432. package/src/componentApi.ts +354 -0
  433. package/src/entrypoints/alpha.ts +6 -0
  434. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +6 -27
  435. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +1 -2
  436. package/src/feature-libraries/chunked-forest/codec/codecs.ts +17 -44
  437. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
  438. package/src/feature-libraries/index.ts +2 -0
  439. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +51 -7
  440. package/src/feature-libraries/modular-schema/genericFieldKind.ts +1 -1
  441. package/src/feature-libraries/modular-schema/index.ts +5 -2
  442. package/src/feature-libraries/modular-schema/minimizeModularChange.ts +33 -0
  443. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +16 -1
  444. package/src/feature-libraries/optional-field/optionalField.ts +43 -3
  445. package/src/feature-libraries/schemaChecker.ts +86 -9
  446. package/src/feature-libraries/sequence-field/filterEdits.ts +143 -0
  447. package/src/feature-libraries/sequence-field/markQueue.ts +28 -11
  448. package/src/feature-libraries/sequence-field/moveEffectTable.ts +2 -7
  449. package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +3 -5
  450. package/src/index.ts +6 -0
  451. package/src/packageVersion.ts +1 -1
  452. package/src/shared-tree/independentView.ts +35 -5
  453. package/src/shared-tree/index.ts +3 -0
  454. package/src/shared-tree/schematizingTreeView.ts +52 -20
  455. package/src/shared-tree/serializedChange.ts +127 -0
  456. package/src/shared-tree/sharedTree.ts +16 -0
  457. package/src/shared-tree/sharedTreeChangeFamily.ts +7 -1
  458. package/src/shared-tree/transactionMinimize.ts +74 -0
  459. package/src/shared-tree/treeCheckout.ts +42 -57
  460. package/src/shared-tree-core/editManager.ts +42 -6
  461. package/src/shared-tree-core/editManagerFormatCommons.ts +1 -1
  462. package/src/shared-tree-core/messageCodecVSharedBranches.ts +8 -1
  463. package/src/shared-tree-core/messageFormat.ts +1 -1
  464. package/src/shared-tree-core/messageFormatVSharedBranches.ts +10 -0
  465. package/src/shared-tree-core/messageTypes.ts +1 -0
  466. package/src/shared-tree-core/sharedTreeCore.ts +33 -10
  467. package/src/shared-tree-core/transaction.ts +19 -2
  468. package/src/simple-tree/api/configuration.ts +40 -2
  469. package/src/simple-tree/api/index.ts +2 -1
  470. package/src/simple-tree/api/schemaCompatibilityTester.ts +41 -49
  471. package/src/simple-tree/api/schemaFactoryAlpha.ts +56 -15
  472. package/src/simple-tree/api/schemaFactoryBeta.ts +0 -3
  473. package/src/simple-tree/api/snapshotCompatibilityChecker.ts +2 -3
  474. package/src/simple-tree/api/storedSchema.ts +2 -3
  475. package/src/simple-tree/api/tree.ts +82 -3
  476. package/src/simple-tree/api/typesUnsafe.ts +2 -1
  477. package/src/simple-tree/core/index.ts +2 -1
  478. package/src/simple-tree/core/toStored.ts +95 -8
  479. package/src/simple-tree/index.ts +4 -3
  480. package/src/simple-tree/node-kinds/array/arrayNode.ts +168 -4
  481. package/src/simple-tree/prepareForInsertion.ts +12 -0
  482. package/src/simple-tree/simpleSchemaFormatV1.ts +1 -1
  483. package/src/simple-tree/toStoredSchema.ts +44 -39
  484. package/src/treeFactory.ts +1 -1
  485. package/src/util/breakable.ts +8 -1
  486. package/src/util/compressedIds.ts +90 -2
  487. package/src/util/index.ts +3 -1
  488. package/src/util/nestedMap.ts +21 -4
  489. package/src/util/nestedSet.ts +1 -1
  490. package/src/util/utils.ts +0 -18
@@ -0,0 +1,143 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { ChangeAtomId } from "../../core/index.js";
7
+ import type { RangeQueryResult } from "../../util/index.js";
8
+ import { EditFilterStatus, type EditFilterFunc } from "../modular-schema/index.js";
9
+ import { MarkListFactory } from "./markListFactory.js";
10
+ import { NoopMarkType, type Changeset, type Mark } from "./types.js";
11
+ import { getDetachedNodeId, getDetachOutputCellId, omitMarkEffect } from "./utils.js";
12
+ import { MarkQueueBase } from "./markQueue.js";
13
+ import { unreachableCase } from "@fluidframework/core-utils/internal";
14
+
15
+ export function filterEdits(
16
+ change: Changeset,
17
+ options: {
18
+ filterDetach: EditFilterFunc;
19
+ filterAttach: EditFilterFunc;
20
+ preserveOtherEdits: boolean;
21
+ },
22
+ ): Changeset {
23
+ const factory = new MarkListFactory();
24
+ const queue = new MarkQueueBase(change);
25
+ for (let mark = queue.peek(); mark !== undefined; mark = queue.peek()) {
26
+ const filtered = filterMark(
27
+ mark,
28
+ options.filterDetach,
29
+ options.filterAttach,
30
+ options.preserveOtherEdits,
31
+ );
32
+ factory.push(filtered);
33
+ queue.dequeueUpTo(filtered.count);
34
+ }
35
+
36
+ return factory.list;
37
+ }
38
+
39
+ function filterMark(
40
+ mark: Mark,
41
+ filterDetach: (
42
+ id: ChangeAtomId,
43
+ count: number,
44
+ endpoint?: ChangeAtomId,
45
+ ) => RangeQueryResult<EditFilterStatus>,
46
+ filterAttach: (
47
+ id: ChangeAtomId,
48
+ count: number,
49
+ endpoint?: ChangeAtomId,
50
+ ) => RangeQueryResult<EditFilterStatus>,
51
+ preserveOtherEdits: boolean,
52
+ ): Mark {
53
+ const type = mark.type;
54
+ switch (type) {
55
+ case "Insert":
56
+ case "MoveIn": {
57
+ if (mark.cellId === undefined) {
58
+ return preserveOtherEdits ? mark : omitMarkEffect(mark);
59
+ }
60
+
61
+ const endpoint = mark.type === "MoveIn" ? mark.finalEndpoint : undefined;
62
+ const result = filterAttach(mark.cellId, mark.count, endpoint);
63
+
64
+ let filtered: Mark;
65
+ switch (result.value) {
66
+ case EditFilterStatus.Preserve: {
67
+ filtered = mark;
68
+ break;
69
+ }
70
+ case EditFilterStatus.PreserveWithoutMove: {
71
+ // KLUDGE: PreserveWithoutMove requires us to return a mark which attaches the node
72
+ // using the detach ID of the move (the endpoint ID).
73
+ // Insert marks use the cell ID as the attach ID, so we must change the cell ID here.
74
+ // This could be a problem if there were references to the old cell ID outside this changeset,
75
+ // but PreserveWithoutMove is only used for transaction minimization, where that is not a problem.
76
+ const newCellId = endpoint ?? { revision: mark.revision, localId: mark.id };
77
+ filtered = {
78
+ type: "Insert",
79
+ count: result.length,
80
+ cellId: newCellId,
81
+ revision: mark.revision,
82
+ id: mark.id,
83
+ };
84
+ break;
85
+ }
86
+ case EditFilterStatus.Remove: {
87
+ filtered = omitMarkEffect(mark);
88
+ break;
89
+ }
90
+ default: {
91
+ unreachableCase(result.value);
92
+ }
93
+ }
94
+
95
+ return { ...filtered, count: result.length };
96
+ }
97
+ case "Remove":
98
+ case "MoveOut": {
99
+ const detachId = getDetachedNodeId(mark);
100
+ const endpoint = mark.type === "MoveOut" ? mark.finalEndpoint : undefined;
101
+ const result = filterDetach(detachId, mark.count, endpoint);
102
+
103
+ let filtered: Mark;
104
+ switch (result.value) {
105
+ case EditFilterStatus.Preserve: {
106
+ filtered = mark;
107
+ break;
108
+ }
109
+ case EditFilterStatus.PreserveWithoutMove: {
110
+ const outputCellId = getDetachOutputCellId(mark);
111
+ filtered = {
112
+ type: "Remove",
113
+ count: mark.count,
114
+ revision: outputCellId.revision,
115
+ id: outputCellId.localId,
116
+ };
117
+
118
+ if (mark.changes !== undefined) {
119
+ filtered.changes = mark.changes;
120
+ }
121
+
122
+ break;
123
+ }
124
+ case EditFilterStatus.Remove: {
125
+ filtered = omitMarkEffect(mark);
126
+ break;
127
+ }
128
+ default: {
129
+ unreachableCase(result.value);
130
+ }
131
+ }
132
+ return { ...filtered, count: result.length };
133
+ }
134
+ case NoopMarkType:
135
+ case "Rename":
136
+ case "AttachAndDetach": {
137
+ return preserveOtherEdits ? mark : omitMarkEffect(mark);
138
+ }
139
+ default: {
140
+ unreachableCase(type);
141
+ }
142
+ }
143
+ }
@@ -3,20 +3,17 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, oob } from "@fluidframework/core-utils/internal";
6
+ import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
- import { type MoveEffectTable, splitMarkForMoveEffects } from "./moveEffectTable.js";
8
+ import { getFirstMoveEffectLength, type MoveEffectTable } from "./moveEffectTable.js";
9
9
  import type { Mark } from "./types.js";
10
10
  import { splitMark } from "./utils.js";
11
11
 
12
- export class MarkQueue {
12
+ export class MarkQueueBase {
13
13
  private readonly stack: Mark[] = [];
14
14
  private index = 0;
15
15
 
16
- public constructor(
17
- private readonly list: readonly Mark[],
18
- private readonly moveEffects: MoveEffectTable,
19
- ) {
16
+ public constructor(private readonly list: readonly Mark[]) {
20
17
  this.list = list;
21
18
  }
22
19
 
@@ -36,11 +33,14 @@ export class MarkQueue {
36
33
  return undefined;
37
34
  }
38
35
 
39
- const splitMarks = splitMarkForMoveEffects(mark, this.moveEffects);
40
- for (let i = splitMarks.length - 1; i > 0; i--) {
41
- this.stack.push(splitMarks[i] ?? oob());
36
+ const splitLength = this.getLengthForSplit(mark);
37
+ if (splitLength < mark.count) {
38
+ const [part1, part2] = splitMark(mark, splitLength);
39
+ this.stack.push(part2);
40
+ return part1;
42
41
  }
43
- return splitMarks[0];
42
+
43
+ return mark;
44
44
  }
45
45
 
46
46
  /**
@@ -66,4 +66,21 @@ export class MarkQueue {
66
66
  }
67
67
  return mark;
68
68
  }
69
+
70
+ protected getLengthForSplit(mark: Mark): number {
71
+ return mark.count;
72
+ }
73
+ }
74
+
75
+ export class MarkQueue extends MarkQueueBase {
76
+ public constructor(
77
+ list: readonly Mark[],
78
+ private readonly moveEffects: MoveEffectTable,
79
+ ) {
80
+ super(list);
81
+ }
82
+
83
+ protected override getLengthForSplit(mark: Mark): number {
84
+ return getFirstMoveEffectLength(mark, mark.count, this.moveEffects);
85
+ }
69
86
  }
@@ -15,7 +15,7 @@ import {
15
15
 
16
16
  import type { MoveMarkEffect } from "./helperTypes.js";
17
17
  import type { CellMark, Detach, Mark, MarkEffect, MoveId, MoveIn, MoveOut } from "./types.js";
18
- import { isAttachAndDetachEffect, splitMark, splitMarkEffect } from "./utils.js";
18
+ import { isAttachAndDetachEffect, splitMarkEffect } from "./utils.js";
19
19
 
20
20
  export type MoveEffectTable = CrossFieldManager<MoveEffect>;
21
21
 
@@ -168,12 +168,7 @@ function adjustMoveEffectBasis(effect: MoveEffectWithBasis, newBasis: MoveId): M
168
168
  return adjusted;
169
169
  }
170
170
 
171
- export function splitMarkForMoveEffects(mark: Mark, effects: MoveEffectTable): Mark[] {
172
- const length = getFirstMoveEffectLength(mark, mark.count, effects);
173
- return length < mark.count ? splitMark(mark, length) : [mark];
174
- }
175
-
176
- function getFirstMoveEffectLength(
171
+ export function getFirstMoveEffectLength(
177
172
  markEffect: MarkEffect,
178
173
  count: number,
179
174
  effects: MoveEffectTable,
@@ -6,12 +6,12 @@
6
6
  import type { FieldChangeRebaser } from "../modular-schema/index.js";
7
7
 
8
8
  import { compose } from "./compose.js";
9
+ import { filterEdits } from "./filterEdits.js";
9
10
  import { invert } from "./invert.js";
10
11
  import { prune } from "./prune.js";
11
12
  import { rebase } from "./rebase.js";
12
13
  import { replaceRevisions } from "./replaceRevisions.js";
13
14
  import type { Changeset } from "./types.js";
14
- import { omitMarkEffect } from "./utils.js";
15
15
 
16
16
  export type SequenceChangeRebaser = FieldChangeRebaser<Changeset>;
17
17
 
@@ -21,7 +21,5 @@ export const sequenceFieldChangeRebaser = {
21
21
  rebase,
22
22
  prune,
23
23
  replaceRevisions,
24
- mute: (change: Changeset): Changeset => {
25
- return change.map((mark) => omitMarkEffect(mark));
26
- },
27
- };
24
+ filterEdits,
25
+ } as const;
package/src/index.ts CHANGED
@@ -78,12 +78,14 @@ export {
78
78
  type TreeIdentifierUtils,
79
79
  independentView,
80
80
  type IndependentViewOptions,
81
+ type IndependentViewTelemetryOptions,
81
82
  createIndependentTreeBeta,
82
83
  createIndependentTreeAlpha,
83
84
  type CreateIndependentTreeAlphaOptions,
84
85
  ForestTypeOptimized,
85
86
  ForestTypeExpensiveDebug,
86
87
  ForestTypeReference,
88
+ minimize,
87
89
  } from "./shared-tree/index.js";
88
90
 
89
91
  export {
@@ -97,6 +99,7 @@ export {
97
99
  type TreeNodeSchema,
98
100
  TreeViewConfiguration,
99
101
  type ITreeViewConfiguration,
102
+ type ITreeViewConfigurationAlpha,
100
103
  type ITreeConfigurationOptions,
101
104
  type TreeView,
102
105
  type TreeViewEvents,
@@ -332,6 +335,8 @@ export {
332
335
  type ErasedNode,
333
336
  type ErasedSchemaSubclassable,
334
337
  type SnapshotSchemaCompatibilityOptions,
338
+ StagedSchemaUpgradePolicy,
339
+ type StagedSchemaUpgradePolicyFactory,
335
340
  type ArrayPlaceAnchor,
336
341
  createArrayInsertionAnchor,
337
342
  type WithValue,
@@ -415,3 +420,4 @@ export {
415
420
  utf16LengthForCodePoints,
416
421
  } from "./text/index.js";
417
422
  export { ExtensibleUnionNode } from "./extensibleUnionNode.js";
423
+ export { Component } from "./componentApi.js";
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.111.0";
9
+ export const pkgVersion = "2.113.0-411909";
@@ -3,12 +3,16 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { IFluidHandle } from "@fluidframework/core-interfaces";
6
+ import type { IFluidHandle, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
7
7
  import { assert } from "@fluidframework/core-utils/internal";
8
8
  import {
9
9
  type IIdCompressor,
10
10
  createIdCompressor,
11
11
  } from "@fluidframework/id-compressor/internal";
12
+ import {
13
+ createChildLogger,
14
+ extractTelemetryLoggerExt,
15
+ } from "@fluidframework/telemetry-utils/internal";
12
16
 
13
17
  import type { CodecWriteOptions, ICodecOptions } from "../codec/index.js";
14
18
  import {
@@ -22,8 +26,8 @@ import {
22
26
  FieldBatchDecodingContext,
23
27
  defaultIncrementalEncodingPolicy,
24
28
  schemaCodecBuilder,
29
+ combineChunks,
25
30
  } from "../feature-libraries/index.js";
26
- import { combineChunks } from "../feature-libraries/index.js";
27
31
  import type {
28
32
  TreeViewConfiguration,
29
33
  ImplicitFieldSchema,
@@ -52,11 +56,28 @@ import {
52
56
  } from "./sharedTree.js";
53
57
  import { createTreeCheckout } from "./treeCheckout.js";
54
58
 
59
+ /**
60
+ * Options for supplying a telemetry logger to an independent tree view.
61
+ * @remarks
62
+ * Events emitted by the independent tree are tagged with the `independentView` namespace.
63
+ * If no logger is provided, telemetry events are dropped.
64
+ * @alpha @input
65
+ */
66
+ export interface IndependentViewTelemetryOptions {
67
+ /**
68
+ * Optional logger for telemetry.
69
+ */
70
+ readonly logger?: ITelemetryBaseLogger | undefined;
71
+ }
72
+
55
73
  /**
56
74
  * {@link independentView} options.
57
75
  * @alpha @input
58
76
  */
59
- export interface IndependentViewOptions extends ForestOptions, Partial<CodecWriteOptions> {
77
+ export interface IndependentViewOptions
78
+ extends ForestOptions,
79
+ Partial<CodecWriteOptions>,
80
+ IndependentViewTelemetryOptions {
60
81
  /**
61
82
  * Optional ID compressor for generating and compressing identifiers.
62
83
  * If not provided, a new one will be created.
@@ -69,6 +90,7 @@ export interface IndependentViewOptions extends ForestOptions, Partial<CodecWrit
69
90
  * @alpha
70
91
  */
71
92
  export type CreateIndependentTreeAlphaOptions = ForestOptions &
93
+ IndependentViewTelemetryOptions &
72
94
  (
73
95
  | (IndependentViewOptions & {
74
96
  /**
@@ -120,7 +142,7 @@ export function independentView<const TSchema extends ImplicitFieldSchema>(
120
142
  */
121
143
  export function independentInitializedView<const TSchema extends ImplicitFieldSchema>(
122
144
  config: TreeViewConfiguration<TSchema>,
123
- options: ForestOptions & ICodecOptions,
145
+ options: ForestOptions & ICodecOptions & IndependentViewTelemetryOptions,
124
146
  content: ViewContent,
125
147
  ): TreeViewAlpha<TSchema> {
126
148
  return createIndependentTreeAlpha({ ...options, content }).viewWith(
@@ -202,7 +224,13 @@ export function createIndependentTreeBeta<const TSchema extends ImplicitFieldSch
202
224
  export function createIndependentTreeAlpha<const TSchema extends ImplicitFieldSchema>(
203
225
  options?: CreateIndependentTreeAlphaOptions,
204
226
  ): ViewableTree & Pick<ITreeAlpha, "exportVerbose" | "exportSimpleSchema"> {
205
- const breaker = new Breakable("independentView");
227
+ const logger = extractTelemetryLoggerExt(
228
+ createChildLogger({
229
+ logger: options?.logger,
230
+ namespace: "independentView",
231
+ }),
232
+ );
233
+ const breaker = new Breakable("independentView", logger);
206
234
  const idCompressor: IIdCompressor =
207
235
  options?.idCompressor ?? options?.content?.idCompressor ?? createIdCompressor();
208
236
  const mintRevisionTag = (): RevisionTag => idCompressor.generateCompressedId();
@@ -223,6 +251,7 @@ export function createIndependentTreeAlpha<const TSchema extends ImplicitFieldSc
223
251
  forest,
224
252
  schema: schemaRepository,
225
253
  breaker,
254
+ logger,
226
255
  codecOptions: options,
227
256
  });
228
257
 
@@ -235,6 +264,7 @@ export function createIndependentTreeAlpha<const TSchema extends ImplicitFieldSc
235
264
  // (finalized compressed ids or strings), so summary-style decode is correct.
236
265
  const context = FieldBatchDecodingContext.forSummary({
237
266
  idCompressor,
267
+ healing: undefined,
238
268
  });
239
269
  const fieldCursors = fieldBatchCodec.decode(
240
270
  options.content.tree as JsonCompatibleReadOnly,
@@ -43,6 +43,8 @@ export type {
43
43
  SharedTreeEditBuilder,
44
44
  } from "./sharedTreeEditBuilder.js";
45
45
 
46
+ export { minimize } from "./transactionMinimize.js";
47
+
46
48
  export { Tree } from "./tree.js";
47
49
  export type { RunTransaction } from "./tree.js";
48
50
 
@@ -57,6 +59,7 @@ export {
57
59
  type ViewContent,
58
60
  independentView,
59
61
  type IndependentViewOptions,
62
+ type IndependentViewTelemetryOptions,
60
63
  createIndependentTreeBeta,
61
64
  createIndependentTreeAlpha,
62
65
  type CreateIndependentTreeAlphaOptions,
@@ -23,6 +23,7 @@ import {
23
23
  type FlexTreeUnknownUnboxed,
24
24
  FieldKinds,
25
25
  type FlexTreeRequiredField,
26
+ allowsRepoSuperset,
26
27
  } from "../feature-libraries/index.js";
27
28
  import {
28
29
  type ImplicitFieldSchema,
@@ -32,8 +33,9 @@ import {
32
33
  tryGetTreeNodeForField,
33
34
  setField,
34
35
  normalizeFieldSchema,
35
- SchemaCompatibilityTester,
36
+ checkSchemaCompatibility,
36
37
  type InsertableContent,
38
+ type StagedSchemaUpgradePolicy,
37
39
  type TreeViewConfiguration,
38
40
  type TreeViewAlpha,
39
41
  type InsertableField,
@@ -57,6 +59,7 @@ import {
57
59
  toInitialSchema,
58
60
  toUpgradeSchema,
59
61
  type TreeBranchAlpha,
62
+ type TreeSchema,
60
63
  } from "../simple-tree/index.js";
61
64
  import {
62
65
  type Breakable,
@@ -98,7 +101,14 @@ export class SchematizingSimpleTreeView<
98
101
  IEmitter<TreeViewEvents & TreeBranchEvents> &
99
102
  HasListeners<TreeViewEvents & TreeBranchEvents> = createEmitter();
100
103
 
101
- private readonly viewSchema: SchemaCompatibilityTester;
104
+ /**
105
+ * The schema for this view, captured at construction time for compatibility checking.
106
+ */
107
+ private readonly viewSchema: TreeSchema;
108
+ /**
109
+ * Stored-schema generation policy from the view configuration, frozen at construction time.
110
+ */
111
+ private readonly stagedUpgradePolicy: StagedSchemaUpgradePolicy;
102
112
 
103
113
  /**
104
114
  * Events to unregister upon flex-tree view disposal.
@@ -141,9 +151,18 @@ export class SchematizingSimpleTreeView<
141
151
 
142
152
  this.rootFieldSchema = normalizeFieldSchema(config.schema);
143
153
 
144
- const configAlpha = new TreeViewConfigurationAlpha({ schema: config.schema });
154
+ const stagedUpgradePolicy =
155
+ config instanceof TreeViewConfigurationAlpha ? config.stagedUpgradePolicy : undefined;
156
+ const configAlpha = new TreeViewConfigurationAlpha({
157
+ schema: config.schema,
158
+ enableSchemaValidation: config.enableSchemaValidation,
159
+ preventAmbiguity: config.preventAmbiguity,
160
+ stagedUpgradePolicy,
161
+ });
162
+ this.stagedUpgradePolicy = configAlpha.stagedUpgradePolicy;
145
163
 
146
- this.viewSchema = new SchemaCompatibilityTester(configAlpha);
164
+ // Store viewSchema directly from the configuration (TreeViewConfigurationAlpha implements TreeSchema)
165
+ this.viewSchema = configAlpha;
147
166
  // This must be initialized before `update` can be called.
148
167
  this.currentCompatibility = {
149
168
  canView: false,
@@ -188,7 +207,7 @@ export class SchematizingSimpleTreeView<
188
207
  }
189
208
 
190
209
  this.runSchemaEdit(() => {
191
- const schema = toInitialSchema(this.config.schema);
210
+ const schema = toInitialSchema(this.config.schema, this.stagedUpgradePolicy);
192
211
  // This has to be the contextless version, since when "initialize" is called (right after this),
193
212
  // it will do a schema change which would dispose of the current context (see inside `update`).
194
213
  // Thus using the current context (if any) would hydrate nodes then
@@ -246,19 +265,18 @@ export class SchematizingSimpleTreeView<
246
265
  public upgradeSchema(): void {
247
266
  this.ensureUndisposed();
248
267
 
249
- const compatibility = this.compatibility;
250
- if (compatibility.isEquivalent) {
251
- // No-op
252
- return;
253
- }
254
-
255
- if (!compatibility.canUpgrade) {
268
+ const newSchema = toUpgradeSchema(this.viewSchema.root, this.stagedUpgradePolicy);
269
+ const storedSchema = this.checkout.storedSchema.clone();
270
+ if (!allowsRepoSuperset(defaultSchemaPolicy, storedSchema, newSchema)) {
256
271
  throw new UsageError(
257
- "Existing stored schema cannot be upgraded (see TreeView.compatibility.canUpgrade).",
272
+ "Existing stored schema cannot be upgraded to the requested schema (see TreeView.compatibility.canUpgrade).",
258
273
  );
259
274
  }
275
+ if (allowsRepoSuperset(defaultSchemaPolicy, newSchema, storedSchema)) {
276
+ // No-op
277
+ return;
278
+ }
260
279
 
261
- const newSchema = toUpgradeSchema(this.viewSchema.viewSchema.root);
262
280
  this.runSchemaEdit(() => this.checkout.updateSchema(newSchema));
263
281
  }
264
282
 
@@ -347,12 +365,8 @@ export class SchematizingSimpleTreeView<
347
365
  private update(): void {
348
366
  this.disposeFlexView();
349
367
 
350
- const compatibility = this.viewSchema.checkCompatibility(this.checkout.storedSchema);
351
-
352
- this.currentCompatibility = {
353
- ...compatibility,
354
- canInitialize: canInitialize(this.checkout),
355
- };
368
+ const compatibility = this.computeCompatibility();
369
+ this.currentCompatibility = compatibility;
356
370
 
357
371
  const anchors = this.checkout.forest.anchors;
358
372
  const slots = anchors.slots;
@@ -423,6 +437,18 @@ export class SchematizingSimpleTreeView<
423
437
  }
424
438
  }
425
439
 
440
+ private computeCompatibility(): SchemaCompatibilityStatus {
441
+ const compatibility = checkSchemaCompatibility(
442
+ this.viewSchema,
443
+ this.checkout.storedSchema,
444
+ this.stagedUpgradePolicy,
445
+ );
446
+ return {
447
+ ...compatibility,
448
+ canInitialize: canInitialize(this.checkout),
449
+ };
450
+ }
451
+
426
452
  private runSchemaEdit(edit: () => void): void {
427
453
  this.midUpgrade = true;
428
454
  try {
@@ -533,5 +559,11 @@ export class SchematizingSimpleTreeView<
533
559
  return this.checkout.isMissingEditsFrom(context);
534
560
  }
535
561
 
562
+ public computeNetChangeIfRebasedOnto(
563
+ context: TreeBranchAlpha,
564
+ ): JsonCompatibleReadOnly | undefined {
565
+ return this.checkout.computeNetChangeIfRebasedOnto(context);
566
+ }
567
+
536
568
  // #endregion Branching
537
569
  }
@@ -0,0 +1,127 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { IIdCompressor, SessionId } from "@fluidframework/id-compressor";
7
+ import { isStableId } from "@fluidframework/id-compressor/internal";
8
+ import { UsageError } from "@fluidframework/telemetry-utils/internal";
9
+
10
+ import {
11
+ type ChangeFamily,
12
+ type RevisionTag,
13
+ tagChange,
14
+ type ChangeEncodingContext,
15
+ type TaggedChange,
16
+ } from "../core/index.js";
17
+ import type { JsonCompatibleReadOnly } from "../util/index.js";
18
+
19
+ import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
20
+ import type { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
21
+ import { SharedTreeChangeFormatVersion } from "./sharedTreeChangeCodecs.js";
22
+
23
+ /**
24
+ * Represents a serialized change for SharedTree.
25
+ *
26
+ * Data in this format is not expected to be durable beyond the scope of a single session.
27
+ */
28
+ interface SerializedChange {
29
+ readonly version: 1;
30
+ readonly revision: RevisionTag;
31
+ readonly change: JsonCompatibleReadOnly;
32
+ readonly originatorId: SessionId;
33
+ }
34
+
35
+ function isSerializedChangeV1(value: unknown): value is SerializedChange {
36
+ if (typeof value !== "object" || value === null) {
37
+ return false;
38
+ }
39
+ const change = value as Partial<SerializedChange>;
40
+ return (
41
+ change.version === 1 &&
42
+ (change.revision === "root" || typeof change.revision === "number") &&
43
+ typeof change.originatorId === "string" &&
44
+ isStableId(change.originatorId) &&
45
+ change.change !== undefined
46
+ );
47
+ }
48
+
49
+ function encodeSerializedChangeV1(
50
+ idCompressor: IIdCompressor,
51
+ changeFamily: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,
52
+ change: SharedTreeChange,
53
+ changeRevision: RevisionTag,
54
+ contextRevision?: RevisionTag,
55
+ ): JsonCompatibleReadOnly {
56
+ const context: ChangeEncodingContext = {
57
+ idCompressor,
58
+ originatorId: idCompressor.localSessionId,
59
+ revision: contextRevision,
60
+ isSummary: false,
61
+ };
62
+ const encodedChange = changeFamily.codecs
63
+ .resolve(SharedTreeChangeFormatVersion.v4)
64
+ .encode(change, context);
65
+
66
+ return {
67
+ version: 1,
68
+ revision: changeRevision,
69
+ originatorId: idCompressor.localSessionId,
70
+ change: encodedChange,
71
+ } satisfies SerializedChange;
72
+ }
73
+
74
+ function decodeSerializedChangeV1(
75
+ idCompressor: IIdCompressor,
76
+ changeFamily: ChangeFamily<SharedTreeEditBuilder, SharedTreeChange>,
77
+ serializedChange: JsonCompatibleReadOnly,
78
+ ): TaggedChange<SharedTreeChange> {
79
+ if (!isSerializedChangeV1(serializedChange)) {
80
+ throw new UsageError(`Cannot apply change. Invalid serialized change format.`);
81
+ }
82
+ const { revision, originatorId, change } = serializedChange;
83
+ if (originatorId !== idCompressor.localSessionId) {
84
+ throw new UsageError(
85
+ `Cannot apply change. A serialized changed must be applied to the same SharedTree as it was created from.`,
86
+ );
87
+ }
88
+ const context: ChangeEncodingContext = {
89
+ idCompressor,
90
+ originatorId: idCompressor.localSessionId,
91
+ revision,
92
+ isSummary: false,
93
+ };
94
+ const treeChange = changeFamily.codecs
95
+ .resolve(SharedTreeChangeFormatVersion.v4)
96
+ .decode(change, context);
97
+ return tagChange(treeChange, revision);
98
+ }
99
+
100
+ /**
101
+ * Provides utilities for serializing and deserializing SharedTree changes.
102
+ *
103
+ * @remarks Such changes are not expected to be durable beyond the scope of a single session.
104
+ */
105
+ export const SerializedChange = {
106
+ /** Utilities for version 1 of the serialized change format. */
107
+ V1: {
108
+ /**
109
+ * Encodes a SharedTree change into the version 1 serialized change format.
110
+ * @param idCompressor - The ID compressor to use for encoding.
111
+ * @param changeFamily - The change family to use for encoding.
112
+ * @param change - The change to encode.
113
+ * @param changeRevision - The revision tag for the change.
114
+ * @param contextRevision - The optional context revision tag.
115
+ * @returns The encoded change in the version 1 serialized change format.
116
+ */
117
+ encode: encodeSerializedChangeV1,
118
+ /**
119
+ * Decodes a version 1 serialized change into a SharedTree change.
120
+ * @param idCompressor - The ID compressor to use for decoding.
121
+ * @param changeFamily - The change family to use for decoding.
122
+ * @param serializedChange - The serialized change to decode.
123
+ * @returns The decoded SharedTree change.
124
+ */
125
+ decode: decodeSerializedChangeV1,
126
+ },
127
+ } as const;