@fluidframework/tree 2.63.0-359461 → 2.63.0-359734

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 (377) hide show
  1. package/.mocharc.cjs +9 -1
  2. package/api-report/tree.alpha.api.md +93 -98
  3. package/api-report/tree.beta.api.md +37 -2
  4. package/api-report/tree.legacy.beta.api.md +37 -2
  5. package/api-report/tree.legacy.public.api.md +9 -2
  6. package/api-report/tree.public.api.md +9 -2
  7. package/dist/alpha.d.ts +11 -13
  8. package/dist/beta.d.ts +5 -0
  9. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  10. package/dist/feature-libraries/treeCursorUtils.js +17 -15
  11. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/jsonDomainSchema.d.ts +5 -5
  16. package/dist/jsonDomainSchema.js +5 -5
  17. package/dist/jsonDomainSchema.js.map +1 -1
  18. package/dist/legacy.d.ts +5 -0
  19. package/dist/packageVersion.d.ts +1 -1
  20. package/dist/packageVersion.js +1 -1
  21. package/dist/packageVersion.js.map +1 -1
  22. package/dist/public.d.ts +1 -0
  23. package/dist/serializableDomainSchema.d.ts +6 -6
  24. package/dist/serializableDomainSchema.js +5 -5
  25. package/dist/serializableDomainSchema.js.map +1 -1
  26. package/dist/shared-tree/schematizingTreeView.js +1 -1
  27. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  28. package/dist/shared-tree/treeAlpha.d.ts +20 -28
  29. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  30. package/dist/shared-tree/treeAlpha.js +4 -29
  31. package/dist/shared-tree/treeAlpha.js.map +1 -1
  32. package/dist/simple-tree/api/conciseTree.d.ts +1 -1
  33. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  34. package/dist/simple-tree/api/configuration.d.ts +0 -3
  35. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  36. package/dist/simple-tree/api/configuration.js +1 -4
  37. package/dist/simple-tree/api/configuration.js.map +1 -1
  38. package/dist/simple-tree/api/customTree.d.ts +7 -7
  39. package/dist/simple-tree/api/customTree.js +5 -5
  40. package/dist/simple-tree/api/customTree.js.map +1 -1
  41. package/dist/simple-tree/api/discrepancies.js +2 -2
  42. package/dist/simple-tree/api/discrepancies.js.map +1 -1
  43. package/dist/simple-tree/api/index.d.ts +2 -2
  44. package/dist/simple-tree/api/index.d.ts.map +1 -1
  45. package/dist/simple-tree/api/index.js +4 -1
  46. package/dist/simple-tree/api/index.js.map +1 -1
  47. package/dist/simple-tree/api/schemaFactory.d.ts +12 -4
  48. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  49. package/dist/simple-tree/api/schemaFactory.js +3 -8
  50. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  51. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +27 -26
  52. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  53. package/dist/simple-tree/api/schemaFactoryAlpha.js +11 -0
  54. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  55. package/dist/simple-tree/api/schemaFactoryBeta.d.ts +13 -2
  56. package/dist/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  57. package/dist/simple-tree/api/schemaFactoryBeta.js +14 -0
  58. package/dist/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  59. package/dist/simple-tree/api/schemaStatics.d.ts +9 -14
  60. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -1
  61. package/dist/simple-tree/api/schemaStatics.js +9 -12
  62. package/dist/simple-tree/api/schemaStatics.js.map +1 -1
  63. package/dist/simple-tree/api/storedSchema.d.ts +2 -2
  64. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  65. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  66. package/dist/simple-tree/api/tree.d.ts +3 -3
  67. package/dist/simple-tree/api/tree.js.map +1 -1
  68. package/dist/simple-tree/api/treeBeta.d.ts +52 -2
  69. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  70. package/dist/simple-tree/api/treeBeta.js +36 -1
  71. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  72. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  73. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  74. package/dist/simple-tree/core/allowedTypes.d.ts +120 -62
  75. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  76. package/dist/simple-tree/core/allowedTypes.js +162 -84
  77. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  78. package/dist/simple-tree/core/context.d.ts +2 -2
  79. package/dist/simple-tree/core/context.d.ts.map +1 -1
  80. package/dist/simple-tree/core/context.js.map +1 -1
  81. package/dist/simple-tree/core/index.d.ts +2 -2
  82. package/dist/simple-tree/core/index.d.ts.map +1 -1
  83. package/dist/simple-tree/core/index.js +4 -3
  84. package/dist/simple-tree/core/index.js.map +1 -1
  85. package/dist/simple-tree/core/toStored.d.ts +3 -3
  86. package/dist/simple-tree/core/toStored.d.ts.map +1 -1
  87. package/dist/simple-tree/core/toStored.js +2 -2
  88. package/dist/simple-tree/core/toStored.js.map +1 -1
  89. package/dist/simple-tree/core/treeNode.d.ts +1 -1
  90. package/dist/simple-tree/core/treeNode.js +1 -1
  91. package/dist/simple-tree/core/treeNode.js.map +1 -1
  92. package/dist/simple-tree/core/treeNodeSchema.d.ts +3 -3
  93. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  94. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  95. package/dist/simple-tree/core/treeNodeValid.d.ts +2 -2
  96. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  97. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  98. package/dist/simple-tree/core/walkSchema.d.ts +3 -3
  99. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  100. package/dist/simple-tree/core/walkSchema.js +1 -1
  101. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  102. package/dist/simple-tree/createContext.js +2 -2
  103. package/dist/simple-tree/createContext.js.map +1 -1
  104. package/dist/simple-tree/fieldSchema.d.ts +9 -32
  105. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  106. package/dist/simple-tree/fieldSchema.js +12 -20
  107. package/dist/simple-tree/fieldSchema.js.map +1 -1
  108. package/dist/simple-tree/index.d.ts +4 -4
  109. package/dist/simple-tree/index.d.ts.map +1 -1
  110. package/dist/simple-tree/index.js +6 -2
  111. package/dist/simple-tree/index.js.map +1 -1
  112. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +2 -2
  113. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  114. package/dist/simple-tree/node-kinds/array/arrayNode.js +5 -6
  115. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  116. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
  117. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
  118. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
  119. package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
  120. package/dist/simple-tree/node-kinds/common.js +2 -2
  121. package/dist/simple-tree/node-kinds/common.js.map +1 -1
  122. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  123. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  124. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  125. package/dist/simple-tree/node-kinds/map/mapNode.d.ts +2 -2
  126. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  127. package/dist/simple-tree/node-kinds/map/mapNode.js +3 -3
  128. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  129. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
  130. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  131. package/dist/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  132. package/dist/simple-tree/node-kinds/object/index.d.ts +2 -2
  133. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  134. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  135. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +5 -18
  136. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  137. package/dist/simple-tree/node-kinds/object/objectNode.js +5 -15
  138. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  139. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +4 -11
  140. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  141. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  142. package/dist/simple-tree/node-kinds/record/recordNode.d.ts +3 -3
  143. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  144. package/dist/simple-tree/node-kinds/record/recordNode.js +3 -3
  145. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  146. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +5 -5
  147. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
  148. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
  149. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  150. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  151. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  152. package/dist/simple-tree/toStoredSchema.d.ts +8 -8
  153. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  154. package/dist/simple-tree/toStoredSchema.js +5 -5
  155. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  156. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  157. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  158. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  159. package/dist/simple-tree/unsafeUnknownSchema.d.ts.map +1 -1
  160. package/dist/simple-tree/unsafeUnknownSchema.js.map +1 -1
  161. package/dist/simple-tree/walkFieldSchema.js +1 -1
  162. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  163. package/dist/tableSchema.d.ts +19 -19
  164. package/dist/tableSchema.d.ts.map +1 -1
  165. package/dist/tableSchema.js +2 -2
  166. package/dist/tableSchema.js.map +1 -1
  167. package/lib/alpha.d.ts +11 -13
  168. package/lib/beta.d.ts +5 -0
  169. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  170. package/lib/feature-libraries/treeCursorUtils.js +17 -15
  171. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  172. package/lib/index.d.ts +1 -1
  173. package/lib/index.d.ts.map +1 -1
  174. package/lib/index.js.map +1 -1
  175. package/lib/jsonDomainSchema.d.ts +5 -5
  176. package/lib/jsonDomainSchema.js +5 -5
  177. package/lib/jsonDomainSchema.js.map +1 -1
  178. package/lib/legacy.d.ts +5 -0
  179. package/lib/packageVersion.d.ts +1 -1
  180. package/lib/packageVersion.js +1 -1
  181. package/lib/packageVersion.js.map +1 -1
  182. package/lib/public.d.ts +1 -0
  183. package/lib/serializableDomainSchema.d.ts +6 -6
  184. package/lib/serializableDomainSchema.js +5 -5
  185. package/lib/serializableDomainSchema.js.map +1 -1
  186. package/lib/shared-tree/schematizingTreeView.js +1 -1
  187. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  188. package/lib/shared-tree/treeAlpha.d.ts +20 -28
  189. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  190. package/lib/shared-tree/treeAlpha.js +3 -28
  191. package/lib/shared-tree/treeAlpha.js.map +1 -1
  192. package/lib/simple-tree/api/conciseTree.d.ts +1 -1
  193. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  194. package/lib/simple-tree/api/configuration.d.ts +0 -3
  195. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  196. package/lib/simple-tree/api/configuration.js +2 -5
  197. package/lib/simple-tree/api/configuration.js.map +1 -1
  198. package/lib/simple-tree/api/customTree.d.ts +7 -7
  199. package/lib/simple-tree/api/customTree.js +5 -5
  200. package/lib/simple-tree/api/customTree.js.map +1 -1
  201. package/lib/simple-tree/api/discrepancies.js +3 -3
  202. package/lib/simple-tree/api/discrepancies.js.map +1 -1
  203. package/lib/simple-tree/api/index.d.ts +2 -2
  204. package/lib/simple-tree/api/index.d.ts.map +1 -1
  205. package/lib/simple-tree/api/index.js +1 -1
  206. package/lib/simple-tree/api/index.js.map +1 -1
  207. package/lib/simple-tree/api/schemaFactory.d.ts +12 -4
  208. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  209. package/lib/simple-tree/api/schemaFactory.js +3 -8
  210. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  211. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +27 -26
  212. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  213. package/lib/simple-tree/api/schemaFactoryAlpha.js +12 -1
  214. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  215. package/lib/simple-tree/api/schemaFactoryBeta.d.ts +13 -2
  216. package/lib/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  217. package/lib/simple-tree/api/schemaFactoryBeta.js +16 -2
  218. package/lib/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  219. package/lib/simple-tree/api/schemaStatics.d.ts +9 -14
  220. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -1
  221. package/lib/simple-tree/api/schemaStatics.js +9 -12
  222. package/lib/simple-tree/api/schemaStatics.js.map +1 -1
  223. package/lib/simple-tree/api/storedSchema.d.ts +2 -2
  224. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  225. package/lib/simple-tree/api/storedSchema.js +1 -1
  226. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  227. package/lib/simple-tree/api/tree.d.ts +3 -3
  228. package/lib/simple-tree/api/tree.js.map +1 -1
  229. package/lib/simple-tree/api/treeBeta.d.ts +52 -2
  230. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  231. package/lib/simple-tree/api/treeBeta.js +33 -1
  232. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  233. package/lib/simple-tree/api/treeNodeApi.js +1 -1
  234. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  235. package/lib/simple-tree/core/allowedTypes.d.ts +120 -62
  236. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  237. package/lib/simple-tree/core/allowedTypes.js +158 -80
  238. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  239. package/lib/simple-tree/core/context.d.ts +2 -2
  240. package/lib/simple-tree/core/context.d.ts.map +1 -1
  241. package/lib/simple-tree/core/context.js.map +1 -1
  242. package/lib/simple-tree/core/index.d.ts +2 -2
  243. package/lib/simple-tree/core/index.d.ts.map +1 -1
  244. package/lib/simple-tree/core/index.js +1 -1
  245. package/lib/simple-tree/core/index.js.map +1 -1
  246. package/lib/simple-tree/core/toStored.d.ts +3 -3
  247. package/lib/simple-tree/core/toStored.d.ts.map +1 -1
  248. package/lib/simple-tree/core/toStored.js +3 -3
  249. package/lib/simple-tree/core/toStored.js.map +1 -1
  250. package/lib/simple-tree/core/treeNode.d.ts +1 -1
  251. package/lib/simple-tree/core/treeNode.js +1 -1
  252. package/lib/simple-tree/core/treeNode.js.map +1 -1
  253. package/lib/simple-tree/core/treeNodeSchema.d.ts +3 -3
  254. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  255. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  256. package/lib/simple-tree/core/treeNodeValid.d.ts +2 -2
  257. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  258. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  259. package/lib/simple-tree/core/walkSchema.d.ts +3 -3
  260. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  261. package/lib/simple-tree/core/walkSchema.js +2 -2
  262. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  263. package/lib/simple-tree/createContext.js +3 -3
  264. package/lib/simple-tree/createContext.js.map +1 -1
  265. package/lib/simple-tree/fieldSchema.d.ts +9 -32
  266. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  267. package/lib/simple-tree/fieldSchema.js +13 -21
  268. package/lib/simple-tree/fieldSchema.js.map +1 -1
  269. package/lib/simple-tree/index.d.ts +4 -4
  270. package/lib/simple-tree/index.d.ts.map +1 -1
  271. package/lib/simple-tree/index.js +2 -2
  272. package/lib/simple-tree/index.js.map +1 -1
  273. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +2 -2
  274. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  275. package/lib/simple-tree/node-kinds/array/arrayNode.js +6 -7
  276. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  277. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
  278. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
  279. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
  280. package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
  281. package/lib/simple-tree/node-kinds/common.js +3 -3
  282. package/lib/simple-tree/node-kinds/common.js.map +1 -1
  283. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  284. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  285. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  286. package/lib/simple-tree/node-kinds/map/mapNode.d.ts +2 -2
  287. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  288. package/lib/simple-tree/node-kinds/map/mapNode.js +4 -4
  289. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  290. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
  291. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  292. package/lib/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  293. package/lib/simple-tree/node-kinds/object/index.d.ts +2 -2
  294. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  295. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  296. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +5 -18
  297. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  298. package/lib/simple-tree/node-kinds/object/objectNode.js +6 -15
  299. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  300. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +4 -11
  301. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  302. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  303. package/lib/simple-tree/node-kinds/record/recordNode.d.ts +3 -3
  304. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  305. package/lib/simple-tree/node-kinds/record/recordNode.js +4 -4
  306. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  307. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +5 -5
  308. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
  309. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
  310. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  311. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  312. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  313. package/lib/simple-tree/toStoredSchema.d.ts +8 -8
  314. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  315. package/lib/simple-tree/toStoredSchema.js +5 -5
  316. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  317. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  318. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  319. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  320. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  321. package/lib/simple-tree/unsafeUnknownSchema.d.ts.map +1 -1
  322. package/lib/simple-tree/unsafeUnknownSchema.js.map +1 -1
  323. package/lib/simple-tree/walkFieldSchema.js +1 -1
  324. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  325. package/lib/tableSchema.d.ts +19 -19
  326. package/lib/tableSchema.d.ts.map +1 -1
  327. package/lib/tableSchema.js +2 -2
  328. package/lib/tableSchema.js.map +1 -1
  329. package/package.json +23 -21
  330. package/src/feature-libraries/treeCursorUtils.ts +34 -19
  331. package/src/index.ts +7 -10
  332. package/src/jsonDomainSchema.ts +5 -5
  333. package/src/packageVersion.ts +1 -1
  334. package/src/serializableDomainSchema.ts +6 -6
  335. package/src/shared-tree/schematizingTreeView.ts +1 -1
  336. package/src/shared-tree/treeAlpha.ts +32 -81
  337. package/src/simple-tree/api/conciseTree.ts +1 -1
  338. package/src/simple-tree/api/configuration.ts +3 -7
  339. package/src/simple-tree/api/customTree.ts +7 -7
  340. package/src/simple-tree/api/discrepancies.ts +3 -3
  341. package/src/simple-tree/api/index.ts +10 -2
  342. package/src/simple-tree/api/schemaFactory.ts +18 -73
  343. package/src/simple-tree/api/schemaFactoryAlpha.ts +45 -12
  344. package/src/simple-tree/api/schemaFactoryBeta.ts +76 -1
  345. package/src/simple-tree/api/schemaStatics.ts +16 -61
  346. package/src/simple-tree/api/storedSchema.ts +2 -6
  347. package/src/simple-tree/api/tree.ts +3 -3
  348. package/src/simple-tree/api/treeBeta.ts +136 -3
  349. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  350. package/src/simple-tree/core/allowedTypes.ts +355 -159
  351. package/src/simple-tree/core/context.ts +2 -2
  352. package/src/simple-tree/core/index.ts +10 -8
  353. package/src/simple-tree/core/toStored.ts +7 -5
  354. package/src/simple-tree/core/treeNode.ts +1 -1
  355. package/src/simple-tree/core/treeNodeSchema.ts +3 -6
  356. package/src/simple-tree/core/treeNodeValid.ts +2 -2
  357. package/src/simple-tree/core/walkSchema.ts +9 -5
  358. package/src/simple-tree/createContext.ts +3 -3
  359. package/src/simple-tree/fieldSchema.ts +24 -98
  360. package/src/simple-tree/index.ts +11 -10
  361. package/src/simple-tree/node-kinds/array/arrayNode.ts +9 -14
  362. package/src/simple-tree/node-kinds/array/arrayNodeTypes.ts +7 -8
  363. package/src/simple-tree/node-kinds/common.ts +5 -3
  364. package/src/simple-tree/node-kinds/index.ts +0 -2
  365. package/src/simple-tree/node-kinds/map/mapNode.ts +5 -13
  366. package/src/simple-tree/node-kinds/map/mapNodeTypes.ts +7 -8
  367. package/src/simple-tree/node-kinds/object/index.ts +0 -2
  368. package/src/simple-tree/node-kinds/object/objectNode.ts +13 -51
  369. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +5 -19
  370. package/src/simple-tree/node-kinds/record/recordNode.ts +9 -16
  371. package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +7 -11
  372. package/src/simple-tree/prepareForInsertion.ts +5 -5
  373. package/src/simple-tree/toStoredSchema.ts +8 -9
  374. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +2 -6
  375. package/src/simple-tree/unsafeUnknownSchema.ts +2 -3
  376. package/src/simple-tree/walkFieldSchema.ts +1 -1
  377. package/src/tableSchema.ts +24 -37
@@ -4,6 +4,12 @@
4
4
  */
5
5
 
6
6
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
7
+ import { assert, Lazy } from "@fluidframework/core-utils/internal";
8
+
9
+ import {
10
+ type ErasedBaseType,
11
+ ErasedTypeImplementation,
12
+ } from "@fluidframework/core-interfaces/internal";
7
13
 
8
14
  import {
9
15
  getOrCreate,
@@ -39,8 +45,10 @@ import { schemaAsTreeNodeValid } from "./treeNodeValid.js";
39
45
  * but some of the items are known to be present unconditionally.
40
46
  * For example, typing `[typeof A] | [typeof A, typeof B]` as `[typeof A, typeof B | typeof A]` is allowed,
41
47
  * and can produce more useful {@link Input} types.
42
- * @privateRemarks
43
- * Code reading data from this should use `normalizeAllowedTypes` to ensure consistent handling, caching, nice errors etc.
48
+ *
49
+ * Due to one implementation of this being {@link AllowedTypesFull}, it is not safe to assume this is an array (as determined by `Array.isArray`).
50
+ *
51
+ * Code reading data from this should use {@link normalizeAllowedTypes} to ensure consistent handling, caching, nice errors etc.
44
52
  * @system @public
45
53
  */
46
54
  export type AllowedTypes = readonly LazyItem<TreeNodeSchema>[];
@@ -49,6 +57,9 @@ export type AllowedTypes = readonly LazyItem<TreeNodeSchema>[];
49
57
  * Stores annotations for an individual allowed type.
50
58
  * @remarks
51
59
  * Create using APIs on {@link SchemaFactoryAlpha}, like {@link SchemaStaticsAlpha.staged}.
60
+ * @privateRemarks
61
+ * Since this is sealed, users are not supposed to create instances of it directly.
62
+ * Making it extend ErasedType could enforce that.
52
63
  * @alpha
53
64
  * @sealed
54
65
  */
@@ -64,24 +75,22 @@ export interface AnnotatedAllowedType<T = LazyItem<TreeNodeSchema>> {
64
75
  }
65
76
 
66
77
  /**
67
- * {@link AnnotatedAllowedTypes} but with the lazy schema references eagerly evaluated.
78
+ * {@link AllowedTypesFull} but with the lazy schema references eagerly evaluated.
68
79
  * @sealed
69
80
  * @alpha
70
81
  */
71
- export interface NormalizedAnnotatedAllowedTypes
72
- extends AnnotatedAllowedTypes<TreeNodeSchema> {}
82
+ export type AllowedTypesFullEvaluated = AllowedTypesFull<
83
+ readonly AnnotatedAllowedType<TreeNodeSchema>[]
84
+ >;
73
85
 
74
86
  /**
75
87
  * Checks if the input is an {@link AnnotatedAllowedTypes}.
76
88
  */
77
89
  export function isAnnotatedAllowedTypes(
78
- allowedTypes: ImplicitAnnotatedAllowedTypes,
79
- ): allowedTypes is AnnotatedAllowedTypes {
90
+ allowedTypes: ImplicitAllowedTypes,
91
+ ): allowedTypes is AllowedTypesFullInternal {
80
92
  checkForUninitializedSchema(allowedTypes);
81
- return (
82
- // Class based schema, and lazy schema references report type "function": filtering them out with typeof makes narrowing based on members mostly safe
83
- typeof allowedTypes === "object" && "metadata" in allowedTypes && "types" in allowedTypes
84
- );
93
+ return allowedTypes instanceof AnnotatedAllowedTypesInternal;
85
94
  }
86
95
 
87
96
  /**
@@ -89,15 +98,274 @@ export function isAnnotatedAllowedTypes(
89
98
  * @alpha
90
99
  * @sealed
91
100
  */
92
- export interface AnnotatedAllowedTypes<T = LazyItem<TreeNodeSchema>> {
101
+ export interface AnnotatedAllowedTypes<T = readonly AnnotatedAllowedType[]>
102
+ extends ErasedBaseType<"tree.AnnotatedAllowedTypes"> {
93
103
  /**
94
104
  * Annotations that apply to a set of allowed types.
95
105
  */
96
106
  readonly metadata: AllowedTypesMetadata;
107
+
97
108
  /**
98
109
  * All the allowed types that the annotations apply to. The types themselves may also have individual annotations.
99
110
  */
100
- readonly types: readonly AnnotatedAllowedType<T>[];
111
+ readonly types: T;
112
+
113
+ /**
114
+ * Get this {@link AnnotatedAllowedTypes} but with any lazy schema references eagerly evaluated.
115
+ * @remarks
116
+ * See {@link evaluateLazySchema} the implications of evaluating lazy schema references.
117
+ */
118
+ evaluate(): AllowedTypesFullEvaluated;
119
+
120
+ /**
121
+ * Get the allowed types as a set with any lazy schema references eagerly evaluated.
122
+ * @remarks
123
+ * See {@link evaluateLazySchema} the implications of evaluating lazy schema references.
124
+ */
125
+ evaluateSet(): ReadonlySet<TreeNodeSchema>;
126
+
127
+ /**
128
+ * Get the allowed types as a set of identifiers with any lazy schema references eagerly evaluated.
129
+ * @remarks
130
+ * See {@link evaluateLazySchema} the implications of evaluating lazy schema references.
131
+ *
132
+ * It is recommend to work in terms of {@link TreeNodeSchema}
133
+ * rather than identifiers where possible since its more type safe and it is possible that two schema with the same identifier exist.
134
+ */
135
+ evaluateIdentifiers(): ReadonlySet<string>;
136
+ }
137
+
138
+ /**
139
+ * Stores annotations for a set of allowed types.
140
+ * @remarks
141
+ * Most expressive form of AllowedTypes which any of the implicit types can be normalized to.
142
+ * @alpha
143
+ * @sealed
144
+ */
145
+ export type AllowedTypesFull<
146
+ T extends readonly AnnotatedAllowedType[] = readonly AnnotatedAllowedType[],
147
+ > = AnnotatedAllowedTypes<T> & UnannotateAllowedTypesList<T>;
148
+
149
+ /**
150
+ * Creates an {@link AllowedTypesFull} type from a mixed array of annotated and unannotated allowed types.
151
+ * @alpha
152
+ * @sealed
153
+ */
154
+ export type AllowedTypesFullFromMixed<
155
+ T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
156
+ > = UnannotateAllowedTypesList<T> & AnnotatedAllowedTypes<AnnotateAllowedTypesList<T>>;
157
+
158
+ /**
159
+ * The same as the built-in InstanceType, but works on classes with private constructors.
160
+ * @privateRemarks
161
+ * This is based on the trick in {@link https://stackoverflow.com/a/74657881}.
162
+ */
163
+ type InstanceTypeRelaxed<TClass> = InstanceType<(new () => never) & TClass>;
164
+
165
+ /**
166
+ * {@link AllowedTypesFull} but with internal types.
167
+ */
168
+ export type AllowedTypesFullInternal<
169
+ T extends readonly AnnotatedAllowedType[] = readonly AnnotatedAllowedType[],
170
+ > = AnnotatedAllowedTypesInternal<T> & UnannotateAllowedTypesList<T>;
171
+
172
+ type AllowedTypesFullInternalEvaluated = AllowedTypesFullInternal<
173
+ readonly AnnotatedAllowedType<TreeNodeSchema>[]
174
+ >;
175
+
176
+ /**
177
+ * The implementation of {@link AnnotatedAllowedTypes}. Also implements {@link AllowedTypesFull}.
178
+ * @remarks
179
+ * Due to TypeScript limitations, this class cannot directly state it implements {@link AllowedTypesFull}.
180
+ * As a workaround for that, the static `create` method returns the intersection type.
181
+ */
182
+ export class AnnotatedAllowedTypesInternal<
183
+ T extends readonly AnnotatedAllowedType[] = readonly AnnotatedAllowedType[],
184
+ >
185
+ extends ErasedTypeImplementation<AnnotatedAllowedTypes<T>>
186
+ implements AnnotatedAllowedTypes<T>
187
+ {
188
+ public readonly unannotatedTypes: UnannotateAllowedTypesList<T>;
189
+
190
+ /**
191
+ * True if and only if there is at least one lazy schema reference in the types arrays.
192
+ */
193
+ private readonly isLazy: boolean;
194
+
195
+ private readonly lazyEvaluate: Lazy<{
196
+ readonly annotated: AllowedTypesFullInternalEvaluated;
197
+ readonly set: ReadonlySet<TreeNodeSchema>;
198
+ readonly identifiers: ReadonlySet<string>;
199
+ }>;
200
+
201
+ private constructor(
202
+ public readonly types: T,
203
+ public readonly metadata: AllowedTypesMetadata = {},
204
+ ) {
205
+ super();
206
+ this.unannotatedTypes = types.map((type) => type.type) as typeof this.unannotatedTypes;
207
+
208
+ // Since the array has been copied, mutations to it will not be handled correctly so freeze it.
209
+ // Support for such mutations could be added at a later date by making more things lazy.
210
+ Object.freeze(this.types);
211
+ Object.freeze(this.unannotatedTypes);
212
+
213
+ this.isLazy = false;
214
+ for (const type of this.unannotatedTypes) {
215
+ if (isLazy(type)) {
216
+ this.isLazy = true;
217
+ } else {
218
+ markSchemaMostDerived(type);
219
+ }
220
+ }
221
+
222
+ const proxy = AnnotatedAllowedTypesInternal.proxy(this);
223
+
224
+ this.lazyEvaluate = new Lazy(() => {
225
+ const annotated = this.isLazy
226
+ ? AnnotatedAllowedTypesInternal.create(
227
+ this.types.map((type) => ({
228
+ ...type,
229
+ type: evaluateLazySchema(type.type),
230
+ })),
231
+ this.metadata,
232
+ )
233
+ : (proxy as AllowedTypesFullInternalEvaluated);
234
+ return {
235
+ annotated,
236
+ set: new Set(annotated.unannotatedTypes),
237
+ identifiers: new Set(annotated.unannotatedTypes.map((t) => t.identifier)),
238
+ };
239
+ });
240
+
241
+ return proxy;
242
+ }
243
+
244
+ public evaluate(): AllowedTypesFullInternalEvaluated {
245
+ return this.lazyEvaluate.value.annotated;
246
+ }
247
+
248
+ public evaluateSet(): ReadonlySet<TreeNodeSchema> {
249
+ return this.lazyEvaluate.value.set;
250
+ }
251
+
252
+ public evaluateIdentifiers(): ReadonlySet<string> {
253
+ return this.lazyEvaluate.value.identifiers;
254
+ }
255
+
256
+ public static override [Symbol.hasInstance]<
257
+ TThis extends
258
+ | (abstract new (
259
+ ...args: unknown[]
260
+ ) => object)
261
+ | typeof AnnotatedAllowedTypesInternal,
262
+ >(
263
+ this: TThis,
264
+ value: ErasedBaseType | InstanceTypeRelaxed<TThis> | ImplicitAllowedTypes,
265
+ ): value is InstanceTypeRelaxed<TThis> & AnnotatedAllowedTypesInternal & AllowedTypesFull {
266
+ return Object.prototype.isPrototypeOf.call(this.prototype, value);
267
+ }
268
+
269
+ public static override narrow<
270
+ TThis extends
271
+ | (abstract new (
272
+ ...args: unknown[]
273
+ ) => object)
274
+ | typeof AnnotatedAllowedTypesInternal,
275
+ >(
276
+ this: TThis,
277
+ value: ErasedBaseType | InstanceTypeRelaxed<TThis> | ImplicitAllowedTypes,
278
+ ): asserts value is InstanceTypeRelaxed<TThis> &
279
+ AnnotatedAllowedTypesInternal &
280
+ AllowedTypesFull {
281
+ if (!Object.prototype.isPrototypeOf.call(this.prototype, value)) {
282
+ throw new TypeError("Invalid AnnotatedAllowedTypes instance");
283
+ }
284
+ }
285
+
286
+ private static proxy<const T extends readonly AnnotatedAllowedType[]>(
287
+ result: AnnotatedAllowedTypesInternal<T>,
288
+ ): AnnotatedAllowedTypesInternal<T> & AllowedTypesFull<T> {
289
+ const proxy = new Proxy(result, {
290
+ set: () => {
291
+ throw new UsageError("AnnotatedAllowedTypes is immutable");
292
+ },
293
+
294
+ get: (target, property, receiver) => {
295
+ // Hide common array editing methods.
296
+ if (property === "push" || property === "pop") {
297
+ return undefined;
298
+ }
299
+
300
+ // Forward array lookup and array methods to the unannotated types array.
301
+ if (property in target.unannotatedTypes) {
302
+ return Reflect.get(target.unannotatedTypes, property);
303
+ }
304
+ // Forward anything else to target.
305
+ return Reflect.get(target, property) as unknown;
306
+ },
307
+
308
+ has: (target, property) => {
309
+ if (property in target.unannotatedTypes) {
310
+ return true;
311
+ }
312
+ // Forward anything else to target.
313
+ return property in target;
314
+ },
315
+
316
+ ownKeys: (target) => {
317
+ const targetKeys = Reflect.ownKeys(target);
318
+ const unannotatedTypesKeys = Reflect.ownKeys(target.unannotatedTypes);
319
+ return [...unannotatedTypesKeys, ...targetKeys];
320
+ },
321
+
322
+ getOwnPropertyDescriptor: (target, property) => {
323
+ if (Object.prototype.hasOwnProperty.call(target.unannotatedTypes, property)) {
324
+ const inner = Object.getOwnPropertyDescriptor(target.unannotatedTypes, property);
325
+ return {
326
+ ...inner,
327
+ // Since these properties are not on the target, make them non-configurable to confirm with proxy invariants.
328
+ configurable: true,
329
+ writable: false,
330
+ };
331
+ } else {
332
+ const inner = Object.getOwnPropertyDescriptor(target, property);
333
+ return {
334
+ ...inner,
335
+ writable: false,
336
+ // Allow only array entries to be enumerable.
337
+ enumerable: false,
338
+ };
339
+ }
340
+ },
341
+ });
342
+ return proxy as typeof result & UnannotateAllowedTypesList<T>;
343
+ }
344
+
345
+ public static create<const T extends readonly AnnotatedAllowedType[]>(
346
+ types: T,
347
+ metadata: AllowedTypesMetadata = {},
348
+ ): AnnotatedAllowedTypesInternal<T> & AllowedTypesFull<T> {
349
+ const result = new AnnotatedAllowedTypesInternal(types, metadata);
350
+ return result as typeof result & UnannotateAllowedTypesList<T>;
351
+ }
352
+
353
+ public static createUnannotated<const T extends AllowedTypes>(
354
+ types: T,
355
+ metadata: AllowedTypesMetadata = {},
356
+ ): AnnotatedAllowedTypesInternal & T {
357
+ const annotatedTypes: AnnotatedAllowedType[] = types.map(normalizeToAnnotatedAllowedType);
358
+ const result = AnnotatedAllowedTypesInternal.create(annotatedTypes, metadata);
359
+ return result as typeof result & T;
360
+ }
361
+
362
+ public static createMixed<
363
+ const T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
364
+ >(types: T, metadata: AllowedTypesMetadata = {}): AllowedTypesFullFromMixed<T> {
365
+ const annotatedTypes: AnnotatedAllowedType[] = types.map(normalizeToAnnotatedAllowedType);
366
+ const result = AnnotatedAllowedTypesInternal.create(annotatedTypes, metadata);
367
+ return result as AllowedTypesFullFromMixed<T>;
368
+ }
101
369
  }
102
370
 
103
371
  /**
@@ -184,6 +452,8 @@ export class SchemaUpgrade {
184
452
  * When referring to types that are declared after the definition of the `ImplicitAllowedTypes`, the schema can be wrapped in a lambda to allow the forward reference.
185
453
  * See {@link ValidateRecursiveSchema} for details on how to structure the `ImplicitAllowedTypes` instances when constructing recursive schema.
186
454
  *
455
+ * Code reading data from this should use {@link normalizeAllowedTypes} to ensure consistent handling, caching, nice errors etc.
456
+ *
187
457
  * @example Explicit use with strong typing
188
458
  * ```typescript
189
459
  * const sf = new SchemaFactory("myScope");
@@ -197,48 +467,10 @@ export class SchemaUpgrade {
197
467
  * class A extends sf.array("example", [() => B]) {}
198
468
  * class B extends sf.array("Inner", sf.number) {}
199
469
  * ```
200
- * @privateRemarks
201
- * Code reading data from this should use `normalizeAllowedTypes` to ensure consistent handling, caching, nice errors etc.
202
470
  * @public
203
471
  */
204
472
  export type ImplicitAllowedTypes = AllowedTypes | TreeNodeSchema;
205
473
 
206
- /**
207
- * Types of {@link TreeNode|TreeNodes} or {@link TreeLeafValue|TreeLeafValues} allowed at a location in a tree with
208
- * additional metadata associated with the location they're allowed at.
209
- * @alpha
210
- * @input
211
- */
212
- export type ImplicitAnnotatedAllowedTypes =
213
- | TreeNodeSchema
214
- | AnnotatedAllowedType
215
- | AnnotatedAllowedTypes
216
- | readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[];
217
-
218
- /**
219
- * Returns an {@link ImplicitAllowedTypes} that is equivalent to the input without annotations.
220
- * @system @alpha
221
- */
222
- export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTypes> =
223
- T extends AnnotatedAllowedTypes
224
- ? UnannotateAllowedTypes<T>
225
- : T extends AnnotatedAllowedType
226
- ? UnannotateAllowedTypesList<[T]>
227
- : T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[]
228
- ? UnannotateAllowedTypesList<T>
229
- : // This should able to just return `T` here, however doing so breaks generic code in ArrayNode.
230
- T extends TreeNodeSchema
231
- ? T
232
- : // Ideally this case would not be hit as it should be impossible.
233
- // Due to limitations of TypeScript some generic code does depend on this case,
234
- // so return a valid nonspecific schema in this otherwise unreachable case.
235
- // This ensures that when this case is hit, the type system can still reason about it.
236
- // It also ensures that if bugs cause this to matter in other cases, they will err on the side of restricting the API
237
- // (due to non-specific schema) rather than being unsafe.
238
- // This helps any such bugs be noticed more easily, be less likely to lead to runtime errors,
239
- // and be more likely to be fixable as non-breaking changes.
240
- ImplicitAllowedTypes;
241
-
242
474
  /**
243
475
  * Removes annotations from a list of allowed types that may contain annotations.
244
476
  * @system @alpha
@@ -246,53 +478,27 @@ export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTyp
246
478
  export type UnannotateAllowedTypesList<
247
479
  T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
248
480
  > = {
249
- [I in keyof T]: UnannotateAllowedType<T[I]>;
481
+ [I in keyof T]: T[I] extends AnnotatedAllowedType<infer X> ? X : T[I];
250
482
  };
251
483
 
252
484
  /**
253
- * Removes all annotations from a set of allowed types.
485
+ * Add annotations to a list of allowed types that may or may not contain annotations.
254
486
  * @system @alpha
255
487
  */
256
- export type UnannotateAllowedTypes<T extends AnnotatedAllowedTypes> =
257
- UnannotateAllowedTypesList<T["types"]>;
488
+ export type AnnotateAllowedTypesList<
489
+ T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
490
+ > = {
491
+ [I in keyof T]: T[I] extends AnnotatedAllowedType<unknown>
492
+ ? T[I]
493
+ : AnnotatedAllowedType<T[I]>;
494
+ };
258
495
 
259
496
  /**
260
- * Removes annotations from an allowed type.
261
- * @remarks
262
- * If the input could be lazy
263
- * (is a LazyItem or AnnotatedAllowedType<LazyItem> instead of just a TreeNodeSchema | AnnotatedAllowedType<TreeNodeSchema>)
264
- * then the output of this will be a LazyItem and thus is not valid as an ImplicitAllowedTypes without wrapping it in an array.
265
- * This can however be used on items within an AllowedTypes array.
266
- * @system @alpha
497
+ * Normalizes an {@link ImplicitAllowedTypes} to an {@link AllowedTypesFull}.
498
+ * @alpha
267
499
  */
268
- export type UnannotateAllowedType<T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>> =
269
- T extends AnnotatedAllowedType<infer X> ? X : T;
270
-
271
- /**
272
- * Normalizes a {@link ImplicitAllowedTypes} to a set of {@link TreeNodeSchema}s, by eagerly evaluating any
273
- * lazy schema declarations.
274
- *
275
- * @remarks Note: this must only be called after all required schemas have been declared, otherwise evaluation of
276
- * recursive schemas may fail.
277
- *
278
- * @internal
279
- */
280
- export function normalizeAllowedTypes(
281
- types: ImplicitAnnotatedAllowedTypes,
282
- ): ReadonlySet<TreeNodeSchema> {
283
- // remove annotations before normalizing
284
- const unannotated = unannotateImplicitAllowedTypes(types);
285
- const normalized = new Set<TreeNodeSchema>();
286
- if (isReadonlyArray(unannotated)) {
287
- // Types array must not be modified after it is normalized since that would result in the user of the normalized data having wrong (out of date) content.
288
- Object.freeze(unannotated);
289
- for (const lazyType of unannotated) {
290
- normalized.add(evaluateLazySchema(lazyType));
291
- }
292
- } else {
293
- normalized.add(evaluateLazySchema(unannotated));
294
- }
295
- return normalized;
500
+ export function normalizeAllowedTypes(types: ImplicitAllowedTypes): AllowedTypesFull {
501
+ return normalizeAllowedTypesInternal(types);
296
502
  }
297
503
 
298
504
  /**
@@ -310,76 +516,50 @@ export function normalizeToAnnotatedAllowedType<T extends LazyItem<TreeNodeSchem
310
516
  }
311
517
 
312
518
  /**
313
- * Normalizes a {@link ImplicitAnnotatedAllowedTypes} to a set of {@link AnnotatedAllowedSchema}s, by eagerly evaluating any
314
- * lazy schema declarations and adding empty metadata if it doesn't already exist.
315
- *
316
- * @remarks Note: this must only be called after all required schemas have been declared, otherwise evaluation of
317
- * recursive schemas may fail.
519
+ * See note inside {@link normalizeAllowedTypesInternal}.
318
520
  */
319
- export function normalizeAnnotatedAllowedTypes(
320
- types: ImplicitAnnotatedAllowedTypes,
321
- ): NormalizedAnnotatedAllowedTypes {
322
- const typesWithoutAnnotation = isAnnotatedAllowedTypes(types) ? types.types : types;
323
- const annotatedTypes: AnnotatedAllowedType<TreeNodeSchema>[] = [];
324
- if (isReadonlyArray(typesWithoutAnnotation)) {
325
- for (const annotatedType of typesWithoutAnnotation) {
326
- if (isAnnotatedAllowedType(annotatedType)) {
327
- annotatedTypes.push({
328
- type: evaluateLazySchema(annotatedType.type),
329
- metadata: annotatedType.metadata,
330
- });
331
- } else {
332
- annotatedTypes.push({ type: evaluateLazySchema(annotatedType), metadata: {} });
333
- }
334
- }
335
- } else {
336
- if (isAnnotatedAllowedType(typesWithoutAnnotation)) {
337
- annotatedTypes.push({
338
- type: evaluateLazySchema(typesWithoutAnnotation.type),
339
- metadata: typesWithoutAnnotation.metadata,
340
- });
341
- } else {
342
- annotatedTypes.push({ type: evaluateLazySchema(typesWithoutAnnotation), metadata: {} });
343
- }
521
+ const cachedNormalize = new WeakMap<ImplicitAllowedTypes, AllowedTypesFullInternal>();
522
+
523
+ /**
524
+ * Normalizes allowed types to an {@link AllowedTypesFullInternal}.
525
+ */
526
+ export function normalizeAllowedTypesInternal(
527
+ type: ImplicitAllowedTypes,
528
+ ): AllowedTypesFullInternal {
529
+ if (isAnnotatedAllowedTypes(type)) {
530
+ return type;
344
531
  }
345
532
 
346
- return {
347
- metadata: isAnnotatedAllowedTypes(types) ? types.metadata : {},
348
- types: annotatedTypes,
349
- };
350
- }
533
+ // This caching accomplishes two things:
534
+ // 1. It avoids redundant computations for the same input.
535
+ // 2. It provides a stable object identity for the output in case the input is normalized twice and other systems (such as unhydrated contexts) are cached based on the object identity of the output.
536
+ // It is this second case which is the more important since creating the AnnotatedAllowedTypesInternal is rather cheap.
537
+ // Adding this cache improved the performance of the "large recursive union" test (which mostly just constructs a TreeConfiguration) by ~5 times.
538
+ // This cache is strictly a performance optimization: it is not required for correctness.
539
+ return getOrCreate(cachedNormalize, type, () => {
540
+ // Due to more specific internal type, the above does not narrow sufficiently, so more narrowing is needed.
541
+ // It is possible this will give a false error if a TreeNodeSchema which matches this check is used.
542
+ assert(!("types" in type && "metadata" in type), "invalid AnnotatedAllowedTypes");
543
+
544
+ const annotatedTypes: AnnotatedAllowedType[] = (isReadonlyArray(type) ? type : [type]).map(
545
+ normalizeToAnnotatedAllowedType,
546
+ );
351
547
 
352
- /**
353
- * Converts an {@link ImplicitAnnotatedAllowedTypes} to an {@link ImplicitAllowedTypes}s, by removing
354
- * any annotations.
355
- * @remarks
356
- * This does not evaluate any lazy schemas.
357
- */
358
- export function unannotateImplicitAllowedTypes<Types extends ImplicitAnnotatedAllowedTypes>(
359
- types: Types,
360
- ): UnannotateImplicitAllowedTypes<Types> {
361
- return (
362
- isAnnotatedAllowedTypes(types)
363
- ? types.types.map(unannotateAllowedType)
364
- : isReadonlyArray(types)
365
- ? types.map(unannotateAllowedType)
366
- : isAnnotatedAllowedType(types)
367
- ? types.type
368
- : types
369
- ) as UnannotateImplicitAllowedTypes<Types>;
548
+ return AnnotatedAllowedTypesInternal.create(annotatedTypes);
549
+ });
370
550
  }
371
551
 
372
552
  /**
373
- * Converts an {@link AnnotatedAllowedType} to an {@link LazyItem} by removing any annotations.
374
- * @remarks
375
- * This does not evaluate any lazy schemas.
376
- */
377
- export function unannotateAllowedType<
378
- Type extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
379
- >(allowedType: Type): UnannotateAllowedType<Type> {
380
- return isAnnotatedAllowedType(allowedType)
381
- ? (allowedType.type as UnannotateAllowedType<Type>)
382
- : (allowedType as UnannotateAllowedType<Type>);
553
+ * Normalizes an {@link ImplicitAllowedTypes} to an {@link AllowedTypesFullInternalEvaluated} by eagerly evaluating any
554
+ * lazy schema declarations and adding empty metadata if it doesn't already exist.
555
+ *
556
+ * @remarks Note: this must only be called after all required schemas have been declared, otherwise evaluation of
557
+ * recursive schemas may fail.
558
+ */
559
+ export function normalizeAndEvaluateAnnotatedAllowedTypes(
560
+ types: ImplicitAllowedTypes,
561
+ ): AllowedTypesFullInternalEvaluated {
562
+ return normalizeAllowedTypesInternal(types).evaluate();
383
563
  }
384
564
 
385
565
  const cachedLazyItem = new WeakMap<() => unknown, unknown>();
@@ -404,7 +584,7 @@ export function evaluateLazySchema<T extends TreeNodeSchema>(value: LazyItem<T>)
404
584
  * Throws a UsageError if the provided schema is undefined, most likely due to being used before it was initialized.
405
585
  */
406
586
  export function checkForUninitializedSchema(
407
- schema: ImplicitAnnotatedAllowedTypes | LazyItem<TreeNodeSchema> | AnnotatedAllowedType,
587
+ schema: ImplicitAllowedTypes | LazyItem<TreeNodeSchema> | AnnotatedAllowedType,
408
588
  ): void {
409
589
  if (schema === undefined) {
410
590
  throw new UsageError(
@@ -543,16 +723,32 @@ export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitA
543
723
  * @typeparam TList - AllowedTypes to process
544
724
  *
545
725
  * @privateRemarks
546
- * This loop is manually unrolled to allow larger unions before hitting the recursion limit in TypeScript.
726
+ * This loop is non-recursive to allow larger unions before hitting the recursion limit in TypeScript.
547
727
  * @system @public
548
728
  */
549
729
  export type InsertableTreeNodeFromAllowedTypes<TList extends AllowedTypes> =
550
730
  IsUnion<TList> extends true
551
731
  ? never
552
732
  : {
553
- readonly [Property in keyof TList]: TList[Property] extends LazyItem<
554
- infer TSchema extends TreeNodeSchema
555
- >
733
+ readonly [Property in keyof TList]: [TList[Property]] extends [
734
+ LazyItem<infer TSchema extends TreeNodeSchema>,
735
+ ]
556
736
  ? InsertableTypedNode<TSchema>
557
737
  : never;
558
- }[number];
738
+ }[NumberKeys<TList>];
739
+
740
+ /**
741
+ * Extracts the keys of `T` which are numbers.
742
+ * @remarks
743
+ * The keys are extracted as strings which can be used to index `T`.
744
+ *
745
+ * This handles cases like `{ x: 4 } & [5, 6]` returning `"0"` and `"1"`.
746
+ * Such cases are difficult to handle since `keyof` includes `number` in such cases, but the type can not be indexed by `number`.
747
+ * @system @public
748
+ */
749
+ export type NumberKeys<
750
+ T,
751
+ Transformed = {
752
+ readonly [Property in keyof T as number extends Property ? never : Property]: Property;
753
+ },
754
+ > = Transformed[`${number}` & keyof Transformed];
@@ -9,7 +9,7 @@ import type {
9
9
  FlexTreeHydratedContext,
10
10
  } from "../../feature-libraries/index.js";
11
11
  import { brand } from "../../util/index.js";
12
- import type { NormalizedAnnotatedAllowedTypes } from "./allowedTypes.js";
12
+ import type { AllowedTypesFullEvaluated } from "./allowedTypes.js";
13
13
 
14
14
  import type { TreeNodeSchema } from "./treeNodeSchema.js";
15
15
  import { walkAllowedTypes } from "./walkSchema.js";
@@ -29,7 +29,7 @@ import { walkAllowedTypes } from "./walkSchema.js";
29
29
  */
30
30
  export class Context {
31
31
  public static schemaMapFromRootSchema(
32
- rootSchema: NormalizedAnnotatedAllowedTypes,
32
+ rootSchema: AllowedTypesFullEvaluated,
33
33
  ): ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema> {
34
34
  const schema: Map<TreeNodeSchemaIdentifier, TreeNodeSchema> = new Map();
35
35
  walkAllowedTypes(rootSchema, {
@@ -53,31 +53,33 @@ export {
53
53
  isAnnotatedAllowedTypes,
54
54
  isAnnotatedAllowedType,
55
55
  normalizeAllowedTypes,
56
- normalizeAnnotatedAllowedTypes,
56
+ normalizeAndEvaluateAnnotatedAllowedTypes,
57
57
  normalizeToAnnotatedAllowedType,
58
- unannotateImplicitAllowedTypes,
59
58
  markSchemaMostDerived,
60
59
  evaluateLazySchema,
61
60
  createSchemaUpgrade,
62
- type SchemaUpgrade,
61
+ AnnotatedAllowedTypesInternal,
62
+ normalizeAllowedTypesInternal,
63
63
  } from "./allowedTypes.js";
64
64
  export type {
65
65
  AnnotatedAllowedType,
66
- NormalizedAnnotatedAllowedTypes,
66
+ AllowedTypesFullEvaluated,
67
67
  ImplicitAllowedTypes,
68
- ImplicitAnnotatedAllowedTypes,
69
- UnannotateImplicitAllowedTypes,
70
68
  AllowedTypesMetadata,
71
69
  AllowedTypes,
72
70
  TreeNodeFromImplicitAllowedTypes,
73
71
  InsertableTreeNodeFromImplicitAllowedTypes,
74
72
  InsertableTreeNodeFromAllowedTypes,
75
73
  Input,
76
- UnannotateAllowedTypes,
77
- UnannotateAllowedType,
78
74
  UnannotateAllowedTypesList,
79
75
  AllowedTypeMetadata,
80
76
  AnnotatedAllowedTypes,
77
+ AnnotateAllowedTypesList,
78
+ SchemaUpgrade,
79
+ AllowedTypesFullInternal,
80
+ AllowedTypesFull,
81
+ AllowedTypesFullFromMixed,
82
+ NumberKeys,
81
83
  } from "./allowedTypes.js";
82
84
  export { walkAllowedTypes, walkNodeSchema, type SchemaVisitor } from "./walkSchema.js";
83
85
  export { Context, HydratedContext } from "./context.js";