@fluidframework/tree 2.43.0-343119 → 2.50.0-345060

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 (501) hide show
  1. package/CHANGELOG.md +189 -0
  2. package/api-report/tree.alpha.api.md +86 -20
  3. package/api-report/tree.beta.api.md +10 -3
  4. package/api-report/tree.legacy.alpha.api.md +9 -2
  5. package/api-report/tree.legacy.public.api.md +9 -2
  6. package/api-report/tree.public.api.md +9 -2
  7. package/dist/alpha.d.ts +10 -0
  8. package/dist/core/forest/editableForest.d.ts +0 -2
  9. package/dist/core/forest/editableForest.d.ts.map +1 -1
  10. package/dist/core/forest/editableForest.js.map +1 -1
  11. package/dist/core/forest/forest.d.ts +0 -4
  12. package/dist/core/forest/forest.d.ts.map +1 -1
  13. package/dist/core/forest/forest.js +0 -4
  14. package/dist/core/forest/forest.js.map +1 -1
  15. package/dist/core/rebase/changeRebaser.d.ts +0 -6
  16. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  17. package/dist/core/rebase/changeRebaser.js.map +1 -1
  18. package/dist/core/rebase/types.d.ts +0 -2
  19. package/dist/core/rebase/types.d.ts.map +1 -1
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/schema-stored/schema.d.ts +0 -8
  22. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  23. package/dist/core/schema-stored/schema.js +0 -8
  24. package/dist/core/schema-stored/schema.js.map +1 -1
  25. package/dist/core/schema-view/view.d.ts +0 -2
  26. package/dist/core/schema-view/view.d.ts.map +1 -1
  27. package/dist/core/schema-view/view.js.map +1 -1
  28. package/dist/core/tree/cursor.d.ts +0 -2
  29. package/dist/core/tree/cursor.d.ts.map +1 -1
  30. package/dist/core/tree/cursor.js +0 -2
  31. package/dist/core/tree/cursor.js.map +1 -1
  32. package/dist/core/tree/delta.d.ts +0 -2
  33. package/dist/core/tree/delta.d.ts.map +1 -1
  34. package/dist/core/tree/delta.js.map +1 -1
  35. package/dist/core/tree/types.d.ts +0 -4
  36. package/dist/core/tree/types.d.ts.map +1 -1
  37. package/dist/core/tree/types.js +0 -2
  38. package/dist/core/tree/types.js.map +1 -1
  39. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
  40. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  41. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  42. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +0 -10
  43. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  44. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  45. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -3
  46. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  47. package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  48. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  49. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
  50. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  51. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
  52. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  53. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
  54. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  55. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
  56. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  57. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
  58. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  59. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  60. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
  61. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  62. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  63. package/dist/feature-libraries/sequence-field/types.d.ts +0 -2
  64. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  65. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  66. package/dist/index.d.ts +1 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +3 -2
  69. package/dist/index.js.map +1 -1
  70. package/dist/jsonDomainSchema.d.ts +2 -6
  71. package/dist/jsonDomainSchema.d.ts.map +1 -1
  72. package/dist/jsonDomainSchema.js +2 -2
  73. package/dist/jsonDomainSchema.js.map +1 -1
  74. package/dist/packageVersion.d.ts +1 -1
  75. package/dist/packageVersion.js +1 -1
  76. package/dist/packageVersion.js.map +1 -1
  77. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  78. package/dist/shared-tree/schematizingTreeView.js +3 -3
  79. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  80. package/dist/shared-tree/treeAlpha.d.ts +38 -0
  81. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  82. package/dist/shared-tree/treeAlpha.js +116 -9
  83. package/dist/shared-tree/treeAlpha.js.map +1 -1
  84. package/dist/simple-tree/api/configuration.d.ts +15 -3
  85. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  86. package/dist/simple-tree/api/configuration.js +88 -38
  87. package/dist/simple-tree/api/configuration.js.map +1 -1
  88. package/dist/simple-tree/api/customTree.d.ts +1 -1
  89. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  90. package/dist/simple-tree/api/customTree.js +3 -4
  91. package/dist/simple-tree/api/customTree.js.map +1 -1
  92. package/dist/simple-tree/api/index.d.ts +3 -3
  93. package/dist/simple-tree/api/index.d.ts.map +1 -1
  94. package/dist/simple-tree/api/index.js +4 -4
  95. package/dist/simple-tree/api/index.js.map +1 -1
  96. package/dist/simple-tree/api/jsonSchema.d.ts +32 -8
  97. package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
  98. package/dist/simple-tree/api/jsonSchema.js.map +1 -1
  99. package/dist/simple-tree/api/schemaFactory.d.ts +2 -2
  100. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  101. package/dist/simple-tree/api/schemaFactory.js +1 -1
  102. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  103. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
  104. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  105. package/dist/simple-tree/api/schemaFactoryAlpha.js +75 -0
  106. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  107. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
  108. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  109. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  110. package/dist/simple-tree/api/schemaFromSimple.js +2 -0
  111. package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
  112. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  113. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +4 -4
  114. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  115. package/dist/simple-tree/api/treeBeta.d.ts +1 -1
  116. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  117. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  118. package/dist/simple-tree/api/treeNodeApi.d.ts +3 -0
  119. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  120. package/dist/simple-tree/api/treeNodeApi.js +2 -2
  121. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  122. package/dist/simple-tree/api/typesUnsafe.d.ts +12 -0
  123. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  124. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  125. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  126. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +5 -3
  127. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  128. package/dist/simple-tree/core/context.d.ts +3 -3
  129. package/dist/simple-tree/core/context.d.ts.map +1 -1
  130. package/dist/simple-tree/core/context.js.map +1 -1
  131. package/dist/simple-tree/core/getOrCreateNode.d.ts +9 -0
  132. package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  133. package/dist/simple-tree/core/getOrCreateNode.js +12 -1
  134. package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
  135. package/dist/simple-tree/core/index.d.ts +3 -3
  136. package/dist/simple-tree/core/index.d.ts.map +1 -1
  137. package/dist/simple-tree/core/index.js +4 -1
  138. package/dist/simple-tree/core/index.js.map +1 -1
  139. package/dist/simple-tree/core/treeNodeKernel.js +1 -1
  140. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  141. package/dist/simple-tree/core/treeNodeSchema.d.ts +73 -2
  142. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  143. package/dist/simple-tree/core/treeNodeSchema.js +28 -1
  144. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  145. package/dist/simple-tree/core/walkSchema.d.ts +3 -3
  146. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  147. package/dist/simple-tree/core/walkSchema.js +9 -5
  148. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  149. package/dist/simple-tree/createContext.js +1 -1
  150. package/dist/simple-tree/createContext.js.map +1 -1
  151. package/dist/simple-tree/getTreeNodeForField.d.ts +1 -1
  152. package/dist/simple-tree/getTreeNodeForField.d.ts.map +1 -1
  153. package/dist/simple-tree/getTreeNodeForField.js +3 -3
  154. package/dist/simple-tree/getTreeNodeForField.js.map +1 -1
  155. package/dist/simple-tree/index.d.ts +6 -6
  156. package/dist/simple-tree/index.d.ts.map +1 -1
  157. package/dist/simple-tree/index.js +10 -5
  158. package/dist/simple-tree/index.js.map +1 -1
  159. package/dist/simple-tree/leafNodeSchema.d.ts +2 -1
  160. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  161. package/dist/simple-tree/leafNodeSchema.js +1 -0
  162. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  163. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  164. package/dist/simple-tree/node-kinds/array/arrayNode.js +18 -15
  165. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  166. package/dist/simple-tree/node-kinds/index.d.ts +2 -1
  167. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  168. package/dist/simple-tree/node-kinds/index.js +5 -1
  169. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  170. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  171. package/dist/simple-tree/node-kinds/map/mapNode.js +7 -3
  172. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  173. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  174. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  175. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  176. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  177. package/dist/simple-tree/node-kinds/object/objectNode.js +9 -6
  178. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  179. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
  180. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  181. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  182. package/dist/simple-tree/node-kinds/record/index.d.ts +7 -0
  183. package/dist/simple-tree/node-kinds/record/index.d.ts.map +1 -0
  184. package/dist/simple-tree/node-kinds/record/index.js +13 -0
  185. package/dist/simple-tree/node-kinds/record/index.js.map +1 -0
  186. package/dist/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
  187. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
  188. package/dist/simple-tree/node-kinds/record/recordNode.js +234 -0
  189. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -0
  190. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
  191. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
  192. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js +30 -0
  193. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
  194. package/dist/simple-tree/schemaTypes.d.ts +13 -27
  195. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  196. package/dist/simple-tree/schemaTypes.js +45 -39
  197. package/dist/simple-tree/schemaTypes.js.map +1 -1
  198. package/dist/simple-tree/simpleSchema.d.ts +16 -1
  199. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  200. package/dist/simple-tree/simpleSchema.js.map +1 -1
  201. package/dist/simple-tree/toStoredSchema.d.ts +2 -0
  202. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  203. package/dist/simple-tree/toStoredSchema.js +6 -2
  204. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  205. package/dist/simple-tree/treeNodeValid.d.ts.map +1 -1
  206. package/dist/simple-tree/treeNodeValid.js +1 -2
  207. package/dist/simple-tree/treeNodeValid.js.map +1 -1
  208. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
  209. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  210. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +56 -32
  211. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  212. package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
  213. package/dist/simple-tree/walkFieldSchema.js +1 -1
  214. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  215. package/dist/tableSchema.d.ts +7 -2
  216. package/dist/tableSchema.d.ts.map +1 -1
  217. package/dist/tableSchema.js +21 -7
  218. package/dist/tableSchema.js.map +1 -1
  219. package/dist/util/brandedMap.d.ts +0 -2
  220. package/dist/util/brandedMap.d.ts.map +1 -1
  221. package/dist/util/brandedMap.js.map +1 -1
  222. package/docs/main/compatibility.md +15 -1
  223. package/lib/alpha.d.ts +10 -0
  224. package/lib/core/forest/editableForest.d.ts +0 -2
  225. package/lib/core/forest/editableForest.d.ts.map +1 -1
  226. package/lib/core/forest/editableForest.js.map +1 -1
  227. package/lib/core/forest/forest.d.ts +0 -4
  228. package/lib/core/forest/forest.d.ts.map +1 -1
  229. package/lib/core/forest/forest.js +0 -4
  230. package/lib/core/forest/forest.js.map +1 -1
  231. package/lib/core/rebase/changeRebaser.d.ts +0 -6
  232. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  233. package/lib/core/rebase/changeRebaser.js.map +1 -1
  234. package/lib/core/rebase/types.d.ts +0 -2
  235. package/lib/core/rebase/types.d.ts.map +1 -1
  236. package/lib/core/rebase/types.js.map +1 -1
  237. package/lib/core/schema-stored/schema.d.ts +0 -8
  238. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  239. package/lib/core/schema-stored/schema.js +0 -8
  240. package/lib/core/schema-stored/schema.js.map +1 -1
  241. package/lib/core/schema-view/view.d.ts +0 -2
  242. package/lib/core/schema-view/view.d.ts.map +1 -1
  243. package/lib/core/schema-view/view.js.map +1 -1
  244. package/lib/core/tree/cursor.d.ts +0 -2
  245. package/lib/core/tree/cursor.d.ts.map +1 -1
  246. package/lib/core/tree/cursor.js +0 -2
  247. package/lib/core/tree/cursor.js.map +1 -1
  248. package/lib/core/tree/delta.d.ts +0 -2
  249. package/lib/core/tree/delta.d.ts.map +1 -1
  250. package/lib/core/tree/delta.js.map +1 -1
  251. package/lib/core/tree/types.d.ts +0 -4
  252. package/lib/core/tree/types.d.ts.map +1 -1
  253. package/lib/core/tree/types.js +0 -2
  254. package/lib/core/tree/types.js.map +1 -1
  255. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
  256. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  257. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  258. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +0 -10
  259. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  260. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  261. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -3
  262. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  263. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  264. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  265. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
  266. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  267. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
  268. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  269. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
  270. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  271. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
  272. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  273. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
  274. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  275. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  276. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
  277. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  278. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  279. package/lib/feature-libraries/sequence-field/types.d.ts +0 -2
  280. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  281. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  282. package/lib/index.d.ts +1 -1
  283. package/lib/index.d.ts.map +1 -1
  284. package/lib/index.js +1 -1
  285. package/lib/index.js.map +1 -1
  286. package/lib/jsonDomainSchema.d.ts +2 -6
  287. package/lib/jsonDomainSchema.d.ts.map +1 -1
  288. package/lib/jsonDomainSchema.js +3 -3
  289. package/lib/jsonDomainSchema.js.map +1 -1
  290. package/lib/packageVersion.d.ts +1 -1
  291. package/lib/packageVersion.js +1 -1
  292. package/lib/packageVersion.js.map +1 -1
  293. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  294. package/lib/shared-tree/schematizingTreeView.js +4 -4
  295. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  296. package/lib/shared-tree/treeAlpha.d.ts +38 -0
  297. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  298. package/lib/shared-tree/treeAlpha.js +110 -3
  299. package/lib/shared-tree/treeAlpha.js.map +1 -1
  300. package/lib/simple-tree/api/configuration.d.ts +15 -3
  301. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  302. package/lib/simple-tree/api/configuration.js +91 -41
  303. package/lib/simple-tree/api/configuration.js.map +1 -1
  304. package/lib/simple-tree/api/customTree.d.ts +1 -1
  305. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  306. package/lib/simple-tree/api/customTree.js +2 -3
  307. package/lib/simple-tree/api/customTree.js.map +1 -1
  308. package/lib/simple-tree/api/index.d.ts +3 -3
  309. package/lib/simple-tree/api/index.d.ts.map +1 -1
  310. package/lib/simple-tree/api/index.js +1 -1
  311. package/lib/simple-tree/api/index.js.map +1 -1
  312. package/lib/simple-tree/api/jsonSchema.d.ts +32 -8
  313. package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
  314. package/lib/simple-tree/api/jsonSchema.js.map +1 -1
  315. package/lib/simple-tree/api/schemaFactory.d.ts +2 -2
  316. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  317. package/lib/simple-tree/api/schemaFactory.js +1 -1
  318. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  319. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
  320. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  321. package/lib/simple-tree/api/schemaFactoryAlpha.js +77 -2
  322. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  323. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
  324. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  325. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  326. package/lib/simple-tree/api/schemaFromSimple.js +2 -0
  327. package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
  328. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  329. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +5 -5
  330. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  331. package/lib/simple-tree/api/treeBeta.d.ts +1 -1
  332. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  333. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  334. package/lib/simple-tree/api/treeNodeApi.d.ts +3 -0
  335. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  336. package/lib/simple-tree/api/treeNodeApi.js +4 -4
  337. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  338. package/lib/simple-tree/api/typesUnsafe.d.ts +12 -0
  339. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  340. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  341. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  342. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +6 -4
  343. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  344. package/lib/simple-tree/core/context.d.ts +3 -3
  345. package/lib/simple-tree/core/context.d.ts.map +1 -1
  346. package/lib/simple-tree/core/context.js.map +1 -1
  347. package/lib/simple-tree/core/getOrCreateNode.d.ts +9 -0
  348. package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  349. package/lib/simple-tree/core/getOrCreateNode.js +10 -0
  350. package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
  351. package/lib/simple-tree/core/index.d.ts +3 -3
  352. package/lib/simple-tree/core/index.d.ts.map +1 -1
  353. package/lib/simple-tree/core/index.js +3 -3
  354. package/lib/simple-tree/core/index.js.map +1 -1
  355. package/lib/simple-tree/core/treeNodeKernel.js +1 -1
  356. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  357. package/lib/simple-tree/core/treeNodeSchema.d.ts +73 -2
  358. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  359. package/lib/simple-tree/core/treeNodeSchema.js +25 -0
  360. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  361. package/lib/simple-tree/core/walkSchema.d.ts +3 -3
  362. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  363. package/lib/simple-tree/core/walkSchema.js +9 -5
  364. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  365. package/lib/simple-tree/createContext.js +1 -1
  366. package/lib/simple-tree/createContext.js.map +1 -1
  367. package/lib/simple-tree/getTreeNodeForField.d.ts +1 -1
  368. package/lib/simple-tree/getTreeNodeForField.d.ts.map +1 -1
  369. package/lib/simple-tree/getTreeNodeForField.js +1 -1
  370. package/lib/simple-tree/getTreeNodeForField.js.map +1 -1
  371. package/lib/simple-tree/index.d.ts +6 -6
  372. package/lib/simple-tree/index.d.ts.map +1 -1
  373. package/lib/simple-tree/index.js +4 -4
  374. package/lib/simple-tree/index.js.map +1 -1
  375. package/lib/simple-tree/leafNodeSchema.d.ts +2 -1
  376. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  377. package/lib/simple-tree/leafNodeSchema.js +2 -1
  378. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  379. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  380. package/lib/simple-tree/node-kinds/array/arrayNode.js +10 -7
  381. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  382. package/lib/simple-tree/node-kinds/index.d.ts +2 -1
  383. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  384. package/lib/simple-tree/node-kinds/index.js +1 -0
  385. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  386. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  387. package/lib/simple-tree/node-kinds/map/mapNode.js +9 -5
  388. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  389. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  390. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  391. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  392. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  393. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  394. package/lib/simple-tree/node-kinds/object/objectNode.js +11 -8
  395. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  396. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
  397. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  398. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  399. package/lib/simple-tree/node-kinds/record/index.d.ts +7 -0
  400. package/lib/simple-tree/node-kinds/record/index.d.ts.map +1 -0
  401. package/lib/simple-tree/node-kinds/record/index.js +7 -0
  402. package/lib/simple-tree/node-kinds/record/index.js.map +1 -0
  403. package/lib/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
  404. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
  405. package/lib/simple-tree/node-kinds/record/recordNode.js +232 -0
  406. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -0
  407. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
  408. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
  409. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js +26 -0
  410. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
  411. package/lib/simple-tree/schemaTypes.d.ts +13 -27
  412. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  413. package/lib/simple-tree/schemaTypes.js +42 -35
  414. package/lib/simple-tree/schemaTypes.js.map +1 -1
  415. package/lib/simple-tree/simpleSchema.d.ts +16 -1
  416. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  417. package/lib/simple-tree/simpleSchema.js.map +1 -1
  418. package/lib/simple-tree/toStoredSchema.d.ts +2 -0
  419. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  420. package/lib/simple-tree/toStoredSchema.js +6 -2
  421. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  422. package/lib/simple-tree/treeNodeValid.d.ts.map +1 -1
  423. package/lib/simple-tree/treeNodeValid.js +1 -2
  424. package/lib/simple-tree/treeNodeValid.js.map +1 -1
  425. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
  426. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  427. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +58 -34
  428. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  429. package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
  430. package/lib/simple-tree/walkFieldSchema.js +1 -1
  431. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  432. package/lib/tableSchema.d.ts +7 -2
  433. package/lib/tableSchema.d.ts.map +1 -1
  434. package/lib/tableSchema.js +22 -8
  435. package/lib/tableSchema.js.map +1 -1
  436. package/lib/util/brandedMap.d.ts +0 -2
  437. package/lib/util/brandedMap.d.ts.map +1 -1
  438. package/lib/util/brandedMap.js.map +1 -1
  439. package/package.json +36 -24
  440. package/src/core/forest/editableForest.ts +0 -2
  441. package/src/core/forest/forest.ts +0 -4
  442. package/src/core/rebase/changeRebaser.ts +0 -6
  443. package/src/core/rebase/types.ts +0 -2
  444. package/src/core/schema-stored/schema.ts +0 -8
  445. package/src/core/schema-view/view.ts +0 -2
  446. package/src/core/tree/cursor.ts +0 -2
  447. package/src/core/tree/delta.ts +0 -2
  448. package/src/core/tree/types.ts +0 -4
  449. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +0 -4
  450. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +0 -10
  451. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +1 -3
  452. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +0 -2
  453. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +0 -10
  454. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +0 -8
  455. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +0 -12
  456. package/src/feature-libraries/sequence-field/types.ts +0 -2
  457. package/src/index.ts +10 -0
  458. package/src/jsonDomainSchema.ts +3 -3
  459. package/src/packageVersion.ts +1 -1
  460. package/src/shared-tree/schematizingTreeView.ts +8 -5
  461. package/src/shared-tree/treeAlpha.ts +190 -3
  462. package/src/simple-tree/api/configuration.ts +131 -45
  463. package/src/simple-tree/api/customTree.ts +3 -3
  464. package/src/simple-tree/api/index.ts +6 -3
  465. package/src/simple-tree/api/jsonSchema.ts +35 -8
  466. package/src/simple-tree/api/schemaFactory.ts +5 -13
  467. package/src/simple-tree/api/schemaFactoryAlpha.ts +268 -1
  468. package/src/simple-tree/api/schemaFactoryRecursive.ts +5 -1
  469. package/src/simple-tree/api/schemaFromSimple.ts +6 -0
  470. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +16 -7
  471. package/src/simple-tree/api/treeBeta.ts +2 -2
  472. package/src/simple-tree/api/treeNodeApi.ts +7 -4
  473. package/src/simple-tree/api/typesUnsafe.ts +15 -0
  474. package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +14 -6
  475. package/src/simple-tree/core/context.ts +3 -3
  476. package/src/simple-tree/core/getOrCreateNode.ts +14 -0
  477. package/src/simple-tree/core/index.ts +8 -1
  478. package/src/simple-tree/core/treeNodeKernel.ts +1 -1
  479. package/src/simple-tree/core/treeNodeSchema.ts +121 -5
  480. package/src/simple-tree/core/walkSchema.ts +16 -7
  481. package/src/simple-tree/createContext.ts +1 -1
  482. package/src/simple-tree/getTreeNodeForField.ts +3 -1
  483. package/src/simple-tree/index.ts +20 -5
  484. package/src/simple-tree/leafNodeSchema.ts +7 -1
  485. package/src/simple-tree/node-kinds/array/arrayNode.ts +15 -9
  486. package/src/simple-tree/node-kinds/index.ts +11 -0
  487. package/src/simple-tree/node-kinds/map/mapNode.ts +10 -4
  488. package/src/simple-tree/node-kinds/object/index.ts +5 -1
  489. package/src/simple-tree/node-kinds/object/objectNode.ts +23 -13
  490. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +6 -3
  491. package/src/simple-tree/node-kinds/record/index.ts +14 -0
  492. package/src/simple-tree/node-kinds/record/recordNode.ts +410 -0
  493. package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +136 -0
  494. package/src/simple-tree/schemaTypes.ts +55 -64
  495. package/src/simple-tree/simpleSchema.ts +19 -1
  496. package/src/simple-tree/toStoredSchema.ts +6 -2
  497. package/src/simple-tree/treeNodeValid.ts +1 -1
  498. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +83 -40
  499. package/src/simple-tree/walkFieldSchema.ts +5 -1
  500. package/src/tableSchema.ts +27 -8
  501. package/src/util/brandedMap.ts +0 -2
@@ -32,8 +32,10 @@ import type {
32
32
  TreeNodeSchemaCore,
33
33
  TreeNodeSchemaNonClass,
34
34
  UnhydratedFlexTreeNode,
35
+ AnnotatedAllowedType,
36
+ NormalizedAnnotatedAllowedTypes,
35
37
  } from "./core/index.js";
36
- import { inPrototypeChain } from "./core/index.js";
38
+ import { inPrototypeChain, isAnnotatedAllowedTypes } from "./core/index.js";
37
39
  import { isLazy, type FlexListToUnion, type LazyItem } from "./flexList.js";
38
40
  import { LeafNodeSchema } from "./leafNodeSchema.js";
39
41
  import type { SimpleFieldSchema, SimpleObjectFieldSchema } from "./simpleSchema.js";
@@ -106,17 +108,6 @@ export interface AnnotatedAllowedTypes {
106
108
  readonly types: readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[];
107
109
  }
108
110
 
109
- /**
110
- * Checks if the input is an {@link AnnotatedAllowedTypes}.
111
- */
112
- export function isAnnotatedAllowedTypes(
113
- allowedTypes: ImplicitAnnotatedAllowedTypes,
114
- ): allowedTypes is AnnotatedAllowedTypes {
115
- return (
116
- typeof allowedTypes === "object" && "metadata" in allowedTypes && "types" in allowedTypes
117
- );
118
- }
119
-
120
111
  /**
121
112
  * Annotations that apply to a set of allowed types.
122
113
  * @remarks
@@ -130,21 +121,6 @@ export interface AllowedTypesMetadata {
130
121
  readonly custom?: unknown;
131
122
  }
132
123
 
133
- /**
134
- * Stores annotations for an individual allowed type.
135
- * @alpha
136
- */
137
- export interface AnnotatedAllowedType<T extends TreeNodeSchema = TreeNodeSchema> {
138
- /**
139
- * Annotations for the allowed type.
140
- */
141
- readonly metadata: AllowedTypeMetadata;
142
- /**
143
- * The allowed type the annotations apply to in a particular schema.
144
- */
145
- readonly type: LazyItem<T>;
146
- }
147
-
148
124
  /**
149
125
  * Checks if the given allowed type is annotated with {@link AllowedTypeMetadata}.
150
126
  */
@@ -207,7 +183,10 @@ export enum FieldKind {
207
183
  * If an explicit stored key was specified in the schema, it will be used.
208
184
  * Otherwise, the stored key is the same as the property key.
209
185
  */
210
- export function getStoredKey(propertyKey: string, fieldSchema: ImplicitFieldSchema): FieldKey {
186
+ export function getStoredKey(
187
+ propertyKey: string,
188
+ fieldSchema: ImplicitAnnotatedFieldSchema,
189
+ ): FieldKey {
211
190
  return brand(getExplicitStoredKey(fieldSchema) ?? propertyKey);
212
191
  }
213
192
 
@@ -215,7 +194,9 @@ export function getStoredKey(propertyKey: string, fieldSchema: ImplicitFieldSche
215
194
  * Gets the {@link FieldProps.key | stored key} specified by the schema, if one was explicitly specified.
216
195
  * Otherwise, returns undefined.
217
196
  */
218
- export function getExplicitStoredKey(fieldSchema: ImplicitFieldSchema): string | undefined {
197
+ export function getExplicitStoredKey(
198
+ fieldSchema: ImplicitAnnotatedFieldSchema,
199
+ ): string | undefined {
219
200
  return fieldSchema instanceof FieldSchema ? fieldSchema.props?.key : undefined;
220
201
  }
221
202
 
@@ -541,7 +522,7 @@ export class FieldSchemaAlpha<
541
522
  implements SimpleFieldSchema
542
523
  {
543
524
  private readonly lazyIdentifiers: Lazy<ReadonlySet<string>>;
544
- private readonly lazyAnnotatedTypes: Lazy<ReadonlyMap<TreeNodeSchema, AllowedTypeMetadata>>;
525
+ private readonly lazyAnnotatedTypes: Lazy<NormalizedAnnotatedAllowedTypes>;
545
526
  private readonly propsAlpha: FieldPropsAlpha<TCustomMetadata> | undefined;
546
527
 
547
528
  /**
@@ -586,7 +567,7 @@ export class FieldSchemaAlpha<
586
567
  ? annotatedAllowedTypes.metadata
587
568
  : {};
588
569
  this.lazyAnnotatedTypes = new Lazy(() =>
589
- extractAnnotationsFromAllowedTypes(this.annotatedAllowedTypes),
570
+ normalizeAnnotatedAllowedTypes(annotatedAllowedTypes),
590
571
  );
591
572
  this.lazyIdentifiers = new Lazy(
592
573
  () => new Set([...this.allowedTypeSet].map((t) => t.identifier)),
@@ -602,7 +583,7 @@ export class FieldSchemaAlpha<
602
583
  * What types of tree nodes are allowed in this field and their annotations.
603
584
  * @remarks Counterpart to {@link FieldSchemaAlpha.annotatedAllowedTypes}, with any lazy definitions evaluated.
604
585
  */
605
- public get annotatedAllowedTypeSet(): ReadonlyMap<TreeNodeSchema, AllowedTypeMetadata> {
586
+ public get annotatedAllowedTypesNormalized(): NormalizedAnnotatedAllowedTypes {
606
587
  return this.lazyAnnotatedTypes.value;
607
588
  }
608
589
  }
@@ -671,8 +652,8 @@ export function normalizeAllowedTypes(
671
652
  * Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist.
672
653
  */
673
654
  export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema>(
674
- type: T | AnnotatedAllowedType<T>,
675
- ): AnnotatedAllowedType<T> {
655
+ type: T | AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>>,
656
+ ): AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>> {
676
657
  return isAnnotatedAllowedType(type)
677
658
  ? type
678
659
  : {
@@ -681,6 +662,46 @@ export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema>(
681
662
  };
682
663
  }
683
664
 
665
+ /**
666
+ * Normalizes a {@link ImplicitAnnotatedAllowedTypes} to a set of {@link AnnotatedAllowedSchema}s, by eagerly evaluating any
667
+ * lazy schema declarations and adding empty metadata if it doesn't already exist.
668
+ *
669
+ * @remarks Note: this must only be called after all required schemas have been declared, otherwise evaluation of
670
+ * recursive schemas may fail.
671
+ */
672
+ export function normalizeAnnotatedAllowedTypes(
673
+ types: ImplicitAnnotatedAllowedTypes,
674
+ ): NormalizedAnnotatedAllowedTypes {
675
+ const typesWithoutAnnotation = isAnnotatedAllowedTypes(types) ? types.types : types;
676
+ const annotatedTypes: AnnotatedAllowedType<TreeNodeSchema>[] = [];
677
+ if (isReadonlyArray(typesWithoutAnnotation)) {
678
+ for (const annotatedType of typesWithoutAnnotation) {
679
+ if (isAnnotatedAllowedType(annotatedType)) {
680
+ annotatedTypes.push({
681
+ type: evaluateLazySchema(annotatedType.type),
682
+ metadata: annotatedType.metadata,
683
+ });
684
+ } else {
685
+ annotatedTypes.push({ type: evaluateLazySchema(annotatedType), metadata: {} });
686
+ }
687
+ }
688
+ } else {
689
+ if (isAnnotatedAllowedType(typesWithoutAnnotation)) {
690
+ annotatedTypes.push({
691
+ type: evaluateLazySchema(typesWithoutAnnotation.type),
692
+ metadata: typesWithoutAnnotation.metadata,
693
+ });
694
+ } else {
695
+ annotatedTypes.push({ type: evaluateLazySchema(typesWithoutAnnotation), metadata: {} });
696
+ }
697
+ }
698
+
699
+ return {
700
+ metadata: isAnnotatedAllowedTypes(types) ? types.metadata : {},
701
+ types: annotatedTypes,
702
+ };
703
+ }
704
+
684
705
  /**
685
706
  * Converts an {@link ImplicitAnnotatedAllowedTypes} to an {@link ImplicitAllowedTypes}s, by removing
686
707
  * any annotations.
@@ -719,36 +740,6 @@ export function unannotateSchemaRecord<
719
740
  ) as UnannotateSchemaRecord<Schema>;
720
741
  }
721
742
 
722
- /**
723
- * Converts annotated allowed types into a mapping between the type schema and their associated annotations.
724
- */
725
- export function extractAnnotationsFromAllowedTypes(
726
- types: ImplicitAnnotatedAllowedTypes,
727
- ): ReadonlyMap<TreeNodeSchema, AllowedTypeMetadata> {
728
- const typesWithoutAnnotation = isAnnotatedAllowedTypes(types) ? types.types : types;
729
- const annotations = new Map<TreeNodeSchema, AllowedTypeMetadata>();
730
- if (isReadonlyArray(typesWithoutAnnotation)) {
731
- for (const annotatedType of typesWithoutAnnotation) {
732
- if (isAnnotatedAllowedType(annotatedType)) {
733
- annotations.set(evaluateLazySchema(annotatedType.type), annotatedType.metadata);
734
- } else {
735
- annotations.set(evaluateLazySchema(annotatedType), {});
736
- }
737
- }
738
- } else {
739
- if (isAnnotatedAllowedType(typesWithoutAnnotation)) {
740
- annotations.set(
741
- evaluateLazySchema(typesWithoutAnnotation.type),
742
- typesWithoutAnnotation.metadata,
743
- );
744
- } else {
745
- annotations.set(evaluateLazySchema(typesWithoutAnnotation), {});
746
- }
747
- }
748
-
749
- return annotations;
750
- }
751
-
752
743
  /**
753
744
  * Returns true if the given {@link ImplicitFieldSchema} are equivalent, otherwise false.
754
745
  * @remarks Two ImplicitFieldSchema are considered equivalent if all of the following are true:
@@ -126,6 +126,23 @@ export interface SimpleMapNodeSchema<out TCustomMetadata = unknown>
126
126
  readonly allowedTypesIdentifiers: ReadonlySet<string>;
127
127
  }
128
128
 
129
+ /**
130
+ * A {@link SimpleNodeSchema} for a map node.
131
+ *
132
+ * @alpha
133
+ * @sealed
134
+ */
135
+ export interface SimpleRecordNodeSchema<out TCustomMetadata = unknown>
136
+ extends SimpleNodeSchemaBaseAlpha<NodeKind.Record, TCustomMetadata> {
137
+ /**
138
+ * The types allowed as values in the record.
139
+ *
140
+ * @remarks Refers to the types by identifier.
141
+ * A {@link SimpleTreeSchema} is needed to resolve these identifiers to their schema {@link SimpleTreeSchema.definitions}.
142
+ */
143
+ readonly allowedTypesIdentifiers: ReadonlySet<string>;
144
+ }
145
+
129
146
  /**
130
147
  * A {@link SimpleNodeSchema} for a leaf node.
131
148
  *
@@ -157,7 +174,8 @@ export type SimpleNodeSchema =
157
174
  | SimpleLeafNodeSchema
158
175
  | SimpleMapNodeSchema
159
176
  | SimpleArrayNodeSchema
160
- | SimpleObjectNodeSchema;
177
+ | SimpleObjectNodeSchema
178
+ | SimpleRecordNodeSchema;
161
179
 
162
180
  /**
163
181
  * A simple, shallow representation of a schema for a field.
@@ -37,6 +37,8 @@ const viewToStoredCache = new WeakMap<ImplicitFieldSchema, TreeStoredSchema>();
37
37
 
38
38
  /**
39
39
  * Converts a {@link ImplicitFieldSchema} into a {@link TreeStoredSchema}.
40
+ * @throws
41
+ * Throws a `UsageError` if multiple schemas are encountered with the same identifier.
40
42
  */
41
43
  export function toStoredSchema(root: ImplicitFieldSchema): TreeStoredSchema {
42
44
  return getOrCreate(viewToStoredCache, root, () => {
@@ -117,7 +119,8 @@ export function getStoredSchema(schema: SimpleNodeSchema): TreeNodeStoredSchema
117
119
  assert(schema instanceof LeafNodeSchema, 0xa4a /* invalid kind */);
118
120
  return new LeafNodeStoredSchema(schema.leafKind);
119
121
  }
120
- case NodeKind.Map: {
122
+ case NodeKind.Map:
123
+ case NodeKind.Record: {
121
124
  const types = schema.allowedTypesIdentifiers as TreeTypeSet;
122
125
  return new MapNodeStoredSchema(
123
126
  {
@@ -146,7 +149,8 @@ export function getStoredSchema(schema: SimpleNodeSchema): TreeNodeStoredSchema
146
149
  }
147
150
  return new ObjectNodeStoredSchema(fields, schema.persistedMetadata);
148
151
  }
149
- default:
152
+ default: {
150
153
  unreachableCase(kind);
154
+ }
151
155
  }
152
156
  }
@@ -20,8 +20,8 @@ import {
20
20
  type InnerNode,
21
21
  type Context,
22
22
  type UnhydratedFlexTreeNode,
23
+ getSimpleNodeSchemaFromInnerNode,
23
24
  } from "./core/index.js";
24
- import { getSimpleNodeSchemaFromInnerNode } from "./core/index.js";
25
25
  import { markEager } from "./flexList.js";
26
26
 
27
27
  /**
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import type { IFluidHandle } from "@fluidframework/core-interfaces";
6
7
  import { assert, fail, unreachableCase } from "@fluidframework/core-utils/internal";
7
8
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
9
  import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
@@ -28,28 +29,39 @@ import {
28
29
  type TreeLeafValue,
29
30
  extractFieldProvider,
30
31
  type ContextualFieldProvider,
32
+ unannotateImplicitAllowedTypes,
31
33
  } from "./schemaTypes.js";
32
34
  import {
35
+ createField,
33
36
  getKernel,
34
37
  isTreeNode,
35
38
  NodeKind,
36
39
  type TreeNode,
37
40
  type TreeNodeSchema,
38
41
  type Unhydrated,
42
+ type UnhydratedFlexTreeField,
39
43
  UnhydratedFlexTreeNode,
40
44
  UnhydratedSequenceField,
41
45
  } from "./core/index.js";
46
+ import { getUnhydratedContext } from "./createContext.js";
47
+ import { convertFieldKind } from "./toStoredSchema.js";
48
+
42
49
  // Required to prevent the introduction of new circular dependencies
43
50
  // TODO: Having the schema provide their own policy functions for compatibility which
44
- // unhydratedFlexTreeFromInsertable invokes instead of manually handling each kind would remove this bad
51
+ // `unhydratedFlexTreeFromInsertable` invokes instead of manually handling each kind would remove this bad
45
52
  // dependency, and reduce coupling.
46
- // eslint-disable-next-line import/no-internal-modules
47
- import { isObjectNodeSchema } from "./node-kinds/object/objectNodeTypes.js";
48
- import type { IFluidHandle } from "@fluidframework/core-interfaces";
49
- // eslint-disable-next-line import/no-internal-modules
50
- import { createField, type UnhydratedFlexTreeField } from "./core/unhydratedFlexTree.js";
51
- import { convertFieldKind } from "./toStoredSchema.js";
52
- import { getUnhydratedContext } from "./createContext.js";
53
+ /* eslint-disable import/no-internal-modules */
54
+ import { isArrayNodeSchema, type ArrayNodeSchema } from "./node-kinds/array/arrayNodeTypes.js";
55
+ import { isMapNodeSchema, type MapNodeSchema } from "./node-kinds/map/mapNodeTypes.js";
56
+ import {
57
+ isObjectNodeSchema,
58
+ type ObjectNodeSchemaPrivate,
59
+ } from "./node-kinds/object/objectNodeTypes.js";
60
+ import {
61
+ isRecordNodeSchema,
62
+ type RecordNodeSchema,
63
+ } from "./node-kinds/record/recordNodeTypes.js";
64
+ /* eslint-enable import/no-internal-modules */
53
65
 
54
66
  /**
55
67
  * Module notes:
@@ -139,14 +151,21 @@ function unhydratedFlexTreeFromInsertableNode(
139
151
  result = leafToFlexContent(data, schema, allowedTypes);
140
152
  break;
141
153
  case NodeKind.Array:
154
+ assert(isArrayNodeSchema(schema), 0x922 /* Expected an array schema. */);
142
155
  result = arrayToFlexContent(data, schema);
143
156
  break;
144
157
  case NodeKind.Map:
158
+ assert(isMapNodeSchema(schema), 0x923 /* Expected a Map schema. */);
145
159
  result = mapToFlexContent(data, schema);
146
160
  break;
147
161
  case NodeKind.Object:
162
+ assert(isObjectNodeSchema(schema), 0x924 /* Expected an Object schema. */);
148
163
  result = objectToFlexContent(data, schema);
149
164
  break;
165
+ case NodeKind.Record:
166
+ assert(isRecordNodeSchema(schema), "Expected a Record schema.");
167
+ result = recordToFlexContent(data, schema);
168
+ break;
150
169
  default:
151
170
  unreachableCase(schema.kind);
152
171
  }
@@ -265,8 +284,7 @@ function arrayChildToFlexTree(
265
284
  * @param data - The tree data to be transformed. Must be an iterable.
266
285
  * @param schema - The schema associated with the value.
267
286
  */
268
- function arrayToFlexContent(data: FactoryContent, schema: TreeNodeSchema): FlexContent {
269
- assert(schema.kind === NodeKind.Array, 0x922 /* Expected an array schema. */);
287
+ function arrayToFlexContent(data: FactoryContent, schema: ArrayNodeSchema): FlexContent {
270
288
  if (!(typeof data === "object" && data !== null && Symbol.iterator in data)) {
271
289
  throw new UsageError(`Input data is incompatible with Array schema: ${data}`);
272
290
  }
@@ -308,14 +326,11 @@ function arrayToFlexContent(data: FactoryContent, schema: TreeNodeSchema): FlexC
308
326
  * @param data - The tree data to be transformed. Must be an iterable.
309
327
  * @param schema - The schema associated with the value.
310
328
  */
311
- function mapToFlexContent(data: FactoryContent, schema: TreeNodeSchema): FlexContent {
312
- assert(schema.kind === NodeKind.Map, 0x923 /* Expected a Map schema. */);
329
+ function mapToFlexContent(data: FactoryContent, schema: MapNodeSchema): FlexContent {
313
330
  if (!(typeof data === "object" && data !== null)) {
314
331
  throw new UsageError(`Input data is incompatible with Map schema: ${data}`);
315
332
  }
316
333
 
317
- const allowedChildTypes = normalizeAllowedTypes(schema.info as ImplicitAllowedTypes);
318
-
319
334
  const fieldsIterator = (
320
335
  Symbol.iterator in data
321
336
  ? // Support iterables of key value pairs (including Map objects)
@@ -324,30 +339,7 @@ function mapToFlexContent(data: FactoryContent, schema: TreeNodeSchema): FlexCon
324
339
  Object.entries(data)
325
340
  ) as Iterable<readonly [string, InsertableContent]>;
326
341
 
327
- const context = getUnhydratedContext(schema).flexContext;
328
-
329
- const transformedFields = new Map<FieldKey, UnhydratedFlexTreeField>();
330
- for (const item of fieldsIterator) {
331
- if (!isReadonlyArray(item) || item.length !== 2 || typeof item[0] !== "string") {
332
- throw new UsageError(`Input data is incompatible with map entry: ${item}`);
333
- }
334
- const [key, value] = item;
335
- assert(!transformedFields.has(brand(key)), 0x84c /* Keys should not be duplicated */);
336
-
337
- // Omit undefined values - an entry with an undefined value is equivalent to one that has been removed or omitted
338
- if (value !== undefined) {
339
- const child = unhydratedFlexTreeFromInsertableNode(value, allowedChildTypes);
340
- const field = createField(context, FieldKinds.optional.identifier, brand(key), [child]);
341
- transformedFields.set(brand(key), field);
342
- }
343
- }
344
-
345
- return [
346
- {
347
- type: brand(schema.identifier),
348
- },
349
- transformedFields,
350
- ];
342
+ return recordLikeDataToFlexContent(fieldsIterator, schema);
351
343
  }
352
344
 
353
345
  /**
@@ -355,8 +347,10 @@ function mapToFlexContent(data: FactoryContent, schema: TreeNodeSchema): FlexCon
355
347
  * @param data - The tree data to be transformed. Must be a Record-like object.
356
348
  * @param schema - The schema associated with the value.
357
349
  */
358
- function objectToFlexContent(data: FactoryContent, schema: TreeNodeSchema): FlexContent {
359
- assert(isObjectNodeSchema(schema), 0x924 /* Expected an Object schema. */);
350
+ function objectToFlexContent(
351
+ data: FactoryContent,
352
+ schema: ObjectNodeSchemaPrivate,
353
+ ): FlexContent {
360
354
  if (
361
355
  typeof data !== "object" ||
362
356
  data === null ||
@@ -396,6 +390,51 @@ function objectToFlexContent(data: FactoryContent, schema: TreeNodeSchema): Flex
396
390
  return [{ type: brand(schema.identifier) }, fields];
397
391
  }
398
392
 
393
+ /**
394
+ * Transforms data under an Object schema.
395
+ * @param data - The tree data to be transformed. Must be a Record-like object.
396
+ * @param schema - The schema associated with the value.
397
+ */
398
+ function recordToFlexContent(data: FactoryContent, schema: RecordNodeSchema): FlexContent {
399
+ if (!(typeof data === "object" && data !== null)) {
400
+ throw new UsageError(`Input data is incompatible with Record schema: ${data}`);
401
+ }
402
+
403
+ const fieldsIterator: Iterable<readonly [string, InsertableContent]> = Object.entries(data);
404
+ return recordLikeDataToFlexContent(fieldsIterator, schema);
405
+ }
406
+
407
+ /**
408
+ * Converts record-like data to a FlexContent representation for map/record schema.
409
+ */
410
+ function recordLikeDataToFlexContent(
411
+ fieldsIterator: Iterable<readonly [string, InsertableContent]>,
412
+ schema: MapNodeSchema | RecordNodeSchema,
413
+ ): FlexContent {
414
+ const allowedChildTypes = normalizeAllowedTypes(unannotateImplicitAllowedTypes(schema.info));
415
+ const context = getUnhydratedContext(schema).flexContext;
416
+
417
+ const transformedFields = new Map<FieldKey, UnhydratedFlexTreeField>();
418
+ for (const item of fieldsIterator) {
419
+ const [key, value] = item;
420
+ assert(!transformedFields.has(brand(key)), 0x84c /* Keys should not be duplicated */);
421
+
422
+ // Omit undefined values - an entry with an undefined value is equivalent to one that has been removed or omitted
423
+ if (value !== undefined) {
424
+ const child = unhydratedFlexTreeFromInsertableNode(value, allowedChildTypes);
425
+ const field = createField(context, FieldKinds.optional.identifier, brand(key), [child]);
426
+ transformedFields.set(brand(key), field);
427
+ }
428
+ }
429
+
430
+ return [
431
+ {
432
+ type: brand(schema.identifier),
433
+ },
434
+ transformedFields,
435
+ ];
436
+ }
437
+
399
438
  /**
400
439
  * Check {@link FactoryContentObject} for a property which could be store a field.
401
440
  *
@@ -550,6 +589,10 @@ function shallowCompatibilityTest(
550
589
 
551
590
  // At this point, it is assumed data is a record-like object since all the other cases have been eliminated.
552
591
 
592
+ if (schema.kind === NodeKind.Record) {
593
+ return CompatibilityLevel.Normal;
594
+ }
595
+
553
596
  if (schema.kind === NodeKind.Array) {
554
597
  return CompatibilityLevel.None;
555
598
  }
@@ -14,5 +14,9 @@ export function walkFieldSchema(
14
14
  visitor: SchemaVisitor,
15
15
  visitedSet: Set<TreeNodeSchema> = new Set(),
16
16
  ): void {
17
- walkAllowedTypes(normalizeFieldSchema(schema).allowedTypeSet, visitor, visitedSet);
17
+ walkAllowedTypes(
18
+ normalizeFieldSchema(schema).annotatedAllowedTypesNormalized,
19
+ visitor,
20
+ visitedSet,
21
+ );
18
22
  }
@@ -6,7 +6,7 @@
6
6
  import { oob } from "@fluidframework/core-utils/internal";
7
7
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
8
 
9
- import { Tree } from "./shared-tree/index.js";
9
+ import { Tree, TreeAlpha } from "./shared-tree/index.js";
10
10
  import {
11
11
  type FieldHasDefault,
12
12
  type ImplicitAllowedTypes,
@@ -28,6 +28,7 @@ import {
28
28
  type ImplicitAnnotatedFieldSchema,
29
29
  type UnannotateImplicitFieldSchema,
30
30
  isArrayNodeSchema,
31
+ type InsertableField,
31
32
  } from "./simple-tree/index.js";
32
33
 
33
34
  // Future improvement TODOs:
@@ -352,7 +353,12 @@ export namespace System_TableSchema {
352
353
  // See definition of `RowInsertableType` below.
353
354
  const rowFieldsBuiltInParts = {
354
355
  id: schemaFactory.identifier,
355
- cells: schemaFactory.required(schemaFactory.map("Row.cells", cellSchema), {
356
+ /**
357
+ * The cells of the table row, keyed by column ID.
358
+ * @remarks
359
+ * The table row models its cells as a record, where each key is the ID of the column it belongs to. The choice of record (as opposed to a map) is intended to make interop with common table rendering libraries in TypeScript/JavaScript easier.
360
+ */
361
+ cells: schemaFactory.required(schemaFactory.record("Row.cells", cellSchema), {
356
362
  metadata: {
357
363
  description: "The cells of the table row, keyed by column ID.",
358
364
  },
@@ -389,7 +395,8 @@ export namespace System_TableSchema {
389
395
  columnOrId: TableSchema.Column<TCellSchema> | string,
390
396
  ): CellValueType | undefined {
391
397
  const columnId = typeof columnOrId === "string" ? columnOrId : columnOrId.id;
392
- return this.cells.get(columnId) as CellValueType | undefined;
398
+ // Unlike most objects, RecordNodes don't have the default inherited object properties, so this is safe
399
+ return this.cells[columnId];
393
400
  }
394
401
 
395
402
  public setCell(
@@ -398,8 +405,18 @@ export namespace System_TableSchema {
398
405
  ): void {
399
406
  // TODO: throw if column does not exist in the owning table.
400
407
 
401
- const columnId = typeof columnOrId === "string" ? columnOrId : columnOrId.id;
402
- this.cells.set(columnId, value);
408
+ if (value === undefined) {
409
+ this.removeCell(columnOrId);
410
+ } else {
411
+ const columnId = typeof columnOrId === "string" ? columnOrId : columnOrId.id;
412
+
413
+ // TypeScript is unable to narrow the types correctly here, hence the casts.
414
+ // See: https://github.com/microsoft/TypeScript/issues/52144
415
+ this.cells[columnId] = TreeAlpha.create(
416
+ cellSchema,
417
+ value as InsertableField<TCellSchema>,
418
+ ) as CellValueType;
419
+ }
403
420
  }
404
421
 
405
422
  public removeCell(
@@ -409,12 +426,14 @@ export namespace System_TableSchema {
409
426
 
410
427
  const columnId = typeof columnOrId === "string" ? columnOrId : columnOrId.id;
411
428
 
412
- const cell: CellValueType | undefined = this.cells.get(columnId);
429
+ const cell: CellValueType | undefined = this.getCell(columnId);
413
430
  if (cell === undefined) {
414
431
  return undefined;
415
432
  }
416
433
 
417
- this.cells.delete(columnId);
434
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete -- The record's values are non-optional, so setting `undefined` as a means to remove the cell is not supported.
435
+ delete this.cells[columnId];
436
+
418
437
  return cell;
419
438
  }
420
439
 
@@ -423,7 +442,7 @@ export namespace System_TableSchema {
423
442
  cell: CellValueType;
424
443
  }[] {
425
444
  const result = [];
426
- for (const [columnId, cell] of this.cells.entries()) {
445
+ for (const [columnId, cell] of Object.entries(this.cells)) {
427
446
  if (cell !== undefined) {
428
447
  result.push({
429
448
  columnId,
@@ -16,8 +16,6 @@ import { getOrCreate } from "./utils.js";
16
16
  */
17
17
  export type BrandedKey<TKey, TContent> = TKey & Invariant<TContent>;
18
18
 
19
- /**
20
- */
21
19
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
20
  export type BrandedKeyContent<TKey extends BrandedKey<unknown, any>> = TKey extends BrandedKey<
23
21
  unknown,