@fluidframework/tree 2.41.0 → 2.42.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 (416) hide show
  1. package/.vscode/settings.json +1 -0
  2. package/CHANGELOG.md +33 -0
  3. package/api-report/tree.alpha.api.md +11 -7
  4. package/dist/alpha.d.ts +1 -0
  5. package/dist/codec/codec.d.ts +23 -3
  6. package/dist/codec/codec.d.ts.map +1 -1
  7. package/dist/codec/codec.js.map +1 -1
  8. package/dist/codec/index.d.ts +1 -1
  9. package/dist/codec/index.d.ts.map +1 -1
  10. package/dist/codec/index.js.map +1 -1
  11. package/dist/codec/versioned/codec.d.ts +35 -2
  12. package/dist/codec/versioned/codec.d.ts.map +1 -1
  13. package/dist/codec/versioned/codec.js +38 -3
  14. package/dist/codec/versioned/codec.js.map +1 -1
  15. package/dist/core/tree/detachedFieldIndex.d.ts +2 -2
  16. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  17. package/dist/core/tree/detachedFieldIndex.js +5 -1
  18. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  19. package/dist/core/tree/mapTree.d.ts +2 -1
  20. package/dist/core/tree/mapTree.d.ts.map +1 -1
  21. package/dist/core/tree/mapTree.js +11 -5
  22. package/dist/core/tree/mapTree.js.map +1 -1
  23. package/dist/core/tree/visitorUtils.d.ts +2 -2
  24. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  25. package/dist/core/tree/visitorUtils.js.map +1 -1
  26. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +3 -2
  27. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  28. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  29. package/dist/feature-libraries/default-schema/schemaChecker.d.ts +4 -3
  30. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  31. package/dist/feature-libraries/default-schema/schemaChecker.js +4 -3
  32. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  33. package/dist/feature-libraries/flex-tree/context.d.ts +14 -6
  34. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  35. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  36. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +34 -14
  37. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  38. package/dist/feature-libraries/flex-tree/flexTreeTypes.js +4 -0
  39. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  40. package/dist/feature-libraries/flex-tree/index.d.ts +2 -2
  41. package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
  42. package/dist/feature-libraries/flex-tree/index.js.map +1 -1
  43. package/dist/feature-libraries/flex-tree/lazyField.d.ts +6 -6
  44. package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  45. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  46. package/dist/feature-libraries/flex-tree/lazyNode.d.ts +3 -2
  47. package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  48. package/dist/feature-libraries/flex-tree/lazyNode.js +3 -0
  49. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  50. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -2
  51. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  52. package/dist/feature-libraries/forest-summary/forestSummarizer.js +7 -7
  53. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  54. package/dist/feature-libraries/index.d.ts +2 -2
  55. package/dist/feature-libraries/index.d.ts.map +1 -1
  56. package/dist/feature-libraries/index.js +4 -2
  57. package/dist/feature-libraries/index.js.map +1 -1
  58. package/dist/feature-libraries/mapTreeCursor.d.ts +39 -3
  59. package/dist/feature-libraries/mapTreeCursor.d.ts.map +1 -1
  60. package/dist/feature-libraries/mapTreeCursor.js +45 -7
  61. package/dist/feature-libraries/mapTreeCursor.js.map +1 -1
  62. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  63. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  64. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +5 -5
  65. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  66. package/dist/feature-libraries/treeCursorUtils.d.ts +5 -1
  67. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  68. package/dist/feature-libraries/treeCursorUtils.js +8 -2
  69. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  70. package/dist/index.d.ts +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/packageVersion.d.ts +1 -1
  74. package/dist/packageVersion.js +1 -1
  75. package/dist/packageVersion.js.map +1 -1
  76. package/dist/shared-tree/schematizingTreeView.d.ts +11 -1
  77. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  78. package/dist/shared-tree/schematizingTreeView.js +36 -22
  79. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  80. package/dist/shared-tree/sharedTree.d.ts +3 -3
  81. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  82. package/dist/shared-tree/sharedTree.js +1 -0
  83. package/dist/shared-tree/sharedTree.js.map +1 -1
  84. package/dist/shared-tree/tree.d.ts.map +1 -1
  85. package/dist/shared-tree/tree.js +8 -24
  86. package/dist/shared-tree/tree.js.map +1 -1
  87. package/dist/shared-tree/treeAlpha.d.ts +2 -3
  88. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  89. package/dist/shared-tree/treeAlpha.js +13 -15
  90. package/dist/shared-tree/treeAlpha.js.map +1 -1
  91. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  92. package/dist/shared-tree/treeCheckout.js +5 -2
  93. package/dist/shared-tree/treeCheckout.js.map +1 -1
  94. package/dist/simple-tree/api/configuration.d.ts +2 -2
  95. package/dist/simple-tree/api/configuration.js +1 -1
  96. package/dist/simple-tree/api/configuration.js.map +1 -1
  97. package/dist/simple-tree/api/create.d.ts +9 -4
  98. package/dist/simple-tree/api/create.d.ts.map +1 -1
  99. package/dist/simple-tree/api/create.js +29 -16
  100. package/dist/simple-tree/api/create.js.map +1 -1
  101. package/dist/simple-tree/api/customTree.d.ts +4 -0
  102. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  103. package/dist/simple-tree/api/customTree.js +9 -1
  104. package/dist/simple-tree/api/customTree.js.map +1 -1
  105. package/dist/simple-tree/api/index.d.ts +1 -1
  106. package/dist/simple-tree/api/index.d.ts.map +1 -1
  107. package/dist/simple-tree/api/index.js +1 -2
  108. package/dist/simple-tree/api/index.js.map +1 -1
  109. package/dist/simple-tree/api/schemaFactory.d.ts +10 -2
  110. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  111. package/dist/simple-tree/api/schemaFactory.js +38 -9
  112. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  113. package/dist/simple-tree/api/treeNodeApi.d.ts +14 -3
  114. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  115. package/dist/simple-tree/api/treeNodeApi.js +32 -17
  116. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  117. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  118. package/dist/simple-tree/api/verboseTree.js +12 -9
  119. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  120. package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  121. package/dist/simple-tree/core/getOrCreateNode.js +2 -1
  122. package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
  123. package/dist/simple-tree/core/index.d.ts +2 -2
  124. package/dist/simple-tree/core/index.d.ts.map +1 -1
  125. package/dist/simple-tree/core/index.js +3 -4
  126. package/dist/simple-tree/core/index.js.map +1 -1
  127. package/dist/simple-tree/core/treeNodeKernel.d.ts +15 -25
  128. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  129. package/dist/simple-tree/core/treeNodeKernel.js +26 -33
  130. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  131. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +128 -59
  132. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  133. package/dist/simple-tree/core/unhydratedFlexTree.js +169 -182
  134. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  135. package/dist/simple-tree/index.d.ts +3 -3
  136. package/dist/simple-tree/index.d.ts.map +1 -1
  137. package/dist/simple-tree/index.js +5 -5
  138. package/dist/simple-tree/index.js.map +1 -1
  139. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  140. package/dist/simple-tree/node-kinds/array/arrayNode.js +5 -6
  141. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  142. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  143. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  144. package/dist/simple-tree/node-kinds/index.js +1 -2
  145. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  146. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  147. package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
  148. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  149. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  150. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  151. package/dist/simple-tree/node-kinds/object/index.js +1 -2
  152. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  153. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +3 -14
  154. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  155. package/dist/simple-tree/node-kinds/object/objectNode.js +12 -43
  156. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  157. package/dist/simple-tree/prepareForInsertion.d.ts +20 -6
  158. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  159. package/dist/simple-tree/prepareForInsertion.js +26 -19
  160. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  161. package/dist/simple-tree/schemaTypes.d.ts +8 -8
  162. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  163. package/dist/simple-tree/schemaTypes.js.map +1 -1
  164. package/dist/simple-tree/toStoredSchema.d.ts +6 -1
  165. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  166. package/dist/simple-tree/toStoredSchema.js +6 -3
  167. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  168. package/dist/simple-tree/{toMapTree.d.ts → unhydratedFlexTreeFromInsertable.d.ts} +12 -23
  169. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -0
  170. package/dist/simple-tree/{toMapTree.js → unhydratedFlexTreeFromInsertable.js} +103 -185
  171. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -0
  172. package/dist/treeFactory.d.ts.map +1 -1
  173. package/dist/treeFactory.js +6 -1
  174. package/dist/treeFactory.js.map +1 -1
  175. package/dist/util/index.d.ts +1 -1
  176. package/dist/util/index.d.ts.map +1 -1
  177. package/dist/util/index.js +2 -1
  178. package/dist/util/index.js.map +1 -1
  179. package/dist/util/utils.d.ts +4 -0
  180. package/dist/util/utils.d.ts.map +1 -1
  181. package/dist/util/utils.js +8 -1
  182. package/dist/util/utils.js.map +1 -1
  183. package/docs/user-facing/schema-evolution.md +1 -1
  184. package/lib/alpha.d.ts +1 -0
  185. package/lib/codec/codec.d.ts +23 -3
  186. package/lib/codec/codec.d.ts.map +1 -1
  187. package/lib/codec/codec.js.map +1 -1
  188. package/lib/codec/index.d.ts +1 -1
  189. package/lib/codec/index.d.ts.map +1 -1
  190. package/lib/codec/index.js.map +1 -1
  191. package/lib/codec/versioned/codec.d.ts +35 -2
  192. package/lib/codec/versioned/codec.d.ts.map +1 -1
  193. package/lib/codec/versioned/codec.js +36 -2
  194. package/lib/codec/versioned/codec.js.map +1 -1
  195. package/lib/core/tree/detachedFieldIndex.d.ts +2 -2
  196. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  197. package/lib/core/tree/detachedFieldIndex.js +6 -2
  198. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  199. package/lib/core/tree/mapTree.d.ts +2 -1
  200. package/lib/core/tree/mapTree.d.ts.map +1 -1
  201. package/lib/core/tree/mapTree.js +11 -5
  202. package/lib/core/tree/mapTree.js.map +1 -1
  203. package/lib/core/tree/visitorUtils.d.ts +2 -2
  204. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  205. package/lib/core/tree/visitorUtils.js.map +1 -1
  206. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +3 -2
  207. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  208. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  209. package/lib/feature-libraries/default-schema/schemaChecker.d.ts +4 -3
  210. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  211. package/lib/feature-libraries/default-schema/schemaChecker.js +4 -3
  212. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  213. package/lib/feature-libraries/flex-tree/context.d.ts +14 -6
  214. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  215. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  216. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +34 -14
  217. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  218. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +4 -0
  219. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  220. package/lib/feature-libraries/flex-tree/index.d.ts +2 -2
  221. package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
  222. package/lib/feature-libraries/flex-tree/index.js.map +1 -1
  223. package/lib/feature-libraries/flex-tree/lazyField.d.ts +6 -6
  224. package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
  225. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  226. package/lib/feature-libraries/flex-tree/lazyNode.d.ts +3 -2
  227. package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  228. package/lib/feature-libraries/flex-tree/lazyNode.js +3 -0
  229. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  230. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -2
  231. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  232. package/lib/feature-libraries/forest-summary/forestSummarizer.js +2 -2
  233. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  234. package/lib/feature-libraries/index.d.ts +2 -2
  235. package/lib/feature-libraries/index.d.ts.map +1 -1
  236. package/lib/feature-libraries/index.js +1 -1
  237. package/lib/feature-libraries/index.js.map +1 -1
  238. package/lib/feature-libraries/mapTreeCursor.d.ts +39 -3
  239. package/lib/feature-libraries/mapTreeCursor.d.ts.map +1 -1
  240. package/lib/feature-libraries/mapTreeCursor.js +43 -7
  241. package/lib/feature-libraries/mapTreeCursor.js.map +1 -1
  242. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  243. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  244. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +5 -5
  245. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  246. package/lib/feature-libraries/treeCursorUtils.d.ts +5 -1
  247. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  248. package/lib/feature-libraries/treeCursorUtils.js +8 -2
  249. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  250. package/lib/index.d.ts +1 -1
  251. package/lib/index.d.ts.map +1 -1
  252. package/lib/index.js.map +1 -1
  253. package/lib/packageVersion.d.ts +1 -1
  254. package/lib/packageVersion.js +1 -1
  255. package/lib/packageVersion.js.map +1 -1
  256. package/lib/shared-tree/schematizingTreeView.d.ts +11 -1
  257. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  258. package/lib/shared-tree/schematizingTreeView.js +34 -21
  259. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  260. package/lib/shared-tree/sharedTree.d.ts +3 -3
  261. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  262. package/lib/shared-tree/sharedTree.js +2 -1
  263. package/lib/shared-tree/sharedTree.js.map +1 -1
  264. package/lib/shared-tree/tree.d.ts.map +1 -1
  265. package/lib/shared-tree/tree.js +2 -18
  266. package/lib/shared-tree/tree.js.map +1 -1
  267. package/lib/shared-tree/treeAlpha.d.ts +2 -3
  268. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  269. package/lib/shared-tree/treeAlpha.js +4 -6
  270. package/lib/shared-tree/treeAlpha.js.map +1 -1
  271. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  272. package/lib/shared-tree/treeCheckout.js +6 -3
  273. package/lib/shared-tree/treeCheckout.js.map +1 -1
  274. package/lib/simple-tree/api/configuration.d.ts +2 -2
  275. package/lib/simple-tree/api/configuration.js +1 -1
  276. package/lib/simple-tree/api/configuration.js.map +1 -1
  277. package/lib/simple-tree/api/create.d.ts +9 -4
  278. package/lib/simple-tree/api/create.d.ts.map +1 -1
  279. package/lib/simple-tree/api/create.js +22 -9
  280. package/lib/simple-tree/api/create.js.map +1 -1
  281. package/lib/simple-tree/api/customTree.d.ts +4 -0
  282. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  283. package/lib/simple-tree/api/customTree.js +7 -0
  284. package/lib/simple-tree/api/customTree.js.map +1 -1
  285. package/lib/simple-tree/api/index.d.ts +1 -1
  286. package/lib/simple-tree/api/index.d.ts.map +1 -1
  287. package/lib/simple-tree/api/index.js +1 -1
  288. package/lib/simple-tree/api/index.js.map +1 -1
  289. package/lib/simple-tree/api/schemaFactory.d.ts +10 -2
  290. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  291. package/lib/simple-tree/api/schemaFactory.js +40 -11
  292. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  293. package/lib/simple-tree/api/treeNodeApi.d.ts +14 -3
  294. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  295. package/lib/simple-tree/api/treeNodeApi.js +35 -20
  296. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  297. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  298. package/lib/simple-tree/api/verboseTree.js +13 -10
  299. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  300. package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  301. package/lib/simple-tree/core/getOrCreateNode.js +3 -2
  302. package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
  303. package/lib/simple-tree/core/index.d.ts +2 -2
  304. package/lib/simple-tree/core/index.d.ts.map +1 -1
  305. package/lib/simple-tree/core/index.js +2 -2
  306. package/lib/simple-tree/core/index.js.map +1 -1
  307. package/lib/simple-tree/core/treeNodeKernel.d.ts +15 -25
  308. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  309. package/lib/simple-tree/core/treeNodeKernel.js +24 -32
  310. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  311. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +128 -59
  312. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  313. package/lib/simple-tree/core/unhydratedFlexTree.js +166 -181
  314. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  315. package/lib/simple-tree/index.d.ts +3 -3
  316. package/lib/simple-tree/index.d.ts.map +1 -1
  317. package/lib/simple-tree/index.js +3 -3
  318. package/lib/simple-tree/index.js.map +1 -1
  319. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  320. package/lib/simple-tree/node-kinds/array/arrayNode.js +4 -5
  321. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  322. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  323. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  324. package/lib/simple-tree/node-kinds/index.js +1 -1
  325. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  326. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  327. package/lib/simple-tree/node-kinds/map/mapNode.js +3 -3
  328. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  329. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  330. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  331. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  332. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  333. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +3 -14
  334. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  335. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -33
  336. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  337. package/lib/simple-tree/prepareForInsertion.d.ts +20 -6
  338. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  339. package/lib/simple-tree/prepareForInsertion.js +25 -19
  340. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  341. package/lib/simple-tree/schemaTypes.d.ts +8 -8
  342. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  343. package/lib/simple-tree/schemaTypes.js.map +1 -1
  344. package/lib/simple-tree/toStoredSchema.d.ts +6 -1
  345. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  346. package/lib/simple-tree/toStoredSchema.js +4 -1
  347. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  348. package/lib/simple-tree/{toMapTree.d.ts → unhydratedFlexTreeFromInsertable.d.ts} +12 -23
  349. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -0
  350. package/lib/simple-tree/{toMapTree.js → unhydratedFlexTreeFromInsertable.js} +105 -186
  351. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -0
  352. package/lib/treeFactory.d.ts.map +1 -1
  353. package/lib/treeFactory.js +6 -1
  354. package/lib/treeFactory.js.map +1 -1
  355. package/lib/util/index.d.ts +1 -1
  356. package/lib/util/index.d.ts.map +1 -1
  357. package/lib/util/index.js +1 -1
  358. package/lib/util/index.js.map +1 -1
  359. package/lib/util/utils.d.ts +4 -0
  360. package/lib/util/utils.d.ts.map +1 -1
  361. package/lib/util/utils.js +6 -0
  362. package/lib/util/utils.js.map +1 -1
  363. package/package.json +21 -21
  364. package/src/codec/codec.ts +24 -3
  365. package/src/codec/index.ts +1 -0
  366. package/src/codec/versioned/codec.ts +42 -5
  367. package/src/core/tree/detachedFieldIndex.ts +13 -4
  368. package/src/core/tree/mapTree.ts +22 -7
  369. package/src/core/tree/visitorUtils.ts +2 -2
  370. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +3 -2
  371. package/src/feature-libraries/default-schema/schemaChecker.ts +7 -6
  372. package/src/feature-libraries/flex-tree/context.ts +17 -7
  373. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +36 -15
  374. package/src/feature-libraries/flex-tree/index.ts +4 -0
  375. package/src/feature-libraries/flex-tree/lazyField.ts +8 -6
  376. package/src/feature-libraries/flex-tree/lazyNode.ts +6 -2
  377. package/src/feature-libraries/forest-summary/forestSummarizer.ts +3 -2
  378. package/src/feature-libraries/index.ts +9 -0
  379. package/src/feature-libraries/mapTreeCursor.ts +103 -16
  380. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +9 -5
  381. package/src/feature-libraries/treeCursorUtils.ts +21 -10
  382. package/src/index.ts +1 -0
  383. package/src/packageVersion.ts +1 -1
  384. package/src/shared-tree/schematizingTreeView.ts +40 -22
  385. package/src/shared-tree/sharedTree.ts +9 -3
  386. package/src/shared-tree/tree.ts +5 -20
  387. package/src/shared-tree/treeAlpha.ts +17 -11
  388. package/src/shared-tree/treeCheckout.ts +6 -3
  389. package/src/simple-tree/api/configuration.ts +3 -3
  390. package/src/simple-tree/api/create.ts +49 -19
  391. package/src/simple-tree/api/customTree.ts +10 -0
  392. package/src/simple-tree/api/index.ts +1 -4
  393. package/src/simple-tree/api/schemaFactory.ts +62 -13
  394. package/src/simple-tree/api/treeNodeApi.ts +48 -27
  395. package/src/simple-tree/api/verboseTree.ts +15 -12
  396. package/src/simple-tree/core/getOrCreateNode.ts +4 -2
  397. package/src/simple-tree/core/index.ts +2 -3
  398. package/src/simple-tree/core/treeNodeKernel.ts +37 -54
  399. package/src/simple-tree/core/unhydratedFlexTree.ts +222 -261
  400. package/src/simple-tree/index.ts +3 -3
  401. package/src/simple-tree/node-kinds/array/arrayNode.ts +12 -13
  402. package/src/simple-tree/node-kinds/index.ts +0 -1
  403. package/src/simple-tree/node-kinds/map/mapNode.ts +6 -9
  404. package/src/simple-tree/node-kinds/object/index.ts +0 -1
  405. package/src/simple-tree/node-kinds/object/objectNode.ts +7 -49
  406. package/src/simple-tree/prepareForInsertion.ts +49 -42
  407. package/src/simple-tree/schemaTypes.ts +9 -8
  408. package/src/simple-tree/toStoredSchema.ts +7 -1
  409. package/src/simple-tree/{toMapTree.ts → unhydratedFlexTreeFromInsertable.ts} +134 -226
  410. package/src/treeFactory.ts +6 -1
  411. package/src/util/index.ts +1 -0
  412. package/src/util/utils.ts +7 -0
  413. package/dist/simple-tree/toMapTree.d.ts.map +0 -1
  414. package/dist/simple-tree/toMapTree.js.map +0 -1
  415. package/lib/simple-tree/toMapTree.d.ts.map +0 -1
  416. package/lib/simple-tree/toMapTree.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, oob, fail } from "@fluidframework/core-utils/internal";
6
+ import { assert, oob, fail, unreachableCase } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import { EmptyKey, rootFieldKey } from "../../core/index.js";
9
9
  import { type TreeStatus, isTreeValue, FieldKinds } from "../../feature-libraries/index.js";
@@ -34,17 +34,23 @@ import {
34
34
  type TreeNode,
35
35
  tryGetTreeNodeSchema,
36
36
  getOrCreateNodeFromInnerNode,
37
- UnhydratedFlexTreeNode,
38
37
  typeSchemaSymbol,
39
38
  getOrCreateInnerNode,
40
39
  } from "../core/index.js";
41
40
  import type { TreeChangeEvents } from "./treeChangeEvents.js";
42
- import { lazilyAllocateIdentifier, isObjectNodeSchema } from "../node-kinds/index.js";
41
+ import { isObjectNodeSchema } from "../node-kinds/index.js";
42
+ import { getTreeNodeForField } from "../getTreeNodeForField.js";
43
43
 
44
44
  /**
45
45
  * Provides various functions for analyzing {@link TreeNode}s.
46
- * * @remarks
47
- * This type should only be used via the public `Tree` export.
46
+ *
47
+ * @remarks
48
+ * With the exception of {@link TreeNodeApi.status}, these functions should not be called with nodes that have
49
+ * been {@link TreeStatus.Deleted | deleted}.
50
+ * To verify whether or not a node already has been deleted, use the {@link TreeNodeApi.status} function.
51
+ *
52
+ * This type should only be used via the public {@link (Tree:variable)} export.
53
+ *
48
54
  * @privateRemarks
49
55
  * Due to limitations of API-Extractor link resolution, this type can't be moved into internalTypes but should be considered just an implementation detail of the `Tree` export.
50
56
  *
@@ -75,14 +81,19 @@ export interface TreeNodeApi {
75
81
 
76
82
  /**
77
83
  * Return the node under which this node resides in the tree (or undefined if this is a root node of the tree).
84
+ *
85
+ * @throws A {@link @fluidframework/telemetry-utils#UsageError} if the node has been {@link TreeStatus.Deleted | deleted}.
78
86
  */
79
87
  parent(node: TreeNode): TreeNode | undefined;
80
88
 
81
89
  /**
82
90
  * The key of the given node under its parent.
91
+ *
83
92
  * @remarks
84
93
  * If `node` is an element in a {@link (TreeArrayNode:interface)}, this returns the index of `node` in the array node (a `number`).
85
94
  * Otherwise, this returns the key of the field that it is under (a `string`).
95
+ *
96
+ * @throws A {@link @fluidframework/telemetry-utils#UsageError} if the node has been {@link TreeStatus.Deleted | deleted}.
86
97
  */
87
98
  key(node: TreeNode): string | number;
88
99
 
@@ -126,7 +137,7 @@ export interface TreeNodeApi {
126
137
  }
127
138
 
128
139
  /**
129
- * The `Tree` object holds various functions for analyzing {@link TreeNode}s.
140
+ * {@inheritDoc TreeNodeApi}
130
141
  */
131
142
  export const treeNodeApi: TreeNodeApi = {
132
143
  parent(node: TreeNode): TreeNode | undefined {
@@ -303,29 +314,39 @@ export function getIdentifierFromNode(
303
314
  return undefined;
304
315
  case 1: {
305
316
  const key = identifierFieldKeys[0] ?? oob();
306
- const identifier = flexNode.tryGetField(key)?.boxedAt(0);
307
- if (flexNode instanceof UnhydratedFlexTreeNode) {
308
- if (identifier === undefined) {
309
- return lazilyAllocateIdentifier(flexNode, key);
310
- }
311
- return identifier.value as string;
312
- }
313
- assert(
314
- identifier?.context.isHydrated() === true,
315
- 0xa27 /* Expected hydrated identifier */,
316
- );
317
- const identifierValue = identifier.value as string;
317
+ const identifierField = flexNode.tryGetField(key);
318
+ assert(identifierField !== undefined, 0xbb5 /* missing identifier field */);
319
+ const identifierValue = getTreeNodeForField(identifierField);
320
+ assert(typeof identifierValue === "string", 0xbb6 /* identifier not a string */);
318
321
 
319
- if (compression === "preferCompressed") {
320
- const localNodeKey =
321
- identifier.context.nodeKeyManager.tryLocalizeNodeIdentifier(identifierValue);
322
- return localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : identifierValue;
323
- } else if (compression === "compressed") {
324
- const localNodeKey =
325
- identifier.context.nodeKeyManager.tryLocalizeNodeIdentifier(identifierValue);
326
- return localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : undefined;
322
+ const context = flexNode.context;
323
+ switch (compression) {
324
+ case "preferCompressed": {
325
+ if (context.isHydrated()) {
326
+ const localNodeKey =
327
+ context.nodeKeyManager.tryLocalizeNodeIdentifier(identifierValue);
328
+ return localNodeKey !== undefined
329
+ ? extractFromOpaque(localNodeKey)
330
+ : identifierValue;
331
+ } else {
332
+ return identifierValue;
333
+ }
334
+ }
335
+ case "compressed": {
336
+ if (context.isHydrated()) {
337
+ const localNodeKey =
338
+ context.nodeKeyManager.tryLocalizeNodeIdentifier(identifierValue);
339
+ return localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : undefined;
340
+ } else {
341
+ return undefined;
342
+ }
343
+ }
344
+ case "uncompressed": {
345
+ return identifierValue;
346
+ }
347
+ default:
348
+ unreachableCase(compression);
327
349
  }
328
- return identifierValue;
329
350
  }
330
351
  default:
331
352
  throw new UsageError(
@@ -6,6 +6,7 @@
6
6
  import type { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
  import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
8
8
  import { assert, fail } from "@fluidframework/core-utils/internal";
9
+ import { UsageError } from "@fluidframework/telemetry-utils/internal";
9
10
 
10
11
  import {
11
12
  aboveRootPlaceholder,
@@ -14,7 +15,6 @@ import {
14
15
  type FieldKey,
15
16
  type ITreeCursor,
16
17
  type ITreeCursorSynchronous,
17
- type TreeNodeSchemaIdentifier,
18
18
  } from "../../core/index.js";
19
19
  import { brand } from "../../util/index.js";
20
20
  import type {
@@ -40,6 +40,7 @@ import { isObjectNodeSchema } from "../node-kinds/index.js";
40
40
  import {
41
41
  customFromCursor,
42
42
  replaceHandles,
43
+ unknownTypeError,
43
44
  type CustomTreeNode,
44
45
  type HandleConverter,
45
46
  type SchemalessParseOptions,
@@ -153,12 +154,14 @@ export function applySchemaToParserOptions(
153
154
  return key;
154
155
  },
155
156
  parse: (type, inputKey): FieldKey => {
156
- const simpleNodeSchema =
157
- context.schema.get(brand(type)) ?? fail(0xb3a /* missing schema */);
157
+ const simpleNodeSchema = context.schema.get(brand(type)) ?? unknownTypeError(type);
158
158
  if (isObjectNodeSchema(simpleNodeSchema)) {
159
- const info =
160
- simpleNodeSchema.flexKeyMap.get(inputKey) ??
161
- fail(0xb3b /* missing field info */);
159
+ const info = simpleNodeSchema.flexKeyMap.get(inputKey);
160
+ if (info === undefined) {
161
+ throw new UsageError(
162
+ `Failed to parse VerboseTree due to unexpected key ${JSON.stringify(inputKey)} on type ${JSON.stringify(type)}.`,
163
+ );
164
+ }
162
165
  return info.storedKey;
163
166
  }
164
167
  return brand(inputKey);
@@ -203,19 +206,19 @@ function verboseTreeAdapter(options: SchemalessParseOptions): CursorAdapter<Verb
203
206
  type: (node: VerboseTree) => {
204
207
  switch (typeof node) {
205
208
  case "number":
206
- return numberSchema.identifier as TreeNodeSchemaIdentifier;
209
+ return brand(numberSchema.identifier);
207
210
  case "string":
208
- return stringSchema.identifier as TreeNodeSchemaIdentifier;
211
+ return brand(stringSchema.identifier);
209
212
  case "boolean":
210
- return booleanSchema.identifier as TreeNodeSchemaIdentifier;
213
+ return brand(booleanSchema.identifier);
211
214
  default:
212
215
  if (node === null) {
213
- return nullSchema.identifier as TreeNodeSchemaIdentifier;
216
+ return brand(nullSchema.identifier);
214
217
  }
215
218
  if (isFluidHandle(node)) {
216
- return handleSchema.identifier as TreeNodeSchemaIdentifier;
219
+ return brand(handleSchema.identifier);
217
220
  }
218
- return node.type as TreeNodeSchemaIdentifier;
221
+ return brand(node.type);
219
222
  }
220
223
  },
221
224
  keysFromNode: (node: VerboseTree): readonly FieldKey[] => {
@@ -8,9 +8,9 @@ import type { TreeValue } from "../../core/index.js";
8
8
  import type { TreeNode } from "./treeNode.js";
9
9
  import {
10
10
  type InnerNode,
11
- unhydratedFlexTreeNodeToTreeNode,
12
11
  simpleTreeNodeSlot,
13
12
  createTreeNodeFromInner,
13
+ splitInnerNodeType,
14
14
  } from "./treeNodeKernel.js";
15
15
  import { UnhydratedFlexTreeNode } from "./unhydratedFlexTree.js";
16
16
 
@@ -21,9 +21,11 @@ import { UnhydratedFlexTreeNode } from "./unhydratedFlexTree.js";
21
21
  * This supports both hydrated and unhydrated nodes.
22
22
  */
23
23
  export function getOrCreateNodeFromInnerNode(flexNode: InnerNode): TreeNode | TreeValue {
24
+ splitInnerNodeType(flexNode);
25
+
24
26
  const cached =
25
27
  flexNode instanceof UnhydratedFlexTreeNode
26
- ? unhydratedFlexTreeNodeToTreeNode.get(flexNode)
28
+ ? flexNode.treeNode
27
29
  : flexNode.anchorNode.slots.get(simpleTreeNodeSlot);
28
30
 
29
31
  if (cached !== undefined) {
@@ -10,7 +10,6 @@ export {
10
10
  tryGetTreeNodeSchema,
11
11
  type InnerNode,
12
12
  tryDisposeTreeNode,
13
- unhydratedFlexTreeNodeToTreeNode,
14
13
  getOrCreateInnerNode,
15
14
  treeNodeFromAnchor,
16
15
  getSimpleNodeSchemaFromInnerNode,
@@ -38,7 +37,7 @@ export { Context, HydratedContext, SimpleContextSlot } from "./context.js";
38
37
  export { getOrCreateNodeFromInnerNode } from "./getOrCreateNode.js";
39
38
  export {
40
39
  UnhydratedFlexTreeNode,
41
- UnhydratedTreeSequenceField,
42
- tryUnhydratedFlexTreeNode,
40
+ UnhydratedSequenceField,
43
41
  UnhydratedContext,
42
+ createField,
44
43
  } from "./unhydratedFlexTree.js";
@@ -27,6 +27,7 @@ import {
27
27
  TreeStatus,
28
28
  treeStatusFromAnchorCache,
29
29
  type FlexTreeNode,
30
+ type HydratedFlexTreeNode,
30
31
  } from "../../feature-libraries/index.js";
31
32
 
32
33
  import { SimpleContextSlot, type Context, type HydratedContext } from "./context.js";
@@ -143,12 +144,15 @@ export class TreeNodeKernel {
143
144
  innerNode: InnerNode,
144
145
  private readonly initialContext: Context,
145
146
  ) {
147
+ splitInnerNodeType(innerNode);
148
+
146
149
  assert(!treeNodeToKernel.has(node), 0xa1a /* only one kernel per node can be made */);
147
150
  treeNodeToKernel.set(node, this);
148
151
 
149
152
  if (innerNode instanceof UnhydratedFlexTreeNode) {
150
153
  // Unhydrated case
151
- unhydratedFlexTreeNodeToTreeNodeInternal.set(innerNode, node);
154
+ debugAssert(() => innerNode.treeNode === undefined);
155
+ innerNode.treeNode = node;
152
156
  // Register for change events from the unhydrated flex node.
153
157
  // These will be fired if the unhydrated node is edited, and will also be forwarded later to the hydrated node.
154
158
  this.#hydrationState = {
@@ -160,7 +164,7 @@ export class TreeNodeKernel {
160
164
 
161
165
  let unhydratedNode: UnhydratedFlexTreeNode | undefined = innerNode;
162
166
  while (unhydratedNode !== undefined) {
163
- const treeNode = unhydratedFlexTreeNodeToTreeNodeInternal.get(unhydratedNode);
167
+ const treeNode = unhydratedNode.treeNode;
164
168
  if (treeNode !== undefined) {
165
169
  const kernel = getKernel(treeNode);
166
170
  kernel.#unhydratedEvents.value.emit("subtreeChangedAfterBatch");
@@ -178,6 +182,7 @@ export class TreeNodeKernel {
178
182
  } else {
179
183
  // Hydrated case
180
184
  this.#hydrationState = this.createHydratedState(innerNode.anchorNode);
185
+ this.#hydrationState.innerNode = innerNode;
181
186
  }
182
187
  }
183
188
 
@@ -202,7 +207,6 @@ export class TreeNodeKernel {
202
207
  public hydrate(anchors: AnchorSet, path: UpPath): void {
203
208
  assert(!this.disposed, 0xa2a /* cannot hydrate a disposed node */);
204
209
  assert(!isHydrated(this.#hydrationState), 0xa2b /* hydration should only happen once */);
205
- unhydratedFlexTreeNodeToTreeNodeInternal.delete(this.#hydrationState.innerNode);
206
210
 
207
211
  const anchor = anchors.track(path);
208
212
  const anchorNode =
@@ -291,16 +295,16 @@ export class TreeNodeKernel {
291
295
  }
292
296
 
293
297
  /**
294
- * Retrieves the flex node associated with the given target via {@link setInnerNode}.
298
+ * Retrieves the flex node associated with the given target.
295
299
  * @remarks
296
300
  * For {@link Unhydrated} nodes, this returns the MapTreeNode.
297
301
  *
298
302
  * For hydrated nodes it returns a FlexTreeNode backed by the forest.
299
303
  * Note that for "marinated" nodes, this FlexTreeNode exists and returns it: it does not return the MapTreeNode which is the current InnerNode.
300
304
  *
301
- * If `allowDeleted` is false, this will throw a UsageError if the node is deleted.
305
+ * @throws A {@link @fluidframework/telemetry-utils#UsageError} if the node has been deleted.
302
306
  */
303
- public getOrCreateInnerNode(allowDeleted = false): InnerNode {
307
+ public getOrCreateInnerNode(): InnerNode {
304
308
  if (!isHydrated(this.#hydrationState)) {
305
309
  debugAssert(
306
310
  () =>
@@ -310,6 +314,10 @@ export class TreeNodeKernel {
310
314
  return this.#hydrationState.innerNode; // Unhydrated case
311
315
  }
312
316
 
317
+ if (this.disposed) {
318
+ throw new UsageError("Cannot access a deleted node.");
319
+ }
320
+
313
321
  if (this.#hydrationState.innerNode === undefined) {
314
322
  // Marinated case -> cooked
315
323
  const anchorNode = this.#hydrationState.anchorNode;
@@ -326,15 +334,7 @@ export class TreeNodeKernel {
326
334
  context.checkout.forest.moveCursorToPath(anchorNode, cursor);
327
335
  this.#hydrationState.innerNode = makeTree(context, cursor);
328
336
  cursor.free();
329
- if (!allowDeleted) {
330
- assertFlexTreeEntityNotFreed(this.#hydrationState.innerNode);
331
- }
332
- }
333
- }
334
-
335
- if (!allowDeleted) {
336
- if (this.#hydrationState.innerNode.context.isDisposed()) {
337
- throw new UsageError("Cannot access a Deleted node.");
337
+ assertFlexTreeEntityNotFreed(this.#hydrationState.innerNode);
338
338
  }
339
339
  }
340
340
 
@@ -342,20 +342,12 @@ export class TreeNodeKernel {
342
342
  }
343
343
 
344
344
  /**
345
- * Retrieves the InnerNode associated with the given target via {@link setInnerNode}, if any.
346
- * @remarks
347
- * If `target` is an unhydrated node, returns its UnhydratedFlexTreeNode.
348
- * If `target` is a cooked node (or marinated but a FlexTreeNode exists) returns the FlexTreeNode.
349
- * If the target is a marinated node with no FlexTreeNode for its anchor, returns undefined.
345
+ * Retrieves the {@link UnhydratedFlexTreeNode} if unhydrated. otherwise undefined.
350
346
  */
351
- public tryGetInnerNode(): InnerNode | undefined {
347
+ public getInnerNodeIfUnhydrated(): UnhydratedFlexTreeNode | undefined {
352
348
  if (isHydrated(this.#hydrationState)) {
353
- return (
354
- this.#hydrationState.innerNode ??
355
- this.#hydrationState.anchorNode.slots.get(flexTreeSlot)
356
- );
349
+ return undefined;
357
350
  }
358
-
359
351
  return this.#hydrationState.innerNode;
360
352
  }
361
353
  }
@@ -365,34 +357,24 @@ const kernelEvents = ["childrenChangedAfterBatch", "subtreeChangedAfterBatch"] a
365
357
  type KernelEvents = Pick<AnchorEvents, (typeof kernelEvents)[number]>;
366
358
 
367
359
  /**
368
- * For "cooked" nodes this is a FlexTreeNode thats a projection of forest content.
369
- * For {@link Unhydrated} nodes this is a MapTreeNode.
370
- * For "marinated" nodes, some code (ex: getOrCreateInnerNode) returns the FlexTreeNode thats a projection of forest content, and some code (ex: tryGetInnerNode) returns undefined.
371
- *
372
- * @remarks
373
- * Currently MapTreeNode extends FlexTreeNode, and most code which can work with either just uses FlexTreeNode.
374
- * TODO: Code should be migrating toward using this type to distinguish to two use-cases.
360
+ * For "cooked" nodes this is a HydratedFlexTreeNode thats a projection of forest content.
361
+ * For {@link Unhydrated} nodes this is a UnhydratedFlexTreeNode.
375
362
  *
376
- * TODO: The inconsistent handling of "marinated" cases should be cleaned up.
377
- * Maybe getOrCreateInnerNode should cook marinated nodes so they have a proper InnerNode?
363
+ * For "marinated" nodes, some code (ex: getOrCreateInnerNode) returns the FlexTreeNode thats a projection of forest content, and some code (ex: tryGetInnerNode) returns undefined.
378
364
  */
379
- export type InnerNode = FlexTreeNode | UnhydratedFlexTreeNode;
365
+ export type InnerNode = FlexTreeNode;
380
366
 
381
367
  /**
382
- * Associates a given {@link UnhydratedFlexTreeNode} with a {@link TreeNode}.
383
- */
384
- const unhydratedFlexTreeNodeToTreeNodeInternal = new WeakMap<
385
- UnhydratedFlexTreeNode,
386
- TreeNode
387
- >();
388
- /**
389
- * Retrieves the {@link TreeNode} associated with the given {@link UnhydratedFlexTreeNode} if any.
368
+ * Narrows innerNode to either {@link UnhydratedFlexTreeNode} or {@link HydratedFlexTreeNode}.
390
369
  */
391
- export const unhydratedFlexTreeNodeToTreeNode =
392
- unhydratedFlexTreeNodeToTreeNodeInternal as Pick<
393
- WeakMap<UnhydratedFlexTreeNode, TreeNode>,
394
- "get"
395
- >;
370
+ export function splitInnerNodeType(
371
+ innerNode: InnerNode,
372
+ ): asserts innerNode is UnhydratedFlexTreeNode | HydratedFlexTreeNode {
373
+ assert(
374
+ innerNode instanceof UnhydratedFlexTreeNode || innerNode.isHydrated(),
375
+ "Invalid inner node type",
376
+ );
377
+ }
396
378
 
397
379
  /**
398
380
  * An anchor slot which associates an anchor with its corresponding {@link TreeNode}, if there is one.
@@ -426,6 +408,7 @@ export function getSimpleNodeSchemaFromInnerNode(innerNode: InnerNode): TreeNode
426
408
  * Gets the {@link Context} for the {@link InnerNode}.
427
409
  */
428
410
  export function getSimpleContextFromInnerNode(innerNode: InnerNode): Context {
411
+ splitInnerNodeType(innerNode);
429
412
  if (innerNode instanceof UnhydratedFlexTreeNode) {
430
413
  return innerNode.simpleContext;
431
414
  }
@@ -437,24 +420,24 @@ export function getSimpleContextFromInnerNode(innerNode: InnerNode): Context {
437
420
  }
438
421
 
439
422
  /**
440
- * Retrieves the flex node associated with the given target via {@link setInnerNode}.
423
+ * Retrieves the flex node associated with the given target.
441
424
  * @remarks
442
425
  * For {@link Unhydrated} nodes, this returns the MapTreeNode.
443
426
  *
444
427
  * For hydrated nodes it returns a FlexTreeNode backed by the forest.
445
428
  * Note that for "marinated" nodes, this FlexTreeNode exists and returns it: it does not return the MapTreeNode which is the current InnerNode.
446
429
  *
447
- * If `allowDeleted` is false, this will throw a UsageError if the node is deleted.
430
+ * @throws A {@link @fluidframework/telemetry-utils#UsageError} if the node has been deleted.
448
431
  */
449
- export function getOrCreateInnerNode(treeNode: TreeNode, allowDeleted = false): InnerNode {
432
+ export function getOrCreateInnerNode(treeNode: TreeNode): InnerNode {
450
433
  const kernel = getKernel(treeNode);
451
- return kernel.getOrCreateInnerNode(allowDeleted);
434
+ return kernel.getOrCreateInnerNode();
452
435
  }
453
436
 
454
437
  /**
455
438
  * Gets a flex node from an anchor node
456
439
  */
457
- function flexNodeFromAnchor(anchorNode: AnchorNode): FlexTreeNode {
440
+ function flexNodeFromAnchor(anchorNode: AnchorNode): HydratedFlexTreeNode {
458
441
  const flexNode = anchorNode.slots.get(flexTreeSlot);
459
442
  if (flexNode !== undefined) {
460
443
  return flexNode; // If it does have a flex node, return it...