@fluidframework/tree 2.32.0 → 2.33.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 (339) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/api-report/tree.alpha.api.md +169 -192
  3. package/api-report/tree.beta.api.md +135 -164
  4. package/api-report/tree.legacy.alpha.api.md +138 -167
  5. package/api-report/tree.legacy.public.api.md +135 -164
  6. package/api-report/tree.public.api.md +135 -164
  7. package/dist/alpha.d.ts +3 -11
  8. package/dist/beta.d.ts +2 -11
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +1 -2
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/schema-stored/index.d.ts +1 -1
  14. package/dist/core/schema-stored/index.d.ts.map +1 -1
  15. package/dist/core/schema-stored/index.js +1 -2
  16. package/dist/core/schema-stored/index.js.map +1 -1
  17. package/dist/core/schema-stored/schema.d.ts +4 -11
  18. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  19. package/dist/core/schema-stored/schema.js +7 -14
  20. package/dist/core/schema-stored/schema.js.map +1 -1
  21. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  22. package/dist/core/tree/anchorSet.js +31 -24
  23. package/dist/core/tree/anchorSet.js.map +1 -1
  24. package/dist/core/tree/deltaUtil.d.ts +1 -4
  25. package/dist/core/tree/deltaUtil.d.ts.map +1 -1
  26. package/dist/core/tree/deltaUtil.js +1 -13
  27. package/dist/core/tree/deltaUtil.js.map +1 -1
  28. package/dist/core/tree/visitDelta.d.ts +6 -29
  29. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  30. package/dist/core/tree/visitDelta.js +11 -50
  31. package/dist/core/tree/visitDelta.js.map +1 -1
  32. package/dist/core/tree/visitorUtils.d.ts +12 -9
  33. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  34. package/dist/core/tree/visitorUtils.js +19 -32
  35. package/dist/core/tree/visitorUtils.js.map +1 -1
  36. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  37. package/dist/feature-libraries/chunked-forest/chunkedForest.js +6 -11
  38. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  39. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +1 -1
  40. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  41. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  42. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts +41 -5
  43. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js +43 -26
  45. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +1 -1
  47. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  48. package/dist/feature-libraries/flex-tree/context.d.ts +5 -0
  49. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  50. package/dist/feature-libraries/flex-tree/context.js +4 -0
  51. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  52. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +8 -0
  53. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  54. package/dist/feature-libraries/flex-tree/flexTreeTypes.js +8 -0
  55. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  56. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  57. package/dist/feature-libraries/indexing/anchorTreeIndex.js +15 -22
  58. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  59. package/dist/feature-libraries/node-identifier/nodeIdentifierManager.d.ts.map +1 -1
  60. package/dist/feature-libraries/node-identifier/nodeIdentifierManager.js +29 -25
  61. package/dist/feature-libraries/node-identifier/nodeIdentifierManager.js.map +1 -1
  62. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  63. package/dist/feature-libraries/object-forest/objectForest.js +1 -7
  64. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  65. package/dist/feature-libraries/schema-index/codec.d.ts.map +1 -1
  66. package/dist/feature-libraries/schema-index/codec.js +1 -1
  67. package/dist/feature-libraries/schema-index/codec.js.map +1 -1
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +3 -2
  71. package/dist/index.js.map +1 -1
  72. package/dist/internalTypes.d.ts +1 -1
  73. package/dist/internalTypes.d.ts.map +1 -1
  74. package/dist/internalTypes.js.map +1 -1
  75. package/dist/jsonDomainSchema.d.ts +6 -6
  76. package/dist/jsonDomainSchema.d.ts.map +1 -1
  77. package/dist/jsonDomainSchema.js.map +1 -1
  78. package/dist/legacy.d.ts +2 -11
  79. package/dist/packageVersion.d.ts +1 -1
  80. package/dist/packageVersion.js +1 -1
  81. package/dist/packageVersion.js.map +1 -1
  82. package/dist/public.d.ts +2 -11
  83. package/dist/serializableDomainSchema.d.ts +5 -5
  84. package/dist/shared-tree/checkoutFlexTreeView.d.ts +1 -0
  85. package/dist/shared-tree/checkoutFlexTreeView.d.ts.map +1 -1
  86. package/dist/shared-tree/checkoutFlexTreeView.js +4 -0
  87. package/dist/shared-tree/checkoutFlexTreeView.js.map +1 -1
  88. package/dist/shared-tree/index.d.ts +3 -2
  89. package/dist/shared-tree/index.d.ts.map +1 -1
  90. package/dist/shared-tree/index.js +2 -2
  91. package/dist/shared-tree/index.js.map +1 -1
  92. package/dist/shared-tree/sharedTree.d.ts +4 -35
  93. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  94. package/dist/shared-tree/sharedTree.js +4 -54
  95. package/dist/shared-tree/sharedTree.js.map +1 -1
  96. package/dist/simple-tree/api/index.d.ts +2 -1
  97. package/dist/simple-tree/api/index.d.ts.map +1 -1
  98. package/dist/simple-tree/api/index.js +3 -1
  99. package/dist/simple-tree/api/index.js.map +1 -1
  100. package/dist/simple-tree/api/schemaFactory.d.ts +28 -28
  101. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  102. package/dist/simple-tree/api/schemaFactory.js +11 -11
  103. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  104. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +6 -7
  105. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  106. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  107. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +24 -5
  108. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  109. package/dist/simple-tree/api/schemaFactoryRecursive.js +14 -1
  110. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  111. package/dist/simple-tree/api/testRecursiveDomain.d.ts +10 -10
  112. package/dist/simple-tree/api/tree.d.ts +1 -14
  113. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  114. package/dist/simple-tree/api/tree.js.map +1 -1
  115. package/dist/simple-tree/api/typesUnsafe.d.ts +237 -220
  116. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  117. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  118. package/dist/simple-tree/arrayNode.d.ts +2 -2
  119. package/dist/simple-tree/arrayNode.d.ts.map +1 -1
  120. package/dist/simple-tree/arrayNode.js.map +1 -1
  121. package/dist/simple-tree/core/treeNodeKernel.d.ts +9 -2
  122. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  123. package/dist/simple-tree/core/treeNodeKernel.js +39 -24
  124. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  125. package/dist/simple-tree/core/types.d.ts +14 -4
  126. package/dist/simple-tree/core/types.d.ts.map +1 -1
  127. package/dist/simple-tree/core/types.js +14 -4
  128. package/dist/simple-tree/core/types.js.map +1 -1
  129. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +2 -1
  130. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  131. package/dist/simple-tree/core/unhydratedFlexTree.js +3 -0
  132. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  133. package/dist/simple-tree/index.d.ts +1 -1
  134. package/dist/simple-tree/index.d.ts.map +1 -1
  135. package/dist/simple-tree/index.js +3 -2
  136. package/dist/simple-tree/index.js.map +1 -1
  137. package/dist/simple-tree/objectNode.d.ts +9 -2
  138. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  139. package/dist/simple-tree/objectNode.js +3 -0
  140. package/dist/simple-tree/objectNode.js.map +1 -1
  141. package/dist/simple-tree/schemaTypes.d.ts +10 -5
  142. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  143. package/dist/simple-tree/schemaTypes.js +5 -2
  144. package/dist/simple-tree/schemaTypes.js.map +1 -1
  145. package/dist/tableSchema.d.ts +78 -26
  146. package/dist/tableSchema.d.ts.map +1 -1
  147. package/dist/tableSchema.js +53 -24
  148. package/dist/tableSchema.js.map +1 -1
  149. package/dist/treeFactory.d.ts +6 -12
  150. package/dist/treeFactory.d.ts.map +1 -1
  151. package/dist/treeFactory.js +56 -5
  152. package/dist/treeFactory.js.map +1 -1
  153. package/lib/alpha.d.ts +3 -11
  154. package/lib/beta.d.ts +2 -11
  155. package/lib/core/index.d.ts +1 -1
  156. package/lib/core/index.d.ts.map +1 -1
  157. package/lib/core/index.js +1 -1
  158. package/lib/core/index.js.map +1 -1
  159. package/lib/core/schema-stored/index.d.ts +1 -1
  160. package/lib/core/schema-stored/index.d.ts.map +1 -1
  161. package/lib/core/schema-stored/index.js +1 -1
  162. package/lib/core/schema-stored/index.js.map +1 -1
  163. package/lib/core/schema-stored/schema.d.ts +4 -11
  164. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  165. package/lib/core/schema-stored/schema.js +6 -12
  166. package/lib/core/schema-stored/schema.js.map +1 -1
  167. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  168. package/lib/core/tree/anchorSet.js +31 -24
  169. package/lib/core/tree/anchorSet.js.map +1 -1
  170. package/lib/core/tree/deltaUtil.d.ts +1 -4
  171. package/lib/core/tree/deltaUtil.d.ts.map +1 -1
  172. package/lib/core/tree/deltaUtil.js +0 -9
  173. package/lib/core/tree/deltaUtil.js.map +1 -1
  174. package/lib/core/tree/visitDelta.d.ts +6 -29
  175. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  176. package/lib/core/tree/visitDelta.js +12 -51
  177. package/lib/core/tree/visitDelta.js.map +1 -1
  178. package/lib/core/tree/visitorUtils.d.ts +12 -9
  179. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  180. package/lib/core/tree/visitorUtils.js +19 -32
  181. package/lib/core/tree/visitorUtils.js.map +1 -1
  182. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  183. package/lib/feature-libraries/chunked-forest/chunkedForest.js +6 -11
  184. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  185. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +1 -1
  186. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  187. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  188. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts +41 -5
  189. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +1 -1
  190. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js +43 -26
  191. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  192. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +1 -1
  193. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  194. package/lib/feature-libraries/flex-tree/context.d.ts +5 -0
  195. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  196. package/lib/feature-libraries/flex-tree/context.js +5 -1
  197. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  198. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +8 -0
  199. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  200. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +8 -0
  201. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  202. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  203. package/lib/feature-libraries/indexing/anchorTreeIndex.js +15 -22
  204. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  205. package/lib/feature-libraries/node-identifier/nodeIdentifierManager.d.ts.map +1 -1
  206. package/lib/feature-libraries/node-identifier/nodeIdentifierManager.js +28 -24
  207. package/lib/feature-libraries/node-identifier/nodeIdentifierManager.js.map +1 -1
  208. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  209. package/lib/feature-libraries/object-forest/objectForest.js +1 -7
  210. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  211. package/lib/feature-libraries/schema-index/codec.d.ts.map +1 -1
  212. package/lib/feature-libraries/schema-index/codec.js +2 -2
  213. package/lib/feature-libraries/schema-index/codec.js.map +1 -1
  214. package/lib/index.d.ts +1 -1
  215. package/lib/index.d.ts.map +1 -1
  216. package/lib/index.js +1 -1
  217. package/lib/index.js.map +1 -1
  218. package/lib/internalTypes.d.ts +1 -1
  219. package/lib/internalTypes.d.ts.map +1 -1
  220. package/lib/internalTypes.js.map +1 -1
  221. package/lib/jsonDomainSchema.d.ts +6 -6
  222. package/lib/jsonDomainSchema.d.ts.map +1 -1
  223. package/lib/jsonDomainSchema.js.map +1 -1
  224. package/lib/legacy.d.ts +2 -11
  225. package/lib/packageVersion.d.ts +1 -1
  226. package/lib/packageVersion.js +1 -1
  227. package/lib/packageVersion.js.map +1 -1
  228. package/lib/public.d.ts +2 -11
  229. package/lib/serializableDomainSchema.d.ts +5 -5
  230. package/lib/shared-tree/checkoutFlexTreeView.d.ts +1 -0
  231. package/lib/shared-tree/checkoutFlexTreeView.d.ts.map +1 -1
  232. package/lib/shared-tree/checkoutFlexTreeView.js +4 -0
  233. package/lib/shared-tree/checkoutFlexTreeView.js.map +1 -1
  234. package/lib/shared-tree/index.d.ts +3 -2
  235. package/lib/shared-tree/index.d.ts.map +1 -1
  236. package/lib/shared-tree/index.js +1 -1
  237. package/lib/shared-tree/index.js.map +1 -1
  238. package/lib/shared-tree/sharedTree.d.ts +4 -35
  239. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  240. package/lib/shared-tree/sharedTree.js +2 -51
  241. package/lib/shared-tree/sharedTree.js.map +1 -1
  242. package/lib/simple-tree/api/index.d.ts +2 -1
  243. package/lib/simple-tree/api/index.d.ts.map +1 -1
  244. package/lib/simple-tree/api/index.js +1 -0
  245. package/lib/simple-tree/api/index.js.map +1 -1
  246. package/lib/simple-tree/api/schemaFactory.d.ts +28 -28
  247. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  248. package/lib/simple-tree/api/schemaFactory.js +11 -11
  249. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  250. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +6 -7
  251. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  252. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  253. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +24 -5
  254. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  255. package/lib/simple-tree/api/schemaFactoryRecursive.js +12 -0
  256. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  257. package/lib/simple-tree/api/testRecursiveDomain.d.ts +10 -10
  258. package/lib/simple-tree/api/tree.d.ts +1 -14
  259. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  260. package/lib/simple-tree/api/tree.js.map +1 -1
  261. package/lib/simple-tree/api/typesUnsafe.d.ts +237 -220
  262. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  263. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  264. package/lib/simple-tree/arrayNode.d.ts +2 -2
  265. package/lib/simple-tree/arrayNode.d.ts.map +1 -1
  266. package/lib/simple-tree/arrayNode.js.map +1 -1
  267. package/lib/simple-tree/core/treeNodeKernel.d.ts +9 -2
  268. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  269. package/lib/simple-tree/core/treeNodeKernel.js +40 -25
  270. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  271. package/lib/simple-tree/core/types.d.ts +14 -4
  272. package/lib/simple-tree/core/types.d.ts.map +1 -1
  273. package/lib/simple-tree/core/types.js +14 -4
  274. package/lib/simple-tree/core/types.js.map +1 -1
  275. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +2 -1
  276. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  277. package/lib/simple-tree/core/unhydratedFlexTree.js +3 -0
  278. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  279. package/lib/simple-tree/index.d.ts +1 -1
  280. package/lib/simple-tree/index.d.ts.map +1 -1
  281. package/lib/simple-tree/index.js +1 -1
  282. package/lib/simple-tree/index.js.map +1 -1
  283. package/lib/simple-tree/objectNode.d.ts +9 -2
  284. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  285. package/lib/simple-tree/objectNode.js +4 -1
  286. package/lib/simple-tree/objectNode.js.map +1 -1
  287. package/lib/simple-tree/schemaTypes.d.ts +10 -5
  288. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  289. package/lib/simple-tree/schemaTypes.js +5 -2
  290. package/lib/simple-tree/schemaTypes.js.map +1 -1
  291. package/lib/tableSchema.d.ts +78 -26
  292. package/lib/tableSchema.d.ts.map +1 -1
  293. package/lib/tableSchema.js +53 -24
  294. package/lib/tableSchema.js.map +1 -1
  295. package/lib/treeFactory.d.ts +6 -12
  296. package/lib/treeFactory.d.ts.map +1 -1
  297. package/lib/treeFactory.js +55 -3
  298. package/lib/treeFactory.js.map +1 -1
  299. package/lib/tsdoc-metadata.json +1 -1
  300. package/package.json +22 -23
  301. package/src/core/index.ts +0 -2
  302. package/src/core/schema-stored/index.ts +0 -2
  303. package/src/core/schema-stored/schema.ts +10 -29
  304. package/src/core/tree/anchorSet.ts +32 -24
  305. package/src/core/tree/deltaUtil.ts +1 -13
  306. package/src/core/tree/visitDelta.ts +24 -81
  307. package/src/core/tree/visitorUtils.ts +43 -53
  308. package/src/feature-libraries/chunked-forest/chunkedForest.ts +7 -22
  309. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +1 -1
  310. package/src/feature-libraries/chunked-forest/codec/nodeShape.ts +45 -27
  311. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +1 -1
  312. package/src/feature-libraries/flex-tree/context.ts +11 -1
  313. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +8 -0
  314. package/src/feature-libraries/indexing/anchorTreeIndex.ts +17 -28
  315. package/src/feature-libraries/node-identifier/nodeIdentifierManager.ts +39 -38
  316. package/src/feature-libraries/object-forest/objectForest.ts +1 -18
  317. package/src/feature-libraries/schema-index/codec.ts +1 -2
  318. package/src/index.ts +3 -11
  319. package/src/internalTypes.ts +0 -19
  320. package/src/jsonDomainSchema.ts +1 -3
  321. package/src/packageVersion.ts +1 -1
  322. package/src/shared-tree/checkoutFlexTreeView.ts +6 -0
  323. package/src/shared-tree/index.ts +8 -3
  324. package/src/shared-tree/sharedTree.ts +5 -133
  325. package/src/simple-tree/api/index.ts +2 -22
  326. package/src/simple-tree/api/schemaFactory.ts +40 -54
  327. package/src/simple-tree/api/schemaFactoryAlpha.ts +9 -14
  328. package/src/simple-tree/api/schemaFactoryRecursive.ts +25 -5
  329. package/src/simple-tree/api/tree.ts +1 -14
  330. package/src/simple-tree/api/typesUnsafe.ts +359 -341
  331. package/src/simple-tree/arrayNode.ts +2 -2
  332. package/src/simple-tree/core/treeNodeKernel.ts +46 -28
  333. package/src/simple-tree/core/types.ts +14 -4
  334. package/src/simple-tree/core/unhydratedFlexTree.ts +5 -1
  335. package/src/simple-tree/index.ts +2 -22
  336. package/src/simple-tree/objectNode.ts +13 -4
  337. package/src/simple-tree/schemaTypes.ts +11 -7
  338. package/src/tableSchema.ts +190 -63
  339. package/src/treeFactory.ts +151 -8
@@ -45,7 +45,7 @@ import {
45
45
  } from "./core/index.js";
46
46
  import { TreeNodeValid, type MostDerivedData } from "./treeNodeValid.js";
47
47
  import { getUnhydratedContext } from "./createContext.js";
48
- import type { ImplicitAllowedTypesUnsafe } from "./api/index.js";
48
+ import type { System_Unsafe } from "./api/index.js";
49
49
  import type {
50
50
  ArrayNodeCustomizableSchema,
51
51
  ArrayNodePojoEmulationSchema,
@@ -75,7 +75,7 @@ export interface ReadonlyArrayNode<out T = TreeNode | TreeLeafValue>
75
75
  * @sealed @public
76
76
  */
77
77
  export interface TreeArrayNode<
78
- TAllowedTypes extends ImplicitAllowedTypesUnsafe = ImplicitAllowedTypes,
78
+ TAllowedTypes extends System_Unsafe.ImplicitAllowedTypesUnsafe = ImplicitAllowedTypes,
79
79
  out T = [TAllowedTypes] extends [ImplicitAllowedTypes]
80
80
  ? TreeNodeFromImplicitAllowedTypes<TAllowedTypes>
81
81
  : TreeNodeFromImplicitAllowedTypes<ImplicitAllowedTypes>,
@@ -3,7 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, Lazy, fail } from "@fluidframework/core-utils/internal";
6
+ import { assert, Lazy, fail, debugAssert } from "@fluidframework/core-utils/internal";
7
+ import { UsageError } from "@fluidframework/telemetry-utils/internal";
7
8
  import { createEmitter } from "@fluid-internal/client-utils";
8
9
  import type { Listenable, Off } from "@fluidframework/core-interfaces";
9
10
  import type { InternalTreeNode, TreeNode, Unhydrated } from "./types.js";
@@ -72,7 +73,7 @@ export function tryGetTreeNodeSchema(value: unknown): undefined | TreeNodeSchema
72
73
  /** The {@link HydrationState} of a {@link TreeNodeKernel} before the kernel is hydrated */
73
74
  interface UnhydratedState {
74
75
  off: Off;
75
- innerNode: UnhydratedFlexTreeNode;
76
+ readonly innerNode: UnhydratedFlexTreeNode;
76
77
  }
77
78
 
78
79
  /** The {@link HydrationState} of a {@link TreeNodeKernel} after the kernel is hydrated */
@@ -80,9 +81,9 @@ interface HydratedState {
80
81
  /** The flex node for this kernel (lazy - undefined if it has not yet been demanded) */
81
82
  innerNode?: FlexTreeNode;
82
83
  /** The {@link AnchorNode} that this node is associated with. */
83
- anchorNode: AnchorNode;
84
+ readonly anchorNode: AnchorNode;
84
85
  /** All {@link Off | event deregistration functions} that should be run when the kernel is disposed. */
85
- offAnchorNode: Set<Off>;
86
+ readonly offAnchorNode: Set<Off>;
86
87
  }
87
88
 
88
89
  /** State within a {@link TreeNodeKernel} that is related to the hydration process */
@@ -287,35 +288,46 @@ export class TreeNodeKernel {
287
288
  *
288
289
  * For hydrated nodes it returns a FlexTreeNode backed by the forest.
289
290
  * Note that for "marinated" nodes, this FlexTreeNode exists and returns it: it does not return the MapTreeNode which is the current InnerNode.
291
+ *
292
+ * If `allowDeleted` is false, this will throw a UsageError if the node is deleted.
290
293
  */
291
- public getOrCreateInnerNode(allowFreed = false): InnerNode {
294
+ public getOrCreateInnerNode(allowDeleted = false): InnerNode {
292
295
  if (!isHydrated(this.#hydrationState)) {
296
+ debugAssert(
297
+ () =>
298
+ this.#hydrationState.innerNode?.context.isDisposed() === false ||
299
+ "Unhydrated node should never be disposed",
300
+ );
293
301
  return this.#hydrationState.innerNode; // Unhydrated case
294
302
  }
295
303
 
296
- if (this.#hydrationState.innerNode !== undefined) {
297
- return this.#hydrationState.innerNode; // Cooked case
304
+ if (this.#hydrationState.innerNode === undefined) {
305
+ // Marinated case -> cooked
306
+ const anchorNode = this.#hydrationState.anchorNode;
307
+ // The proxy is bound to an anchor node, but it may or may not have an actual flex node yet
308
+ const flexNode = anchorNode.slots.get(flexTreeSlot);
309
+ if (flexNode !== undefined) {
310
+ // If the flex node already exists, use it...
311
+ this.#hydrationState.innerNode = flexNode;
312
+ } else {
313
+ // ...otherwise, the flex node must be created
314
+ const context =
315
+ anchorNode.anchorSet.slots.get(ContextSlot) ?? fail(0xb41 /* missing context */);
316
+ const cursor = context.checkout.forest.allocateCursor("getFlexNode");
317
+ context.checkout.forest.moveCursorToPath(anchorNode, cursor);
318
+ this.#hydrationState.innerNode = makeTree(context, cursor);
319
+ cursor.free();
320
+ // Calling this is a performance improvement, however, do this only after demand to avoid momentarily having no anchors to anchorNode
321
+ anchorForgetters?.get(this.node)?.();
322
+ if (!allowDeleted) {
323
+ assertFlexTreeEntityNotFreed(this.#hydrationState.innerNode);
324
+ }
325
+ }
298
326
  }
299
327
 
300
- // Marinated case -> cooked
301
- const anchorNode = this.#hydrationState.anchorNode;
302
- // The proxy is bound to an anchor node, but it may or may not have an actual flex node yet
303
- const flexNode = anchorNode.slots.get(flexTreeSlot);
304
- if (flexNode !== undefined) {
305
- // If the flex node already exists, use it...
306
- this.#hydrationState.innerNode = flexNode;
307
- } else {
308
- // ...otherwise, the flex node must be created
309
- const context =
310
- anchorNode.anchorSet.slots.get(ContextSlot) ?? fail(0xb41 /* missing context */);
311
- const cursor = context.checkout.forest.allocateCursor("getFlexNode");
312
- context.checkout.forest.moveCursorToPath(anchorNode, cursor);
313
- this.#hydrationState.innerNode = makeTree(context, cursor);
314
- cursor.free();
315
- // Calling this is a performance improvement, however, do this only after demand to avoid momentarily having no anchors to anchorNode
316
- anchorForgetters?.get(this.node)?.();
317
- if (!allowFreed) {
318
- assertFlexTreeEntityNotFreed(this.#hydrationState.innerNode);
328
+ if (!allowDeleted) {
329
+ if (this.#hydrationState.innerNode.context.isDisposed()) {
330
+ throw new UsageError("Cannot access a Deleted node.");
319
331
  }
320
332
  }
321
333
 
@@ -417,11 +429,15 @@ export const unhydratedFlexTreeNodeToTreeNode =
417
429
  */
418
430
  export const proxySlot = anchorSlot<TreeNode>();
419
431
 
432
+ /**
433
+ * Dispose a TreeNode (if any) for an existing anchor without disposing the anchor.
434
+ */
420
435
  export function tryDisposeTreeNode(anchorNode: AnchorNode): void {
421
436
  const treeNode = anchorNode.slots.get(proxySlot);
422
437
  if (treeNode !== undefined) {
423
438
  const kernel = getKernel(treeNode);
424
439
  kernel.dispose();
440
+ anchorNode.slots.delete(proxySlot);
425
441
  }
426
442
  }
427
443
 
@@ -454,10 +470,12 @@ export function getSimpleContextFromInnerNode(innerNode: InnerNode): Context {
454
470
  *
455
471
  * For hydrated nodes it returns a FlexTreeNode backed by the forest.
456
472
  * Note that for "marinated" nodes, this FlexTreeNode exists and returns it: it does not return the MapTreeNode which is the current InnerNode.
473
+ *
474
+ * If `allowDeleted` is false, this will throw a UsageError if the node is deleted.
457
475
  */
458
- export function getOrCreateInnerNode(treeNode: TreeNode, allowFreed = false): InnerNode {
476
+ export function getOrCreateInnerNode(treeNode: TreeNode, allowDeleted = false): InnerNode {
459
477
  const kernel = getKernel(treeNode);
460
- return kernel.getOrCreateInnerNode(allowFreed);
478
+ return kernel.getOrCreateInnerNode(allowDeleted);
461
479
  }
462
480
 
463
481
  /**
@@ -113,13 +113,23 @@ export interface TreeChangeEvents {
113
113
  * A non-{@link NodeKind.Leaf|leaf} SharedTree node. Includes objects, arrays, and maps.
114
114
  *
115
115
  * @remarks
116
- * Base type which all nodes implement.
116
+ * Base type which all nodes extend.
117
117
  *
118
- * This can be used as a type to indicate/document values which should be tree nodes.
118
+ * This type can be used as a type to indicate/document values which should be tree nodes.
119
119
  * Runtime use of this class object (for example when used with `instanceof` or extending it), is not currently supported.
120
120
  *
121
- * Instances of tree nodes must be created by opening an existing document, inserting values into the document,
122
- * or by using the constructors and create functions of {@link TreeNodeSchema} produced by {@link SchemaFactory}.
121
+ * There are three ways to get instances of TreeNode:
122
+ *
123
+ * 1. From a {@link TreeView} loading nodes from an existing document, or creating local copies of nodes inserted by a remote collaborator.
124
+ * This case provides an {@link InternalTreeNode} to the constructor: subclasses must not modify how the constructor handles this case.
125
+ * 2. Explicit construction of {@link Unhydrated} nodes using either {@link TreeNodeSchemaClass} as a constructor or {@link TreeNodeSchemaNonClass|TreeNodeSchemaNonClass.create}.
126
+ * Either way the {@link TreeNodeSchema} produced must be produced using a {@link SchemaFactory}.
127
+ * 3. Implicit construction: Several APIs which logically require an unhydrated TreeNode also allow passing in a value which could be used to explicitly construct the node instead.
128
+ * These APIs internally call the constructor with the provided value, so it's really just a special case of the above option.
129
+ * Note that when constructing nodes, sometimes implicit construction is not allowed
130
+ * (either at runtime due to ambiguous types or at compile time due to TypeScript limitations):
131
+ * in such cases, explicit construction must be used.
132
+ *
123
133
  * @privateRemarks
124
134
  * This is a class not an interface to enable stricter type checking (see {@link TreeNode.#brand})
125
135
  * and some runtime enforcement of schema class policy (see the the validation in the constructor).
@@ -73,7 +73,7 @@ interface LocationInField {
73
73
  *
74
74
  * Create a `UnhydratedFlexTreeNode` by calling {@link getOrCreate}.
75
75
  */
76
- export class UnhydratedFlexTreeNode implements UnhydratedFlexTreeNode {
76
+ export class UnhydratedFlexTreeNode implements FlexTreeNode {
77
77
  public get schema(): TreeNodeSchemaIdentifier {
78
78
  return this.mapTree.type;
79
79
  }
@@ -277,6 +277,10 @@ export class UnhydratedContext implements FlexTreeContext {
277
277
  public readonly schema: TreeStoredSchema,
278
278
  ) {}
279
279
 
280
+ public isDisposed(): boolean {
281
+ return false;
282
+ }
283
+
280
284
  public isHydrated(): this is FlexTreeHydratedContext {
281
285
  return false;
282
286
  }
@@ -83,28 +83,7 @@ export {
83
83
  comparePersistedSchemaInternal,
84
84
  ViewSchema,
85
85
  type Unenforced,
86
- type FieldHasDefaultUnsafe,
87
- type ObjectFromSchemaRecordUnsafe,
88
- type TreeObjectNodeUnsafe,
89
- type TreeFieldFromImplicitFieldUnsafe,
90
- type TreeNodeFromImplicitAllowedTypesUnsafe,
91
- type FieldSchemaUnsafe,
92
- type InsertableTreeNodeFromImplicitAllowedTypesUnsafe,
93
- type TreeArrayNodeUnsafe,
94
- type TreeMapNodeUnsafe,
95
- type InsertableObjectFromSchemaRecordUnsafe,
96
- type InsertableTreeFieldFromImplicitFieldUnsafe,
97
- type InsertableTypedNodeUnsafe,
98
- type NodeBuilderDataUnsafe,
99
- type NodeFromSchemaUnsafe,
100
- type ReadonlyMapInlined,
101
- type TreeNodeSchemaClassUnsafe,
102
- type TreeNodeSchemaUnsafe,
103
- type AllowedTypesUnsafe,
104
- type ImplicitAllowedTypesUnsafe,
105
- type ImplicitFieldSchemaUnsafe,
106
- type TreeNodeSchemaNonClassUnsafe,
107
- type InsertableTreeNodeFromAllowedTypesUnsafe,
86
+ type System_Unsafe,
108
87
  type ArrayNodeCustomizableSchemaUnsafe,
109
88
  type MapNodeCustomizableSchemaUnsafe,
110
89
  type TreeViewAlpha,
@@ -138,6 +117,7 @@ export {
138
117
  replaceHandles,
139
118
  replaceVerboseTreeHandles,
140
119
  type HandleConverter,
120
+ allowUnused,
141
121
  type FieldSchemaAlphaUnsafe,
142
122
  type TreeSchema,
143
123
  } from "./api/index.js";
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, Lazy, fail } from "@fluidframework/core-utils/internal";
6
+ import { assert, Lazy, fail, debugAssert } from "@fluidframework/core-utils/internal";
7
7
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
8
 
9
9
  import type { FieldKey, SchemaPolicy } from "../core/index.js";
@@ -56,6 +56,10 @@ import type { SimpleObjectFieldSchema } from "./simpleSchema.js";
56
56
 
57
57
  /**
58
58
  * Generates the properties for an ObjectNode from its field schema object.
59
+ * @remarks
60
+ * Due to {@link https://github.com/microsoft/TypeScript/issues/43826}, we can't enable implicit construction of {@link TreeNode|TreeNodes} for setters.
61
+ * Therefore code assigning to these fields must explicitly construct nodes using the schema's constructor or create method,
62
+ * or using some other method like {@link TreeAlpha.create}.
59
63
  * @system @public
60
64
  */
61
65
  export type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> =
@@ -69,14 +73,17 @@ export type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFie
69
73
  };
70
74
 
71
75
  /**
72
- * A {@link TreeNode} which modules a JavaScript object.
76
+ * A {@link TreeNode} which models a JavaScript object.
73
77
  * @remarks
74
- * Object nodes consist of a type which specifies which {@link TreeNodeSchema} they use (see {@link TreeNodeApi.schema}), and a collections of fields, each with a distinct `key` and its own {@link FieldSchema} defining what can be placed under that key.
78
+ * Object nodes consist of a type which specifies which {@link TreeNodeSchema} they use (see {@link TreeNodeApi.schema} and {@link SchemaFactory.object}),
79
+ * and a collections of fields, each with a distinct `key` and its own {@link FieldSchema} defining what can be placed under that key.
75
80
  *
76
81
  * All fields on an object node are exposed as own properties with string keys.
77
82
  * Non-empty fields are enumerable and empty optional fields are non-enumerable own properties with the value `undefined`.
78
83
  * No other own `own` or `enumerable` properties are included on object nodes unless the user of the node manually adds custom session only state.
79
84
  * This allows a majority of general purpose JavaScript object processing operations (like `for...in`, `Reflect.ownKeys()` and `Object.entries()`) to enumerate all the children.
85
+ *
86
+ * The API for fields is defined by {@link ObjectFromSchemaRecord}.
80
87
  * @public
81
88
  */
82
89
  export type TreeObjectNode<
@@ -174,6 +181,8 @@ function createFlexKeyMapping(fields: Record<string, ImplicitFieldSchema>): Simp
174
181
  }
175
182
 
176
183
  /**
184
+ * Creates a proxy handler for the given schema.
185
+ *
177
186
  * @param allowAdditionalProperties - If true, setting of unexpected properties will be forwarded to the target object.
178
187
  * Otherwise setting of unexpected properties will error.
179
188
  * TODO: consider implementing this using `Object.preventExtension` instead.
@@ -196,9 +205,9 @@ function createProxyHandler(
196
205
  const handler: ProxyHandler<TreeNode> = {
197
206
  get(target, propertyKey, proxy): unknown {
198
207
  const fieldInfo = schema.flexKeyMap.get(propertyKey);
199
-
200
208
  if (fieldInfo !== undefined) {
201
209
  const flexNode = getOrCreateInnerNode(proxy);
210
+ debugAssert(() => !flexNode.context.isDisposed() || "FlexTreeNode is disposed");
202
211
  const field = flexNode.tryGetField(fieldInfo.storedKey);
203
212
  if (field !== undefined) {
204
213
  return getTreeNodeForField(field);
@@ -81,9 +81,10 @@ export function isTreeNodeSchemaClass<
81
81
  export type AllowedTypes = readonly LazyItem<TreeNodeSchema>[];
82
82
 
83
83
  /**
84
- * Kind of a field on a node.
84
+ * Kind of a field on an {@link TreeObjectNode}.
85
85
  * @remarks
86
86
  * More kinds may be added over time, so do not assume this is an exhaustive set.
87
+ * See {@link FieldSchema} for where these are used, and {@link SchemaFactory} for how to create schema which use them.
87
88
  * @public
88
89
  */
89
90
  export enum FieldKind {
@@ -100,9 +101,11 @@ export enum FieldKind {
100
101
  */
101
102
  Required,
102
103
  /**
103
- * A special field used for node identifiers.
104
+ * A special readonly field used for node identifier strings.
104
105
  * @remarks
105
106
  * Only allows exactly one child.
107
+ *
108
+ * See {@link SchemaFactory.identifier} for more details.
106
109
  */
107
110
  Identifier,
108
111
  }
@@ -883,13 +886,14 @@ export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitA
883
886
  * @typeparam TList - AllowedTypes to process
884
887
  * @system @public
885
888
  */
886
- export type InsertableTreeNodeFromAllowedTypes<TList extends AllowedTypes> =
887
- TList extends readonly [
889
+ export type InsertableTreeNodeFromAllowedTypes<TList extends AllowedTypes> = [TList] extends [
890
+ readonly [
888
891
  LazyItem<infer TSchema extends TreeNodeSchema>,
889
892
  ...infer Rest extends AllowedTypes,
890
- ]
891
- ? InsertableTypedNode<TSchema> | InsertableTreeNodeFromAllowedTypes<Rest>
892
- : never;
893
+ ],
894
+ ]
895
+ ? InsertableTypedNode<TSchema> | InsertableTreeNodeFromAllowedTypes<Rest>
896
+ : never;
893
897
 
894
898
  /**
895
899
  * Takes in `TreeNodeSchema[]` and returns a TypedNode union.