@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
@@ -5,7 +5,7 @@
5
5
  */
6
6
  var _a, _b;
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.unsupportedUsageError = exports.tryUnhydratedFlexTreeNode = exports.UnhydratedTreeSequenceField = exports.UnhydratedContext = exports.UnhydratedFlexTreeNode = void 0;
8
+ exports.unsupportedUsageError = exports.createField = exports.UnhydratedSequenceField = exports.UnhydratedOptionalField = exports.UnhydratedFlexTreeField = exports.UnhydratedContext = exports.UnhydratedFlexTreeNode = void 0;
9
9
  const client_utils_1 = require("@fluid-internal/client-utils");
10
10
  const internal_1 = require("@fluidframework/core-utils/internal");
11
11
  const internal_2 = require("@fluidframework/telemetry-utils/internal");
@@ -13,70 +13,90 @@ const index_js_1 = require("../../core/index.js");
13
13
  const index_js_2 = require("../../feature-libraries/index.js");
14
14
  const index_js_3 = require("../../util/index.js");
15
15
  /**
16
- * An unhydrated implementation of {@link FlexTreeNode} which wraps a {@link MapTree}.
17
- * @remarks
18
- * MapTreeNodes are unconditionally cached -
19
- * when retrieved via {@link getOrCreateNodeFromInnerNode}, the same {@link MapTree} object will always produce the same `UnhydratedFlexTreeNode` object.
20
- *
21
- * Create a `UnhydratedFlexTreeNode` by calling {@link getOrCreate}.
16
+ * The {@link Unhydrated} implementation of {@link FlexTreeNode}.
22
17
  */
23
18
  class UnhydratedFlexTreeNode {
24
- get schema() {
25
- return this.mapTree.type;
19
+ isHydrated() {
20
+ return false;
26
21
  }
27
22
  get storedSchema() {
28
- return (this.context.schema.nodeSchema.get(this.mapTree.type) ?? (0, internal_1.fail)(0xb46 /* missing schema */));
23
+ return (this.context.schema.nodeSchema.get(this.data.type) ?? (0, internal_1.fail)(0xb46 /* missing schema */));
29
24
  }
30
25
  get events() {
31
26
  return this._events;
32
27
  }
33
- /**
34
- * Create a {@link UnhydratedFlexTreeNode} that wraps the given {@link MapTree}, or get the node that already exists for that {@link MapTree} if there is one.
35
- * @param nodeSchema - the {@link FlexTreeNodeSchema | schema} that the node conforms to
36
- * @param mapTree - the {@link MapTree} containing the data for this node.
37
- * @remarks It must conform to the `nodeSchema`.
38
- */
39
- static getOrCreate(context, mapTree) {
40
- return nodeCache.get(mapTree) ?? new UnhydratedFlexTreeNode(context, mapTree, undefined);
41
- }
42
28
  get context() {
43
29
  return this.simpleContext.flexContext;
44
30
  }
45
31
  /**
46
32
  * Create a new UnhydratedFlexTreeNode.
47
- * @param location - the parentage of this node, if it is being created underneath an existing node and field, or undefined if not
48
- * @remarks This class (and its subclasses) should not be directly constructed outside of this module.
49
- * Instead, use {@link getOrCreateNodeFromInnerNode} to create a UnhydratedFlexTreeNode from a {@link MapTree}.
50
- * A `UnhydratedFlexTreeNode` may never be constructed more than once for the same {@link MapTree} object.
51
- * Instead, it should always be acquired via {@link getOrCreateNodeFromInnerNode}.
52
33
  */
53
- constructor(simpleContext,
54
- /** The underlying {@link MapTree} that this `UnhydratedFlexTreeNode` reads its data from */
55
- mapTree, location = unparentedLocation) {
34
+ constructor(
35
+ /**
36
+ * The {@link NodeData} for this node.
37
+ */
38
+ data,
39
+ /**
40
+ * All {@link UnhydratedFlexTreeField} for this node that have been created so far.
41
+ * @remarks
42
+ * This includes all non-empty fields, but also any empty fields which have been previously requested.
43
+ */
44
+ fieldsAll,
45
+ /**
46
+ * The {@link Context} for this node.
47
+ * @remarks
48
+ * Provides access to all schema reachable from this node.
49
+ * See {@link getUnhydratedContext}.
50
+ */
51
+ simpleContext) {
52
+ this.data = data;
53
+ this.fieldsAll = fieldsAll;
56
54
  this.simpleContext = simpleContext;
57
- this.mapTree = mapTree;
58
- this.location = location;
55
+ this.location = unparentedLocation;
59
56
  this[_a] = index_js_2.FlexTreeEntityKind.Node;
60
57
  this._events = (0, client_utils_1.createEmitter)();
61
- (0, internal_1.assert)(!nodeCache.has(mapTree), 0x98b /* A node already exists for the given MapTree */);
62
- nodeCache.set(mapTree, this);
63
- // Fully demand the tree to ensure that parent pointers are present and accurate on all nodes.
64
- // When a UnhydratedFlexTreeNode is constructed, its MapTree may contain nodes (anywhere below) that map (via the `nodeCache`) to pre-existing UnhydratedFlexTreeNodes.
65
- // Put another way, for a given MapTree, some ancestor UnhydratedFlexTreeNode can be created after any number of its descendant UnhydratedFlexTreeNodes already exist.
66
- // In such a case, the spine of nodes between the descendant and ancestor need to exist in order for the ancestor to be able to walk upwards via the `parentField` property.
67
- // This needs to happen for all UnhydratedFlexTreeNodes that are descendants of the ancestor UnhydratedFlexTreeNode.
68
- // Demanding the entire tree is overkill to solve this problem since not all descendant MapTree nodes will have corresponding UnhydratedFlexTreeNodes.
69
- // However, demanding the full tree also lets us eagerly validate that there are no duplicate MapTrees (i.e. same MapTree object) anywhere in the tree.
70
- this.walkTree();
58
+ /**
59
+ * The non-empty fields on this node.
60
+ * @remarks
61
+ * This is needed to implement {@link MapTreeNodeViewGeneric.fields}, which must omit empty fields.
62
+ * Due to having to detect if a field is empty, this forces the evaluation of any pending defaults in the fields.
63
+ * Use {@link allFieldsLazy} to avoid evaluating pending defaults.
64
+ */
65
+ this.fields = {
66
+ get: (key) => this.tryGetField(key),
67
+ [Symbol.iterator]: () => (0, index_js_3.filterIterable)(this.fieldsAll, ([, field]) => field.length > 0),
68
+ };
69
+ for (const [_key, field] of this.fieldsAll) {
70
+ field.parent = this;
71
+ }
72
+ }
73
+ /**
74
+ * Gets all fields, without filtering out empty ones.
75
+ * @remarks
76
+ * This avoids forcing the evaluating of pending defaults in the fields, and also saves a copy on access.
77
+ */
78
+ get allFieldsLazy() {
79
+ return this.fieldsAll;
71
80
  }
72
81
  get type() {
73
- return this.mapTree.type;
82
+ return this.data.type;
83
+ }
84
+ get schema() {
85
+ return this.data.type;
86
+ }
87
+ getOrCreateField(key) {
88
+ return (0, index_js_3.getOrCreate)(this.fieldsAll, key, () => {
89
+ const stored = this.storedSchema.getFieldSchema(key).kind;
90
+ const field = createField(this.context, stored, key, []);
91
+ field.parent = this;
92
+ return field;
93
+ });
74
94
  }
75
95
  adoptBy(parent, index) {
76
96
  if (parent !== undefined) {
77
97
  (0, internal_1.assert)(index !== undefined, 0xa08 /* Expected index */);
78
98
  if (this.location !== unparentedLocation) {
79
- throw new internal_2.UsageError("A node may not be inserted if it's already in a tree");
99
+ throw new internal_2.UsageError("A node may not be in more than one place in the tree");
80
100
  }
81
101
  let unhydratedNode = parent.parent;
82
102
  while (unhydratedNode !== undefined) {
@@ -102,49 +122,27 @@ class UnhydratedFlexTreeNode {
102
122
  return this.location;
103
123
  }
104
124
  borrowCursor() {
105
- return (0, index_js_2.cursorForMapTreeNode)(this.mapTree);
125
+ return (0, index_js_2.cursorForMapTreeNode)(this);
106
126
  }
107
127
  tryGetField(key) {
108
- const field = this.mapTree.fields.get(key);
128
+ const field = this.fieldsAll.get(key);
109
129
  // Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.
110
130
  if (field !== undefined && field.length > 0) {
111
- return getOrCreateField(this, key, this.storedSchema.getFieldSchema(key).kind, () => this.emitChangedEvent(key));
131
+ return field;
112
132
  }
113
133
  }
114
134
  getBoxed(key) {
115
135
  const fieldKey = (0, index_js_3.brand)(key);
116
- return getOrCreateField(this, fieldKey, this.storedSchema.getFieldSchema(fieldKey).kind, () => this.emitChangedEvent(fieldKey));
136
+ return this.getOrCreateField(fieldKey);
117
137
  }
118
138
  boxedIterator() {
119
- return (0, index_js_3.mapIterable)(this.mapTree.fields.entries(), ([key]) => getOrCreateField(this, key, this.storedSchema.getFieldSchema(key).kind, () => this.emitChangedEvent(key)));
139
+ return Array.from(this.fields, ([key, field]) => field)[Symbol.iterator]();
120
140
  }
121
141
  keys() {
122
- // TODO: how this should handle missing defaults (and empty keys if they end up being allowed) needs to be determined.
123
- return this.mapTree.fields.keys();
142
+ return Array.from(this.fields, ([key]) => key)[Symbol.iterator]();
124
143
  }
125
144
  get value() {
126
- return this.mapTree.value;
127
- }
128
- get anchorNode() {
129
- // This API is relevant to `LazyTreeNode`s, but not `UnhydratedFlexTreeNode`s.
130
- // TODO: Refactor the FlexTreeNode interface so that stubbing this out isn't necessary.
131
- return (0, internal_1.fail)(0xb47 /* UnhydratedFlexTreeNode does not implement anchorNode */);
132
- }
133
- walkTree() {
134
- for (const [key, mapTrees] of this.mapTree.fields) {
135
- const field = getOrCreateField(this, key, this.storedSchema.getFieldSchema(key).kind, () => this.emitChangedEvent(key));
136
- for (let index = 0; index < field.length; index++) {
137
- const child = getOrCreateChild(this.simpleContext, mapTrees[index] ?? (0, internal_1.oob)(), {
138
- parent: field,
139
- index,
140
- });
141
- // These next asserts detect the case where `getOrCreateChild` gets a cache hit of a different node than the one we're trying to create
142
- (0, internal_1.assert)(child.location !== undefined, 0x98d /* Expected node to have parent */);
143
- (0, internal_1.assert)(child.location.parent.parent === this, 0x98e /* Node may not be multi-parented */);
144
- (0, internal_1.assert)(child.location.index === index, 0x98f /* Node may not be multi-parented */);
145
- child.walkTree();
146
- }
147
- }
145
+ return this.data.value;
148
146
  }
149
147
  emitChangedEvent(key) {
150
148
  this._events.emit("childrenChangedAfterBatch", { changedFields: new Set([key]) });
@@ -207,61 +205,82 @@ const unparentedLocation = {
207
205
  },
208
206
  index: -1,
209
207
  };
208
+ /**
209
+ * The {@link Unhydrated} implementation of {@link FlexTreeField}.
210
+ */
210
211
  class UnhydratedFlexTreeField {
211
- get context() {
212
- return this.simpleContext.flexContext;
213
- }
214
- constructor(simpleContext, schema, key, parent, onEdit) {
215
- this.simpleContext = simpleContext;
212
+ constructor(context, schema, key,
213
+ /**
214
+ * The children of this field.
215
+ * @remarks
216
+ * This is either an array of {@link UnhydratedFlexTreeNode}s or a {@link ContextualFieldProvider} that will be used to populate the children lazily (after which it will become an array).
217
+ * See {@link fillPendingDefaults}.
218
+ * Note that any fields using a {@link ConstantFieldProvider} should be evaluated before constructing the UnhydratedFlexTreeField.
219
+ */
220
+ lazyChildren) {
221
+ this.context = context;
216
222
  this.schema = schema;
217
223
  this.key = key;
218
- this.parent = parent;
219
- this.onEdit = onEdit;
224
+ this.lazyChildren = lazyChildren;
220
225
  this[_b] = index_js_2.FlexTreeEntityKind.Field;
221
- const fieldKeyCache = getFieldKeyCache(parent);
222
- (0, internal_1.assert)(!fieldKeyCache.has(key), 0x990 /* A field already exists for the given MapTrees */);
223
- fieldKeyCache.set(key, this);
226
+ this.parent = undefined;
224
227
  // When this field is created (which only happens one time, because it is cached), all the children become parented for the first time.
225
228
  // "Adopt" each child by updating its parent information to point to this field.
226
- for (const [i, mapTree] of this.mapTrees.entries()) {
227
- const mapTreeNodeChild = nodeCache.get(mapTree);
228
- if (mapTreeNodeChild !== undefined) {
229
- if (mapTreeNodeChild.parentField !== unparentedLocation) {
230
- throw new internal_2.UsageError("A node may not be in more than one place in the tree");
231
- }
232
- mapTreeNodeChild.adoptBy(this, i);
229
+ if (Array.isArray(lazyChildren)) {
230
+ for (const [i, child] of lazyChildren.entries()) {
231
+ child.adoptBy(this, i);
233
232
  }
234
233
  }
235
234
  }
236
- get mapTrees() {
237
- return this.parent.mapTree.fields.get(this.key) ?? [];
235
+ getPendingDefault() {
236
+ return !Array.isArray(this.lazyChildren) ? this.lazyChildren : undefined;
237
+ }
238
+ /**
239
+ * Populate pending default (if present) using the provided context.
240
+ * @remarks
241
+ * This apply to just this field: caller will likely want to recursively walk the tree.
242
+ * @see {@link pendingDefault}.
243
+ */
244
+ fillPendingDefaults(context) {
245
+ const provider = this.getPendingDefault();
246
+ if (provider) {
247
+ const content = provider(context);
248
+ this.lazyChildren = content;
249
+ }
250
+ }
251
+ /**
252
+ * Returns true if this field has a pending default due to defined defined using a {@link ContextualFieldProvider}.
253
+ */
254
+ get pendingDefault() {
255
+ return this.getPendingDefault() !== undefined;
256
+ }
257
+ get children() {
258
+ const provider = this.getPendingDefault();
259
+ if (provider) {
260
+ const content = provider("UseGlobalContext");
261
+ this.lazyChildren = content;
262
+ }
263
+ return this.lazyChildren;
238
264
  }
239
265
  get length() {
240
- return this.mapTrees.length;
266
+ return this.children.length;
241
267
  }
242
268
  is(kind) {
243
269
  return this.schema === kind.identifier;
244
270
  }
245
271
  boxedIterator() {
246
- return this.mapTrees
247
- .map((m, index) => getOrCreateChild(this.simpleContext, m, {
248
- parent: this,
249
- index,
250
- }))
251
- .values();
272
+ return this.children[Symbol.iterator]();
252
273
  }
253
274
  boxedAt(index) {
254
275
  const i = (0, index_js_2.indexForAt)(index, this.length);
255
276
  if (i === undefined) {
256
277
  return undefined;
257
278
  }
258
- const m = this.mapTrees[i];
259
- if (m !== undefined) {
260
- return getOrCreateChild(this.simpleContext, m, {
261
- parent: this,
262
- index: i,
263
- });
264
- }
279
+ const m = this.children[i];
280
+ return m;
281
+ }
282
+ [(_b = index_js_2.flexTreeMarker, Symbol.iterator)]() {
283
+ return this.boxedIterator();
265
284
  }
266
285
  /**
267
286
  * Mutate this field.
@@ -272,43 +291,41 @@ class UnhydratedFlexTreeField {
272
291
  * This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.
273
292
  */
274
293
  edit(edit) {
275
- const oldMapTrees = this.parent.mapTree.fields.get(this.key) ?? [];
276
- const newMapTrees = edit(oldMapTrees) ?? oldMapTrees;
277
- if (newMapTrees.length > 0) {
278
- this.parent.mapTree.fields.set(this.key, newMapTrees);
294
+ // Clear parents for all old map trees.
295
+ for (const tree of this.children) {
296
+ tree.adoptBy(undefined);
279
297
  }
280
- else {
281
- this.parent.mapTree.fields.delete(this.key);
298
+ this.lazyChildren = edit(this.children) ?? this.children;
299
+ // Set parents for all new map trees.
300
+ for (const [index, tree] of this.children.entries()) {
301
+ tree.adoptBy(this, index);
282
302
  }
283
- this.onEdit?.();
303
+ this.parent?.emitChangedEvent(this.key);
284
304
  }
285
305
  getFieldPath() {
286
306
  throw unsupportedUsageError("Editing an array");
287
307
  }
288
308
  /** Unboxes leaf nodes to their values */
289
309
  unboxed(index) {
290
- const mapTree = this.mapTrees[index] ?? (0, internal_1.oob)();
291
- const value = mapTree.value;
310
+ const child = this.children[index] ?? (0, internal_1.oob)();
311
+ const value = child.value;
292
312
  if (value !== undefined) {
293
313
  return value;
294
314
  }
295
- return getOrCreateChild(this.simpleContext, mapTree, { parent: this, index });
315
+ return child;
296
316
  }
297
317
  }
298
- _b = index_js_2.flexTreeMarker;
299
- class EagerMapTreeOptionalField extends UnhydratedFlexTreeField {
318
+ exports.UnhydratedFlexTreeField = UnhydratedFlexTreeField;
319
+ /**
320
+ * The {@link Unhydrated} implementation of {@link FlexTreeOptionalField}.
321
+ */
322
+ class UnhydratedOptionalField extends UnhydratedFlexTreeField {
300
323
  constructor() {
301
324
  super(...arguments);
302
325
  this.editor = {
303
326
  set: (newContent) => {
304
- // If the new content is a UnhydratedFlexTreeNode, it needs to have its parent pointer updated
305
327
  if (newContent !== undefined) {
306
- nodeCache.get(newContent)?.adoptBy(this, 0);
307
- }
308
- // If the old content is a UnhydratedFlexTreeNode, it needs to have its parent pointer unset
309
- const oldContent = this.mapTrees[0];
310
- if (oldContent !== undefined) {
311
- nodeCache.get(oldContent)?.adoptBy(undefined);
328
+ (0, internal_1.assert)(newContent instanceof UnhydratedFlexTreeNode, 0xbb7 /* Expected unhydrated node */);
312
329
  }
313
330
  this.edit((mapTrees) => {
314
331
  if (newContent !== undefined) {
@@ -322,46 +339,49 @@ class EagerMapTreeOptionalField extends UnhydratedFlexTreeField {
322
339
  };
323
340
  }
324
341
  get content() {
325
- const value = this.mapTrees[0];
342
+ const value = this.children[0];
326
343
  if (value !== undefined) {
327
344
  return this.unboxed(0);
328
345
  }
329
346
  return undefined;
330
347
  }
331
348
  }
332
- class EagerMapTreeRequiredField extends EagerMapTreeOptionalField {
349
+ exports.UnhydratedOptionalField = UnhydratedOptionalField;
350
+ class UnhydratedRequiredField extends UnhydratedOptionalField {
333
351
  get content() {
334
352
  // This cannot use ?? since null is a legal value here.
335
353
  (0, internal_1.assert)(super.content !== undefined, 0xa57 /* Expected EagerMapTree required field to have a value */);
336
354
  return super.content;
337
355
  }
338
356
  }
339
- class UnhydratedTreeSequenceField extends UnhydratedFlexTreeField {
357
+ /**
358
+ * The {@link Unhydrated} implementation of {@link FlexTreeSequenceField}.
359
+ */
360
+ class UnhydratedSequenceField extends UnhydratedFlexTreeField {
340
361
  constructor() {
341
362
  super(...arguments);
342
363
  this.editor = {
343
364
  insert: (index, newContent) => {
344
- for (let i = 0; i < newContent.length; i++) {
345
- const c = newContent[i];
365
+ for (const c of newContent) {
346
366
  (0, internal_1.assert)(c !== undefined, 0xa0a /* Unexpected sparse array content */);
347
- nodeCache.get(c)?.adoptBy(this, index + i);
367
+ (0, internal_1.assert)(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);
348
368
  }
369
+ const newContentChecked = newContent;
349
370
  this.edit((mapTrees) => {
350
371
  if (newContent.length < 1000) {
351
372
  // For "smallish arrays" (`1000` is not empirically derived), the `splice` function is appropriate...
352
- mapTrees.splice(index, 0, ...newContent);
373
+ mapTrees.splice(index, 0, ...newContentChecked);
353
374
  }
354
375
  else {
355
376
  // ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).
356
- return mapTrees.slice(0, index).concat(newContent, mapTrees.slice(index));
377
+ return mapTrees.slice(0, index).concat(newContentChecked, mapTrees.slice(index));
357
378
  }
358
379
  });
359
380
  },
360
381
  remove: (index, count) => {
361
382
  for (let i = index; i < index + count; i++) {
362
- const c = this.mapTrees[i];
383
+ const c = this.children[i];
363
384
  (0, internal_1.assert)(c !== undefined, 0xa0b /* Unexpected sparse array */);
364
- nodeCache.get(c)?.adoptBy(undefined);
365
385
  }
366
386
  let removed;
367
387
  this.edit((mapTrees) => {
@@ -381,60 +401,27 @@ class UnhydratedTreeSequenceField extends UnhydratedFlexTreeField {
381
401
  map(callbackfn) {
382
402
  return Array.from(this, callbackfn);
383
403
  }
384
- *[Symbol.iterator]() {
385
- for (const [i] of this.mapTrees.entries()) {
386
- yield this.unboxed(i);
387
- }
388
- }
389
404
  }
390
- exports.UnhydratedTreeSequenceField = UnhydratedTreeSequenceField;
405
+ exports.UnhydratedSequenceField = UnhydratedSequenceField;
391
406
  // #endregion Fields
392
- // #region Caching and unboxing utilities
393
- const nodeCache = new WeakMap();
394
- /** Node Parent -\> Field Key -\> Field */
395
- const fieldCache = new WeakMap();
396
- function getFieldKeyCache(parent) {
397
- return (0, index_js_3.getOrCreate)(fieldCache, parent, () => new Map());
398
- }
399
- /**
400
- * If there exists a {@link UnhydratedFlexTreeNode} for the given {@link MapTree}, returns it, otherwise returns `undefined`.
401
- * @remarks {@link UnhydratedFlexTreeNode | UnhydratedFlexTreeNodes} are created via {@link getOrCreateNodeFromInnerNode}.
402
- */
403
- function tryUnhydratedFlexTreeNode(mapTree) {
404
- return nodeCache.get(mapTree);
405
- }
406
- exports.tryUnhydratedFlexTreeNode = tryUnhydratedFlexTreeNode;
407
- /** Helper for creating a `UnhydratedFlexTreeNode` given the parent field (e.g. when "walking down") */
408
- function getOrCreateChild(context, mapTree, parent) {
409
- const cached = nodeCache.get(mapTree);
410
- if (cached !== undefined) {
411
- return cached;
412
- }
413
- return new UnhydratedFlexTreeNode(context, mapTree, parent);
414
- }
415
- /** Creates a field with the given attributes, or returns a cached field if there is one */
416
- function getOrCreateField(parent, key, schema, onEdit) {
417
- const cached = getFieldKeyCache(parent).get(key);
418
- if (cached !== undefined) {
419
- return cached;
420
- }
421
- if (schema === index_js_2.FieldKinds.required.identifier ||
422
- schema === index_js_2.FieldKinds.identifier.identifier) {
423
- return new EagerMapTreeRequiredField(parent.simpleContext, schema, key, parent, onEdit);
424
- }
425
- if (schema === index_js_2.FieldKinds.optional.identifier) {
426
- return new EagerMapTreeOptionalField(parent.simpleContext, schema, key, parent, onEdit);
427
- }
428
- if (schema === index_js_2.FieldKinds.sequence.identifier) {
429
- return new UnhydratedTreeSequenceField(parent.simpleContext, schema, key, parent, onEdit);
430
- }
431
- // TODO: this seems to used by unknown optional fields. They should probably use "optional" not "Forbidden" schema.
432
- if (schema === index_js_2.FieldKinds.forbidden.identifier) {
433
- return new UnhydratedFlexTreeField(parent.simpleContext, schema, key, parent, onEdit);
407
+ /** Creates a field with the given attributes */
408
+ function createField(...args) {
409
+ switch (args[1]) {
410
+ case index_js_2.FieldKinds.required.identifier:
411
+ case index_js_2.FieldKinds.identifier.identifier:
412
+ return new UnhydratedRequiredField(...args);
413
+ case index_js_2.FieldKinds.optional.identifier:
414
+ return new UnhydratedOptionalField(...args);
415
+ case index_js_2.FieldKinds.sequence.identifier:
416
+ return new UnhydratedSequenceField(...args);
417
+ case index_js_2.FieldKinds.forbidden.identifier:
418
+ // TODO: this seems to used by unknown optional fields. They should probably use "optional" not "Forbidden" schema.
419
+ return new UnhydratedFlexTreeField(...args);
420
+ default:
421
+ return (0, internal_1.fail)(0xb9d /* unsupported field kind */);
434
422
  }
435
- return (0, internal_1.fail)(0xb9d /* unsupported field kind */);
436
423
  }
437
- // #endregion Caching and unboxing utilities
424
+ exports.createField = createField;
438
425
  function unsupportedUsageError(message) {
439
426
  return new internal_2.UsageError(`${message ?? "Operation"} is not supported for content that has not yet been inserted into the tree`);
440
427
  }