@fluidframework/tree 2.22.1 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/.vscode/extensions.json +1 -0
  2. package/CHANGELOG.md +47 -0
  3. package/api-report/tree.alpha.api.md +31 -0
  4. package/dist/alpha.d.ts +1 -0
  5. package/dist/codec/codec.js +3 -3
  6. package/dist/codec/codec.js.map +1 -1
  7. package/dist/codec/discriminatedUnions.d.ts.map +1 -1
  8. package/dist/codec/discriminatedUnions.js +1 -1
  9. package/dist/codec/discriminatedUnions.js.map +1 -1
  10. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  11. package/dist/core/schema-stored/schema.js +3 -3
  12. package/dist/core/schema-stored/schema.js.map +1 -1
  13. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  14. package/dist/core/tree/anchorSet.js +18 -13
  15. package/dist/core/tree/anchorSet.js.map +1 -1
  16. package/dist/core/tree/treeTextFormat.js +1 -1
  17. package/dist/core/tree/treeTextFormat.js.map +1 -1
  18. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  19. package/dist/feature-libraries/chunked-forest/basicChunk.js +11 -8
  20. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  21. package/dist/feature-libraries/chunked-forest/chunkTree.js +2 -2
  22. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  23. package/dist/feature-libraries/chunked-forest/chunkedForest.js +3 -3
  24. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  25. package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +2 -2
  26. package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
  27. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  28. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +4 -3
  29. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  30. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js +2 -2
  31. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  32. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncoding.d.ts.map +1 -1
  33. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js +3 -3
  34. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js.map +1 -1
  35. package/dist/feature-libraries/chunked-forest/emptyChunk.js +14 -14
  36. package/dist/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
  37. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  38. package/dist/feature-libraries/chunked-forest/uniformChunk.js +6 -4
  39. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  40. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
  41. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  42. package/dist/feature-libraries/default-schema/schemaChecker.js +1 -1
  43. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  44. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  45. package/dist/feature-libraries/flex-tree/lazyField.js +4 -3
  46. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  47. package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  48. package/dist/feature-libraries/flex-tree/lazyNode.js +5 -4
  49. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  50. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  51. package/dist/feature-libraries/indexing/anchorTreeIndex.js +1 -1
  52. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  53. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  54. package/dist/feature-libraries/modular-schema/comparison.js +6 -4
  55. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  56. package/dist/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
  57. package/dist/feature-libraries/modular-schema/isNeverTree.js +4 -4
  58. package/dist/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  60. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  61. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  62. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +10 -11
  63. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  64. package/dist/feature-libraries/node-key/mockNodeKeyManager.js +1 -1
  65. package/dist/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
  66. package/dist/feature-libraries/object-forest/objectForest.js +1 -1
  67. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  68. package/dist/feature-libraries/schema-index/codec.js +1 -1
  69. package/dist/feature-libraries/schema-index/codec.js.map +1 -1
  70. package/dist/feature-libraries/sequence-field/compose.js +1 -1
  71. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  72. package/dist/feature-libraries/sequence-field/invert.js +1 -1
  73. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  74. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  75. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  76. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  77. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  78. package/dist/feature-libraries/sequence-field/utils.js +1 -1
  79. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  80. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  81. package/dist/feature-libraries/treeCursorUtils.js +6 -4
  82. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  83. package/dist/index.d.ts +3 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +5 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/jsonDomainSchema.d.ts +113 -0
  88. package/dist/jsonDomainSchema.d.ts.map +1 -0
  89. package/dist/jsonDomainSchema.js +101 -0
  90. package/dist/jsonDomainSchema.js.map +1 -0
  91. package/dist/packageVersion.d.ts +1 -1
  92. package/dist/packageVersion.js +1 -1
  93. package/dist/packageVersion.js.map +1 -1
  94. package/dist/serializableDomainSchema.d.ts +108 -0
  95. package/dist/serializableDomainSchema.d.ts.map +1 -0
  96. package/dist/serializableDomainSchema.js +90 -0
  97. package/dist/serializableDomainSchema.js.map +1 -0
  98. package/dist/shared-tree/index.d.ts +1 -1
  99. package/dist/shared-tree/index.d.ts.map +1 -1
  100. package/dist/shared-tree/index.js.map +1 -1
  101. package/dist/shared-tree/schematizeTree.js +1 -1
  102. package/dist/shared-tree/schematizeTree.js.map +1 -1
  103. package/dist/shared-tree/sharedTree.d.ts +37 -20
  104. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  105. package/dist/shared-tree/sharedTree.js +17 -17
  106. package/dist/shared-tree/sharedTree.js.map +1 -1
  107. package/dist/shared-tree/sharedTreeChangeFamily.js +1 -1
  108. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  109. package/dist/shared-tree/treeApiAlpha.d.ts.map +1 -1
  110. package/dist/shared-tree/treeApiAlpha.js +4 -4
  111. package/dist/shared-tree/treeApiAlpha.js.map +1 -1
  112. package/dist/shared-tree/treeCheckout.js +1 -1
  113. package/dist/shared-tree/treeCheckout.js.map +1 -1
  114. package/dist/shared-tree-core/editManager.d.ts +11 -2
  115. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  116. package/dist/shared-tree-core/editManager.js +70 -34
  117. package/dist/shared-tree-core/editManager.js.map +1 -1
  118. package/dist/shared-tree-core/resubmitMachine.d.ts +2 -0
  119. package/dist/shared-tree-core/resubmitMachine.d.ts.map +1 -1
  120. package/dist/shared-tree-core/resubmitMachine.js.map +1 -1
  121. package/dist/shared-tree-core/sharedTreeCore.d.ts +10 -3
  122. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  123. package/dist/shared-tree-core/sharedTreeCore.js +42 -7
  124. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  125. package/dist/simple-tree/api/customTree.js +3 -3
  126. package/dist/simple-tree/api/customTree.js.map +1 -1
  127. package/dist/simple-tree/api/schemaCreationUtilities.js +1 -1
  128. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  129. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -1
  130. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  131. package/dist/simple-tree/api/simpleTreeIndex.js +3 -3
  132. package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
  133. package/dist/simple-tree/api/tree.js +1 -1
  134. package/dist/simple-tree/api/tree.js.map +1 -1
  135. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  136. package/dist/simple-tree/api/treeNodeApi.js +9 -5
  137. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  138. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  139. package/dist/simple-tree/api/verboseTree.js +5 -4
  140. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  141. package/dist/simple-tree/api/view.js +1 -1
  142. package/dist/simple-tree/api/view.js.map +1 -1
  143. package/dist/simple-tree/arrayNode.js +2 -2
  144. package/dist/simple-tree/arrayNode.js.map +1 -1
  145. package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  146. package/dist/simple-tree/core/getOrCreateNode.js +1 -1
  147. package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
  148. package/dist/simple-tree/core/schemaCaching.js +1 -1
  149. package/dist/simple-tree/core/schemaCaching.js.map +1 -1
  150. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  151. package/dist/simple-tree/core/treeNodeKernel.js +6 -6
  152. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  153. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  154. package/dist/simple-tree/core/unhydratedFlexTree.js +5 -5
  155. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  156. package/dist/simple-tree/objectNode.js +2 -2
  157. package/dist/simple-tree/objectNode.js.map +1 -1
  158. package/dist/simple-tree/proxies.js +1 -1
  159. package/dist/simple-tree/proxies.js.map +1 -1
  160. package/dist/simple-tree/toMapTree.js +3 -3
  161. package/dist/simple-tree/toMapTree.js.map +1 -1
  162. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  163. package/dist/simple-tree/toStoredSchema.js +2 -1
  164. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  165. package/dist/simple-tree/treeNodeValid.d.ts.map +1 -1
  166. package/dist/simple-tree/treeNodeValid.js +5 -2
  167. package/dist/simple-tree/treeNodeValid.js.map +1 -1
  168. package/dist/util/idAllocator.js +1 -1
  169. package/dist/util/idAllocator.js.map +1 -1
  170. package/dist/util/index.d.ts +2 -2
  171. package/dist/util/index.d.ts.map +1 -1
  172. package/dist/util/index.js +5 -4
  173. package/dist/util/index.js.map +1 -1
  174. package/dist/util/nestedMap.d.ts +2 -10
  175. package/dist/util/nestedMap.d.ts.map +1 -1
  176. package/dist/util/nestedMap.js +9 -28
  177. package/dist/util/nestedMap.js.map +1 -1
  178. package/dist/util/utils.d.ts +23 -6
  179. package/dist/util/utils.d.ts.map +1 -1
  180. package/dist/util/utils.js +46 -13
  181. package/dist/util/utils.js.map +1 -1
  182. package/lib/alpha.d.ts +1 -0
  183. package/lib/codec/codec.js +3 -3
  184. package/lib/codec/codec.js.map +1 -1
  185. package/lib/codec/discriminatedUnions.d.ts.map +1 -1
  186. package/lib/codec/discriminatedUnions.js +1 -1
  187. package/lib/codec/discriminatedUnions.js.map +1 -1
  188. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  189. package/lib/core/schema-stored/schema.js +3 -3
  190. package/lib/core/schema-stored/schema.js.map +1 -1
  191. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  192. package/lib/core/tree/anchorSet.js +19 -14
  193. package/lib/core/tree/anchorSet.js.map +1 -1
  194. package/lib/core/tree/treeTextFormat.js +1 -1
  195. package/lib/core/tree/treeTextFormat.js.map +1 -1
  196. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  197. package/lib/feature-libraries/chunked-forest/basicChunk.js +11 -8
  198. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  199. package/lib/feature-libraries/chunked-forest/chunkTree.js +2 -2
  200. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  201. package/lib/feature-libraries/chunked-forest/chunkedForest.js +3 -3
  202. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  203. package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +2 -2
  204. package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
  205. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  206. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +4 -3
  207. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  208. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js +2 -2
  209. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  210. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncoding.d.ts.map +1 -1
  211. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js +3 -3
  212. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js.map +1 -1
  213. package/lib/feature-libraries/chunked-forest/emptyChunk.js +14 -14
  214. package/lib/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
  215. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  216. package/lib/feature-libraries/chunked-forest/uniformChunk.js +6 -4
  217. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  218. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
  219. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  220. package/lib/feature-libraries/default-schema/schemaChecker.js +1 -1
  221. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  222. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  223. package/lib/feature-libraries/flex-tree/lazyField.js +4 -3
  224. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  225. package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  226. package/lib/feature-libraries/flex-tree/lazyNode.js +5 -4
  227. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  228. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  229. package/lib/feature-libraries/indexing/anchorTreeIndex.js +1 -1
  230. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  231. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  232. package/lib/feature-libraries/modular-schema/comparison.js +6 -4
  233. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  234. package/lib/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
  235. package/lib/feature-libraries/modular-schema/isNeverTree.js +4 -4
  236. package/lib/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
  237. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  238. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  239. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  240. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +11 -12
  241. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  242. package/lib/feature-libraries/node-key/mockNodeKeyManager.js +1 -1
  243. package/lib/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
  244. package/lib/feature-libraries/object-forest/objectForest.js +1 -1
  245. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  246. package/lib/feature-libraries/schema-index/codec.js +1 -1
  247. package/lib/feature-libraries/schema-index/codec.js.map +1 -1
  248. package/lib/feature-libraries/sequence-field/compose.js +1 -1
  249. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  250. package/lib/feature-libraries/sequence-field/invert.js +1 -1
  251. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  252. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  253. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  254. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  255. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  256. package/lib/feature-libraries/sequence-field/utils.js +1 -1
  257. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  258. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  259. package/lib/feature-libraries/treeCursorUtils.js +6 -4
  260. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  261. package/lib/index.d.ts +3 -1
  262. package/lib/index.d.ts.map +1 -1
  263. package/lib/index.js +2 -0
  264. package/lib/index.js.map +1 -1
  265. package/lib/jsonDomainSchema.d.ts +113 -0
  266. package/lib/jsonDomainSchema.d.ts.map +1 -0
  267. package/lib/jsonDomainSchema.js +98 -0
  268. package/lib/jsonDomainSchema.js.map +1 -0
  269. package/lib/packageVersion.d.ts +1 -1
  270. package/lib/packageVersion.js +1 -1
  271. package/lib/packageVersion.js.map +1 -1
  272. package/lib/serializableDomainSchema.d.ts +108 -0
  273. package/lib/serializableDomainSchema.d.ts.map +1 -0
  274. package/lib/serializableDomainSchema.js +87 -0
  275. package/lib/serializableDomainSchema.js.map +1 -0
  276. package/lib/shared-tree/index.d.ts +1 -1
  277. package/lib/shared-tree/index.d.ts.map +1 -1
  278. package/lib/shared-tree/index.js.map +1 -1
  279. package/lib/shared-tree/schematizeTree.js +1 -1
  280. package/lib/shared-tree/schematizeTree.js.map +1 -1
  281. package/lib/shared-tree/sharedTree.d.ts +37 -20
  282. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  283. package/lib/shared-tree/sharedTree.js +18 -18
  284. package/lib/shared-tree/sharedTree.js.map +1 -1
  285. package/lib/shared-tree/sharedTreeChangeFamily.js +1 -1
  286. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  287. package/lib/shared-tree/treeApiAlpha.d.ts.map +1 -1
  288. package/lib/shared-tree/treeApiAlpha.js +4 -4
  289. package/lib/shared-tree/treeApiAlpha.js.map +1 -1
  290. package/lib/shared-tree/treeCheckout.js +1 -1
  291. package/lib/shared-tree/treeCheckout.js.map +1 -1
  292. package/lib/shared-tree-core/editManager.d.ts +11 -2
  293. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  294. package/lib/shared-tree-core/editManager.js +70 -34
  295. package/lib/shared-tree-core/editManager.js.map +1 -1
  296. package/lib/shared-tree-core/resubmitMachine.d.ts +2 -0
  297. package/lib/shared-tree-core/resubmitMachine.d.ts.map +1 -1
  298. package/lib/shared-tree-core/resubmitMachine.js.map +1 -1
  299. package/lib/shared-tree-core/sharedTreeCore.d.ts +10 -3
  300. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  301. package/lib/shared-tree-core/sharedTreeCore.js +42 -7
  302. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  303. package/lib/simple-tree/api/customTree.js +3 -3
  304. package/lib/simple-tree/api/customTree.js.map +1 -1
  305. package/lib/simple-tree/api/schemaCreationUtilities.js +1 -1
  306. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  307. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -1
  308. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  309. package/lib/simple-tree/api/simpleTreeIndex.js +3 -3
  310. package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
  311. package/lib/simple-tree/api/tree.js +1 -1
  312. package/lib/simple-tree/api/tree.js.map +1 -1
  313. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  314. package/lib/simple-tree/api/treeNodeApi.js +9 -5
  315. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  316. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  317. package/lib/simple-tree/api/verboseTree.js +5 -4
  318. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  319. package/lib/simple-tree/api/view.js +1 -1
  320. package/lib/simple-tree/api/view.js.map +1 -1
  321. package/lib/simple-tree/arrayNode.js +2 -2
  322. package/lib/simple-tree/arrayNode.js.map +1 -1
  323. package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  324. package/lib/simple-tree/core/getOrCreateNode.js +1 -1
  325. package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
  326. package/lib/simple-tree/core/schemaCaching.js +1 -1
  327. package/lib/simple-tree/core/schemaCaching.js.map +1 -1
  328. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  329. package/lib/simple-tree/core/treeNodeKernel.js +6 -6
  330. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  331. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  332. package/lib/simple-tree/core/unhydratedFlexTree.js +5 -5
  333. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  334. package/lib/simple-tree/objectNode.js +2 -2
  335. package/lib/simple-tree/objectNode.js.map +1 -1
  336. package/lib/simple-tree/proxies.js +1 -1
  337. package/lib/simple-tree/proxies.js.map +1 -1
  338. package/lib/simple-tree/toMapTree.js +3 -3
  339. package/lib/simple-tree/toMapTree.js.map +1 -1
  340. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  341. package/lib/simple-tree/toStoredSchema.js +2 -1
  342. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  343. package/lib/simple-tree/treeNodeValid.d.ts.map +1 -1
  344. package/lib/simple-tree/treeNodeValid.js +5 -2
  345. package/lib/simple-tree/treeNodeValid.js.map +1 -1
  346. package/lib/util/idAllocator.js +1 -1
  347. package/lib/util/idAllocator.js.map +1 -1
  348. package/lib/util/index.d.ts +2 -2
  349. package/lib/util/index.d.ts.map +1 -1
  350. package/lib/util/index.js +2 -2
  351. package/lib/util/index.js.map +1 -1
  352. package/lib/util/nestedMap.d.ts +2 -10
  353. package/lib/util/nestedMap.d.ts.map +1 -1
  354. package/lib/util/nestedMap.js +5 -23
  355. package/lib/util/nestedMap.js.map +1 -1
  356. package/lib/util/utils.d.ts +23 -6
  357. package/lib/util/utils.d.ts.map +1 -1
  358. package/lib/util/utils.js +42 -11
  359. package/lib/util/utils.js.map +1 -1
  360. package/package.json +22 -22
  361. package/src/codec/codec.ts +3 -3
  362. package/src/codec/discriminatedUnions.ts +2 -1
  363. package/src/core/schema-stored/schema.ts +5 -3
  364. package/src/core/tree/anchorSet.ts +37 -26
  365. package/src/core/tree/treeTextFormat.ts +1 -1
  366. package/src/feature-libraries/chunked-forest/basicChunk.ts +11 -8
  367. package/src/feature-libraries/chunked-forest/chunkTree.ts +2 -2
  368. package/src/feature-libraries/chunked-forest/chunkedForest.ts +3 -3
  369. package/src/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.ts +2 -2
  370. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +4 -3
  371. package/src/feature-libraries/chunked-forest/codec/nodeShape.ts +2 -2
  372. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncoding.ts +4 -3
  373. package/src/feature-libraries/chunked-forest/emptyChunk.ts +14 -14
  374. package/src/feature-libraries/chunked-forest/uniformChunk.ts +6 -4
  375. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
  376. package/src/feature-libraries/default-schema/schemaChecker.ts +1 -1
  377. package/src/feature-libraries/flex-tree/lazyField.ts +6 -8
  378. package/src/feature-libraries/flex-tree/lazyNode.ts +6 -4
  379. package/src/feature-libraries/indexing/anchorTreeIndex.ts +2 -1
  380. package/src/feature-libraries/modular-schema/comparison.ts +7 -5
  381. package/src/feature-libraries/modular-schema/isNeverTree.ts +6 -4
  382. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +4 -4
  383. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +16 -12
  384. package/src/feature-libraries/node-key/mockNodeKeyManager.ts +1 -1
  385. package/src/feature-libraries/object-forest/objectForest.ts +1 -1
  386. package/src/feature-libraries/schema-index/codec.ts +1 -1
  387. package/src/feature-libraries/sequence-field/compose.ts +1 -1
  388. package/src/feature-libraries/sequence-field/invert.ts +1 -1
  389. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
  390. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
  391. package/src/feature-libraries/sequence-field/utils.ts +1 -1
  392. package/src/feature-libraries/treeCursorUtils.ts +6 -4
  393. package/src/index.ts +3 -1
  394. package/src/jsonDomainSchema.ts +129 -0
  395. package/src/packageVersion.ts +1 -1
  396. package/src/serializableDomainSchema.ts +121 -0
  397. package/src/shared-tree/index.ts +0 -1
  398. package/src/shared-tree/schematizeTree.ts +1 -1
  399. package/src/shared-tree/sharedTree.ts +31 -41
  400. package/src/shared-tree/sharedTreeChangeFamily.ts +1 -1
  401. package/src/shared-tree/treeApiAlpha.ts +12 -4
  402. package/src/shared-tree/treeCheckout.ts +1 -1
  403. package/src/shared-tree-core/editManager.ts +85 -47
  404. package/src/shared-tree-core/resubmitMachine.ts +2 -0
  405. package/src/shared-tree-core/sharedTreeCore.ts +62 -14
  406. package/src/simple-tree/api/customTree.ts +3 -3
  407. package/src/simple-tree/api/schemaCreationUtilities.ts +1 -1
  408. package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -1
  409. package/src/simple-tree/api/simpleTreeIndex.ts +3 -3
  410. package/src/simple-tree/api/tree.ts +1 -1
  411. package/src/simple-tree/api/treeNodeApi.ts +11 -6
  412. package/src/simple-tree/api/verboseTree.ts +8 -4
  413. package/src/simple-tree/api/view.ts +1 -1
  414. package/src/simple-tree/arrayNode.ts +2 -2
  415. package/src/simple-tree/core/getOrCreateNode.ts +2 -1
  416. package/src/simple-tree/core/schemaCaching.ts +1 -1
  417. package/src/simple-tree/core/treeNodeKernel.ts +9 -6
  418. package/src/simple-tree/core/unhydratedFlexTree.ts +7 -5
  419. package/src/simple-tree/objectNode.ts +2 -2
  420. package/src/simple-tree/proxies.ts +1 -1
  421. package/src/simple-tree/toMapTree.ts +3 -3
  422. package/src/simple-tree/toStoredSchema.ts +2 -1
  423. package/src/simple-tree/treeNodeValid.ts +5 -2
  424. package/src/util/idAllocator.ts +1 -1
  425. package/src/util/index.ts +3 -2
  426. package/src/util/nestedMap.ts +9 -33
  427. package/src/util/utils.ts +52 -12
@@ -52,11 +52,12 @@ import {
52
52
  idAllocatorFromMaxId,
53
53
  idAllocatorFromState,
54
54
  type RangeQueryResult,
55
- getOrAddInMapLazy,
55
+ getOrCreate,
56
56
  newTupleBTree,
57
57
  mergeTupleBTrees,
58
58
  type TupleBTree,
59
59
  RangeMap,
60
+ balancedReduce,
60
61
  } from "../../util/index.js";
61
62
  import {
62
63
  type TreeChunk,
@@ -183,13 +184,15 @@ export class ModularChangeFamily
183
184
  const { revInfos, maxId } = getRevInfoFromTaggedChanges(changes);
184
185
  const idState: IdAllocationState = { maxId };
185
186
 
186
- if (changes.length === 0) {
187
- return makeModularChangeset();
188
- }
187
+ const pairwiseDelegate = (
188
+ left: ModularChangeset,
189
+ right: ModularChangeset,
190
+ ): ModularChangeset => {
191
+ return this.composePair(left, right, revInfos, idState);
192
+ };
189
193
 
190
- return changes
191
- .map((change) => change.change)
192
- .reduce((change1, change2) => this.composePair(change1, change2, revInfos, idState));
194
+ const innerChanges = changes.map((change) => change.change);
195
+ return balancedReduce(innerChanges, pairwiseDelegate, makeModularChangeset);
193
196
  }
194
197
 
195
198
  private composePair(
@@ -318,7 +321,7 @@ export class ModularChangeFamily
318
321
  crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
319
322
  }
320
323
 
321
- return child1 ?? child2 ?? fail("Should not compose two undefined nodes");
324
+ return child1 ?? child2 ?? fail(0xb22 /* Should not compose two undefined nodes */);
322
325
  };
323
326
 
324
327
  const amendedChange = rebaser.compose(
@@ -563,7 +566,7 @@ export class ModularChangeFamily
563
566
  setInChangeAtomIdMap(crossFieldTable.newToBaseNodeId, child2, child1);
564
567
  crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
565
568
  }
566
- return child1 ?? child2 ?? fail("Should not compose two undefined nodes");
569
+ return child1 ?? child2 ?? fail(0xb23 /* Should not compose two undefined nodes */);
567
570
  },
568
571
  idAllocator,
569
572
  manager,
@@ -1423,7 +1426,8 @@ export class ModularChangeFamily
1423
1426
  constraintState: ConstraintState,
1424
1427
  revertConstraintState: ConstraintState,
1425
1428
  ): void {
1426
- const node = nodes.get([nodeId.revision, nodeId.localId]) ?? fail("Unknown node ID");
1429
+ const node =
1430
+ nodes.get([nodeId.revision, nodeId.localId]) ?? fail(0xb24 /* Unknown node ID */);
1427
1431
  if (node.nodeExistsConstraint !== undefined) {
1428
1432
  const isNowViolated = inputAttachState === NodeAttachState.Detached;
1429
1433
  if (node.nodeExistsConstraint.violated !== isNowViolated) {
@@ -1921,7 +1925,7 @@ export function updateRefreshers(
1921
1925
 
1922
1926
  if (change.builds !== undefined) {
1923
1927
  for (const [[revision, id], chunk] of change.builds.entries()) {
1924
- const lengthTree = getOrAddInMapLazy(chunkLengths, revision, () => new BTree());
1928
+ const lengthTree = getOrCreate(chunkLengths, revision, () => new BTree());
1925
1929
  lengthTree.set(id, chunk.topLevelLength);
1926
1930
  }
1927
1931
  }
@@ -2999,7 +3003,7 @@ function fieldChangeFromId(
2999
3003
  id: FieldId,
3000
3004
  ): FieldChange {
3001
3005
  const fieldMap = fieldMapFromNodeId(fields, nodes, id.nodeId);
3002
- return fieldMap.get(id.field) ?? fail("No field exists for the given ID");
3006
+ return fieldMap.get(id.field) ?? fail(0xb25 /* No field exists for the given ID */);
3003
3007
  }
3004
3008
 
3005
3009
  function fieldMapFromNodeId(
@@ -27,7 +27,7 @@ export class MockNodeKeyManager implements NodeKeyManager {
27
27
  }
28
28
 
29
29
  public localizeNodeKey(key: StableNodeKey): LocalNodeKey {
30
- return this.tryLocalizeNodeKey(key) ?? fail("Key is not compressible");
30
+ return this.tryLocalizeNodeKey(key) ?? fail(0xb26 /* Key is not compressible */);
31
31
  }
32
32
 
33
33
  public stabilizeNodeKey(key: LocalNodeKey): StableNodeKey {
@@ -439,7 +439,7 @@ class Cursor extends SynchronousCursor implements ITreeSubscriptionCursor {
439
439
  }
440
440
  public getPath(prefix?: PathRootPrefix): UpPath {
441
441
  assert(this.innerCursor !== undefined, 0x436 /* Cursor must be current to be used */);
442
- return this.innerCursor.getPath(prefix) ?? fail("no path when at root");
442
+ return this.innerCursor.getPath(prefix) ?? fail(0xb27 /* no path when at root */);
443
443
  }
444
444
  public get fieldIndex(): number {
445
445
  assert(this.innerCursor !== undefined, 0x437 /* Cursor must be current to be used */);
@@ -27,7 +27,7 @@ export function encodeRepo(repo: TreeStoredSchema): Format {
27
27
  Object.create(null);
28
28
  const rootFieldSchema = encodeFieldSchema(repo.rootFieldSchema);
29
29
  for (const name of [...repo.nodeSchema.keys()].sort()) {
30
- const schema = repo.nodeSchema.get(name) ?? fail("missing schema");
30
+ const schema = repo.nodeSchema.get(name) ?? fail(0xb28 /* missing schema */);
31
31
  Object.defineProperty(nodeSchema, name, {
32
32
  enumerable: true,
33
33
  configurable: true,
@@ -540,7 +540,7 @@ export class ComposeQueue {
540
540
  return this.dequeueBase();
541
541
  } else if (areOutputCellsEmpty(baseMark) && areInputCellsEmpty(newMark)) {
542
542
  const baseCellId: ChangeAtomId =
543
- getOutputCellId(baseMark) ?? fail("Expected defined output ID");
543
+ getOutputCellId(baseMark) ?? fail(0xb29 /* Expected defined output ID */);
544
544
 
545
545
  if (markEmptiesCells(baseMark) && baseCellId.revision === undefined) {
546
546
  // The base revision should always be defined except when squashing changes into a transaction.
@@ -176,7 +176,7 @@ function invertMark(
176
176
  }
177
177
 
178
178
  const cellId = getDetachOutputCellId(mark) ?? {
179
- revision: mark.revision ?? fail("Revision must be defined"),
179
+ revision: mark.revision ?? fail(0xb2a /* Revision must be defined */),
180
180
  localId: mark.id,
181
181
  };
182
182
 
@@ -145,7 +145,7 @@ export function makeV1Codec(
145
145
  context,
146
146
  );
147
147
  case NoopMarkType:
148
- fail("Mark type: NoopMarkType should not be encoded.");
148
+ fail(0xb2b /* Mark type: NoopMarkType should not be encoded. */);
149
149
  default:
150
150
  unreachableCase(type);
151
151
  }
@@ -132,7 +132,7 @@ export function makeV2CodecHelpers(
132
132
  context,
133
133
  );
134
134
  case NoopMarkType:
135
- fail("Mark type: NoopMarkType should not be encoded.");
135
+ fail(0xb2c /* Mark type: NoopMarkType should not be encoded. */);
136
136
  default:
137
137
  unreachableCase(type);
138
138
  }
@@ -747,7 +747,7 @@ export function splitMark<TMark extends Mark>(mark: TMark, length: number): [TMa
747
747
  const markLength = mark.count;
748
748
  const remainder = markLength - length;
749
749
  if (length < 1 || remainder < 1) {
750
- fail("Unable to split mark due to lengths");
750
+ fail(0xb2d /* Unable to split mark due to lengths */);
751
751
  }
752
752
 
753
753
  const [effect1, effect2] = splitMarkEffect(mark, length);
@@ -345,14 +345,16 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
345
345
 
346
346
  public exitField(): void {
347
347
  // assert(this.mode === CursorLocationType.Fields, "can only navigate up from field when in field");
348
- this.siblings = this.siblingStack.pop() ?? fail("Unexpected siblingStack.length");
349
- this.index = this.indexStack.pop() ?? fail("Unexpected indexStack.length");
348
+ this.siblings =
349
+ this.siblingStack.pop() ?? fail(0xac3 /* Unexpected siblingStack.length */);
350
+ this.index = this.indexStack.pop() ?? fail(0xac4 /* Unexpected indexStack.length */);
350
351
  }
351
352
 
352
353
  public exitNode(): void {
353
354
  // assert(this.mode === CursorLocationType.Nodes, "can only navigate up from node when in node");
354
- this.siblings = this.siblingStack.pop() ?? fail("Unexpected siblingStack.length");
355
- this.index = this.indexStack.pop() ?? fail("Unexpected indexStack.length");
355
+ this.siblings =
356
+ this.siblingStack.pop() ?? fail(0xac5 /* Unexpected siblingStack.length */);
357
+ this.index = this.indexStack.pop() ?? fail(0xac6 /* Unexpected indexStack.length */);
356
358
  }
357
359
 
358
360
  public getNode(): TNode {
package/src/index.ts CHANGED
@@ -73,7 +73,6 @@ export {
73
73
  ForestTypeOptimized,
74
74
  ForestTypeExpensiveDebug,
75
75
  ForestTypeReference,
76
- type IChannelView,
77
76
  } from "./shared-tree/index.js";
78
77
 
79
78
  export {
@@ -259,3 +258,6 @@ export {
259
258
  export type { MapNodeInsertableData } from "./simple-tree/index.js";
260
259
 
261
260
  export type { JsonCompatible, JsonCompatibleObject } from "./util/index.js";
261
+
262
+ export { JsonAsTree } from "./jsonDomainSchema.js";
263
+ export { FluidSerializableAsTree } from "./serializableDomainSchema.js";
@@ -0,0 +1,129 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ SchemaFactory,
8
+ type AllowedTypes,
9
+ type FixRecursiveArraySchema,
10
+ type TreeNodeFromImplicitAllowedTypes,
11
+ type ValidateRecursiveSchema,
12
+ } from "./simple-tree/index.js";
13
+
14
+ const sf = new SchemaFactory("com.fluidframework.json");
15
+
16
+ /**
17
+ * Utilities for storing JSON data in {@link TreeNode}s.
18
+ * @remarks
19
+ * Schema which replicate the JSON data model with {@link TreeNode}s.
20
+ *
21
+ * This allows JSON to be losslessly round-tripped through a tree with the following limitations:
22
+ *
23
+ * 1. Only information that would be preserved by JSON.parse is preserved. This means (among other things) that numbers are limited to JavasScript's numeric precision.
24
+ *
25
+ * 2. The order of fields on an object is not preserved. The resulting order is arbitrary.
26
+ *
27
+ * JSON data can be imported from JSON into this format using `JSON.parse` then {@link TreeAlpha.importConcise} with the {@link JsonAsTree.(Tree:variable)} schema.
28
+ *
29
+ * @alpha
30
+ */
31
+ export namespace JsonAsTree {
32
+ /**
33
+ * {@link AllowedTypes} for primitives types allowed in JSON.
34
+ * @alpha
35
+ */
36
+ export const Primitive = [
37
+ sf.null,
38
+ sf.boolean,
39
+ sf.number,
40
+ sf.string,
41
+ ] as const satisfies AllowedTypes;
42
+
43
+ /**
44
+ * @alpha
45
+ */
46
+ export type Primitive = TreeNodeFromImplicitAllowedTypes<typeof Primitive>;
47
+
48
+ /**
49
+ * {@link AllowedTypes} for any content allowed in the {@link JsonAsTree} domain.
50
+ * @example
51
+ * ```typescript
52
+ * const tree = TreeAlpha.importConcise(JsonAsTree.Union, { example: { nested: true }, value: 5 });
53
+ * ```
54
+ * @alpha
55
+ */
56
+ export const Tree = [() => JsonObject, () => Array, ...Primitive] as const;
57
+
58
+ /**
59
+ * @alpha
60
+ */
61
+ export type Tree = TreeNodeFromImplicitAllowedTypes<typeof Tree>;
62
+
63
+ /**
64
+ * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}.
65
+ * @system @alpha
66
+ */
67
+ export const _APIExtractorWorkaroundObjectBase = sf.mapRecursive("object", Tree);
68
+
69
+ /**
70
+ * Arbitrary JSON object as a {@link TreeNode}.
71
+ * @remarks
72
+ * API of the tree node is more aligned with an es6 map than a JS object using its properties like a map.
73
+ * @example
74
+ * ```typescript
75
+ * // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting.
76
+ * const fromArray = new JsonAsTreeObject([["a", 0]]);
77
+ * // Using `importConcise` can work better for JSON data:
78
+ * const imported = TreeAlpha.importConcise(JsonAsTree.Object, { a: 0 });
79
+ * // Node API is like a Map:
80
+ * const value = imported.get("a");
81
+ * ```
82
+ * @privateRemarks
83
+ * Due to https://github.com/microsoft/TypeScript/issues/61270 this can't be named `Object`.
84
+ * @sealed @alpha
85
+ */
86
+ export class JsonObject extends _APIExtractorWorkaroundObjectBase {}
87
+ {
88
+ type _check = ValidateRecursiveSchema<typeof JsonObject>;
89
+ }
90
+
91
+ /**
92
+ * D.ts bug workaround, see {@link FixRecursiveArraySchema}.
93
+ * @privateRemarks
94
+ * In the past this this had to reference the base type (_APIExtractorWorkaroundArrayBase).
95
+ * Testing for this in examples/utils/import-testing now shows it has to reference JsonAsTree.Array instead.
96
+ * @system @alpha
97
+ */
98
+ export declare type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema<
99
+ typeof Array
100
+ >;
101
+
102
+ /**
103
+ * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}.
104
+ * @system @alpha
105
+ */
106
+ export const _APIExtractorWorkaroundArrayBase = sf.arrayRecursive("array", Tree);
107
+
108
+ /**
109
+ * Arbitrary JSON array as a {@link TreeNode}.
110
+ * @remarks
111
+ * This can be imported using {@link TreeAlpha.importConcise}.
112
+ * @example
113
+ * ```typescript
114
+ * // Due to TypeScript restrictions on recursive types, the constructor can be somewhat limiting.
115
+ * const usingConstructor = new JsonAsTree.Array(["a", 0, new JsonAsTree.Array([1])]);
116
+ * // Using `importConcise` can work better for JSON data:
117
+ * const imported = TreeAlpha.importConcise(JsonAsTree.Array, ["a", 0, [1]]);
118
+ * // Node API is like an Array:
119
+ * const inner: JsonAsTree.Tree = imported[2];
120
+ * assert(Tree.is(inner, JsonAsTree.Array));
121
+ * const leaf = inner[0];
122
+ * ```
123
+ * @sealed @alpha
124
+ */
125
+ export class Array extends _APIExtractorWorkaroundArrayBase {}
126
+ {
127
+ type _check = ValidateRecursiveSchema<typeof Array>;
128
+ }
129
+ }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.22.1";
9
+ export const pkgVersion = "2.23.0";
@@ -0,0 +1,121 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { IFluidHandle } from "@fluidframework/core-interfaces";
7
+ import {
8
+ SchemaFactory,
9
+ type FixRecursiveArraySchema,
10
+ type TreeNodeFromImplicitAllowedTypes,
11
+ type ValidateRecursiveSchema,
12
+ } from "./simple-tree/index.js";
13
+ import type { JsonCompatible } from "./util/index.js";
14
+
15
+ const sf = new SchemaFactory("com.fluidframework.serializable");
16
+
17
+ /**
18
+ * Utilities for storing {@link FluidSerializableAsTree.Data|Fluid Serializable data} in {@link TreeNode}s.
19
+ *
20
+ * Same as {@link JsonAsTree} except allows {@link @fluidframework/core-interfaces#(IFluidHandle:interface)}s.
21
+ * @remarks
22
+ * Schema which replicate the Fluid Serializable data model with {@link TreeNode}s.
23
+ *
24
+ * Fluid Serializable data can be imported from the {@link FluidSerializableAsTree.Data|Fluid Serializable format} into this format using {@link TreeAlpha.importConcise} with the {@link FluidSerializableAsTree.(Tree:variable)} schema.
25
+ * @internal
26
+ */
27
+ export namespace FluidSerializableAsTree {
28
+ /**
29
+ * Data which can be serialized by Fluid.
30
+ * @remarks
31
+ * Can be encoded as a {@link FluidSerializableAsTree.(Tree:type)} using {@link TreeAlpha.importConcise}.
32
+ * @internal
33
+ */
34
+ export type Data = JsonCompatible<IFluidHandle>;
35
+
36
+ /**
37
+ * {@link AllowedTypes} for any content allowed in the {@link FluidSerializableAsTree} domain.
38
+ * @example
39
+ * ```typescript
40
+ * const tree = TreeAlpha.importConcise(FluidSerializableAsTree.Tree, { example: { nested: true }, value: 5 });
41
+ * ```
42
+ * @internal
43
+ */
44
+ export const Tree = [
45
+ () => FluidSerializableObject,
46
+ () => Array,
47
+ ...SchemaFactory.leaves,
48
+ ] as const;
49
+
50
+ /**
51
+ * @internal
52
+ */
53
+ export type Tree = TreeNodeFromImplicitAllowedTypes<typeof Tree>;
54
+
55
+ /**
56
+ * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}.
57
+ * @system @internal
58
+ */
59
+ export const _APIExtractorWorkaroundObjectBase = sf.mapRecursive("object", Tree);
60
+
61
+ /**
62
+ * Arbitrary Fluid Serializable object as a {@link TreeNode}.
63
+ * @remarks
64
+ * API of the tree node is more aligned with an es6 map than a JS object using its properties like a map.
65
+ * @example
66
+ * ```typescript
67
+ * // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting.
68
+ * const fromArray = new JsonAsTreeObject([["a", 0]]);
69
+ * // Using `importConcise` can work better for Fluid Serializable data:
70
+ * const imported = TreeAlpha.importConcise(FluidSerializableAsTree.Object, { a: 0 });
71
+ * // Node API is like a Map:
72
+ * const value = imported.get("a");
73
+ * ```
74
+ * @privateRemarks
75
+ * Due to https://github.com/microsoft/TypeScript/issues/61270 this can't be named `Object`.
76
+ * @sealed @internal
77
+ */
78
+ export class FluidSerializableObject extends _APIExtractorWorkaroundObjectBase {}
79
+ {
80
+ type _check = ValidateRecursiveSchema<typeof FluidSerializableObject>;
81
+ }
82
+
83
+ /**
84
+ * D.ts bug workaround, see {@link FixRecursiveArraySchema}.
85
+ * @privateRemarks
86
+ * In the past this this had to reference the base type (_APIExtractorWorkaroundArrayBase).
87
+ * Testing for this in examples/utils/import-testing now shows it has to reference FluidSerializableAsTree.Array instead.
88
+ * @system @internal
89
+ */
90
+ export declare type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema<
91
+ typeof Array
92
+ >;
93
+
94
+ /**
95
+ * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}.
96
+ * @system @internal
97
+ */
98
+ export const _APIExtractorWorkaroundArrayBase = sf.arrayRecursive("array", Tree);
99
+
100
+ /**
101
+ * Arbitrary Fluid Serializable array as a {@link TreeNode}.
102
+ * @remarks
103
+ * This can be imported using {@link TreeAlpha.importConcise}.
104
+ * @example
105
+ * ```typescript
106
+ * // Due to TypeScript restrictions on recursive types, the constructor can be somewhat limiting.
107
+ * const usingConstructor = new FluidSerializableAsTree.Array(["a", 0, new FluidSerializableAsTree.Array([1])]);
108
+ * // Using `importConcise` can work better for Fluid Serializable data:
109
+ * const imported = TreeAlpha.importConcise(FluidSerializableAsTree.Array, ["a", 0, [1]]);
110
+ * // Node API is like an Array:
111
+ * const inner: FluidSerializableAsTree.Tree = imported[2];
112
+ * assert(Tree.is(inner, FluidSerializableAsTree.Array));
113
+ * const leaf = inner[0];
114
+ * ```
115
+ * @sealed @internal
116
+ */
117
+ export class Array extends _APIExtractorWorkaroundArrayBase {}
118
+ {
119
+ type _check = ValidateRecursiveSchema<typeof Array>;
120
+ }
121
+ }
@@ -21,7 +21,6 @@ export {
21
21
  ForestTypeOptimized,
22
22
  ForestTypeExpensiveDebug,
23
23
  ForestTypeReference,
24
- type IChannelView,
25
24
  } from "./sharedTree.js";
26
25
 
27
26
  export {
@@ -198,7 +198,7 @@ export function initialize(checkout: ITreeCheckout, treeContent: TreeStoredConte
198
198
  break;
199
199
  }
200
200
  default: {
201
- fail("unexpected root field kind during initialize");
201
+ fail(0xac7 /* unexpected root field kind during initialize */);
202
202
  }
203
203
  }
204
204
  });
@@ -13,10 +13,10 @@ import type {
13
13
  IChannelAttributes,
14
14
  IFluidDataStoreRuntime,
15
15
  IChannelStorageService,
16
- IChannel,
17
16
  } from "@fluidframework/datastore-definitions/internal";
18
17
  import {
19
18
  SharedObject,
19
+ type IChannelView,
20
20
  type IFluidSerializer,
21
21
  type ISharedObject,
22
22
  } from "@fluidframework/shared-object-base/internal";
@@ -29,6 +29,7 @@ import type {
29
29
  ITelemetryContext,
30
30
  IExperimentalIncrementalSummaryContext,
31
31
  ISummaryTreeWithStats,
32
+ IRuntimeMessageCollection,
32
33
  } from "@fluidframework/runtime-definitions/internal";
33
34
  import type { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
34
35
 
@@ -100,13 +101,7 @@ import { SharedTreeChangeFamily } from "./sharedTreeChangeFamily.js";
100
101
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
101
102
  import type { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
102
103
  import { type TreeCheckout, type BranchableTree, createTreeCheckout } from "./treeCheckout.js";
103
- import {
104
- Breakable,
105
- breakingClass,
106
- fail,
107
- throwIfBroken,
108
- type WithBreakable,
109
- } from "../util/index.js";
104
+ import { Breakable, breakingClass, fail, throwIfBroken } from "../util/index.js";
110
105
 
111
106
  /**
112
107
  * Copy of data from an {@link ITreePrivate} at some point in time.
@@ -132,14 +127,6 @@ export interface SharedTreeContentSnapshot {
132
127
  readonly removed: [string | number | undefined, number, JsonableTree][];
133
128
  }
134
129
 
135
- /**
136
- * Information about a Fluid channel.
137
- * @privateRemarks
138
- * This is distinct from {@link IChannel} as it omits the APIs used by the runtime to manage the channel and instead only has things which are useful (and safe) to expose to users of the channel.
139
- * @internal
140
- */
141
- export type IChannelView = Pick<IChannel, "id" | "attributes" | "isAttached">;
142
-
143
130
  /**
144
131
  * {@link ITree} extended with some non-public APIs.
145
132
  * @internal
@@ -161,6 +148,11 @@ export interface ITreePrivate extends ITreeInternal {
161
148
  * This does not include everything that is included in a tree summary, since information about how to merge future edits is omitted.
162
149
  */
163
150
  contentSnapshot(): SharedTreeContentSnapshot;
151
+
152
+ /**
153
+ * Access to internals for testing.
154
+ */
155
+ readonly kernel: SharedTreeKernel;
164
156
  }
165
157
 
166
158
  /**
@@ -215,17 +207,10 @@ function getCodecVersions(formatVersion: number): ExplicitCodecVersions {
215
207
  /**
216
208
  * Shared object wrapping {@link SharedTreeKernel}.
217
209
  */
218
- export class SharedTree extends SharedObject implements ISharedTree, WithBreakable {
219
- public readonly breaker: Breakable = new Breakable("Shared Tree");
210
+ export class SharedTree extends SharedObject implements ISharedTree {
211
+ private readonly breaker: Breakable = new Breakable("Shared Tree");
220
212
 
221
- public get checkout(): TreeCheckout {
222
- return this.kernel.checkout;
223
- }
224
- public get storedSchema(): TreeStoredSchemaRepository {
225
- return this.checkout.storedSchema;
226
- }
227
-
228
- private readonly kernel: SharedTreeKernel;
213
+ public readonly kernel: SharedTreeKernel;
229
214
 
230
215
  public constructor(
231
216
  id: string,
@@ -250,10 +235,6 @@ export class SharedTree extends SharedObject implements ISharedTree, WithBreakab
250
235
  );
251
236
  }
252
237
 
253
- public get editor(): SharedTreeEditBuilder {
254
- return this.kernel.getEditor();
255
- }
256
-
257
238
  public summarizeCore(
258
239
  serializer: IFluidSerializer,
259
240
  telemetryContext?: ITelemetryContext,
@@ -270,7 +251,13 @@ export class SharedTree extends SharedObject implements ISharedTree, WithBreakab
270
251
  this.kernel.processCore(message, local, localOpMetadata);
271
252
  }
272
253
 
273
- protected onDisconnect(): void {}
254
+ protected override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {
255
+ this.kernel.processMessagesCore(messagesCollection);
256
+ }
257
+
258
+ protected onDisconnect(): void {
259
+ this.kernel.onDisconnect();
260
+ }
274
261
 
275
262
  public exportVerbose(): VerboseTree | undefined {
276
263
  return this.kernel.exportVerbose();
@@ -483,7 +470,7 @@ class SharedTreeKernel extends SharedTreeCore<SharedTreeEditBuilder, SharedTreeC
483
470
  cursor.enterNode(0);
484
471
  return verboseFromCursor(cursor, this.storedSchema.nodeSchema);
485
472
  } else {
486
- fail("Invalid document root length");
473
+ fail(0xac8 /* Invalid document root length */);
487
474
  }
488
475
  } finally {
489
476
  cursor.free();
@@ -581,6 +568,8 @@ class SharedTreeKernel extends SharedTreeCore<SharedTreeEditBuilder, SharedTreeC
581
568
  super.submitCommit(commit, schemaAndPolicy, isResubmit),
582
569
  );
583
570
  }
571
+
572
+ public onDisconnect(): void {}
584
573
  }
585
574
 
586
575
  /**
@@ -607,13 +596,13 @@ export function getBranch<T extends ImplicitFieldSchema | UnsafeUnknownSchema>(
607
596
  export function getBranch<T extends ImplicitFieldSchema | UnsafeUnknownSchema>(
608
597
  treeOrView: ITree | TreeViewAlpha<T>,
609
598
  ): BranchableTree {
610
- assert(
611
- treeOrView instanceof SharedTree || treeOrView instanceof SchematizingSimpleTreeView,
612
- 0xa48 /* Unsupported implementation */,
613
- );
614
- const checkout: TreeCheckout = treeOrView.checkout;
599
+ if (treeOrView instanceof SchematizingSimpleTreeView) {
600
+ return treeOrView.checkout as unknown as BranchableTree;
601
+ }
602
+ const kernel = (treeOrView as ITree as ITreePrivate).kernel;
603
+ assert(kernel instanceof SharedTreeKernel, 0xb56 /* Invalid ITree */);
615
604
  // This cast is safe so long as TreeCheckout supports all the operations on the branch interface.
616
- return checkout as unknown as BranchableTree;
605
+ return kernel.checkout as unknown as BranchableTree;
617
606
  }
618
607
 
619
608
  /**
@@ -778,7 +767,8 @@ function verboseFromCursor(
778
767
  schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>,
779
768
  ): VerboseTree {
780
769
  const fields = customFromCursorStored(reader, schema, verboseFromCursor);
781
- const nodeSchema = schema.get(reader.type) ?? fail("missing schema for type in cursor");
770
+ const nodeSchema =
771
+ schema.get(reader.type) ?? fail(0xac9 /* missing schema for type in cursor */);
782
772
  if (nodeSchema instanceof LeafNodeStoredSchema) {
783
773
  return fields as CustomTreeValue<IFluidHandle>;
784
774
  }
@@ -806,7 +796,7 @@ function exportSimpleFieldSchemaStored(schema: TreeFieldStoredSchema): SimpleFie
806
796
  assert(schema.types.size === 0, 0xa94 /* invalid forbidden field */);
807
797
  break;
808
798
  default:
809
- fail("invalid field kind");
799
+ fail(0xaca /* invalid field kind */);
810
800
  }
811
801
  return { kind, allowedTypes: schema.types };
812
802
  }
@@ -833,5 +823,5 @@ function exportSimpleNodeSchemaStored(schema: TreeNodeStoredSchema): SimpleNodeS
833
823
  if (schema instanceof LeafNodeStoredSchema) {
834
824
  return { kind: NodeKind.Leaf, leafKind: schema.leafValue };
835
825
  }
836
- fail("invalid schema kind");
826
+ fail(0xacb /* invalid schema kind */);
837
827
  }
@@ -151,7 +151,7 @@ export class SharedTreeChangeFamily
151
151
  };
152
152
  }
153
153
  default:
154
- fail("Unknown SharedTree change type.");
154
+ fail(0xacc /* Unknown SharedTree change type. */);
155
155
  }
156
156
  };
157
157
  return {