@fluidframework/tree 2.43.0 → 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 (391) hide show
  1. package/api-report/tree.alpha.api.md +73 -16
  2. package/api-report/tree.beta.api.md +9 -3
  3. package/api-report/tree.legacy.alpha.api.md +8 -2
  4. package/api-report/tree.legacy.public.api.md +8 -2
  5. package/api-report/tree.public.api.md +8 -2
  6. package/dist/alpha.d.ts +9 -0
  7. package/dist/core/forest/editableForest.d.ts +0 -2
  8. package/dist/core/forest/editableForest.d.ts.map +1 -1
  9. package/dist/core/forest/editableForest.js.map +1 -1
  10. package/dist/core/forest/forest.d.ts +0 -4
  11. package/dist/core/forest/forest.d.ts.map +1 -1
  12. package/dist/core/forest/forest.js +0 -4
  13. package/dist/core/forest/forest.js.map +1 -1
  14. package/dist/core/rebase/changeRebaser.d.ts +0 -6
  15. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  16. package/dist/core/rebase/changeRebaser.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +0 -2
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js.map +1 -1
  20. package/dist/core/schema-stored/schema.d.ts +0 -8
  21. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  22. package/dist/core/schema-stored/schema.js +0 -8
  23. package/dist/core/schema-stored/schema.js.map +1 -1
  24. package/dist/core/schema-view/view.d.ts +0 -2
  25. package/dist/core/schema-view/view.d.ts.map +1 -1
  26. package/dist/core/schema-view/view.js.map +1 -1
  27. package/dist/core/tree/cursor.d.ts +0 -2
  28. package/dist/core/tree/cursor.d.ts.map +1 -1
  29. package/dist/core/tree/cursor.js +0 -2
  30. package/dist/core/tree/cursor.js.map +1 -1
  31. package/dist/core/tree/delta.d.ts +0 -2
  32. package/dist/core/tree/delta.d.ts.map +1 -1
  33. package/dist/core/tree/delta.js.map +1 -1
  34. package/dist/core/tree/types.d.ts +0 -4
  35. package/dist/core/tree/types.d.ts.map +1 -1
  36. package/dist/core/tree/types.js +0 -2
  37. package/dist/core/tree/types.js.map +1 -1
  38. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
  39. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  40. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  41. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +0 -10
  42. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  43. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  44. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +0 -2
  45. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  46. package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  47. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  48. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
  49. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  50. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
  51. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  52. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
  53. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  54. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
  55. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  56. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
  57. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  58. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
  60. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  61. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  62. package/dist/feature-libraries/sequence-field/types.d.ts +0 -2
  63. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  64. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/jsonDomainSchema.d.ts +2 -6
  70. package/dist/jsonDomainSchema.d.ts.map +1 -1
  71. package/dist/jsonDomainSchema.js +2 -2
  72. package/dist/jsonDomainSchema.js.map +1 -1
  73. package/dist/packageVersion.d.ts +1 -1
  74. package/dist/packageVersion.d.ts.map +1 -1
  75. package/dist/packageVersion.js +1 -1
  76. package/dist/packageVersion.js.map +1 -1
  77. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  78. package/dist/shared-tree/treeAlpha.js +3 -1
  79. package/dist/shared-tree/treeAlpha.js.map +1 -1
  80. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  81. package/dist/simple-tree/api/configuration.js +49 -17
  82. package/dist/simple-tree/api/configuration.js.map +1 -1
  83. package/dist/simple-tree/api/customTree.d.ts +1 -1
  84. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  85. package/dist/simple-tree/api/customTree.js +3 -4
  86. package/dist/simple-tree/api/customTree.js.map +1 -1
  87. package/dist/simple-tree/api/index.d.ts +2 -2
  88. package/dist/simple-tree/api/index.d.ts.map +1 -1
  89. package/dist/simple-tree/api/index.js.map +1 -1
  90. package/dist/simple-tree/api/jsonSchema.d.ts +32 -8
  91. package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
  92. package/dist/simple-tree/api/jsonSchema.js.map +1 -1
  93. package/dist/simple-tree/api/schemaFactory.d.ts +2 -2
  94. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  95. package/dist/simple-tree/api/schemaFactory.js +1 -1
  96. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  97. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
  98. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  99. package/dist/simple-tree/api/schemaFactoryAlpha.js +75 -0
  100. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  101. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
  102. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  103. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  104. package/dist/simple-tree/api/schemaFromSimple.js +2 -0
  105. package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
  106. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  107. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +4 -4
  108. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  109. package/dist/simple-tree/api/treeBeta.d.ts +1 -1
  110. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  111. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  112. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  113. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  114. package/dist/simple-tree/api/typesUnsafe.d.ts +12 -0
  115. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  116. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  117. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  118. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +5 -3
  119. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  120. package/dist/simple-tree/core/index.d.ts +1 -1
  121. package/dist/simple-tree/core/index.d.ts.map +1 -1
  122. package/dist/simple-tree/core/index.js +2 -1
  123. package/dist/simple-tree/core/index.js.map +1 -1
  124. package/dist/simple-tree/core/treeNodeSchema.d.ts +5 -1
  125. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  126. package/dist/simple-tree/core/treeNodeSchema.js +4 -0
  127. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  128. package/dist/simple-tree/index.d.ts +3 -3
  129. package/dist/simple-tree/index.d.ts.map +1 -1
  130. package/dist/simple-tree/index.js +3 -1
  131. package/dist/simple-tree/index.js.map +1 -1
  132. package/dist/simple-tree/node-kinds/index.d.ts +2 -1
  133. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  134. package/dist/simple-tree/node-kinds/index.js +5 -1
  135. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  136. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  137. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  138. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  139. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  140. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  141. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
  142. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  143. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  144. package/dist/simple-tree/node-kinds/record/index.d.ts +7 -0
  145. package/dist/simple-tree/node-kinds/record/index.d.ts.map +1 -0
  146. package/dist/simple-tree/node-kinds/record/index.js +13 -0
  147. package/dist/simple-tree/node-kinds/record/index.js.map +1 -0
  148. package/dist/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
  149. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
  150. package/dist/simple-tree/node-kinds/record/recordNode.js +234 -0
  151. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -0
  152. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
  153. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
  154. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js +30 -0
  155. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
  156. package/dist/simple-tree/simpleSchema.d.ts +16 -1
  157. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  158. package/dist/simple-tree/simpleSchema.js.map +1 -1
  159. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  160. package/dist/simple-tree/toStoredSchema.js +4 -2
  161. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  162. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
  163. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  164. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +56 -32
  165. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  166. package/dist/tableSchema.d.ts +7 -2
  167. package/dist/tableSchema.d.ts.map +1 -1
  168. package/dist/tableSchema.js +21 -7
  169. package/dist/tableSchema.js.map +1 -1
  170. package/dist/util/brandedMap.d.ts +0 -2
  171. package/dist/util/brandedMap.d.ts.map +1 -1
  172. package/dist/util/brandedMap.js.map +1 -1
  173. package/docs/main/compatibility.md +15 -1
  174. package/lib/alpha.d.ts +9 -0
  175. package/lib/core/forest/editableForest.d.ts +0 -2
  176. package/lib/core/forest/editableForest.d.ts.map +1 -1
  177. package/lib/core/forest/editableForest.js.map +1 -1
  178. package/lib/core/forest/forest.d.ts +0 -4
  179. package/lib/core/forest/forest.d.ts.map +1 -1
  180. package/lib/core/forest/forest.js +0 -4
  181. package/lib/core/forest/forest.js.map +1 -1
  182. package/lib/core/rebase/changeRebaser.d.ts +0 -6
  183. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  184. package/lib/core/rebase/changeRebaser.js.map +1 -1
  185. package/lib/core/rebase/types.d.ts +0 -2
  186. package/lib/core/rebase/types.d.ts.map +1 -1
  187. package/lib/core/rebase/types.js.map +1 -1
  188. package/lib/core/schema-stored/schema.d.ts +0 -8
  189. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  190. package/lib/core/schema-stored/schema.js +0 -8
  191. package/lib/core/schema-stored/schema.js.map +1 -1
  192. package/lib/core/schema-view/view.d.ts +0 -2
  193. package/lib/core/schema-view/view.d.ts.map +1 -1
  194. package/lib/core/schema-view/view.js.map +1 -1
  195. package/lib/core/tree/cursor.d.ts +0 -2
  196. package/lib/core/tree/cursor.d.ts.map +1 -1
  197. package/lib/core/tree/cursor.js +0 -2
  198. package/lib/core/tree/cursor.js.map +1 -1
  199. package/lib/core/tree/delta.d.ts +0 -2
  200. package/lib/core/tree/delta.d.ts.map +1 -1
  201. package/lib/core/tree/delta.js.map +1 -1
  202. package/lib/core/tree/types.d.ts +0 -4
  203. package/lib/core/tree/types.d.ts.map +1 -1
  204. package/lib/core/tree/types.js +0 -2
  205. package/lib/core/tree/types.js.map +1 -1
  206. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
  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/defaultFieldKinds.d.ts +0 -10
  210. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  211. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  212. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +0 -2
  213. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  214. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  215. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  216. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
  217. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  218. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
  219. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  220. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
  221. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  222. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
  223. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  224. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
  225. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  226. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  227. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
  228. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  229. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  230. package/lib/feature-libraries/sequence-field/types.d.ts +0 -2
  231. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  232. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  233. package/lib/index.d.ts +1 -1
  234. package/lib/index.d.ts.map +1 -1
  235. package/lib/index.js +1 -1
  236. package/lib/index.js.map +1 -1
  237. package/lib/jsonDomainSchema.d.ts +2 -6
  238. package/lib/jsonDomainSchema.d.ts.map +1 -1
  239. package/lib/jsonDomainSchema.js +3 -3
  240. package/lib/jsonDomainSchema.js.map +1 -1
  241. package/lib/packageVersion.d.ts +1 -1
  242. package/lib/packageVersion.d.ts.map +1 -1
  243. package/lib/packageVersion.js +1 -1
  244. package/lib/packageVersion.js.map +1 -1
  245. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  246. package/lib/shared-tree/treeAlpha.js +3 -1
  247. package/lib/shared-tree/treeAlpha.js.map +1 -1
  248. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  249. package/lib/simple-tree/api/configuration.js +51 -19
  250. package/lib/simple-tree/api/configuration.js.map +1 -1
  251. package/lib/simple-tree/api/customTree.d.ts +1 -1
  252. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  253. package/lib/simple-tree/api/customTree.js +2 -3
  254. package/lib/simple-tree/api/customTree.js.map +1 -1
  255. package/lib/simple-tree/api/index.d.ts +2 -2
  256. package/lib/simple-tree/api/index.d.ts.map +1 -1
  257. package/lib/simple-tree/api/index.js.map +1 -1
  258. package/lib/simple-tree/api/jsonSchema.d.ts +32 -8
  259. package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
  260. package/lib/simple-tree/api/jsonSchema.js.map +1 -1
  261. package/lib/simple-tree/api/schemaFactory.d.ts +2 -2
  262. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  263. package/lib/simple-tree/api/schemaFactory.js +1 -1
  264. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  265. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
  266. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  267. package/lib/simple-tree/api/schemaFactoryAlpha.js +77 -2
  268. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  269. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
  270. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  271. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  272. package/lib/simple-tree/api/schemaFromSimple.js +2 -0
  273. package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
  274. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  275. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +5 -5
  276. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  277. package/lib/simple-tree/api/treeBeta.d.ts +1 -1
  278. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  279. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  280. package/lib/simple-tree/api/treeNodeApi.js +2 -2
  281. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  282. package/lib/simple-tree/api/typesUnsafe.d.ts +12 -0
  283. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  284. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  285. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  286. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +6 -4
  287. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  288. package/lib/simple-tree/core/index.d.ts +1 -1
  289. package/lib/simple-tree/core/index.d.ts.map +1 -1
  290. package/lib/simple-tree/core/index.js +1 -1
  291. package/lib/simple-tree/core/index.js.map +1 -1
  292. package/lib/simple-tree/core/treeNodeSchema.d.ts +5 -1
  293. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  294. package/lib/simple-tree/core/treeNodeSchema.js +4 -0
  295. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  296. package/lib/simple-tree/index.d.ts +3 -3
  297. package/lib/simple-tree/index.d.ts.map +1 -1
  298. package/lib/simple-tree/index.js +1 -1
  299. package/lib/simple-tree/index.js.map +1 -1
  300. package/lib/simple-tree/node-kinds/index.d.ts +2 -1
  301. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  302. package/lib/simple-tree/node-kinds/index.js +1 -0
  303. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  304. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  305. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  306. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  307. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  308. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  309. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  310. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
  311. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  312. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  313. package/lib/simple-tree/node-kinds/record/index.d.ts +7 -0
  314. package/lib/simple-tree/node-kinds/record/index.d.ts.map +1 -0
  315. package/lib/simple-tree/node-kinds/record/index.js +7 -0
  316. package/lib/simple-tree/node-kinds/record/index.js.map +1 -0
  317. package/lib/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
  318. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
  319. package/lib/simple-tree/node-kinds/record/recordNode.js +232 -0
  320. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -0
  321. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
  322. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
  323. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js +26 -0
  324. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
  325. package/lib/simple-tree/simpleSchema.d.ts +16 -1
  326. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  327. package/lib/simple-tree/simpleSchema.js.map +1 -1
  328. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  329. package/lib/simple-tree/toStoredSchema.js +4 -2
  330. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  331. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
  332. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  333. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +58 -34
  334. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  335. package/lib/tableSchema.d.ts +7 -2
  336. package/lib/tableSchema.d.ts.map +1 -1
  337. package/lib/tableSchema.js +22 -8
  338. package/lib/tableSchema.js.map +1 -1
  339. package/lib/util/brandedMap.d.ts +0 -2
  340. package/lib/util/brandedMap.d.ts.map +1 -1
  341. package/lib/util/brandedMap.js.map +1 -1
  342. package/package.json +34 -22
  343. package/src/core/forest/editableForest.ts +0 -2
  344. package/src/core/forest/forest.ts +0 -4
  345. package/src/core/rebase/changeRebaser.ts +0 -6
  346. package/src/core/rebase/types.ts +0 -2
  347. package/src/core/schema-stored/schema.ts +0 -8
  348. package/src/core/schema-view/view.ts +0 -2
  349. package/src/core/tree/cursor.ts +0 -2
  350. package/src/core/tree/delta.ts +0 -2
  351. package/src/core/tree/types.ts +0 -4
  352. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +0 -4
  353. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +0 -10
  354. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -2
  355. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +0 -2
  356. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +0 -10
  357. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +0 -8
  358. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +0 -12
  359. package/src/feature-libraries/sequence-field/types.ts +0 -2
  360. package/src/index.ts +9 -0
  361. package/src/jsonDomainSchema.ts +3 -3
  362. package/src/packageVersion.ts +1 -1
  363. package/src/shared-tree/treeAlpha.ts +3 -1
  364. package/src/simple-tree/api/configuration.ts +73 -19
  365. package/src/simple-tree/api/customTree.ts +3 -3
  366. package/src/simple-tree/api/index.ts +3 -0
  367. package/src/simple-tree/api/jsonSchema.ts +35 -8
  368. package/src/simple-tree/api/schemaFactory.ts +5 -13
  369. package/src/simple-tree/api/schemaFactoryAlpha.ts +268 -1
  370. package/src/simple-tree/api/schemaFactoryRecursive.ts +5 -1
  371. package/src/simple-tree/api/schemaFromSimple.ts +6 -0
  372. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +16 -7
  373. package/src/simple-tree/api/treeBeta.ts +2 -2
  374. package/src/simple-tree/api/treeNodeApi.ts +2 -2
  375. package/src/simple-tree/api/typesUnsafe.ts +15 -0
  376. package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +14 -6
  377. package/src/simple-tree/core/index.ts +1 -0
  378. package/src/simple-tree/core/treeNodeSchema.ts +8 -4
  379. package/src/simple-tree/index.ts +11 -0
  380. package/src/simple-tree/node-kinds/index.ts +11 -0
  381. package/src/simple-tree/node-kinds/object/index.ts +5 -1
  382. package/src/simple-tree/node-kinds/object/objectNode.ts +3 -2
  383. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +6 -3
  384. package/src/simple-tree/node-kinds/record/index.ts +14 -0
  385. package/src/simple-tree/node-kinds/record/recordNode.ts +410 -0
  386. package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +136 -0
  387. package/src/simple-tree/simpleSchema.ts +19 -1
  388. package/src/simple-tree/toStoredSchema.ts +4 -2
  389. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +83 -40
  390. package/src/tableSchema.ts +27 -8
  391. package/src/util/brandedMap.ts +0 -2
@@ -10,11 +10,16 @@ import {
10
10
  mapSchema,
11
11
  type ObjectNodeSchema,
12
12
  objectSchema,
13
+ type RecordNodeCustomizableSchema,
14
+ type RecordNodeInsertableData,
15
+ recordSchema,
16
+ type TreeRecordNode,
13
17
  } from "../node-kinds/index.js";
14
18
  import {
15
19
  defaultSchemaFactoryObjectOptions,
16
20
  SchemaFactory,
17
21
  schemaStatics,
22
+ structuralName,
18
23
  type SchemaFactoryObjectOptions,
19
24
  type ScopedSchemaName,
20
25
  } from "./schemaFactory.js";
@@ -26,11 +31,19 @@ import type {
26
31
  NodeSchemaOptionsAlpha,
27
32
  } from "../schemaTypes.js";
28
33
  import type { RestrictiveStringRecord } from "../../util/index.js";
29
- import type { NodeKind, TreeNodeSchemaClass } from "../core/index.js";
34
+ import type {
35
+ NodeKind,
36
+ TreeNodeSchema,
37
+ TreeNodeSchemaBoth,
38
+ TreeNodeSchemaClass,
39
+ TreeNodeSchemaNonClass,
40
+ WithType,
41
+ } from "../core/index.js";
30
42
  import type {
31
43
  ArrayNodeCustomizableSchemaUnsafe,
32
44
  MapNodeCustomizableSchemaUnsafe,
33
45
  System_Unsafe,
46
+ TreeRecordNodeUnsafe,
34
47
  } from "./typesUnsafe.js";
35
48
  import type { SimpleObjectNodeSchema } from "../simpleSchema.js";
36
49
 
@@ -307,6 +320,260 @@ export class SchemaFactoryAlpha<
307
320
  >;
308
321
  }
309
322
 
323
+ /**
324
+ * Define a structurally typed {@link TreeNodeSchema} for a {@link (TreeRecordNode:interface)}.
325
+ *
326
+ * @param allowedTypes - The types that may appear in the record.
327
+ *
328
+ * @remarks
329
+ * The identifier for this record is defined as a function of the provided types.
330
+ * It is still scoped to this `SchemaFactory`, but multiple calls with the same arguments will return the same
331
+ * schema object, providing somewhat structural typing.
332
+ * This does not support recursive types.
333
+ *
334
+ * If using these structurally named records, other types in this schema builder should avoid names of the form `Record<${string}>`.
335
+ *
336
+ * @example
337
+ * The returned schema should be used as a schema directly:
338
+ * ```typescript
339
+ * const MyRecord = factory.record(factory.number);
340
+ * type MyRecord = NodeFromSchema<typeof Record>;
341
+ * ```
342
+ * Or inline:
343
+ * ```typescript
344
+ * factory.object("Foo", { myRecord: factory.record(factory.number) });
345
+ * ```
346
+ *
347
+ * @privateRemarks
348
+ * The name produced at the type-level here is not as specific as it could be; however, doing type-level sorting and escaping is a real mess.
349
+ * There are cases where not having this full type provided will be less than ideal, since TypeScript's structural types will allow assignment between runtime incompatible types at compile time.
350
+ * For example, attempts to narrow unions of structural records by name won't work.
351
+ * Planned future changes to move to a class based schema system as well as factor function based node construction should mostly avoid these issues,
352
+ * though there may still be some problematic cases even after that work is done.
353
+ *
354
+ * The return value is a class, but its type is intentionally not specific enough to indicate it is a class.
355
+ * This prevents callers of this from sub-classing it, which is unlikely to work well (due to the ease of accidentally giving two different calls to this different subclasses)
356
+ * when working with structural typing.
357
+ *
358
+ * {@label STRUCTURAL}
359
+ */
360
+ public record<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(
361
+ allowedTypes: T,
362
+ ): TreeNodeSchemaNonClass<
363
+ /* Name */ ScopedSchemaName<TScope, `Record<${string}>`>,
364
+ /* Kind */ NodeKind.Record,
365
+ /* TNode */ TreeRecordNode<T> &
366
+ WithType<ScopedSchemaName<TScope, `Record<${string}>`>, NodeKind.Record>,
367
+ /* TInsertable */ RecordNodeInsertableData<T>,
368
+ /* ImplicitlyConstructable */ true,
369
+ /* Info */ T,
370
+ /* TConstructorExtra */ undefined
371
+ >;
372
+ /**
373
+ * Define (and add to this library) a {@link TreeNodeSchemaClass} for a {@link (TreeRecordNode:interface)}.
374
+ *
375
+ * @param name - Unique identifier for this schema within this factory's scope.
376
+ * @param allowedTypes - The types that may appear in the record.
377
+ *
378
+ * @remarks
379
+ * Like TypeScript `Record`s, record nodes have some potential pitfalls.
380
+ * For example: TypeScript makes assumptions about built-in keys being present (e.g. `toString`, `hasOwnProperty`, etc.).
381
+ * Since these are otherwise valid keys in a record, this can lead to unexpected behavior.
382
+ * To prevent inconsistent behavior, these built-ins are hidden by record nodes.
383
+ * This means that if you try to call these built-ins (e.g. `toString()`) on a record node, you will get an error.
384
+ *
385
+ * In most cases, it is probably preferable to use {@link SchemaFactory.(map:2)} instead.
386
+ *
387
+ * @example
388
+ * ```typescript
389
+ * class NamedRecord extends factory.record("name", factory.number) {}
390
+ * ```
391
+ *
392
+ * {@label NAMED}
393
+ */
394
+ public record<const Name extends TName, const T extends ImplicitAllowedTypes>(
395
+ name: Name,
396
+ allowedTypes: T,
397
+ ): TreeNodeSchemaClass<
398
+ /* Name */ ScopedSchemaName<TScope, Name>,
399
+ /* Kind */ NodeKind.Record,
400
+ /* TNode */ TreeRecordNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Record>,
401
+ /* TInsertable */ RecordNodeInsertableData<T>,
402
+ /* ImplicitlyConstructable */ true,
403
+ /* Info */ T,
404
+ /* TConstructorExtra */ undefined
405
+ >;
406
+ /**
407
+ * {@link SchemaFactory.array} implementation.
408
+ *
409
+ * @privateRemarks
410
+ * This should return TreeNodeSchemaBoth: see note on "map" implementation for details.
411
+ */
412
+ public record<const T extends ImplicitAllowedTypes>(
413
+ nameOrAllowedTypes: TName | ((T & TreeNodeSchema) | readonly TreeNodeSchema[]),
414
+ maybeAllowedTypes?: T,
415
+ ): TreeNodeSchema<
416
+ /* Name */ ScopedSchemaName<TScope, string>,
417
+ /* Kind */ NodeKind.Record,
418
+ /* TNode */ TreeRecordNode<T>,
419
+ /* TInsertable */ RecordNodeInsertableData<T>,
420
+ /* ImplicitlyConstructable */ true,
421
+ /* Info */ T
422
+ > {
423
+ if (maybeAllowedTypes === undefined) {
424
+ const types = nameOrAllowedTypes as (T & TreeNodeSchema) | readonly TreeNodeSchema[];
425
+ const fullName = structuralName("Record", types);
426
+ return this.getStructuralType(fullName, types, () =>
427
+ this.namedRecord(
428
+ fullName,
429
+ nameOrAllowedTypes as T,
430
+ /* customizable */ false,
431
+ /* implicitlyConstructable */ true,
432
+ ),
433
+ ) as TreeNodeSchemaClass<
434
+ /* Name */ ScopedSchemaName<TScope, string>,
435
+ /* Kind */ NodeKind.Record,
436
+ /* TNode */ TreeRecordNode<T>,
437
+ /* TInsertable */ RecordNodeInsertableData<T>,
438
+ /* ImplicitlyConstructable */ true,
439
+ /* Info */ T,
440
+ /* TConstructorExtra */ undefined
441
+ >;
442
+ }
443
+ const out: TreeNodeSchemaBoth<
444
+ /* Name */ ScopedSchemaName<TScope, string>,
445
+ /* Kind */ NodeKind.Record,
446
+ /* TNode */ TreeRecordNode<T>,
447
+ /* TInsertable */ RecordNodeInsertableData<T>,
448
+ /* ImplicitlyConstructable */ true,
449
+ /* Info */ T,
450
+ /* TConstructorExtra */ undefined
451
+ > = this.namedRecord(
452
+ nameOrAllowedTypes as TName,
453
+ maybeAllowedTypes,
454
+ /* customizable */ true,
455
+ /* implicitlyConstructable */ true,
456
+ );
457
+ return out;
458
+ }
459
+
460
+ /**
461
+ * Define a {@link TreeNodeSchema} for a {@link (TreeArrayNode:interface)}.
462
+ *
463
+ * @param name - Unique identifier for this schema within this factory's scope.
464
+ *
465
+ * @remarks
466
+ * This is not intended to be used directly, use the overload of `array` which takes a name instead.
467
+ * This is only public to work around a compiler limitation.
468
+ */
469
+ private namedRecord<
470
+ Name extends TName | string,
471
+ const T extends ImplicitAllowedTypes,
472
+ const ImplicitlyConstructable extends boolean,
473
+ >(
474
+ name: Name,
475
+ allowedTypes: T,
476
+ customizable: boolean,
477
+ implicitlyConstructable: ImplicitlyConstructable,
478
+ ): TreeNodeSchemaBoth<
479
+ /* Name */ ScopedSchemaName<TScope, Name>,
480
+ /* Kind */ NodeKind.Record,
481
+ /* TNode */ TreeRecordNode<T> &
482
+ WithType<ScopedSchemaName<TScope, string>, NodeKind.Record>,
483
+ /* TInsertable */ RecordNodeInsertableData<T>,
484
+ /* ImplicitlyConstructable */ ImplicitlyConstructable,
485
+ /* Info */ T,
486
+ /* TConstructorExtra */ undefined
487
+ > {
488
+ const record = recordSchema({
489
+ identifier: this.scoped2(name),
490
+ info: allowedTypes,
491
+ customizable,
492
+ implicitlyConstructable,
493
+ });
494
+
495
+ return record as TreeNodeSchemaBoth<
496
+ /* Name */ ScopedSchemaName<TScope, Name>,
497
+ /* Kind */ NodeKind.Record,
498
+ /* TNode */ TreeRecordNode<T> &
499
+ WithType<ScopedSchemaName<TScope, string>, NodeKind.Record>,
500
+ /* TInsertable */ RecordNodeInsertableData<T>,
501
+ /* ImplicitlyConstructable */ ImplicitlyConstructable,
502
+ /* Info */ T,
503
+ /* TConstructorExtra */ undefined
504
+ >;
505
+ }
506
+
507
+ /**
508
+ * Define (and add to this library) a {@link TreeNodeSchemaClass} for a {@link (TreeRecordNode:interface)}.
509
+ *
510
+ * @param name - Unique identifier for this schema within this factory's scope.
511
+ * @param allowedTypes - The types that may appear in the record.
512
+ * @param options - Additional options for the schema.
513
+ *
514
+ * @example
515
+ * ```typescript
516
+ * class NamedRecord extends factory.recordAlpha("name", factory.number) {}
517
+ * ```
518
+ */
519
+ public recordAlpha<
520
+ const Name extends TName,
521
+ const T extends ImplicitAnnotatedAllowedTypes,
522
+ const TCustomMetadata = unknown,
523
+ >(
524
+ name: Name,
525
+ allowedTypes: T,
526
+ options?: NodeSchemaOptionsAlpha<TCustomMetadata>,
527
+ ): RecordNodeCustomizableSchema<ScopedSchemaName<TScope, Name>, T, true, TCustomMetadata> {
528
+ return recordSchema({
529
+ identifier: this.scoped2(name),
530
+ info: allowedTypes,
531
+ customizable: true,
532
+ implicitlyConstructable: true,
533
+ metadata: options?.metadata,
534
+ persistedMetadata: options?.persistedMetadata,
535
+ });
536
+ }
537
+
538
+ /**
539
+ * {@link SchemaFactoryAlpha.(record:2)} except tweaked to work better for recursive types.
540
+ * Use with {@link ValidateRecursiveSchema} for improved type safety.
541
+ * @remarks
542
+ * This version of `SchemaFactory.record` uses the same workarounds as {@link SchemaFactory.objectRecursive}.
543
+ * See {@link ValidateRecursiveSchema} for additional information about using recursive schema.
544
+ */
545
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
546
+ public recordRecursive<
547
+ Name extends TName,
548
+ const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
549
+ >(name: Name, allowedTypes: T) {
550
+ const RecordSchema = this.namedRecord(
551
+ name,
552
+ allowedTypes as T & ImplicitAllowedTypes,
553
+ /* customizable */ true,
554
+ // Setting this to true seems to work ok currently, but not for other node kinds.
555
+ // Supporting this could be fragile and might break other future changes, so it's being kept as false for now.
556
+ /* implicitlyConstructable */ false,
557
+ );
558
+
559
+ return RecordSchema as TreeNodeSchemaClass<
560
+ /* Name */ ScopedSchemaName<TScope, Name>,
561
+ /* Kind */ NodeKind.Record,
562
+ /* TNode */ TreeRecordNodeUnsafe<T> &
563
+ WithType<ScopedSchemaName<TScope, Name>, NodeKind.Record>,
564
+ /* TInsertable */ {
565
+ // Ideally this would be
566
+ // RestrictiveStringRecord<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>>,
567
+ // but doing so breaks recursive types.
568
+ // Instead we do a less nice version:
569
+ readonly [P in string]: System_Unsafe.InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>;
570
+ },
571
+ /* ImplicitlyConstructable */ false,
572
+ /* Info */ T,
573
+ /* TConstructorExtra */ undefined
574
+ >;
575
+ }
576
+
310
577
  /**
311
578
  * Create a {@link SchemaFactory} with a {@link SchemaFactory.scope|scope} which is a combination of this factory's scope and the provided name.
312
579
  * @remarks
@@ -168,7 +168,7 @@ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNode
168
168
  // Name: This validator places no restrictions on the name other than that it's a string (as required by TreeNodeSchemaClass).
169
169
  string,
170
170
  // NodeKind: These are the NodeKinds which currently can be used recursively.
171
- NodeKind.Array | NodeKind.Map | NodeKind.Object,
171
+ NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record,
172
172
  // TNode: The produced node API. This is pretty minimal validation: more could be added if similar to how TInsertable works below if needed.
173
173
  TreeNode & WithType<T["identifier"], T["kind"]>,
174
174
  // TInsertable: What can be passed to the constructor. This should be enough to catch most issues with incorrect schema.
@@ -183,6 +183,9 @@ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNode
183
183
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes
184
184
  ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]>
185
185
  : unknown;
186
+ [NodeKind.Record]: {
187
+ readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
188
+ };
186
189
  [NodeKind.Leaf]: unknown;
187
190
  }[T["kind"]],
188
191
  // ImplicitlyConstructable: recursive types are currently not implicitly constructable.
@@ -192,6 +195,7 @@ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNode
192
195
  [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
193
196
  [NodeKind.Array]: ImplicitAllowedTypes;
194
197
  [NodeKind.Map]: ImplicitAllowedTypes;
198
+ [NodeKind.Record]: ImplicitAllowedTypes;
195
199
  [NodeKind.Leaf]: unknown;
196
200
  }[T["kind"]]
197
201
  >;
@@ -116,6 +116,12 @@ function generateNode(
116
116
  generateAllowedTypes(schema.allowedTypesIdentifiers, context),
117
117
  { metadata: schema.metadata },
118
118
  );
119
+ case NodeKind.Record:
120
+ return factory.recordAlpha(
121
+ id,
122
+ generateAllowedTypes(schema.allowedTypesIdentifiers, context),
123
+ { metadata: schema.metadata },
124
+ );
119
125
  case NodeKind.Leaf:
120
126
  return (
121
127
  SchemaFactoryAlpha.leaves.find((leaf) => leaf.identifier === id) ??
@@ -18,17 +18,24 @@ import type {
18
18
  JsonObjectNodeSchema,
19
19
  JsonTreeSchema,
20
20
  JsonLeafSchemaType,
21
+ JsonRecordNodeSchema,
21
22
  } from "./jsonSchema.js";
22
23
  import { FieldKind } from "../schemaTypes.js";
23
24
  import type {
24
25
  SimpleArrayNodeSchema,
25
26
  SimpleLeafNodeSchema,
26
27
  SimpleMapNodeSchema,
28
+ SimpleRecordNodeSchema,
27
29
  } from "../simpleSchema.js";
28
30
  import { NodeKind, type TreeNodeSchema } from "../core/index.js";
29
31
  import type { TreeSchema } from "./configuration.js";
30
32
  import type { TreeSchemaEncodingOptions } from "./getJsonSchema.js";
31
- import { ArrayNodeSchema, MapNodeSchema, ObjectNodeSchema } from "../node-kinds/index.js";
33
+ import {
34
+ ArrayNodeSchema,
35
+ isMapNodeSchema,
36
+ isRecordNodeSchema,
37
+ ObjectNodeSchema,
38
+ } from "../node-kinds/index.js";
32
39
  import { LeafNodeSchema } from "../leafNodeSchema.js";
33
40
 
34
41
  /**
@@ -88,8 +95,8 @@ function convertNodeSchema(
88
95
  ): JsonNodeSchema {
89
96
  if (schema instanceof ArrayNodeSchema) {
90
97
  return convertArrayNodeSchema(schema);
91
- } else if (schema instanceof MapNodeSchema) {
92
- return convertMapNodeSchema(schema);
98
+ } else if (isMapNodeSchema(schema) || isRecordNodeSchema(schema)) {
99
+ return convertRecordLikeNodeSchema(schema);
93
100
  } else if (schema instanceof ObjectNodeSchema) {
94
101
  return convertObjectNodeSchema(schema, options);
95
102
  } else if (schema instanceof LeafNodeSchema) {
@@ -191,15 +198,17 @@ export function convertObjectNodeSchema(
191
198
  return transformedNode;
192
199
  }
193
200
 
194
- function convertMapNodeSchema(schema: SimpleMapNodeSchema): JsonMapNodeSchema {
201
+ function convertRecordLikeNodeSchema(
202
+ schema: SimpleRecordNodeSchema | SimpleMapNodeSchema,
203
+ ): JsonMapNodeSchema | JsonRecordNodeSchema {
195
204
  const allowedTypes: JsonSchemaRef[] = [];
196
205
  schema.allowedTypesIdentifiers.forEach((type) => {
197
206
  allowedTypes.push(createSchemaRef(type));
198
207
  });
199
208
 
200
- const output: Mutable<JsonMapNodeSchema> = {
209
+ const output = {
201
210
  type: "object",
202
- _treeNodeSchemaKind: NodeKind.Map,
211
+ _treeNodeSchemaKind: schema.kind,
203
212
  patternProperties: {
204
213
  "^.*$": hasSingle(allowedTypes)
205
214
  ? allowedTypes[0]
@@ -207,7 +216,7 @@ function convertMapNodeSchema(schema: SimpleMapNodeSchema): JsonMapNodeSchema {
207
216
  anyOf: allowedTypes,
208
217
  },
209
218
  },
210
- };
219
+ } as const;
211
220
 
212
221
  copyProperty(schema.metadata, "description", output);
213
222
 
@@ -85,8 +85,8 @@ export interface TreeChangeEventsBeta<TNode extends TreeNode = TreeNode>
85
85
  */
86
86
  nodeChanged: (
87
87
  data: NodeChangedData<TNode> &
88
- // For object and Map nodes, make properties specific to them required instead of optional:
89
- (TNode extends WithType<string, NodeKind.Map | NodeKind.Object>
88
+ // Make the properties of object, map, and record nodes required:
89
+ (TNode extends WithType<string, NodeKind.Map | NodeKind.Object | NodeKind.Record>
90
90
  ? Required<Pick<NodeChangedData<TNode>, "changedProperties">>
91
91
  : unknown),
92
92
  ) => void;
@@ -38,7 +38,7 @@ import {
38
38
  getOrCreateInnerNode,
39
39
  } from "../core/index.js";
40
40
  import type { TreeChangeEvents } from "./treeChangeEvents.js";
41
- import { isObjectNodeSchema } from "../node-kinds/index.js";
41
+ import { isArrayNodeSchema, isObjectNodeSchema } from "../node-kinds/index.js";
42
42
  import { tryGetTreeNodeForField } from "../getTreeNodeForField.js";
43
43
 
44
44
  /**
@@ -193,7 +193,7 @@ export const treeNodeApi: TreeNodeApi = {
193
193
  );
194
194
  listener({ changedProperties });
195
195
  });
196
- } else if (nodeSchema.kind === NodeKind.Array) {
196
+ } else if (isArrayNodeSchema(nodeSchema)) {
197
197
  return kernel.events.on("childrenChangedAfterBatch", () => {
198
198
  listener({ changedProperties: undefined });
199
199
  });
@@ -527,3 +527,18 @@ export interface MapNodeCustomizableSchemaUnsafe<
527
527
  TCustomMetadata
528
528
  >,
529
529
  SimpleMapNodeSchema<TCustomMetadata> {}
530
+
531
+ /**
532
+ * {@link Unenforced} version of {@link TreeRecordNode}.
533
+ * @remarks
534
+ * Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
535
+ * @system @sealed @alpha
536
+ */
537
+ export interface TreeRecordNodeUnsafe<
538
+ TAllowedTypes extends System_Unsafe.ImplicitAllowedTypesUnsafe,
539
+ > extends Record<string, System_Unsafe.TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>>,
540
+ TreeNode {
541
+ [Symbol.iterator](): IterableIterator<
542
+ [string, System_Unsafe.TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>]
543
+ >;
544
+ }
@@ -13,10 +13,16 @@ import type {
13
13
  SimpleNodeSchema,
14
14
  SimpleObjectFieldSchema,
15
15
  SimpleObjectNodeSchema,
16
+ SimpleRecordNodeSchema,
16
17
  SimpleTreeSchema,
17
18
  } from "../simpleSchema.js";
18
19
  import { NodeKind } from "../core/index.js";
19
- import { ArrayNodeSchema, MapNodeSchema, ObjectNodeSchema } from "../node-kinds/index.js";
20
+ import {
21
+ ArrayNodeSchema,
22
+ MapNodeSchema,
23
+ ObjectNodeSchema,
24
+ RecordNodeSchema,
25
+ } from "../node-kinds/index.js";
20
26
  import { walkFieldSchema } from "../walkFieldSchema.js";
21
27
  import { LeafNodeSchema } from "../leafNodeSchema.js";
22
28
 
@@ -49,7 +55,8 @@ export function toSimpleTreeSchema(
49
55
  nodeSchema instanceof ArrayNodeSchema ||
50
56
  nodeSchema instanceof MapNodeSchema ||
51
57
  nodeSchema instanceof LeafNodeSchema ||
52
- nodeSchema instanceof ObjectNodeSchema,
58
+ nodeSchema instanceof ObjectNodeSchema ||
59
+ nodeSchema instanceof RecordNodeSchema,
53
60
  0xb60 /* Invalid schema */,
54
61
  );
55
62
  const outSchema = copySchemaObjects ? copySimpleNodeSchema(nodeSchema) : nodeSchema;
@@ -82,7 +89,8 @@ function copySimpleNodeSchema(schema: SimpleNodeSchema): SimpleNodeSchema {
82
89
  return copySimpleLeafSchema(schema);
83
90
  case NodeKind.Array:
84
91
  case NodeKind.Map:
85
- return copySimpleMapOrArraySchema(schema);
92
+ case NodeKind.Record:
93
+ return copySimpleSchemaWithAllowedTypes(schema);
86
94
  case NodeKind.Object:
87
95
  return copySimpleObjectSchema(schema);
88
96
  default:
@@ -99,9 +107,9 @@ function copySimpleLeafSchema(schema: SimpleLeafNodeSchema): SimpleLeafNodeSchem
99
107
  };
100
108
  }
101
109
 
102
- function copySimpleMapOrArraySchema(
103
- schema: SimpleMapNodeSchema | SimpleArrayNodeSchema,
104
- ): SimpleMapNodeSchema | SimpleArrayNodeSchema {
110
+ function copySimpleSchemaWithAllowedTypes(
111
+ schema: SimpleMapNodeSchema | SimpleArrayNodeSchema | SimpleRecordNodeSchema,
112
+ ): SimpleMapNodeSchema | SimpleArrayNodeSchema | SimpleRecordNodeSchema {
105
113
  return {
106
114
  kind: schema.kind,
107
115
  allowedTypesIdentifiers: schema.allowedTypesIdentifiers,
@@ -42,6 +42,7 @@ export {
42
42
  getOrCreateNodeFromInnerUnboxedNode,
43
43
  } from "./getOrCreateNode.js";
44
44
  export {
45
+ UnhydratedFlexTreeField,
45
46
  UnhydratedFlexTreeNode,
46
47
  UnhydratedSequenceField,
47
48
  UnhydratedContext,
@@ -438,19 +438,23 @@ export enum NodeKind {
438
438
  /**
439
439
  * A node which serves as a map, storing children under string keys.
440
440
  */
441
- Map,
441
+ Map = 0,
442
442
  /**
443
443
  * A node which serves as an array, storing children in an ordered sequence.
444
444
  */
445
- Array,
445
+ Array = 1,
446
446
  /**
447
447
  * A node which stores a heterogenous collection of children in named fields.
448
448
  * @remarks
449
449
  * Each field gets its own schema.
450
450
  */
451
- Object,
451
+ Object = 2,
452
452
  /**
453
453
  * A node which stores a single leaf value.
454
454
  */
455
- Leaf,
455
+ Leaf = 3,
456
+ /**
457
+ * A node which serves as a record, storing children under string keys.
458
+ */
459
+ Record = 4,
456
460
  }
@@ -69,6 +69,8 @@ export {
69
69
  type JsonTreeSchema,
70
70
  type JsonFieldSchema,
71
71
  type JsonLeafSchemaType,
72
+ type JsonRecordNodeSchema,
73
+ type JsonStringKeyPatternProperties,
72
74
  type TreeSchemaEncodingOptions,
73
75
  getJsonSchema,
74
76
  getSimpleSchema,
@@ -83,6 +85,7 @@ export {
83
85
  type System_Unsafe,
84
86
  type ArrayNodeCustomizableSchemaUnsafe,
85
87
  type MapNodeCustomizableSchemaUnsafe,
88
+ type TreeRecordNodeUnsafe,
86
89
  type TreeViewAlpha,
87
90
  type TreeBranch,
88
91
  type TreeBranchEvents,
@@ -136,6 +139,7 @@ export type {
136
139
  SimpleNodeSchemaBase,
137
140
  SimpleNodeSchemaBaseAlpha,
138
141
  SimpleObjectFieldSchema,
142
+ SimpleRecordNodeSchema,
139
143
  } from "./simpleSchema.js";
140
144
  export {
141
145
  type NodeFromSchema,
@@ -207,11 +211,18 @@ export {
207
211
  type InsertableObjectFromSchemaRecord,
208
212
  type ObjectFromSchemaRecord,
209
213
  ObjectNodeSchema,
214
+ type ObjectNodeSchemaPrivate,
210
215
  isObjectNodeSchema,
211
216
  type InsertableObjectFromAnnotatedSchemaRecord,
212
217
  type TreeObjectNode,
213
218
  setField,
214
219
  createUnknownOptionalFieldPolicy,
220
+ isRecordNodeSchema,
221
+ type RecordNodeCustomizableSchema,
222
+ type RecordNodeInsertableData,
223
+ type RecordNodePojoEmulationSchema,
224
+ RecordNodeSchema,
225
+ type TreeRecordNode,
215
226
  } from "./node-kinds/index.js";
216
227
  export {
217
228
  unhydratedFlexTreeFromInsertable,
@@ -33,7 +33,18 @@ export {
33
33
  isObjectNodeSchema,
34
34
  type ObjectFromSchemaRecord,
35
35
  ObjectNodeSchema,
36
+ type ObjectNodeSchemaPrivate,
36
37
  objectSchema,
37
38
  setField,
38
39
  type TreeObjectNode,
39
40
  } from "./object/index.js";
41
+
42
+ export {
43
+ isRecordNodeSchema,
44
+ type RecordNodeCustomizableSchema,
45
+ type RecordNodeInsertableData,
46
+ type RecordNodePojoEmulationSchema,
47
+ RecordNodeSchema,
48
+ recordSchema,
49
+ type TreeRecordNode,
50
+ } from "./record/index.js";
@@ -13,4 +13,8 @@ export {
13
13
  setField,
14
14
  type TreeObjectNode,
15
15
  } from "./objectNode.js";
16
- export { isObjectNodeSchema, ObjectNodeSchema } from "./objectNodeTypes.js";
16
+ export {
17
+ isObjectNodeSchema,
18
+ ObjectNodeSchema,
19
+ type ObjectNodeSchemaPrivate,
20
+ } from "./objectNodeTypes.js";
@@ -40,6 +40,7 @@ import {
40
40
  isObjectNodeSchema,
41
41
  type ObjectNodeSchema,
42
42
  type ObjectNodeSchemaInternalData,
43
+ type ObjectNodeSchemaPrivate,
43
44
  } from "./objectNodeTypes.js";
44
45
  import { prepareForInsertion } from "../../prepareForInsertion.js";
45
46
  import {
@@ -216,7 +217,7 @@ function createFlexKeyMapping(
216
217
  * If not provided `{}` is used for the target.
217
218
  */
218
219
  function createProxyHandler(
219
- schema: ObjectNodeSchema & ObjectNodeSchemaInternalData,
220
+ schema: ObjectNodeSchemaPrivate,
220
221
  allowAdditionalProperties: boolean,
221
222
  ): ProxyHandler<TreeNode> {
222
223
  // To satisfy 'deepEquals' level scrutiny, the target of the proxy must be an object with the same
@@ -476,7 +477,7 @@ export function objectSchema<
476
477
  protected static override oneTimeSetup<T2>(this: typeof TreeNodeValid<T2>): Context {
477
478
  // One time initialization that required knowing the most derived type (from this.constructor) and thus has to be lazy.
478
479
  customizable = (this as unknown) !== CustomObjectNode;
479
- const schema = this as unknown as ObjectNodeSchema & ObjectNodeSchemaInternalData;
480
+ const schema = this as unknown as ObjectNodeSchemaPrivate;
480
481
  handler = createProxyHandler(schema, customizable);
481
482
  unhydratedContext = getUnhydratedContext(schema);
482
483
 
@@ -83,8 +83,11 @@ export const ObjectNodeSchema = {
83
83
  },
84
84
  } as const;
85
85
 
86
- export function isObjectNodeSchema(
87
- schema: TreeNodeSchema,
88
- ): schema is ObjectNodeSchema & ObjectNodeSchemaInternalData {
86
+ /**
87
+ * {@link ObjectNodeSchema} with data that is not part of the package-exported API surface.
88
+ */
89
+ export type ObjectNodeSchemaPrivate = ObjectNodeSchema & ObjectNodeSchemaInternalData;
90
+
91
+ export function isObjectNodeSchema(schema: TreeNodeSchema): schema is ObjectNodeSchemaPrivate {
89
92
  return schema.kind === NodeKind.Object;
90
93
  }
@@ -0,0 +1,14 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ export { recordSchema } from "./recordNode.js";
7
+ export {
8
+ isRecordNodeSchema,
9
+ type RecordNodeCustomizableSchema,
10
+ type RecordNodeInsertableData,
11
+ type RecordNodePojoEmulationSchema,
12
+ RecordNodeSchema,
13
+ type TreeRecordNode,
14
+ } from "./recordNodeTypes.js";