@fluidframework/tree 2.43.0 → 2.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/api-report/tree.alpha.api.md +73 -16
  3. package/api-report/tree.beta.api.md +9 -3
  4. package/api-report/tree.legacy.alpha.api.md +8 -2
  5. package/api-report/tree.legacy.public.api.md +8 -2
  6. package/api-report/tree.public.api.md +8 -2
  7. package/dist/alpha.d.ts +9 -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 +0 -2
  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/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/shared-tree-core/defaultResubmitMachine.d.ts +8 -12
  81. package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  82. package/dist/shared-tree-core/defaultResubmitMachine.js +54 -46
  83. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  84. package/dist/shared-tree-core/resubmitMachine.d.ts +6 -0
  85. package/dist/shared-tree-core/resubmitMachine.d.ts.map +1 -1
  86. package/dist/shared-tree-core/resubmitMachine.js.map +1 -1
  87. package/dist/shared-tree-core/sharedTreeCore.d.ts +1 -0
  88. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  89. package/dist/shared-tree-core/sharedTreeCore.js +16 -3
  90. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  91. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  92. package/dist/simple-tree/api/configuration.js +49 -17
  93. package/dist/simple-tree/api/configuration.js.map +1 -1
  94. package/dist/simple-tree/api/customTree.d.ts +1 -1
  95. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  96. package/dist/simple-tree/api/customTree.js +3 -4
  97. package/dist/simple-tree/api/customTree.js.map +1 -1
  98. package/dist/simple-tree/api/index.d.ts +2 -2
  99. package/dist/simple-tree/api/index.d.ts.map +1 -1
  100. package/dist/simple-tree/api/index.js.map +1 -1
  101. package/dist/simple-tree/api/jsonSchema.d.ts +32 -8
  102. package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
  103. package/dist/simple-tree/api/jsonSchema.js.map +1 -1
  104. package/dist/simple-tree/api/schemaFactory.d.ts +2 -2
  105. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  106. package/dist/simple-tree/api/schemaFactory.js +1 -1
  107. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  108. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
  109. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  110. package/dist/simple-tree/api/schemaFactoryAlpha.js +75 -0
  111. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  112. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
  113. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  114. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  115. package/dist/simple-tree/api/schemaFromSimple.js +2 -0
  116. package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
  117. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  118. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +4 -4
  119. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  120. package/dist/simple-tree/api/treeBeta.d.ts +1 -1
  121. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  122. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  123. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  124. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  125. package/dist/simple-tree/api/typesUnsafe.d.ts +12 -0
  126. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  127. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  128. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  129. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +5 -3
  130. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  131. package/dist/simple-tree/core/index.d.ts +1 -1
  132. package/dist/simple-tree/core/index.d.ts.map +1 -1
  133. package/dist/simple-tree/core/index.js +2 -1
  134. package/dist/simple-tree/core/index.js.map +1 -1
  135. package/dist/simple-tree/core/treeNodeSchema.d.ts +5 -1
  136. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  137. package/dist/simple-tree/core/treeNodeSchema.js +4 -0
  138. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  139. package/dist/simple-tree/index.d.ts +3 -3
  140. package/dist/simple-tree/index.d.ts.map +1 -1
  141. package/dist/simple-tree/index.js +3 -1
  142. package/dist/simple-tree/index.js.map +1 -1
  143. package/dist/simple-tree/node-kinds/index.d.ts +2 -1
  144. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  145. package/dist/simple-tree/node-kinds/index.js +5 -1
  146. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  147. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  148. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  149. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  150. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  151. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  152. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
  153. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  154. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  155. package/dist/simple-tree/node-kinds/record/index.d.ts +7 -0
  156. package/dist/simple-tree/node-kinds/record/index.d.ts.map +1 -0
  157. package/dist/simple-tree/node-kinds/record/index.js +13 -0
  158. package/dist/simple-tree/node-kinds/record/index.js.map +1 -0
  159. package/dist/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
  160. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
  161. package/dist/simple-tree/node-kinds/record/recordNode.js +234 -0
  162. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -0
  163. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
  164. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
  165. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js +30 -0
  166. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
  167. package/dist/simple-tree/simpleSchema.d.ts +16 -1
  168. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  169. package/dist/simple-tree/simpleSchema.js.map +1 -1
  170. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  171. package/dist/simple-tree/toStoredSchema.js +4 -2
  172. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  173. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
  174. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  175. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +56 -32
  176. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  177. package/dist/tableSchema.d.ts +7 -2
  178. package/dist/tableSchema.d.ts.map +1 -1
  179. package/dist/tableSchema.js +21 -7
  180. package/dist/tableSchema.js.map +1 -1
  181. package/dist/util/brandedMap.d.ts +0 -2
  182. package/dist/util/brandedMap.d.ts.map +1 -1
  183. package/dist/util/brandedMap.js.map +1 -1
  184. package/docs/main/compatibility.md +15 -1
  185. package/lib/alpha.d.ts +9 -0
  186. package/lib/core/forest/editableForest.d.ts +0 -2
  187. package/lib/core/forest/editableForest.d.ts.map +1 -1
  188. package/lib/core/forest/editableForest.js.map +1 -1
  189. package/lib/core/forest/forest.d.ts +0 -4
  190. package/lib/core/forest/forest.d.ts.map +1 -1
  191. package/lib/core/forest/forest.js +0 -4
  192. package/lib/core/forest/forest.js.map +1 -1
  193. package/lib/core/rebase/changeRebaser.d.ts +0 -6
  194. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  195. package/lib/core/rebase/changeRebaser.js.map +1 -1
  196. package/lib/core/rebase/types.d.ts +0 -2
  197. package/lib/core/rebase/types.d.ts.map +1 -1
  198. package/lib/core/rebase/types.js.map +1 -1
  199. package/lib/core/schema-stored/schema.d.ts +0 -8
  200. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  201. package/lib/core/schema-stored/schema.js +0 -8
  202. package/lib/core/schema-stored/schema.js.map +1 -1
  203. package/lib/core/schema-view/view.d.ts +0 -2
  204. package/lib/core/schema-view/view.d.ts.map +1 -1
  205. package/lib/core/schema-view/view.js.map +1 -1
  206. package/lib/core/tree/cursor.d.ts +0 -2
  207. package/lib/core/tree/cursor.d.ts.map +1 -1
  208. package/lib/core/tree/cursor.js +0 -2
  209. package/lib/core/tree/cursor.js.map +1 -1
  210. package/lib/core/tree/delta.d.ts +0 -2
  211. package/lib/core/tree/delta.d.ts.map +1 -1
  212. package/lib/core/tree/delta.js.map +1 -1
  213. package/lib/core/tree/types.d.ts +0 -4
  214. package/lib/core/tree/types.d.ts.map +1 -1
  215. package/lib/core/tree/types.js +0 -2
  216. package/lib/core/tree/types.js.map +1 -1
  217. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
  218. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  219. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  220. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +0 -10
  221. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  222. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  223. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +0 -2
  224. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  225. package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
  226. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  227. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
  228. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  229. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
  230. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  231. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
  232. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  233. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
  234. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  235. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
  236. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  237. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  238. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
  239. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  240. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  241. package/lib/feature-libraries/sequence-field/types.d.ts +0 -2
  242. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  243. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  244. package/lib/index.d.ts +1 -1
  245. package/lib/index.d.ts.map +1 -1
  246. package/lib/index.js +1 -1
  247. package/lib/index.js.map +1 -1
  248. package/lib/jsonDomainSchema.d.ts +2 -6
  249. package/lib/jsonDomainSchema.d.ts.map +1 -1
  250. package/lib/jsonDomainSchema.js +3 -3
  251. package/lib/jsonDomainSchema.js.map +1 -1
  252. package/lib/packageVersion.d.ts +1 -1
  253. package/lib/packageVersion.js +1 -1
  254. package/lib/packageVersion.js.map +1 -1
  255. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  256. package/lib/shared-tree/treeAlpha.js +3 -1
  257. package/lib/shared-tree/treeAlpha.js.map +1 -1
  258. package/lib/shared-tree-core/defaultResubmitMachine.d.ts +8 -12
  259. package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  260. package/lib/shared-tree-core/defaultResubmitMachine.js +55 -47
  261. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  262. package/lib/shared-tree-core/resubmitMachine.d.ts +6 -0
  263. package/lib/shared-tree-core/resubmitMachine.d.ts.map +1 -1
  264. package/lib/shared-tree-core/resubmitMachine.js.map +1 -1
  265. package/lib/shared-tree-core/sharedTreeCore.d.ts +1 -0
  266. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  267. package/lib/shared-tree-core/sharedTreeCore.js +16 -3
  268. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  269. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  270. package/lib/simple-tree/api/configuration.js +51 -19
  271. package/lib/simple-tree/api/configuration.js.map +1 -1
  272. package/lib/simple-tree/api/customTree.d.ts +1 -1
  273. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  274. package/lib/simple-tree/api/customTree.js +2 -3
  275. package/lib/simple-tree/api/customTree.js.map +1 -1
  276. package/lib/simple-tree/api/index.d.ts +2 -2
  277. package/lib/simple-tree/api/index.d.ts.map +1 -1
  278. package/lib/simple-tree/api/index.js.map +1 -1
  279. package/lib/simple-tree/api/jsonSchema.d.ts +32 -8
  280. package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
  281. package/lib/simple-tree/api/jsonSchema.js.map +1 -1
  282. package/lib/simple-tree/api/schemaFactory.d.ts +2 -2
  283. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  284. package/lib/simple-tree/api/schemaFactory.js +1 -1
  285. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  286. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
  287. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  288. package/lib/simple-tree/api/schemaFactoryAlpha.js +77 -2
  289. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  290. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
  291. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  292. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  293. package/lib/simple-tree/api/schemaFromSimple.js +2 -0
  294. package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
  295. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  296. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +5 -5
  297. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  298. package/lib/simple-tree/api/treeBeta.d.ts +1 -1
  299. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  300. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  301. package/lib/simple-tree/api/treeNodeApi.js +2 -2
  302. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  303. package/lib/simple-tree/api/typesUnsafe.d.ts +12 -0
  304. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  305. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  306. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  307. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +6 -4
  308. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  309. package/lib/simple-tree/core/index.d.ts +1 -1
  310. package/lib/simple-tree/core/index.d.ts.map +1 -1
  311. package/lib/simple-tree/core/index.js +1 -1
  312. package/lib/simple-tree/core/index.js.map +1 -1
  313. package/lib/simple-tree/core/treeNodeSchema.d.ts +5 -1
  314. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  315. package/lib/simple-tree/core/treeNodeSchema.js +4 -0
  316. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  317. package/lib/simple-tree/index.d.ts +3 -3
  318. package/lib/simple-tree/index.d.ts.map +1 -1
  319. package/lib/simple-tree/index.js +1 -1
  320. package/lib/simple-tree/index.js.map +1 -1
  321. package/lib/simple-tree/node-kinds/index.d.ts +2 -1
  322. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  323. package/lib/simple-tree/node-kinds/index.js +1 -0
  324. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  325. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  326. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  327. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  328. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  329. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  330. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  331. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
  332. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  333. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  334. package/lib/simple-tree/node-kinds/record/index.d.ts +7 -0
  335. package/lib/simple-tree/node-kinds/record/index.d.ts.map +1 -0
  336. package/lib/simple-tree/node-kinds/record/index.js +7 -0
  337. package/lib/simple-tree/node-kinds/record/index.js.map +1 -0
  338. package/lib/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
  339. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
  340. package/lib/simple-tree/node-kinds/record/recordNode.js +232 -0
  341. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -0
  342. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
  343. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
  344. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js +26 -0
  345. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
  346. package/lib/simple-tree/simpleSchema.d.ts +16 -1
  347. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  348. package/lib/simple-tree/simpleSchema.js.map +1 -1
  349. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  350. package/lib/simple-tree/toStoredSchema.js +4 -2
  351. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  352. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
  353. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  354. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +58 -34
  355. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  356. package/lib/tableSchema.d.ts +7 -2
  357. package/lib/tableSchema.d.ts.map +1 -1
  358. package/lib/tableSchema.js +22 -8
  359. package/lib/tableSchema.js.map +1 -1
  360. package/lib/util/brandedMap.d.ts +0 -2
  361. package/lib/util/brandedMap.d.ts.map +1 -1
  362. package/lib/util/brandedMap.js.map +1 -1
  363. package/package.json +34 -22
  364. package/src/core/forest/editableForest.ts +0 -2
  365. package/src/core/forest/forest.ts +0 -4
  366. package/src/core/rebase/changeRebaser.ts +0 -6
  367. package/src/core/rebase/types.ts +0 -2
  368. package/src/core/schema-stored/schema.ts +0 -8
  369. package/src/core/schema-view/view.ts +0 -2
  370. package/src/core/tree/cursor.ts +0 -2
  371. package/src/core/tree/delta.ts +0 -2
  372. package/src/core/tree/types.ts +0 -4
  373. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +0 -4
  374. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +0 -10
  375. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -2
  376. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +0 -2
  377. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +0 -10
  378. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +0 -8
  379. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +0 -12
  380. package/src/feature-libraries/sequence-field/types.ts +0 -2
  381. package/src/index.ts +9 -0
  382. package/src/jsonDomainSchema.ts +3 -3
  383. package/src/packageVersion.ts +1 -1
  384. package/src/shared-tree/treeAlpha.ts +3 -1
  385. package/src/shared-tree-core/defaultResubmitMachine.ts +99 -52
  386. package/src/shared-tree-core/resubmitMachine.ts +7 -0
  387. package/src/shared-tree-core/sharedTreeCore.ts +18 -6
  388. package/src/simple-tree/api/configuration.ts +73 -19
  389. package/src/simple-tree/api/customTree.ts +3 -3
  390. package/src/simple-tree/api/index.ts +3 -0
  391. package/src/simple-tree/api/jsonSchema.ts +35 -8
  392. package/src/simple-tree/api/schemaFactory.ts +5 -13
  393. package/src/simple-tree/api/schemaFactoryAlpha.ts +268 -1
  394. package/src/simple-tree/api/schemaFactoryRecursive.ts +5 -1
  395. package/src/simple-tree/api/schemaFromSimple.ts +6 -0
  396. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +16 -7
  397. package/src/simple-tree/api/treeBeta.ts +2 -2
  398. package/src/simple-tree/api/treeNodeApi.ts +2 -2
  399. package/src/simple-tree/api/typesUnsafe.ts +15 -0
  400. package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +14 -6
  401. package/src/simple-tree/core/index.ts +1 -0
  402. package/src/simple-tree/core/treeNodeSchema.ts +8 -4
  403. package/src/simple-tree/index.ts +11 -0
  404. package/src/simple-tree/node-kinds/index.ts +11 -0
  405. package/src/simple-tree/node-kinds/object/index.ts +5 -1
  406. package/src/simple-tree/node-kinds/object/objectNode.ts +3 -2
  407. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +6 -3
  408. package/src/simple-tree/node-kinds/record/index.ts +14 -0
  409. package/src/simple-tree/node-kinds/record/recordNode.ts +410 -0
  410. package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +136 -0
  411. package/src/simple-tree/simpleSchema.ts +19 -1
  412. package/src/simple-tree/toStoredSchema.ts +4 -2
  413. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +83 -40
  414. package/src/tableSchema.ts +27 -8
  415. package/src/util/brandedMap.ts +0 -2
@@ -0,0 +1,410 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { Lazy } from "@fluidframework/core-utils/internal";
7
+ import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
+
9
+ import { type JsonCompatibleReadOnlyObject, brand } from "../../../util/index.js";
10
+
11
+ import {
12
+ type TreeNodeSchema,
13
+ NodeKind,
14
+ // eslint-disable-next-line import/no-deprecated
15
+ typeNameSymbol,
16
+ typeSchemaSymbol,
17
+ type Context,
18
+ type UnhydratedFlexTreeNode,
19
+ getOrCreateInnerNode,
20
+ getKernel,
21
+ type InternalTreeNode,
22
+ type NormalizedAnnotatedAllowedTypes,
23
+ } from "../../core/index.js";
24
+ import { getUnhydratedContext } from "../../createContext.js";
25
+ import { tryGetTreeNodeForField } from "../../getTreeNodeForField.js";
26
+ import {
27
+ type NodeSchemaMetadata,
28
+ type TreeNodeFromImplicitAllowedTypes,
29
+ type ImplicitAllowedTypes,
30
+ normalizeAllowedTypes,
31
+ unannotateImplicitAllowedTypes,
32
+ type ImplicitAnnotatedAllowedTypes,
33
+ type UnannotateImplicitAllowedTypes,
34
+ createFieldSchema,
35
+ FieldKind,
36
+ normalizeAnnotatedAllowedTypes,
37
+ } from "../../schemaTypes.js";
38
+ import {
39
+ unhydratedFlexTreeFromInsertable,
40
+ type InsertableContent,
41
+ } from "../../unhydratedFlexTreeFromInsertable.js";
42
+ import { TreeNodeValid, type MostDerivedData } from "../../treeNodeValid.js";
43
+ import type {
44
+ RecordNodeCustomizableSchema,
45
+ RecordNodeInsertableData,
46
+ RecordNodePojoEmulationSchema,
47
+ RecordNodeSchema,
48
+ TreeRecordNode,
49
+ } from "./recordNodeTypes.js";
50
+ import type { FlexTreeNode, FlexTreeOptionalField } from "../../../feature-libraries/index.js";
51
+ import { prepareForInsertion } from "../../prepareForInsertion.js";
52
+
53
+ /**
54
+ * Create a proxy which implements the {@link TreeRecordNode} API.
55
+ * @param proxyTarget - Target object of the proxy.
56
+ * @param customizable - See {@link RecordNodeSchemaOptions.customizable}.
57
+ * @param schema - The schema of the record node.
58
+ */
59
+ function createRecordNodeProxy(
60
+ proxyTarget: object,
61
+ customizable: boolean,
62
+ schema: RecordNodeSchema,
63
+ ): TreeRecordNode {
64
+ const proxy: TreeRecordNode = new Proxy<TreeRecordNode>(proxyTarget as TreeRecordNode, {
65
+ get: (target, key, receiver): unknown => {
66
+ if (typeof key === "symbol") {
67
+ switch (key) {
68
+ // POJO mode records don't have TreeNode's build in members on their targets, so special case them:
69
+ case typeSchemaSymbol: {
70
+ return schema;
71
+ }
72
+ // eslint-disable-next-line import/no-deprecated
73
+ case typeNameSymbol: {
74
+ return schema.identifier;
75
+ }
76
+ case Symbol.iterator: {
77
+ return () => recordIterator(proxy);
78
+ }
79
+ case Symbol.toPrimitive: {
80
+ // Handle string interpolation and coercion to string
81
+ return () => Object.prototype.toString.call(proxy);
82
+ }
83
+ case Symbol.toStringTag: {
84
+ // In order to satisfy deep equality checks in POJO (non-customizable) mode,
85
+ // we cannot override the behavior of this.
86
+ if (customizable) {
87
+ // Generates nicer toString behavior for customizable records.
88
+ // E.g. `[object My.Record]` instead of `[object Object]`.
89
+ return schema.identifier;
90
+ }
91
+ break;
92
+ }
93
+ default: {
94
+ // No-op
95
+ }
96
+ }
97
+ }
98
+
99
+ if (typeof key === "string") {
100
+ const innerNode = getOrCreateInnerNode(receiver);
101
+ const field = innerNode.tryGetField(brand(key));
102
+ if (field !== undefined) {
103
+ return tryGetTreeNodeForField(field);
104
+ }
105
+ }
106
+
107
+ return undefined;
108
+ },
109
+ set: (target, key, value: InsertableContent | undefined, receiver): boolean => {
110
+ if (typeof key === "symbol") {
111
+ return false;
112
+ }
113
+
114
+ const innerNode = getOrCreateInnerNode(receiver);
115
+ const field = innerNode.getBoxed(brand(key)) as FlexTreeOptionalField;
116
+ const kernel = getKernel(receiver);
117
+
118
+ const mapTree = prepareForInsertion(
119
+ value,
120
+ createFieldSchema(FieldKind.Optional, kernel.schema.info as ImplicitAllowedTypes),
121
+ innerNode.context,
122
+ );
123
+
124
+ field.editor.set(mapTree, field.length === 0);
125
+ return true;
126
+ },
127
+ has: (target, key): boolean => {
128
+ if (typeof key === "symbol") {
129
+ return false;
130
+ }
131
+
132
+ const innerNode = getOrCreateInnerNode(proxy);
133
+ const childField = innerNode.tryGetField(brand(key));
134
+
135
+ return childField !== undefined;
136
+ },
137
+ ownKeys: (target) => {
138
+ const innerNode = getOrCreateInnerNode(proxy);
139
+ return [...innerNode.keys()];
140
+ },
141
+ getOwnPropertyDescriptor: (target, key) => {
142
+ if (typeof key === "symbol") {
143
+ return undefined;
144
+ }
145
+
146
+ const innerNode = getOrCreateInnerNode(proxy);
147
+ const field = innerNode.tryGetField(brand(key));
148
+
149
+ if (field === undefined) {
150
+ return undefined;
151
+ }
152
+
153
+ return {
154
+ value: tryGetTreeNodeForField(field),
155
+ writable: true,
156
+ enumerable: true,
157
+ configurable: true, // Must be 'configurable' if property is absent from proxy target.
158
+ };
159
+ },
160
+ defineProperty(target, key, attributes) {
161
+ throw new UsageError("Shadowing properties of record nodes is not permitted.");
162
+ },
163
+ deleteProperty(target, key) {
164
+ if (typeof key === "symbol") {
165
+ return false;
166
+ }
167
+
168
+ const innerNode = getOrCreateInnerNode(proxy);
169
+ const field = innerNode.tryGetField(brand(key)) as FlexTreeOptionalField | undefined;
170
+ if (field === undefined) {
171
+ return false;
172
+ }
173
+
174
+ field.editor.set(undefined, field.length === 0);
175
+ return true;
176
+ },
177
+ });
178
+ return proxy;
179
+ }
180
+
181
+ abstract class CustomRecordNodeBase<
182
+ const TAllowedTypes extends ImplicitAllowedTypes,
183
+ > extends TreeNodeValid<RecordNodeInsertableData<TAllowedTypes>> {
184
+ public static readonly kind = NodeKind.Record;
185
+
186
+ public constructor(
187
+ input?: InternalTreeNode | RecordNodeInsertableData<TAllowedTypes> | undefined,
188
+ ) {
189
+ super(input ?? {});
190
+ }
191
+ }
192
+
193
+ /**
194
+ * {@link recordSchema} options.
195
+ * @input
196
+ */
197
+ export interface RecordSchemaOptions<
198
+ TName extends string,
199
+ TAllowedTypes extends ImplicitAnnotatedAllowedTypes,
200
+ TImplicitlyConstructable extends boolean,
201
+ TCustomMetadata = unknown,
202
+ > {
203
+ /**
204
+ * Unique identifier for this schema within this factory's scope.
205
+ */
206
+ readonly identifier: TName;
207
+
208
+ readonly customizable: boolean;
209
+
210
+ /**
211
+ * The kinds of nodes that are allowed as children of this record.
212
+ */
213
+ readonly info: TAllowedTypes;
214
+
215
+ readonly implicitlyConstructable: TImplicitlyConstructable;
216
+
217
+ /**
218
+ * Optional ephemeral metadata for the object node schema.
219
+ */
220
+ readonly metadata?: NodeSchemaMetadata<TCustomMetadata>;
221
+
222
+ /**
223
+ * Optional persisted metadata for the object node schema.
224
+ */
225
+ readonly persistedMetadata?: JsonCompatibleReadOnlyObject | undefined;
226
+ }
227
+
228
+ /**
229
+ * Define a {@link TreeNodeSchema} for a {@link TreeRecordNode}.
230
+ *
231
+ * @param fields - Schema for fields of the object node's schema. Defines what children can be placed under each key.
232
+ * @param persistedMetadata -
233
+ */
234
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
235
+ export function recordSchema<
236
+ TName extends string,
237
+ const TAllowedTypes extends ImplicitAnnotatedAllowedTypes,
238
+ const TImplicitlyConstructable extends boolean,
239
+ const TCustomMetadata = unknown,
240
+ >(
241
+ options: RecordSchemaOptions<
242
+ TName,
243
+ TAllowedTypes,
244
+ TImplicitlyConstructable,
245
+ TCustomMetadata
246
+ >,
247
+ ) {
248
+ type TUnannotatedAllowedTypes = UnannotateImplicitAllowedTypes<TAllowedTypes>;
249
+
250
+ const {
251
+ identifier,
252
+ info,
253
+ customizable,
254
+ implicitlyConstructable,
255
+ metadata,
256
+ persistedMetadata,
257
+ } = options;
258
+
259
+ const lazyChildTypes = new Lazy(() =>
260
+ normalizeAllowedTypes(unannotateImplicitAllowedTypes(info)),
261
+ );
262
+ const lazyAnnotatedTypes = new Lazy(() => [normalizeAnnotatedAllowedTypes(info)]);
263
+ const lazyAllowedTypesIdentifiers = new Lazy(
264
+ () => new Set([...lazyChildTypes.value].map((type) => type.identifier)),
265
+ );
266
+
267
+ let unhydratedContext: Context;
268
+
269
+ class Schema
270
+ extends CustomRecordNodeBase<TUnannotatedAllowedTypes>
271
+ implements TreeRecordNode<TUnannotatedAllowedTypes>
272
+ {
273
+ /**
274
+ * Record-like index signature for the node.
275
+ */
276
+ [key: string]: TreeNodeFromImplicitAllowedTypes<TUnannotatedAllowedTypes>;
277
+
278
+ public static override prepareInstance<T2>(
279
+ this: typeof TreeNodeValid<T2>,
280
+ instance: TreeNodeValid<T2>,
281
+ flexNode: FlexTreeNode,
282
+ ): TreeNodeValid<T2> {
283
+ // Differentiate between the following cases:
284
+ //
285
+ // Case 1: Direct construction (POJO emulation)
286
+ //
287
+ // const Foo = schemaFactory.record("Foo", schemaFactory.number);
288
+ //
289
+ // assert.deepEqual(new Foo({ bar: 42 }), { bar: 42 },
290
+ // "Prototype chain equivalent to POJO.");
291
+ //
292
+ // Case 2: Subclass construction (Customizable Record)
293
+ //
294
+ // class Foo extends schemaFactory.record("Foo", schemaFactory.number) {}
295
+ //
296
+ // assert.notDeepEqual(new Foo({ bar: 42 }), { bar: 42 },
297
+ // "Subclass prototype chain differs from POJO.");
298
+ //
299
+ // In Case 1 (POJO emulation), the prototype chain match '{}' (proxyTarget = undefined)
300
+ // In Case 2 (Customizable Object), the prototype chain include the user's subclass (proxyTarget = this)
301
+ const proxyTarget = customizable ? instance : {};
302
+ return createRecordNodeProxy(
303
+ proxyTarget,
304
+ customizable,
305
+ this as unknown as RecordNodeSchema,
306
+ ) as unknown as Schema;
307
+ }
308
+
309
+ public static override buildRawNode<T2>(
310
+ this: typeof TreeNodeValid<T2>,
311
+ instance: TreeNodeValid<T2>,
312
+ input: T2,
313
+ ): UnhydratedFlexTreeNode {
314
+ return unhydratedFlexTreeFromInsertable(input as object, this as typeof Schema);
315
+ }
316
+
317
+ protected static override oneTimeSetup<T2>(this: typeof TreeNodeValid<T2>): Context {
318
+ const schema = this as unknown as RecordNodeSchema;
319
+ unhydratedContext = getUnhydratedContext(schema);
320
+
321
+ // First run, do extra validation.
322
+ // TODO: provide a way for TreeConfiguration to trigger this same validation to ensure it gets run early.
323
+ // Scan for shadowing inherited members which won't work, but stop scan early to allow shadowing built in (which seems to work ok).
324
+ {
325
+ let prototype: object = this.prototype;
326
+ // There isn't a clear cleaner way to author this loop.
327
+ while (prototype !== Schema.prototype) {
328
+ for (const key of Object.getOwnPropertyNames(prototype)) {
329
+ if (
330
+ // constructor is a special case, since one is built in on the derived type, and shadowing it works fine since we only use it before fields are applied.
331
+ key !== "constructor" &&
332
+ Reflect.getOwnPropertyDescriptor(prototype, key) !== undefined
333
+ ) {
334
+ throw new UsageError(
335
+ `Schema ${identifier} defines an inherited property "${key.toString()}" which could shadow a legal entry. Since child fields are exposed as own properties, shadowing properties of record nodes is not permitted.`,
336
+ );
337
+ }
338
+ }
339
+ // Since this stops at CustomRecordNode, it should never see a null prototype, so this case is safe.
340
+ // Additionally, if the prototype chain is ever messed up such that CustomRecordNode is not in it,
341
+ // the null that would show up here does at least ensure this code throws instead of hanging.
342
+ prototype = Reflect.getPrototypeOf(prototype) as object;
343
+ }
344
+ }
345
+
346
+ return unhydratedContext;
347
+ }
348
+
349
+ public static get allowedTypesIdentifiers(): ReadonlySet<string> {
350
+ return lazyAllowedTypesIdentifiers.value;
351
+ }
352
+
353
+ protected static override constructorCached: MostDerivedData | undefined = undefined;
354
+
355
+ public static readonly identifier = identifier;
356
+ public static readonly info = info;
357
+ public static readonly implicitlyConstructable: TImplicitlyConstructable =
358
+ implicitlyConstructable;
359
+ public static get childTypes(): ReadonlySet<TreeNodeSchema> {
360
+ return lazyChildTypes.value;
361
+ }
362
+ public static get childAnnotatedAllowedTypes(): readonly NormalizedAnnotatedAllowedTypes[] {
363
+ return lazyAnnotatedTypes.value;
364
+ }
365
+ public static readonly metadata: NodeSchemaMetadata<TCustomMetadata> = metadata ?? {};
366
+ public static readonly persistedMetadata: JsonCompatibleReadOnlyObject | undefined =
367
+ persistedMetadata;
368
+
369
+ // eslint-disable-next-line import/no-deprecated
370
+ public get [typeNameSymbol](): TName {
371
+ return identifier;
372
+ }
373
+ public get [typeSchemaSymbol](): Output {
374
+ return Schema.constructorCached?.constructor as unknown as Output;
375
+ }
376
+
377
+ public [Symbol.iterator](): IterableIterator<
378
+ [string, TreeNodeFromImplicitAllowedTypes<TUnannotatedAllowedTypes>]
379
+ > {
380
+ return recordIterator(this);
381
+ }
382
+ public get [Symbol.toStringTag](): string {
383
+ return identifier;
384
+ }
385
+ }
386
+
387
+ type Output = RecordNodeCustomizableSchema<
388
+ TName,
389
+ TAllowedTypes,
390
+ TImplicitlyConstructable,
391
+ TCustomMetadata
392
+ > &
393
+ RecordNodePojoEmulationSchema<
394
+ TName,
395
+ TAllowedTypes,
396
+ TImplicitlyConstructable,
397
+ TCustomMetadata
398
+ >;
399
+
400
+ const output: Output = Schema;
401
+ return output;
402
+ }
403
+
404
+ function* recordIterator<TAllowedTypes extends ImplicitAllowedTypes>(
405
+ record: TreeRecordNode<TAllowedTypes>,
406
+ ): IterableIterator<[string, TreeNodeFromImplicitAllowedTypes<TAllowedTypes>]> {
407
+ for (const [key, value] of Object.entries(record)) {
408
+ yield [key, value];
409
+ }
410
+ }
@@ -0,0 +1,136 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type {
7
+ ImplicitAllowedTypes,
8
+ ImplicitAnnotatedAllowedTypes,
9
+ InsertableTreeNodeFromImplicitAllowedTypes,
10
+ TreeNodeFromImplicitAllowedTypes,
11
+ UnannotateImplicitAllowedTypes,
12
+ } from "../../schemaTypes.js";
13
+ import {
14
+ NodeKind,
15
+ type TreeNodeSchemaClass,
16
+ type TreeNodeSchema,
17
+ type TreeNodeSchemaNonClass,
18
+ type WithType,
19
+ type TreeNode,
20
+ } from "../../core/index.js";
21
+
22
+ import type { SimpleRecordNodeSchema } from "../../simpleSchema.js";
23
+ import type { RestrictiveStringRecord } from "../../../util/index.js";
24
+
25
+ /**
26
+ * A {@link TreeNode} which models a TypeScript {@link https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type | record}.
27
+ *
28
+ * @remarks
29
+ * Due to {@link https://github.com/microsoft/TypeScript/issues/43826}, we can't enable implicit construction of {@link TreeNode|TreeNodes} for setters.
30
+ * Therefore code assigning to these fields must explicitly construct nodes using the schema's constructor or create method,
31
+ * or using some other method like {@link (TreeAlpha:interface).create}.
32
+ *
33
+ * @alpha
34
+ */
35
+ export interface TreeRecordNode<
36
+ TAllowedTypes extends ImplicitAllowedTypes = ImplicitAllowedTypes,
37
+ > extends TreeNode,
38
+ Record<string, TreeNodeFromImplicitAllowedTypes<TAllowedTypes>> {
39
+ /**
40
+ * Allows the record's entries to be iterated over, including in contexts like `for...of` loops.
41
+ */
42
+ [Symbol.iterator](): IterableIterator<
43
+ [string, TreeNodeFromImplicitAllowedTypes<TAllowedTypes>]
44
+ >;
45
+ }
46
+
47
+ /**
48
+ * Content which can be used to construct a Record node, explicitly or implicitly.
49
+ * @system @alpha
50
+ */
51
+ export type RecordNodeInsertableData<T extends ImplicitAllowedTypes> = RestrictiveStringRecord<
52
+ InsertableTreeNodeFromImplicitAllowedTypes<T>
53
+ >;
54
+
55
+ /**
56
+ * A schema for customizable {@link (TreeMapNode:interface)}s.
57
+ * @system @sealed @alpha
58
+ */
59
+ export interface RecordNodeCustomizableSchema<
60
+ out TName extends string = string,
61
+ in out T extends ImplicitAnnotatedAllowedTypes = ImplicitAnnotatedAllowedTypes,
62
+ out ImplicitlyConstructable extends boolean = true,
63
+ out TCustomMetadata = unknown,
64
+ > extends TreeNodeSchemaClass<
65
+ /* Name */ TName,
66
+ /* Kind */ NodeKind.Record,
67
+ /* TNode */ TreeRecordNode<UnannotateImplicitAllowedTypes<T>> &
68
+ WithType<TName, NodeKind.Record, T>,
69
+ /* TInsertable */ RecordNodeInsertableData<UnannotateImplicitAllowedTypes<T>>,
70
+ /* ImplicitlyConstructable */ ImplicitlyConstructable,
71
+ /* Info */ T,
72
+ /* TConstructorExtra */ never,
73
+ /* TCustomMetadata */ TCustomMetadata
74
+ >,
75
+ SimpleRecordNodeSchema<TCustomMetadata> {}
76
+
77
+ /**
78
+ * A schema for POJO emulation mode {@link (TreeMapNode:interface)}s.
79
+ * @system @sealed @alpha
80
+ */
81
+ export interface RecordNodePojoEmulationSchema<
82
+ out TName extends string = string,
83
+ in out T extends ImplicitAnnotatedAllowedTypes = ImplicitAnnotatedAllowedTypes,
84
+ out ImplicitlyConstructable extends boolean = true,
85
+ out TCustomMetadata = unknown,
86
+ > extends TreeNodeSchemaNonClass<
87
+ /* Name */ TName,
88
+ /* Kind */ NodeKind.Record,
89
+ /* TNode */ TreeRecordNode<UnannotateImplicitAllowedTypes<T>> &
90
+ WithType<TName, NodeKind.Record, T>,
91
+ /* TInsertable */ RecordNodeInsertableData<UnannotateImplicitAllowedTypes<T>>,
92
+ /* ImplicitlyConstructable */ ImplicitlyConstructable,
93
+ /* Info */ T,
94
+ /* TConstructorExtra */ never,
95
+ /* TCustomMetadata */ TCustomMetadata
96
+ >,
97
+ SimpleRecordNodeSchema<TCustomMetadata> {}
98
+
99
+ /**
100
+ * A schema for {@link (TreeRecordNode:interface)}s.
101
+ * @privateRemarks
102
+ * This could have generic arguments added and forwarded.
103
+ * The expected use-cases for this don't need them however, and if they did want an argument it would probably be the allowed types;
104
+ * perhaps if moving to an order independent way to pass generic arguments, adding support for them here would make sense.
105
+ * @alpha
106
+ */
107
+ export type RecordNodeSchema<
108
+ TName extends string = string,
109
+ T extends ImplicitAnnotatedAllowedTypes = ImplicitAnnotatedAllowedTypes,
110
+ ImplicitlyConstructable extends boolean = true,
111
+ TCustomMetadata = unknown,
112
+ > =
113
+ | RecordNodeCustomizableSchema<TName, T, ImplicitlyConstructable, TCustomMetadata>
114
+ | RecordNodePojoEmulationSchema<TName, T, ImplicitlyConstructable, TCustomMetadata>;
115
+
116
+ /**
117
+ * @alpha
118
+ */
119
+ export const RecordNodeSchema = {
120
+ /**
121
+ * `instanceof`-based narrowing support for {@link (RecordNodeSchema:type)} in JavaScript and TypeScript 5.3 or newer.
122
+ */
123
+ [Symbol.hasInstance](value: TreeNodeSchema): value is RecordNodeSchema {
124
+ return isRecordNodeSchema(value);
125
+ },
126
+ } as const;
127
+
128
+ /**
129
+ * Narrows a {@link (TreeNodeSchema:interface)} to an {@link (RecordNodeSchema:interface)}.
130
+ * @privateRemarks
131
+ * If at some point we want to have internal only APIs for RecordNodeSchema (like done for objects),
132
+ * this can include those since its not the public-facing API.
133
+ */
134
+ export function isRecordNodeSchema(schema: TreeNodeSchema): schema is RecordNodeSchema {
135
+ return schema.kind === NodeKind.Record;
136
+ }
@@ -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.
@@ -119,7 +119,8 @@ export function getStoredSchema(schema: SimpleNodeSchema): TreeNodeStoredSchema
119
119
  assert(schema instanceof LeafNodeSchema, 0xa4a /* invalid kind */);
120
120
  return new LeafNodeStoredSchema(schema.leafKind);
121
121
  }
122
- case NodeKind.Map: {
122
+ case NodeKind.Map:
123
+ case NodeKind.Record: {
123
124
  const types = schema.allowedTypesIdentifiers as TreeTypeSet;
124
125
  return new MapNodeStoredSchema(
125
126
  {
@@ -148,7 +149,8 @@ export function getStoredSchema(schema: SimpleNodeSchema): TreeNodeStoredSchema
148
149
  }
149
150
  return new ObjectNodeStoredSchema(fields, schema.persistedMetadata);
150
151
  }
151
- default:
152
+ default: {
152
153
  unreachableCase(kind);
154
+ }
153
155
  }
154
156
  }