@fluidframework/tree 2.52.0 → 2.53.0-350190

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 (337) hide show
  1. package/api-report/tree.alpha.api.md +38 -29
  2. package/dist/alpha.d.ts +2 -1
  3. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  4. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
  5. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  6. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
  7. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  8. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
  9. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  10. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  11. package/dist/feature-libraries/modular-schema/genericFieldKind.js +1 -0
  12. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  13. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
  14. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  15. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +49 -20
  16. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  17. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  18. package/dist/feature-libraries/optional-field/optionalField.js +3 -0
  19. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  20. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
  21. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  22. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
  23. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/jsonDomainSchema.d.ts +5 -3
  28. package/dist/jsonDomainSchema.d.ts.map +1 -1
  29. package/dist/jsonDomainSchema.js.map +1 -1
  30. package/dist/packageVersion.d.ts +1 -1
  31. package/dist/packageVersion.d.ts.map +1 -1
  32. package/dist/packageVersion.js +1 -1
  33. package/dist/packageVersion.js.map +1 -1
  34. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  35. package/dist/shared-tree/schematizeTree.js +1 -1
  36. package/dist/shared-tree/schematizeTree.js.map +1 -1
  37. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  38. package/dist/shared-tree/schematizingTreeView.js +3 -3
  39. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  40. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  41. package/dist/shared-tree/treeAlpha.js +9 -3
  42. package/dist/shared-tree/treeAlpha.js.map +1 -1
  43. package/dist/simple-tree/api/configuration.d.ts +3 -0
  44. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  45. package/dist/simple-tree/api/configuration.js +5 -1
  46. package/dist/simple-tree/api/configuration.js.map +1 -1
  47. package/dist/simple-tree/api/create.d.ts +4 -4
  48. package/dist/simple-tree/api/create.d.ts.map +1 -1
  49. package/dist/simple-tree/api/create.js +3 -6
  50. package/dist/simple-tree/api/create.js.map +1 -1
  51. package/dist/simple-tree/api/discrepancies.d.ts +5 -9
  52. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
  53. package/dist/simple-tree/api/discrepancies.js +11 -10
  54. package/dist/simple-tree/api/discrepancies.js.map +1 -1
  55. package/dist/simple-tree/api/index.d.ts +3 -2
  56. package/dist/simple-tree/api/index.d.ts.map +1 -1
  57. package/dist/simple-tree/api/index.js +3 -2
  58. package/dist/simple-tree/api/index.js.map +1 -1
  59. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  60. package/dist/simple-tree/api/schemaCompatibilityTester.js +3 -4
  61. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  62. package/dist/simple-tree/api/schemaFactory.d.ts +9 -155
  63. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  64. package/dist/simple-tree/api/schemaFactory.js +4 -47
  65. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  66. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
  67. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  68. package/dist/simple-tree/api/schemaFactoryAlpha.js +33 -11
  69. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  70. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
  71. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  72. package/dist/simple-tree/api/schemaFactoryRecursive.js +1 -7
  73. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  74. package/dist/simple-tree/api/schemaStatics.d.ts +158 -0
  75. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -0
  76. package/dist/simple-tree/api/schemaStatics.js +59 -0
  77. package/dist/simple-tree/api/schemaStatics.js.map +1 -0
  78. package/dist/simple-tree/api/storedSchema.d.ts +5 -3
  79. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  80. package/dist/simple-tree/api/storedSchema.js +4 -2
  81. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  82. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  83. package/dist/simple-tree/api/treeBeta.js +12 -6
  84. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  85. package/dist/simple-tree/core/allowedTypes.d.ts +33 -17
  86. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  87. package/dist/simple-tree/core/allowedTypes.js +20 -12
  88. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  89. package/dist/simple-tree/core/index.d.ts +5 -3
  90. package/dist/simple-tree/core/index.d.ts.map +1 -1
  91. package/dist/simple-tree/core/index.js +6 -1
  92. package/dist/simple-tree/core/index.js.map +1 -1
  93. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
  94. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
  95. package/dist/simple-tree/core/simpleNodeSchemaBase.js +7 -0
  96. package/dist/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
  97. package/dist/simple-tree/core/toStored.d.ts +32 -0
  98. package/dist/simple-tree/core/toStored.d.ts.map +1 -0
  99. package/dist/simple-tree/core/toStored.js +37 -0
  100. package/dist/simple-tree/core/toStored.js.map +1 -0
  101. package/dist/simple-tree/core/treeNodeSchema.d.ts +7 -2
  102. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  103. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  104. package/dist/simple-tree/core/treeNodeValid.d.ts +6 -1
  105. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  106. package/dist/simple-tree/core/treeNodeValid.js +11 -3
  107. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  108. package/dist/simple-tree/core/walkSchema.d.ts +19 -5
  109. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  110. package/dist/simple-tree/core/walkSchema.js +4 -2
  111. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  112. package/dist/simple-tree/createContext.d.ts.map +1 -1
  113. package/dist/simple-tree/createContext.js +1 -1
  114. package/dist/simple-tree/createContext.js.map +1 -1
  115. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  116. package/dist/simple-tree/fieldSchema.js +1 -1
  117. package/dist/simple-tree/fieldSchema.js.map +1 -1
  118. package/dist/simple-tree/index.d.ts +4 -4
  119. package/dist/simple-tree/index.d.ts.map +1 -1
  120. package/dist/simple-tree/index.js +7 -1
  121. package/dist/simple-tree/index.js.map +1 -1
  122. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  123. package/dist/simple-tree/leafNodeSchema.js +1 -0
  124. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  125. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  126. package/dist/simple-tree/node-kinds/array/arrayNode.js +17 -3
  127. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  128. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  129. package/dist/simple-tree/node-kinds/map/mapNode.js +9 -2
  130. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  131. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -2
  132. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  133. package/dist/simple-tree/node-kinds/object/objectNode.js +37 -26
  134. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  135. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  136. package/dist/simple-tree/node-kinds/record/recordNode.js +9 -2
  137. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  138. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  139. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  140. package/dist/simple-tree/prepareForInsertion.js +10 -10
  141. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  142. package/dist/simple-tree/simpleSchema.d.ts +6 -21
  143. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  144. package/dist/simple-tree/simpleSchema.js.map +1 -1
  145. package/dist/simple-tree/toStoredSchema.d.ts +35 -11
  146. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  147. package/dist/simple-tree/toStoredSchema.js +68 -33
  148. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  149. package/lib/alpha.d.ts +2 -1
  150. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  151. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
  152. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  153. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
  154. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  155. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
  156. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  157. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  158. package/lib/feature-libraries/modular-schema/genericFieldKind.js +1 -0
  159. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  160. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
  161. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  162. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +50 -21
  163. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  164. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  165. package/lib/feature-libraries/optional-field/optionalField.js +3 -0
  166. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  167. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
  168. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  169. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
  170. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  171. package/lib/index.d.ts +1 -1
  172. package/lib/index.d.ts.map +1 -1
  173. package/lib/index.js.map +1 -1
  174. package/lib/jsonDomainSchema.d.ts +5 -3
  175. package/lib/jsonDomainSchema.d.ts.map +1 -1
  176. package/lib/jsonDomainSchema.js.map +1 -1
  177. package/lib/packageVersion.d.ts +1 -1
  178. package/lib/packageVersion.d.ts.map +1 -1
  179. package/lib/packageVersion.js +1 -1
  180. package/lib/packageVersion.js.map +1 -1
  181. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  182. package/lib/shared-tree/schematizeTree.js +2 -2
  183. package/lib/shared-tree/schematizeTree.js.map +1 -1
  184. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  185. package/lib/shared-tree/schematizingTreeView.js +4 -4
  186. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  187. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  188. package/lib/shared-tree/treeAlpha.js +10 -4
  189. package/lib/shared-tree/treeAlpha.js.map +1 -1
  190. package/lib/simple-tree/api/configuration.d.ts +3 -0
  191. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  192. package/lib/simple-tree/api/configuration.js +6 -2
  193. package/lib/simple-tree/api/configuration.js.map +1 -1
  194. package/lib/simple-tree/api/create.d.ts +4 -4
  195. package/lib/simple-tree/api/create.d.ts.map +1 -1
  196. package/lib/simple-tree/api/create.js +3 -6
  197. package/lib/simple-tree/api/create.js.map +1 -1
  198. package/lib/simple-tree/api/discrepancies.d.ts +5 -9
  199. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
  200. package/lib/simple-tree/api/discrepancies.js +11 -10
  201. package/lib/simple-tree/api/discrepancies.js.map +1 -1
  202. package/lib/simple-tree/api/index.d.ts +3 -2
  203. package/lib/simple-tree/api/index.d.ts.map +1 -1
  204. package/lib/simple-tree/api/index.js +2 -1
  205. package/lib/simple-tree/api/index.js.map +1 -1
  206. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  207. package/lib/simple-tree/api/schemaCompatibilityTester.js +4 -5
  208. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  209. package/lib/simple-tree/api/schemaFactory.d.ts +9 -155
  210. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  211. package/lib/simple-tree/api/schemaFactory.js +2 -45
  212. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  213. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
  214. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  215. package/lib/simple-tree/api/schemaFactoryAlpha.js +23 -1
  216. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  217. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
  218. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  219. package/lib/simple-tree/api/schemaFactoryRecursive.js +0 -5
  220. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  221. package/lib/simple-tree/api/schemaStatics.d.ts +158 -0
  222. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -0
  223. package/lib/simple-tree/api/schemaStatics.js +56 -0
  224. package/lib/simple-tree/api/schemaStatics.js.map +1 -0
  225. package/lib/simple-tree/api/storedSchema.d.ts +5 -3
  226. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  227. package/lib/simple-tree/api/storedSchema.js +6 -4
  228. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  229. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  230. package/lib/simple-tree/api/treeBeta.js +8 -2
  231. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  232. package/lib/simple-tree/core/allowedTypes.d.ts +33 -17
  233. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  234. package/lib/simple-tree/core/allowedTypes.js +23 -12
  235. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  236. package/lib/simple-tree/core/index.d.ts +5 -3
  237. package/lib/simple-tree/core/index.d.ts.map +1 -1
  238. package/lib/simple-tree/core/index.js +3 -2
  239. package/lib/simple-tree/core/index.js.map +1 -1
  240. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
  241. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
  242. package/lib/simple-tree/core/simpleNodeSchemaBase.js +6 -0
  243. package/lib/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
  244. package/lib/simple-tree/core/toStored.d.ts +32 -0
  245. package/lib/simple-tree/core/toStored.d.ts.map +1 -0
  246. package/lib/simple-tree/core/toStored.js +32 -0
  247. package/lib/simple-tree/core/toStored.js.map +1 -0
  248. package/lib/simple-tree/core/treeNodeSchema.d.ts +7 -2
  249. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  250. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  251. package/lib/simple-tree/core/treeNodeValid.d.ts +6 -1
  252. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  253. package/lib/simple-tree/core/treeNodeValid.js +9 -2
  254. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  255. package/lib/simple-tree/core/walkSchema.d.ts +19 -5
  256. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  257. package/lib/simple-tree/core/walkSchema.js +4 -2
  258. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  259. package/lib/simple-tree/createContext.d.ts.map +1 -1
  260. package/lib/simple-tree/createContext.js +2 -2
  261. package/lib/simple-tree/createContext.js.map +1 -1
  262. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  263. package/lib/simple-tree/fieldSchema.js +1 -1
  264. package/lib/simple-tree/fieldSchema.js.map +1 -1
  265. package/lib/simple-tree/index.d.ts +4 -4
  266. package/lib/simple-tree/index.d.ts.map +1 -1
  267. package/lib/simple-tree/index.js +1 -1
  268. package/lib/simple-tree/index.js.map +1 -1
  269. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  270. package/lib/simple-tree/leafNodeSchema.js +2 -1
  271. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  272. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  273. package/lib/simple-tree/node-kinds/array/arrayNode.js +20 -6
  274. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  275. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  276. package/lib/simple-tree/node-kinds/map/mapNode.js +12 -5
  277. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  278. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -2
  279. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  280. package/lib/simple-tree/node-kinds/object/objectNode.js +16 -5
  281. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  282. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  283. package/lib/simple-tree/node-kinds/record/recordNode.js +12 -5
  284. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  285. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  286. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  287. package/lib/simple-tree/prepareForInsertion.js +10 -10
  288. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  289. package/lib/simple-tree/simpleSchema.d.ts +6 -21
  290. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  291. package/lib/simple-tree/simpleSchema.js.map +1 -1
  292. package/lib/simple-tree/toStoredSchema.d.ts +35 -11
  293. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  294. package/lib/simple-tree/toStoredSchema.js +67 -34
  295. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  296. package/package.json +21 -21
  297. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -0
  298. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +9 -0
  299. package/src/feature-libraries/modular-schema/genericFieldKind.ts +1 -0
  300. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +61 -19
  301. package/src/feature-libraries/optional-field/optionalField.ts +4 -0
  302. package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +4 -0
  303. package/src/index.ts +2 -1
  304. package/src/jsonDomainSchema.ts +4 -0
  305. package/src/packageVersion.ts +1 -1
  306. package/src/shared-tree/schematizeTree.ts +2 -2
  307. package/src/shared-tree/schematizingTreeView.ts +9 -3
  308. package/src/shared-tree/treeAlpha.ts +18 -4
  309. package/src/simple-tree/api/configuration.ts +10 -2
  310. package/src/simple-tree/api/create.ts +5 -10
  311. package/src/simple-tree/api/discrepancies.ts +18 -17
  312. package/src/simple-tree/api/index.ts +2 -3
  313. package/src/simple-tree/api/schemaCompatibilityTester.ts +5 -9
  314. package/src/simple-tree/api/schemaFactory.ts +6 -250
  315. package/src/simple-tree/api/schemaFactoryAlpha.ts +174 -1
  316. package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -25
  317. package/src/simple-tree/api/schemaStatics.ts +291 -0
  318. package/src/simple-tree/api/storedSchema.ts +12 -5
  319. package/src/simple-tree/api/treeBeta.ts +9 -2
  320. package/src/simple-tree/core/allowedTypes.ts +46 -26
  321. package/src/simple-tree/core/index.ts +9 -1
  322. package/src/simple-tree/core/simpleNodeSchemaBase.ts +30 -0
  323. package/src/simple-tree/core/toStored.ts +58 -0
  324. package/src/simple-tree/core/treeNodeSchema.ts +8 -2
  325. package/src/simple-tree/core/treeNodeValid.ts +14 -2
  326. package/src/simple-tree/core/walkSchema.ts +23 -6
  327. package/src/simple-tree/createContext.ts +5 -2
  328. package/src/simple-tree/fieldSchema.ts +2 -1
  329. package/src/simple-tree/index.ts +14 -3
  330. package/src/simple-tree/leafNodeSchema.ts +2 -1
  331. package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -4
  332. package/src/simple-tree/node-kinds/map/mapNode.ts +23 -2
  333. package/src/simple-tree/node-kinds/object/objectNode.ts +34 -4
  334. package/src/simple-tree/node-kinds/record/recordNode.ts +20 -2
  335. package/src/simple-tree/prepareForInsertion.ts +12 -7
  336. package/src/simple-tree/simpleSchema.ts +6 -26
  337. package/src/simple-tree/toStoredSchema.ts +107 -44
@@ -0,0 +1,291 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { IFluidHandle } from "@fluidframework/core-interfaces";
7
+ import type {
8
+ ImplicitAllowedTypes,
9
+ ImplicitAnnotatedAllowedTypes,
10
+ UnannotateImplicitAllowedTypes,
11
+ } from "../core/index.js";
12
+ import { FieldKind, getDefaultProvider, createFieldSchema } from "../fieldSchema.js";
13
+ import type {
14
+ FieldProps,
15
+ FieldSchema,
16
+ DefaultProvider,
17
+ FieldPropsAlpha,
18
+ FieldSchemaAlpha,
19
+ } from "../fieldSchema.js";
20
+ import type { LeafSchema } from "../leafNodeSchema.js";
21
+ import {
22
+ stringSchema,
23
+ numberSchema,
24
+ booleanSchema,
25
+ nullSchema,
26
+ handleSchema,
27
+ } from "../leafNodeSchema.js";
28
+ import type { System_Unsafe, FieldSchemaAlphaUnsafe } from "./typesUnsafe.js";
29
+
30
+ /**
31
+ * Stateless APIs exposed via {@link SchemaFactory} as both instance properties and as statics.
32
+ * @privateRemarks
33
+ * We have no way to make linkable members which exist both as statics and instance properties since API-Extractor does not support this.
34
+ * As a workaround, we have this type as a third place which can be linked.
35
+ * @system @sealed @public
36
+ */
37
+ export interface SchemaStatics {
38
+ /**
39
+ * {@link TreeNodeSchema} for holding a JavaScript `string`.
40
+ *
41
+ * @remarks
42
+ * Strings containing unpaired UTF-16 surrogate pair code units may not be handled correctly.
43
+ *
44
+ * These limitations come from the use of UTF-8 encoding of the strings, which requires them to be valid unicode.
45
+ * JavaScript does not make this requirement for its strings so not all possible JavaScript strings are supported.
46
+ * @privateRemarks
47
+ * TODO:
48
+ * We should be much more clear about what happens if you use problematic values.
49
+ * We should validate and/or normalize them when inserting content.
50
+ */
51
+ readonly string: LeafSchema<"string", string>;
52
+
53
+ /**
54
+ * {@link TreeNodeSchema} for holding a JavaScript `number`.
55
+ *
56
+ * @remarks
57
+ * The number is a {@link https://en.wikipedia.org/wiki/Double-precision_floating-point_format | double-precision 64-bit binary format IEEE 754} value, however there are some exceptions:
58
+ *
59
+ * - `NaN`, and the infinities are converted to `null` (and may therefore only be used where `null` is allowed by the schema).
60
+ *
61
+ * - `-0` may be converted to `0` in some cases.
62
+ *
63
+ * These limitations match the limitations of JSON.
64
+ * @privateRemarks
65
+ * TODO:
66
+ * We should be much more clear about what happens if you use problematic values.
67
+ * We should validate and/or normalize them when inserting content.
68
+ */
69
+ readonly number: LeafSchema<"number", number>;
70
+
71
+ /**
72
+ * {@link TreeNodeSchema} for holding a boolean.
73
+ */
74
+ readonly boolean: LeafSchema<"boolean", boolean>;
75
+
76
+ /**
77
+ * {@link TreeNodeSchema} for JavaScript `null`.
78
+ *
79
+ * @remarks
80
+ * There are good {@link https://www.npmjs.com/package/%40rushstack/eslint-plugin#rushstackno-new-null | reasons to avoid using null} in JavaScript, however sometimes it is desired.
81
+ * This {@link TreeNodeSchema} node provides the option to include nulls in trees when desired.
82
+ * Unless directly inter-operating with existing data using null, consider other approaches, like wrapping the value in an optional field, or using a more specifically named empty object node.
83
+ */
84
+ // eslint-disable-next-line @rushstack/no-new-null
85
+ readonly null: LeafSchema<"null", null>;
86
+
87
+ /**
88
+ * {@link TreeNodeSchema} for holding an {@link @fluidframework/core-interfaces#(IFluidHandle:interface)}.
89
+ */
90
+ readonly handle: LeafSchema<"handle", IFluidHandle>;
91
+
92
+ /**
93
+ * {@link AllowedTypes} for holding any of the leaf types.
94
+ */
95
+ readonly leaves: readonly [
96
+ SchemaStatics["string"],
97
+ SchemaStatics["number"],
98
+ SchemaStatics["boolean"],
99
+ SchemaStatics["null"],
100
+ SchemaStatics["handle"],
101
+ ];
102
+
103
+ /**
104
+ * Make a field optional instead of the default, which is required.
105
+ *
106
+ * @param t - The types allowed under the field.
107
+ * @param props - Optional properties to associate with the field.
108
+ *
109
+ * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.
110
+ * See {@link FieldSchemaMetadata.custom}.
111
+ */
112
+ readonly optional: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
113
+ t: T,
114
+ props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
115
+ ) => FieldSchema<FieldKind.Optional, T, TCustomMetadata>;
116
+
117
+ /**
118
+ * Make a field explicitly required.
119
+ *
120
+ * @param t - The types allowed under the field.
121
+ * @param props - Optional properties to associate with the field.
122
+ *
123
+ * @remarks
124
+ * Fields are required by default, but this API can be used to make the required nature explicit in the schema,
125
+ * and allows associating custom {@link FieldProps | properties} with the field.
126
+ *
127
+ * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.
128
+ * See {@link FieldSchemaMetadata.custom}.
129
+ */
130
+ readonly required: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
131
+ t: T,
132
+ props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
133
+ ) => FieldSchema<FieldKind.Required, T, TCustomMetadata>;
134
+
135
+ /**
136
+ * {@link SchemaStatics.optional} except tweaked to work better for recursive types.
137
+ * Use with {@link ValidateRecursiveSchema} for improved type safety.
138
+ * @remarks
139
+ * This version of {@link SchemaStatics.optional} has fewer type constraints to work around TypeScript limitations, see {@link Unenforced}.
140
+ * See {@link ValidateRecursiveSchema} for additional information about using recursive schema.
141
+ */
142
+ readonly optionalRecursive: <
143
+ const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
144
+ const TCustomMetadata = unknown,
145
+ >(
146
+ t: T,
147
+ props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
148
+ ) => System_Unsafe.FieldSchemaUnsafe<FieldKind.Optional, T, TCustomMetadata>;
149
+
150
+ /**
151
+ * {@link SchemaStatics.required} except tweaked to work better for recursive types.
152
+ * Use with {@link ValidateRecursiveSchema} for improved type safety.
153
+ * @remarks
154
+ * This version of {@link SchemaStatics.required} has fewer type constraints to work around TypeScript limitations, see {@link Unenforced}.
155
+ * See {@link ValidateRecursiveSchema} for additional information about using recursive schema.
156
+ */
157
+ readonly requiredRecursive: <
158
+ const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
159
+ const TCustomMetadata = unknown,
160
+ >(
161
+ t: T,
162
+ props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
163
+ ) => System_Unsafe.FieldSchemaUnsafe<FieldKind.Required, T, TCustomMetadata>;
164
+ }
165
+
166
+ const defaultOptionalProvider: DefaultProvider = getDefaultProvider(() => []);
167
+
168
+ // The following overloads for optional and required are used to get around the fact that
169
+ // the compiler can't infer that UnannotateImplicitAllowedTypes<T> is equal to T when T is known to extend ImplicitAllowedTypes
170
+
171
+ // #region Overloads for optional and required
172
+ function optional<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
173
+ t: T,
174
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
175
+ ): FieldSchemaAlpha<FieldKind.Optional, T, TCustomMetadata>;
176
+
177
+ function optional<
178
+ const T extends ImplicitAnnotatedAllowedTypes,
179
+ const TCustomMetadata = unknown,
180
+ >(
181
+ t: T,
182
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
183
+ ): FieldSchemaAlpha<FieldKind.Optional, UnannotateImplicitAllowedTypes<T>, TCustomMetadata>;
184
+
185
+ function optional<
186
+ const T extends ImplicitAnnotatedAllowedTypes,
187
+ const TCustomMetadata = unknown,
188
+ >(
189
+ t: T,
190
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
191
+ ): FieldSchemaAlpha<FieldKind.Optional, UnannotateImplicitAllowedTypes<T>, TCustomMetadata> {
192
+ return createFieldSchema(FieldKind.Optional, t, {
193
+ defaultProvider: defaultOptionalProvider,
194
+ ...props,
195
+ });
196
+ }
197
+
198
+ function required<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
199
+ t: T,
200
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
201
+ ): FieldSchemaAlpha<FieldKind.Required, T, TCustomMetadata>;
202
+
203
+ function required<
204
+ const T extends ImplicitAnnotatedAllowedTypes,
205
+ const TCustomMetadata = unknown,
206
+ >(
207
+ t: T,
208
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
209
+ ): FieldSchemaAlpha<FieldKind.Required, UnannotateImplicitAllowedTypes<T>, TCustomMetadata>;
210
+
211
+ function required<
212
+ const T extends ImplicitAnnotatedAllowedTypes,
213
+ const TCustomMetadata = unknown,
214
+ >(
215
+ t: T,
216
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
217
+ ): FieldSchemaAlpha<FieldKind.Required, UnannotateImplicitAllowedTypes<T>, TCustomMetadata> {
218
+ return createFieldSchema(FieldKind.Required, t, props);
219
+ }
220
+ // #endregion
221
+
222
+ /**
223
+ * Implementation of {@link SchemaStatics}.
224
+ * @remarks
225
+ * Entries can use more specific types than {@link SchemaStatics} requires to be more useful for non-public consumers.
226
+ * Additional non-public members are in {@link schemaStatics}.
227
+ */
228
+ export const schemaStaticsStable = {
229
+ string: stringSchema,
230
+ number: numberSchema,
231
+ boolean: booleanSchema,
232
+ null: nullSchema,
233
+ handle: handleSchema,
234
+ leaves: [stringSchema, numberSchema, booleanSchema, nullSchema, handleSchema],
235
+
236
+ optional,
237
+
238
+ required,
239
+
240
+ optionalRecursive: <
241
+ const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
242
+ const TCustomMetadata = unknown,
243
+ >(
244
+ t: T,
245
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
246
+ ): FieldSchemaAlphaUnsafe<FieldKind.Optional, T, TCustomMetadata> => {
247
+ return createFieldSchemaUnsafe(FieldKind.Optional, t, {
248
+ defaultProvider: defaultOptionalProvider,
249
+ ...props,
250
+ });
251
+ },
252
+
253
+ requiredRecursive: <
254
+ const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
255
+ const TCustomMetadata = unknown,
256
+ >(
257
+ t: T,
258
+ props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
259
+ ): FieldSchemaAlphaUnsafe<FieldKind.Required, T, TCustomMetadata> => {
260
+ return createFieldSchemaUnsafe(FieldKind.Required, t, props);
261
+ },
262
+ } as const satisfies SchemaStatics;
263
+
264
+ /**
265
+ * Unstable extensions to {@link schemaStaticsStable}.
266
+ */
267
+ export const schemaStatics = {
268
+ ...schemaStaticsStable,
269
+ identifier: <const TCustomMetadata = unknown>(
270
+ props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
271
+ ): FieldSchemaAlpha<FieldKind.Identifier, typeof stringSchema, TCustomMetadata> => {
272
+ return createFieldSchema(FieldKind.Identifier, stringSchema, props);
273
+ },
274
+ } as const;
275
+
276
+ function createFieldSchemaUnsafe<
277
+ Kind extends FieldKind,
278
+ Types extends System_Unsafe.ImplicitAllowedTypesUnsafe,
279
+ TCustomMetadata = unknown,
280
+ >(
281
+ kind: Kind,
282
+ allowedTypes: Types,
283
+ props?: FieldProps<TCustomMetadata>,
284
+ ): FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata> {
285
+ // At runtime, we still want this to be a FieldSchema instance, but we can't satisfy its extends clause, so just return it as an FieldSchemaUnsafe
286
+ return createFieldSchema(
287
+ kind,
288
+ allowedTypes as ImplicitAllowedTypes & Types,
289
+ props,
290
+ ) as FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata>;
291
+ }
@@ -12,9 +12,13 @@ import {
12
12
  // eslint-disable-next-line import/no-internal-modules
13
13
  } from "../../feature-libraries/schema-index/index.js";
14
14
  import type { JsonCompatible } from "../../util/index.js";
15
- import { normalizeFieldSchema, type ImplicitFieldSchema } from "../fieldSchema.js";
16
- import type { SimpleTreeSchema } from "../simpleSchema.js";
17
- import { simpleToStoredSchema } from "../toStoredSchema.js";
15
+ import type { SchemaUpgrade } from "../core/index.js";
16
+ import {
17
+ normalizeFieldSchema,
18
+ type ImplicitAnnotatedFieldSchema,
19
+ type ImplicitFieldSchema,
20
+ } from "../fieldSchema.js";
21
+ import { toStoredSchema } from "../toStoredSchema.js";
18
22
  import { TreeViewConfigurationAlpha } from "./configuration.js";
19
23
 
20
24
  import { SchemaCompatibilityTester } from "./schemaCompatibilityTester.js";
@@ -24,6 +28,8 @@ import type { SchemaCompatibilityStatus } from "./tree.js";
24
28
  * Dumps the "persisted" schema subset of the provided `schema` into a deterministic JSON-compatible, semi-human-readable format.
25
29
  *
26
30
  * @param schema - The schema to dump.
31
+ * @param oldestCompatibleClient - The oldest client version which can read the schema: impacts the format used.
32
+ * @param includeStaged - filter for selecting which staged allowed types to include in the output.
27
33
  *
28
34
  * @remarks
29
35
  * This can be used to help inspect schema for debugging, and to save a snapshot of schema to help detect and review changes to an applications schema.
@@ -51,10 +57,11 @@ import type { SchemaCompatibilityStatus } from "./tree.js";
51
57
  * @alpha
52
58
  */
53
59
  export function extractPersistedSchema(
54
- schema: SimpleTreeSchema,
60
+ schema: ImplicitAnnotatedFieldSchema,
55
61
  oldestCompatibleClient: FluidClientVersion,
62
+ includeStaged: (upgrade: SchemaUpgrade) => boolean,
56
63
  ): JsonCompatible {
57
- const stored = simpleToStoredSchema(schema);
64
+ const stored = toStoredSchema(schema, { includeStaged });
58
65
  const schemaWriteVersion = clientVersionToSchemaVersion(oldestCompatibleClient);
59
66
  return encodeTreeSchema(stored, schemaWriteVersion);
60
67
  }
@@ -3,7 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { defaultSchemaPolicy } from "../../feature-libraries/index.js";
6
+ import type { TreeFieldStoredSchema } from "../../core/index.js";
7
+ import { defaultSchemaPolicy, FieldKinds } from "../../feature-libraries/index.js";
8
+ import { brand } from "../../util/index.js";
7
9
  import {
8
10
  Context,
9
11
  getKernel,
@@ -191,7 +193,12 @@ export const TreeBeta: TreeBeta = {
191
193
  );
192
194
  const context = new Context(flexContext, getUnhydratedContext(kernel.schema).schema);
193
195
 
194
- return createFromCursor(kernel.schema, cursor, context) as Unhydrated<
196
+ const fieldSchema: TreeFieldStoredSchema = {
197
+ kind: FieldKinds.required.identifier,
198
+ types: new Set([brand(kernel.schema.identifier)]),
199
+ persistedMetadata: undefined,
200
+ };
201
+ return createFromCursor(kernel.schema, cursor, fieldSchema, context) as Unhydrated<
195
202
  TreeFieldFromImplicitField<TSchema>
196
203
  >;
197
204
  },
@@ -5,7 +5,12 @@
5
5
 
6
6
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
7
7
 
8
- import { getOrCreate, isReadonlyArray, type IsUnion } from "../../util/index.js";
8
+ import {
9
+ getOrCreate,
10
+ isReadonlyArray,
11
+ type IsUnion,
12
+ type MakeNominal,
13
+ } from "../../util/index.js";
9
14
  import { isLazy, type FlexListToUnion, type LazyItem } from "./flexList.js";
10
15
  import {
11
16
  NodeKind,
@@ -134,7 +139,34 @@ export interface AllowedTypeMetadata {
134
139
  */
135
140
  readonly custom?: unknown;
136
141
 
137
- // TODO metadata for enablable types will be added here
142
+ /**
143
+ * If defined, indicates that an allowed type is {@link SchemaStaticsAlpha.staged | staged}.
144
+ */
145
+ readonly stagedSchemaUpgrade?: SchemaUpgrade;
146
+ }
147
+
148
+ /**
149
+ * Package internal {@link SchemaUpgrade} construction API.
150
+ */
151
+ export let createSchemaUpgrade: () => SchemaUpgrade;
152
+
153
+ /**
154
+ * Unique token used to upgrade schemas and determine if a particular upgrade has been completed.
155
+ * @remarks
156
+ * Create using {@link SchemaStaticsAlpha.staged}.
157
+ * @privateRemarks
158
+ * TODO:#38722 implement runtime schema upgrades.
159
+ * Until then, the class purely behaves mostly as a placeholder.
160
+ * TODO: Consider allowing users to store a name for the upgrade to use in error messages.
161
+ * @sealed @alpha
162
+ */
163
+ export class SchemaUpgrade {
164
+ protected _typeCheck!: MakeNominal;
165
+ static {
166
+ createSchemaUpgrade = () => new SchemaUpgrade();
167
+ }
168
+
169
+ private constructor() {}
138
170
  }
139
171
 
140
172
  /**
@@ -191,7 +223,7 @@ export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTyp
191
223
  T extends AnnotatedAllowedTypes
192
224
  ? UnannotateAllowedTypes<T>
193
225
  : T extends AnnotatedAllowedType
194
- ? UnannotateAllowedType<T>
226
+ ? UnannotateAllowedTypesList<[T]>
195
227
  : T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[]
196
228
  ? UnannotateAllowedTypesList<T>
197
229
  : T extends TreeNodeSchema
@@ -205,17 +237,9 @@ export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTyp
205
237
  export type UnannotateAllowedTypesList<
206
238
  T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
207
239
  > = {
208
- [I in keyof T]: UnannotateAllowedTypeOrLazyItem<T[I]>;
240
+ [I in keyof T]: UnannotateAllowedType<T[I]>;
209
241
  };
210
242
 
211
- /**
212
- * Removes annotations from an allowed type that may contain annotations.
213
- * @system @alpha
214
- */
215
- export type UnannotateAllowedTypeOrLazyItem<
216
- T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
217
- > = T extends AnnotatedAllowedType<infer X> ? X : T;
218
-
219
243
  /**
220
244
  * Removes all annotations from a set of allowed types.
221
245
  * @system @alpha
@@ -225,10 +249,15 @@ export type UnannotateAllowedTypes<T extends AnnotatedAllowedTypes> =
225
249
 
226
250
  /**
227
251
  * Removes annotations from an allowed type.
252
+ * @remarks
253
+ * If the input could be lazy
254
+ * (is a LazyItem or AnnotatedAllowedType<LazyItem> instead of just a TreeNodeSchema | AnnotatedAllowedType<TreeNodeSchema>)
255
+ * then the output of this will be a LazyItem and thus is not valid as an ImplicitAllowedTypes without wrapping it in an array.
256
+ * This can however be used on items within an AllowedTypes array.
228
257
  * @system @alpha
229
258
  */
230
259
  export type UnannotateAllowedType<T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>> =
231
- T extends AnnotatedAllowedType<infer X> ? [X] : T;
260
+ T extends AnnotatedAllowedType<infer X> ? X : T;
232
261
 
233
262
  /**
234
263
  * Normalizes a {@link ImplicitAllowedTypes} to a set of {@link TreeNodeSchema}s, by eagerly evaluating any
@@ -258,22 +287,13 @@ export function normalizeAllowedTypes(
258
287
  }
259
288
 
260
289
  /**
261
- * Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist
262
- * and eagerly evaluating any lazy schema declarations.
263
- *
264
- * @remarks
265
- * Note: this must only be called after all required schemas have been declared, otherwise evaluation of
266
- * recursive schemas may fail.
267
- * type is frozen and should not be modified after being passed in.
290
+ * Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist.
268
291
  */
269
- export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema>(
270
- type: T | AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>>,
292
+ export function normalizeToAnnotatedAllowedType<T extends LazyItem<TreeNodeSchema>>(
293
+ type: T | AnnotatedAllowedType<T>,
271
294
  ): AnnotatedAllowedType<T> {
272
295
  return isAnnotatedAllowedType(type)
273
- ? {
274
- metadata: type.metadata,
275
- type: evaluateLazySchema(type.type),
276
- }
296
+ ? type
277
297
  : {
278
298
  metadata: {},
279
299
  type,
@@ -57,6 +57,8 @@ export {
57
57
  unannotateImplicitAllowedTypes,
58
58
  markSchemaMostDerived,
59
59
  evaluateLazySchema,
60
+ createSchemaUpgrade,
61
+ type SchemaUpgrade,
60
62
  } from "./allowedTypes.js";
61
63
  export type {
62
64
  AnnotatedAllowedType,
@@ -73,7 +75,6 @@ export type {
73
75
  UnannotateAllowedTypes,
74
76
  UnannotateAllowedType,
75
77
  UnannotateAllowedTypesList,
76
- UnannotateAllowedTypeOrLazyItem,
77
78
  AllowedTypeMetadata,
78
79
  AnnotatedAllowedTypes,
79
80
  } from "./allowedTypes.js";
@@ -101,4 +102,11 @@ export {
101
102
  TreeNodeValid,
102
103
  type MostDerivedData,
103
104
  createTreeNodeSchemaPrivateData,
105
+ isClassBasedSchema,
104
106
  } from "./treeNodeValid.js";
107
+ export type { SimpleNodeSchemaBase } from "./simpleNodeSchemaBase.js";
108
+ export {
109
+ type StoredSchemaGenerationOptions,
110
+ convertAllowedTypes,
111
+ allowedTypeFilter,
112
+ } from "./toStored.js";
@@ -0,0 +1,30 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { NodeKind, NodeSchemaMetadata } from "./treeNodeSchema.js";
7
+
8
+ /**
9
+ * Base interface for {@link TreeNodeSchema} and {@link SimpleNodeSchema} types.
10
+ * Once simple schema is stable this doesn't have a reason to be kept `@system`, but it could be.
11
+ * @system
12
+ * @public
13
+ * @sealed
14
+ */
15
+ export interface SimpleNodeSchemaBase<
16
+ out TNodeKind extends NodeKind,
17
+ out TCustomMetadata = unknown,
18
+ > {
19
+ /**
20
+ * The {@link NodeKind}.
21
+ *
22
+ * @remarks can be used to type-switch between implementations.
23
+ */
24
+ readonly kind: TNodeKind;
25
+
26
+ /**
27
+ * User-provided {@link NodeSchemaMetadata} for this schema.
28
+ */
29
+ readonly metadata: NodeSchemaMetadata<TCustomMetadata>;
30
+ }
@@ -0,0 +1,58 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { brand } from "../../util/index.js";
7
+ import {
8
+ normalizeAnnotatedAllowedTypes,
9
+ type AnnotatedAllowedType,
10
+ type ImplicitAnnotatedAllowedTypes,
11
+ type SchemaUpgrade,
12
+ } from "./allowedTypes.js";
13
+ import type { TreeNodeSchemaIdentifier, TreeTypeSet } from "../../core/index.js";
14
+
15
+ /**
16
+ * Options for generating a {@link TreeStoredSchema} from view schema.
17
+ */
18
+ export interface StoredSchemaGenerationOptions {
19
+ /**
20
+ * Determines whether to include staged schema in the resulting stored schema.
21
+ * @remarks
22
+ * Due to caching, the behavior of this function must be pure.
23
+ */
24
+ includeStaged(upgrade: SchemaUpgrade): boolean;
25
+ }
26
+
27
+ /**
28
+ * Filters an allowed type based on the provided options.
29
+ * @param allowedType - The allowed type to filter.
30
+ * @param options - The options to use for filtering.
31
+ * @returns Whether the allowed type passes the filter.
32
+ */
33
+ export function allowedTypeFilter(
34
+ allowedType: AnnotatedAllowedType,
35
+ options: StoredSchemaGenerationOptions,
36
+ ): boolean {
37
+ // If the allowed type is staged, only include it if the options allow it.
38
+ if (allowedType.metadata.stagedSchemaUpgrade !== undefined) {
39
+ return options.includeStaged(allowedType.metadata.stagedSchemaUpgrade);
40
+ }
41
+ return true;
42
+ }
43
+
44
+ /**
45
+ * Converts an ImplicitAnnotatedAllowedTypes to a stored schema.
46
+ * @param schema - The schema to convert.
47
+ * @param options - The options to use for filtering.
48
+ * @returns The converted stored schema.
49
+ */
50
+ export function convertAllowedTypes(
51
+ schema: ImplicitAnnotatedAllowedTypes,
52
+ options: StoredSchemaGenerationOptions,
53
+ ): TreeTypeSet {
54
+ const filtered: TreeNodeSchemaIdentifier[] = normalizeAnnotatedAllowedTypes(schema)
55
+ .types.filter((allowedType) => allowedTypeFilter(allowedType, options))
56
+ .map((a) => brand(a.type.identifier));
57
+ return new Set(filtered);
58
+ }
@@ -6,7 +6,7 @@
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
  import type { IFluidHandle } from "@fluidframework/core-interfaces";
8
8
 
9
- import type { SimpleNodeSchemaBase } from "../simpleSchema.js";
9
+ import type { SimpleNodeSchemaBase } from "./simpleNodeSchemaBase.js";
10
10
  import type { TreeNode } from "./treeNode.js";
11
11
  import type { InternalTreeNode, Unhydrated } from "./types.js";
12
12
  import type { UnionToIntersection } from "../../util/index.js";
@@ -15,9 +15,10 @@ import type {
15
15
  NormalizedAnnotatedAllowedTypes,
16
16
  } from "./allowedTypes.js";
17
17
  import type { Context } from "./context.js";
18
- import type { FieldKey, NodeData } from "../../core/index.js";
18
+ import type { FieldKey, NodeData, TreeNodeStoredSchema } from "../../core/index.js";
19
19
  import type { UnhydratedFlexTreeField } from "./unhydratedFlexTree.js";
20
20
  import type { FactoryContent } from "../unhydratedFlexTreeFromInsertable.js";
21
+ import type { StoredSchemaGenerationOptions } from "./toStored.js";
21
22
 
22
23
  /**
23
24
  * Schema for a {@link TreeNode} or {@link TreeLeafValue}.
@@ -396,6 +397,11 @@ export interface TreeNodeSchemaPrivateData {
396
397
  * Idempotent initialization function that pre-caches data and can dereference lazy schema references.
397
398
  */
398
399
  idempotentInitialize(): TreeNodeSchemaInitializedData;
400
+
401
+ /**
402
+ * Converts a the schema into a {@link TreeNodeStoredSchema}.
403
+ */
404
+ toStored(options: StoredSchemaGenerationOptions): TreeNodeStoredSchema;
399
405
  }
400
406
 
401
407
  /**
@@ -27,6 +27,7 @@ import {
27
27
  import type { InternalTreeNode } from "./types.js";
28
28
  import { typeSchemaSymbol } from "./withType.js";
29
29
  import type { ImplicitAnnotatedAllowedTypes } from "./allowedTypes.js";
30
+ import type { SimpleNodeSchemaBase } from "./simpleNodeSchemaBase.js";
30
31
 
31
32
  /**
32
33
  * Class which all {@link TreeNode}s must extend.
@@ -233,7 +234,7 @@ export interface MostDerivedData {
233
234
  export function schemaAsTreeNodeValid(
234
235
  schema: TreeNodeSchemaCore<string, NodeKind, boolean>,
235
236
  ): typeof TreeNodeValid & TreeNodeSchema {
236
- if (!inPrototypeChain(schema, TreeNodeValid)) {
237
+ if (!isClassBasedSchema(schema)) {
237
238
  // Use JSON.stringify to quote and escape identifier string.
238
239
  throw new UsageError(
239
240
  `Schema for ${JSON.stringify(
@@ -242,7 +243,16 @@ export function schemaAsTreeNodeValid(
242
243
  );
243
244
  }
244
245
 
245
- return schema as typeof TreeNodeValid & TreeNodeSchema;
246
+ return schema;
247
+ }
248
+
249
+ /**
250
+ * Check if a schema is a {@link TreeNodeValid}.
251
+ */
252
+ export function isClassBasedSchema(
253
+ schema: SimpleNodeSchemaBase<NodeKind>,
254
+ ): schema is typeof TreeNodeValid & TreeNodeSchema {
255
+ return inPrototypeChain(schema, TreeNodeValid);
246
256
  }
247
257
 
248
258
  /**
@@ -253,6 +263,7 @@ export function schemaAsTreeNodeValid(
253
263
  export function createTreeNodeSchemaPrivateData(
254
264
  schema: TreeNodeSchemaCore<string, NodeKind, boolean>,
255
265
  childAnnotatedAllowedTypes: readonly ImplicitAnnotatedAllowedTypes[],
266
+ toStored: TreeNodeSchemaPrivateData["toStored"],
256
267
  ): TreeNodeSchemaPrivateData {
257
268
  const schemaValid = schemaAsTreeNodeValid(schema);
258
269
  // Since this closes over the schema, ensure this schema is marked as most derived
@@ -262,6 +273,7 @@ export function createTreeNodeSchemaPrivateData(
262
273
  return {
263
274
  idempotentInitialize: () => schemaValid.oneTimeInitialize().oneTimeInitialized,
264
275
  childAnnotatedAllowedTypes,
276
+ toStored,
265
277
  };
266
278
  }
267
279