@fluidframework/tree 2.52.0 → 2.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/.eslintrc.cjs +14 -2
  2. package/CHANGELOG.md +125 -0
  3. package/api-report/tree.alpha.api.md +48 -41
  4. package/dist/alpha.d.ts +2 -1
  5. package/dist/core/tree/visitDelta.d.ts +1 -1
  6. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  7. package/dist/core/tree/visitDelta.js.map +1 -1
  8. package/dist/feature-libraries/chunked-forest/index.d.ts +1 -0
  9. package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  10. package/dist/feature-libraries/chunked-forest/index.js +3 -1
  11. package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
  12. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +2 -4
  13. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  14. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +3 -0
  15. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  16. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  17. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
  18. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  19. package/dist/feature-libraries/default-schema/noChangeCodecs.d.ts +1 -1
  20. package/dist/feature-libraries/default-schema/noChangeCodecs.d.ts.map +1 -1
  21. package/dist/feature-libraries/default-schema/noChangeCodecs.js.map +1 -1
  22. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +4 -0
  23. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  24. package/dist/feature-libraries/forest-summary/forestSummarizer.js +5 -5
  25. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  26. package/dist/feature-libraries/index.d.ts +1 -1
  27. package/dist/feature-libraries/index.d.ts.map +1 -1
  28. package/dist/feature-libraries/index.js +4 -2
  29. package/dist/feature-libraries/index.js.map +1 -1
  30. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
  31. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  32. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
  33. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  34. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  35. package/dist/feature-libraries/modular-schema/genericFieldKind.js +1 -0
  36. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  37. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +1 -0
  38. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  39. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
  40. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  41. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +49 -20
  42. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  43. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  44. package/dist/feature-libraries/optional-field/optionalField.js +3 -0
  45. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  46. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
  47. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  48. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
  49. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  50. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.d.ts +1 -1
  51. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.d.ts.map +1 -1
  52. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  53. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +1 -1
  54. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  55. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  56. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts +1 -1
  57. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  58. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  59. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts +1 -1
  60. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts.map +1 -1
  61. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.js.map +1 -1
  62. package/dist/feature-libraries/sequence-field/types.d.ts +1 -1
  63. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  64. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/jsonDomainSchema.d.ts +5 -3
  70. package/dist/jsonDomainSchema.d.ts.map +1 -1
  71. package/dist/jsonDomainSchema.js.map +1 -1
  72. package/dist/packageVersion.d.ts +1 -1
  73. package/dist/packageVersion.js +1 -1
  74. package/dist/packageVersion.js.map +1 -1
  75. package/dist/shared-tree/independentView.d.ts.map +1 -1
  76. package/dist/shared-tree/independentView.js +1 -1
  77. package/dist/shared-tree/independentView.js.map +1 -1
  78. package/dist/shared-tree/index.d.ts +0 -1
  79. package/dist/shared-tree/index.d.ts.map +1 -1
  80. package/dist/shared-tree/index.js.map +1 -1
  81. package/dist/shared-tree/schematizeTree.d.ts +23 -60
  82. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  83. package/dist/shared-tree/schematizeTree.js +59 -151
  84. package/dist/shared-tree/schematizeTree.js.map +1 -1
  85. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  86. package/dist/shared-tree/schematizingTreeView.js +11 -11
  87. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  88. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  89. package/dist/shared-tree/treeAlpha.js +9 -3
  90. package/dist/shared-tree/treeAlpha.js.map +1 -1
  91. package/dist/shared-tree-core/defaultResubmitMachine.d.ts +2 -1
  92. package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  93. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  94. package/dist/simple-tree/api/configuration.d.ts +3 -0
  95. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  96. package/dist/simple-tree/api/configuration.js +5 -1
  97. package/dist/simple-tree/api/configuration.js.map +1 -1
  98. package/dist/simple-tree/api/create.d.ts +4 -4
  99. package/dist/simple-tree/api/create.d.ts.map +1 -1
  100. package/dist/simple-tree/api/create.js +3 -6
  101. package/dist/simple-tree/api/create.js.map +1 -1
  102. package/dist/simple-tree/api/discrepancies.d.ts +5 -9
  103. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
  104. package/dist/simple-tree/api/discrepancies.js +11 -10
  105. package/dist/simple-tree/api/discrepancies.js.map +1 -1
  106. package/dist/simple-tree/api/index.d.ts +3 -2
  107. package/dist/simple-tree/api/index.d.ts.map +1 -1
  108. package/dist/simple-tree/api/index.js +3 -2
  109. package/dist/simple-tree/api/index.js.map +1 -1
  110. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  111. package/dist/simple-tree/api/schemaCompatibilityTester.js +3 -4
  112. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  113. package/dist/simple-tree/api/schemaFactory.d.ts +9 -155
  114. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  115. package/dist/simple-tree/api/schemaFactory.js +4 -47
  116. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  117. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
  118. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  119. package/dist/simple-tree/api/schemaFactoryAlpha.js +33 -11
  120. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  121. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
  122. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  123. package/dist/simple-tree/api/schemaFactoryRecursive.js +1 -7
  124. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  125. package/dist/simple-tree/api/schemaStatics.d.ts +158 -0
  126. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -0
  127. package/dist/simple-tree/api/schemaStatics.js +59 -0
  128. package/dist/simple-tree/api/schemaStatics.js.map +1 -0
  129. package/dist/simple-tree/api/storedSchema.d.ts +5 -3
  130. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  131. package/dist/simple-tree/api/storedSchema.js +4 -2
  132. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  133. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  134. package/dist/simple-tree/api/treeBeta.js +12 -6
  135. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  136. package/dist/simple-tree/core/allowedTypes.d.ts +46 -30
  137. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  138. package/dist/simple-tree/core/allowedTypes.js +20 -12
  139. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  140. package/dist/simple-tree/core/index.d.ts +5 -3
  141. package/dist/simple-tree/core/index.d.ts.map +1 -1
  142. package/dist/simple-tree/core/index.js +6 -1
  143. package/dist/simple-tree/core/index.js.map +1 -1
  144. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
  145. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
  146. package/dist/simple-tree/core/simpleNodeSchemaBase.js +7 -0
  147. package/dist/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
  148. package/dist/simple-tree/core/toStored.d.ts +32 -0
  149. package/dist/simple-tree/core/toStored.d.ts.map +1 -0
  150. package/dist/simple-tree/core/toStored.js +37 -0
  151. package/dist/simple-tree/core/toStored.js.map +1 -0
  152. package/dist/simple-tree/core/treeNode.d.ts +0 -3
  153. package/dist/simple-tree/core/treeNode.d.ts.map +1 -1
  154. package/dist/simple-tree/core/treeNode.js +3 -3
  155. package/dist/simple-tree/core/treeNode.js.map +1 -1
  156. package/dist/simple-tree/core/treeNodeSchema.d.ts +7 -2
  157. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  158. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  159. package/dist/simple-tree/core/treeNodeValid.d.ts +6 -1
  160. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  161. package/dist/simple-tree/core/treeNodeValid.js +11 -6
  162. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  163. package/dist/simple-tree/core/walkSchema.d.ts +19 -5
  164. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  165. package/dist/simple-tree/core/walkSchema.js +4 -2
  166. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  167. package/dist/simple-tree/createContext.d.ts.map +1 -1
  168. package/dist/simple-tree/createContext.js +1 -1
  169. package/dist/simple-tree/createContext.js.map +1 -1
  170. package/dist/simple-tree/fieldSchema.d.ts +2 -1
  171. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  172. package/dist/simple-tree/fieldSchema.js +1 -1
  173. package/dist/simple-tree/fieldSchema.js.map +1 -1
  174. package/dist/simple-tree/index.d.ts +4 -4
  175. package/dist/simple-tree/index.d.ts.map +1 -1
  176. package/dist/simple-tree/index.js +9 -2
  177. package/dist/simple-tree/index.js.map +1 -1
  178. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  179. package/dist/simple-tree/leafNodeSchema.js +1 -0
  180. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  181. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  182. package/dist/simple-tree/node-kinds/array/arrayNode.js +18 -4
  183. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  184. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  185. package/dist/simple-tree/node-kinds/map/mapNode.js +9 -2
  186. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  187. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -2
  188. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  189. package/dist/simple-tree/node-kinds/object/objectNode.js +37 -26
  190. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  191. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  192. package/dist/simple-tree/node-kinds/record/recordNode.js +9 -2
  193. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  194. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  195. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  196. package/dist/simple-tree/prepareForInsertion.js +10 -10
  197. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  198. package/dist/simple-tree/simpleSchema.d.ts +6 -21
  199. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  200. package/dist/simple-tree/simpleSchema.js.map +1 -1
  201. package/dist/simple-tree/toStoredSchema.d.ts +35 -11
  202. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  203. package/dist/simple-tree/toStoredSchema.js +68 -33
  204. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  205. package/dist/tableSchema.d.ts +25 -32
  206. package/dist/tableSchema.d.ts.map +1 -1
  207. package/dist/tableSchema.js +10 -24
  208. package/dist/tableSchema.js.map +1 -1
  209. package/docs/.attachments/cell-ordering/C-knows-of-ABC.png +0 -0
  210. package/docs/.attachments/cell-ordering/C-knows-of-C.png +0 -0
  211. package/docs/.attachments/cell-ordering/XvsA.png +0 -0
  212. package/docs/.attachments/cell-ordering/compose-a-b.png +0 -0
  213. package/docs/.attachments/cell-ordering/compose-a-ref-p1-b-ref-p2.png +0 -0
  214. package/docs/.attachments/cell-ordering/compose-b-no-ref-to-ca.png +0 -0
  215. package/docs/.attachments/cell-ordering/rebase-ab-over-x.png +0 -0
  216. package/docs/.attachments/cell-ordering/rebase-b-over-x.png +0 -0
  217. package/docs/.attachments/cell-ordering/rebase-b2-over-x.png +0 -0
  218. package/docs/.attachments/cell-ordering/rebase-b2.png +0 -0
  219. package/docs/.attachments/cell-ordering/rebase-to-abprime.png +0 -0
  220. package/docs/.attachments/cell-ordering/rebase-to-bprime.png +0 -0
  221. package/docs/main/cell-ordering.md +638 -0
  222. package/lib/alpha.d.ts +2 -1
  223. package/lib/core/tree/visitDelta.d.ts +1 -1
  224. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  225. package/lib/core/tree/visitDelta.js.map +1 -1
  226. package/lib/feature-libraries/chunked-forest/index.d.ts +1 -0
  227. package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  228. package/lib/feature-libraries/chunked-forest/index.js +1 -0
  229. package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
  230. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +2 -4
  231. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  232. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +4 -1
  233. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  234. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  235. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
  236. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  237. package/lib/feature-libraries/default-schema/noChangeCodecs.d.ts +1 -1
  238. package/lib/feature-libraries/default-schema/noChangeCodecs.d.ts.map +1 -1
  239. package/lib/feature-libraries/default-schema/noChangeCodecs.js.map +1 -1
  240. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +4 -0
  241. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  242. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -1
  243. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  244. package/lib/feature-libraries/index.d.ts +1 -1
  245. package/lib/feature-libraries/index.d.ts.map +1 -1
  246. package/lib/feature-libraries/index.js +1 -1
  247. package/lib/feature-libraries/index.js.map +1 -1
  248. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
  249. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  250. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
  251. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  252. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  253. package/lib/feature-libraries/modular-schema/genericFieldKind.js +1 -0
  254. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  255. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +1 -0
  256. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  257. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
  258. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  259. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +50 -21
  260. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  261. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  262. package/lib/feature-libraries/optional-field/optionalField.js +3 -0
  263. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  264. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
  265. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  266. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
  267. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  268. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.d.ts +1 -1
  269. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.d.ts.map +1 -1
  270. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  271. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  272. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +1 -1
  273. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  274. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  275. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  276. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts +1 -1
  277. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  278. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js +1 -1
  279. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  280. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts +1 -1
  281. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts.map +1 -1
  282. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.js.map +1 -1
  283. package/lib/feature-libraries/sequence-field/types.d.ts +1 -1
  284. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  285. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  286. package/lib/index.d.ts +1 -1
  287. package/lib/index.d.ts.map +1 -1
  288. package/lib/index.js +1 -1
  289. package/lib/index.js.map +1 -1
  290. package/lib/jsonDomainSchema.d.ts +5 -3
  291. package/lib/jsonDomainSchema.d.ts.map +1 -1
  292. package/lib/jsonDomainSchema.js.map +1 -1
  293. package/lib/packageVersion.d.ts +1 -1
  294. package/lib/packageVersion.js +1 -1
  295. package/lib/packageVersion.js.map +1 -1
  296. package/lib/shared-tree/independentView.d.ts.map +1 -1
  297. package/lib/shared-tree/independentView.js +2 -2
  298. package/lib/shared-tree/independentView.js.map +1 -1
  299. package/lib/shared-tree/index.d.ts +0 -1
  300. package/lib/shared-tree/index.d.ts.map +1 -1
  301. package/lib/shared-tree/index.js.map +1 -1
  302. package/lib/shared-tree/schematizeTree.d.ts +23 -60
  303. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  304. package/lib/shared-tree/schematizeTree.js +60 -150
  305. package/lib/shared-tree/schematizeTree.js.map +1 -1
  306. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  307. package/lib/shared-tree/schematizingTreeView.js +14 -14
  308. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  309. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  310. package/lib/shared-tree/treeAlpha.js +10 -4
  311. package/lib/shared-tree/treeAlpha.js.map +1 -1
  312. package/lib/shared-tree-core/defaultResubmitMachine.d.ts +2 -1
  313. package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  314. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  315. package/lib/simple-tree/api/configuration.d.ts +3 -0
  316. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  317. package/lib/simple-tree/api/configuration.js +6 -2
  318. package/lib/simple-tree/api/configuration.js.map +1 -1
  319. package/lib/simple-tree/api/create.d.ts +4 -4
  320. package/lib/simple-tree/api/create.d.ts.map +1 -1
  321. package/lib/simple-tree/api/create.js +3 -6
  322. package/lib/simple-tree/api/create.js.map +1 -1
  323. package/lib/simple-tree/api/discrepancies.d.ts +5 -9
  324. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
  325. package/lib/simple-tree/api/discrepancies.js +11 -10
  326. package/lib/simple-tree/api/discrepancies.js.map +1 -1
  327. package/lib/simple-tree/api/index.d.ts +3 -2
  328. package/lib/simple-tree/api/index.d.ts.map +1 -1
  329. package/lib/simple-tree/api/index.js +2 -1
  330. package/lib/simple-tree/api/index.js.map +1 -1
  331. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  332. package/lib/simple-tree/api/schemaCompatibilityTester.js +4 -5
  333. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  334. package/lib/simple-tree/api/schemaFactory.d.ts +9 -155
  335. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  336. package/lib/simple-tree/api/schemaFactory.js +2 -45
  337. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  338. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
  339. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  340. package/lib/simple-tree/api/schemaFactoryAlpha.js +23 -1
  341. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  342. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
  343. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  344. package/lib/simple-tree/api/schemaFactoryRecursive.js +0 -5
  345. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  346. package/lib/simple-tree/api/schemaStatics.d.ts +158 -0
  347. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -0
  348. package/lib/simple-tree/api/schemaStatics.js +56 -0
  349. package/lib/simple-tree/api/schemaStatics.js.map +1 -0
  350. package/lib/simple-tree/api/storedSchema.d.ts +5 -3
  351. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  352. package/lib/simple-tree/api/storedSchema.js +6 -4
  353. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  354. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  355. package/lib/simple-tree/api/treeBeta.js +8 -2
  356. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  357. package/lib/simple-tree/core/allowedTypes.d.ts +46 -30
  358. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  359. package/lib/simple-tree/core/allowedTypes.js +23 -12
  360. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  361. package/lib/simple-tree/core/index.d.ts +5 -3
  362. package/lib/simple-tree/core/index.d.ts.map +1 -1
  363. package/lib/simple-tree/core/index.js +3 -2
  364. package/lib/simple-tree/core/index.js.map +1 -1
  365. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
  366. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
  367. package/lib/simple-tree/core/simpleNodeSchemaBase.js +6 -0
  368. package/lib/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
  369. package/lib/simple-tree/core/toStored.d.ts +32 -0
  370. package/lib/simple-tree/core/toStored.d.ts.map +1 -0
  371. package/lib/simple-tree/core/toStored.js +32 -0
  372. package/lib/simple-tree/core/toStored.js.map +1 -0
  373. package/lib/simple-tree/core/treeNode.d.ts +0 -3
  374. package/lib/simple-tree/core/treeNode.d.ts.map +1 -1
  375. package/lib/simple-tree/core/treeNode.js +3 -3
  376. package/lib/simple-tree/core/treeNode.js.map +1 -1
  377. package/lib/simple-tree/core/treeNodeSchema.d.ts +7 -2
  378. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  379. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  380. package/lib/simple-tree/core/treeNodeValid.d.ts +6 -1
  381. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  382. package/lib/simple-tree/core/treeNodeValid.js +9 -5
  383. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  384. package/lib/simple-tree/core/walkSchema.d.ts +19 -5
  385. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  386. package/lib/simple-tree/core/walkSchema.js +4 -2
  387. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  388. package/lib/simple-tree/createContext.d.ts.map +1 -1
  389. package/lib/simple-tree/createContext.js +2 -2
  390. package/lib/simple-tree/createContext.js.map +1 -1
  391. package/lib/simple-tree/fieldSchema.d.ts +2 -1
  392. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  393. package/lib/simple-tree/fieldSchema.js +1 -1
  394. package/lib/simple-tree/fieldSchema.js.map +1 -1
  395. package/lib/simple-tree/index.d.ts +4 -4
  396. package/lib/simple-tree/index.d.ts.map +1 -1
  397. package/lib/simple-tree/index.js +2 -2
  398. package/lib/simple-tree/index.js.map +1 -1
  399. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  400. package/lib/simple-tree/leafNodeSchema.js +2 -1
  401. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  402. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  403. package/lib/simple-tree/node-kinds/array/arrayNode.js +21 -7
  404. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  405. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  406. package/lib/simple-tree/node-kinds/map/mapNode.js +12 -5
  407. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  408. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -2
  409. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  410. package/lib/simple-tree/node-kinds/object/objectNode.js +16 -5
  411. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  412. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  413. package/lib/simple-tree/node-kinds/record/recordNode.js +12 -5
  414. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  415. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  416. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  417. package/lib/simple-tree/prepareForInsertion.js +10 -10
  418. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  419. package/lib/simple-tree/simpleSchema.d.ts +6 -21
  420. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  421. package/lib/simple-tree/simpleSchema.js.map +1 -1
  422. package/lib/simple-tree/toStoredSchema.d.ts +35 -11
  423. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  424. package/lib/simple-tree/toStoredSchema.js +67 -34
  425. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  426. package/lib/tableSchema.d.ts +25 -32
  427. package/lib/tableSchema.d.ts.map +1 -1
  428. package/lib/tableSchema.js +11 -25
  429. package/lib/tableSchema.js.map +1 -1
  430. package/package.json +21 -21
  431. package/src/core/tree/visitDelta.ts +3 -1
  432. package/src/feature-libraries/chunked-forest/index.ts +1 -0
  433. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +12 -5
  434. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -0
  435. package/src/feature-libraries/default-schema/noChangeCodecs.ts +1 -1
  436. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -1
  437. package/src/feature-libraries/index.ts +2 -0
  438. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +9 -0
  439. package/src/feature-libraries/modular-schema/genericFieldKind.ts +1 -0
  440. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +1 -0
  441. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +61 -19
  442. package/src/feature-libraries/optional-field/optionalField.ts +4 -0
  443. package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +4 -0
  444. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +4 -2
  445. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +4 -2
  446. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +4 -2
  447. package/src/feature-libraries/sequence-field/sequenceFieldCodecs.ts +1 -1
  448. package/src/feature-libraries/sequence-field/types.ts +1 -1
  449. package/src/index.ts +2 -1
  450. package/src/jsonDomainSchema.ts +4 -0
  451. package/src/packageVersion.ts +1 -1
  452. package/src/shared-tree/independentView.ts +6 -2
  453. package/src/shared-tree/index.ts +0 -2
  454. package/src/shared-tree/schematizeTree.ts +83 -199
  455. package/src/shared-tree/schematizingTreeView.ts +26 -12
  456. package/src/shared-tree/treeAlpha.ts +18 -4
  457. package/src/shared-tree-core/defaultResubmitMachine.ts +2 -1
  458. package/src/simple-tree/api/configuration.ts +10 -2
  459. package/src/simple-tree/api/create.ts +5 -10
  460. package/src/simple-tree/api/discrepancies.ts +18 -17
  461. package/src/simple-tree/api/index.ts +2 -3
  462. package/src/simple-tree/api/schemaCompatibilityTester.ts +5 -9
  463. package/src/simple-tree/api/schemaFactory.ts +6 -250
  464. package/src/simple-tree/api/schemaFactoryAlpha.ts +174 -1
  465. package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -25
  466. package/src/simple-tree/api/schemaStatics.ts +291 -0
  467. package/src/simple-tree/api/storedSchema.ts +12 -5
  468. package/src/simple-tree/api/treeBeta.ts +9 -2
  469. package/src/simple-tree/core/allowedTypes.ts +71 -42
  470. package/src/simple-tree/core/index.ts +9 -1
  471. package/src/simple-tree/core/simpleNodeSchemaBase.ts +30 -0
  472. package/src/simple-tree/core/toStored.ts +58 -0
  473. package/src/simple-tree/core/treeNode.ts +3 -3
  474. package/src/simple-tree/core/treeNodeSchema.ts +8 -2
  475. package/src/simple-tree/core/treeNodeValid.ts +14 -5
  476. package/src/simple-tree/core/walkSchema.ts +23 -6
  477. package/src/simple-tree/createContext.ts +5 -2
  478. package/src/simple-tree/fieldSchema.ts +4 -2
  479. package/src/simple-tree/index.ts +15 -6
  480. package/src/simple-tree/leafNodeSchema.ts +2 -1
  481. package/src/simple-tree/node-kinds/array/arrayNode.ts +58 -37
  482. package/src/simple-tree/node-kinds/map/mapNode.ts +26 -2
  483. package/src/simple-tree/node-kinds/object/objectNode.ts +37 -4
  484. package/src/simple-tree/node-kinds/record/recordNode.ts +23 -2
  485. package/src/simple-tree/prepareForInsertion.ts +12 -7
  486. package/src/simple-tree/simpleSchema.ts +6 -26
  487. package/src/simple-tree/toStoredSchema.ts +107 -44
  488. package/src/tableSchema.ts +40 -35
@@ -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,
@@ -42,7 +47,10 @@ export type AllowedTypes = readonly LazyItem<TreeNodeSchema>[];
42
47
 
43
48
  /**
44
49
  * Stores annotations for an individual allowed type.
50
+ * @remarks
51
+ * Create using APIs on {@link SchemaFactoryAlpha}, like {@link SchemaStaticsAlpha.staged}.
45
52
  * @alpha
53
+ * @sealed
46
54
  */
47
55
  export interface AnnotatedAllowedType<T = LazyItem<TreeNodeSchema>> {
48
56
  /**
@@ -56,19 +64,12 @@ export interface AnnotatedAllowedType<T = LazyItem<TreeNodeSchema>> {
56
64
  }
57
65
 
58
66
  /**
59
- * Stores annotations for a set of evaluated annotated allowed types.
67
+ * {@link AnnotatedAllowedTypes} but with the lazy schema references eagerly evaluated.
68
+ * @sealed
60
69
  * @alpha
61
70
  */
62
- export interface NormalizedAnnotatedAllowedTypes {
63
- /**
64
- * Annotations that apply to a set of allowed types.
65
- */
66
- readonly metadata: AllowedTypesMetadata;
67
- /**
68
- * All the evaluated allowed types that the annotations apply to. The types themselves are also individually annotated.
69
- */
70
- readonly types: readonly AnnotatedAllowedType<TreeNodeSchema>[];
71
- }
71
+ export interface NormalizedAnnotatedAllowedTypes
72
+ extends AnnotatedAllowedTypes<TreeNodeSchema> {}
72
73
 
73
74
  /**
74
75
  * Checks if the input is an {@link AnnotatedAllowedTypes}.
@@ -86,8 +87,9 @@ export function isAnnotatedAllowedTypes(
86
87
  /**
87
88
  * Stores annotations for a set of allowed types.
88
89
  * @alpha
90
+ * @sealed
89
91
  */
90
- export interface AnnotatedAllowedTypes {
92
+ export interface AnnotatedAllowedTypes<T = LazyItem<TreeNodeSchema>> {
91
93
  /**
92
94
  * Annotations that apply to a set of allowed types.
93
95
  */
@@ -95,7 +97,7 @@ export interface AnnotatedAllowedTypes {
95
97
  /**
96
98
  * All the allowed types that the annotations apply to. The types themselves may also have individual annotations.
97
99
  */
98
- readonly types: readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[];
100
+ readonly types: readonly AnnotatedAllowedType<T>[];
99
101
  }
100
102
 
101
103
  /**
@@ -103,6 +105,7 @@ export interface AnnotatedAllowedTypes {
103
105
  * @remarks
104
106
  * Additional optionals may be added to this as non-breaking changes, so implementations of it should be simple object literals with no unlisted members.
105
107
  * @alpha
108
+ * @input
106
109
  */
107
110
  export interface AllowedTypesMetadata {
108
111
  /**
@@ -127,6 +130,7 @@ export function isAnnotatedAllowedType(
127
130
  * @remarks
128
131
  * Additional optionals may be added to this as non-breaking changes, so implementations of it should be simple object literals with no unlisted members.
129
132
  * @alpha
133
+ * @input
130
134
  */
131
135
  export interface AllowedTypeMetadata {
132
136
  /**
@@ -134,7 +138,34 @@ export interface AllowedTypeMetadata {
134
138
  */
135
139
  readonly custom?: unknown;
136
140
 
137
- // TODO metadata for enablable types will be added here
141
+ /**
142
+ * If defined, indicates that an allowed type is {@link SchemaStaticsAlpha.staged | staged}.
143
+ */
144
+ readonly stagedSchemaUpgrade?: SchemaUpgrade;
145
+ }
146
+
147
+ /**
148
+ * Package internal {@link SchemaUpgrade} construction API.
149
+ */
150
+ export let createSchemaUpgrade: () => SchemaUpgrade;
151
+
152
+ /**
153
+ * Unique token used to upgrade schemas and determine if a particular upgrade has been completed.
154
+ * @remarks
155
+ * Create using {@link SchemaStaticsAlpha.staged}.
156
+ * @privateRemarks
157
+ * TODO:#38722 implement runtime schema upgrades.
158
+ * Until then, the class purely behaves mostly as a placeholder.
159
+ * TODO: Consider allowing users to store a name for the upgrade to use in error messages.
160
+ * @sealed @alpha
161
+ */
162
+ export class SchemaUpgrade {
163
+ protected _typeCheck!: MakeNominal;
164
+ static {
165
+ createSchemaUpgrade = () => new SchemaUpgrade();
166
+ }
167
+
168
+ private constructor() {}
138
169
  }
139
170
 
140
171
  /**
@@ -176,6 +207,7 @@ export type ImplicitAllowedTypes = AllowedTypes | TreeNodeSchema;
176
207
  * Types of {@link TreeNode|TreeNodes} or {@link TreeLeafValue|TreeLeafValues} allowed at a location in a tree with
177
208
  * additional metadata associated with the location they're allowed at.
178
209
  * @alpha
210
+ * @input
179
211
  */
180
212
  export type ImplicitAnnotatedAllowedTypes =
181
213
  | TreeNodeSchema
@@ -191,12 +223,21 @@ 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
- : T extends TreeNodeSchema
229
+ : // This should able to just return `T` here, however doing so breaks generic code in ArrayNode.
230
+ T extends TreeNodeSchema
198
231
  ? T
199
- : never;
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;
200
241
 
201
242
  /**
202
243
  * Removes annotations from a list of allowed types that may contain annotations.
@@ -205,17 +246,9 @@ export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTyp
205
246
  export type UnannotateAllowedTypesList<
206
247
  T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
207
248
  > = {
208
- [I in keyof T]: UnannotateAllowedTypeOrLazyItem<T[I]>;
249
+ [I in keyof T]: UnannotateAllowedType<T[I]>;
209
250
  };
210
251
 
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
252
  /**
220
253
  * Removes all annotations from a set of allowed types.
221
254
  * @system @alpha
@@ -225,10 +258,15 @@ export type UnannotateAllowedTypes<T extends AnnotatedAllowedTypes> =
225
258
 
226
259
  /**
227
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.
228
266
  * @system @alpha
229
267
  */
230
268
  export type UnannotateAllowedType<T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>> =
231
- T extends AnnotatedAllowedType<infer X> ? [X] : T;
269
+ T extends AnnotatedAllowedType<infer X> ? X : T;
232
270
 
233
271
  /**
234
272
  * Normalizes a {@link ImplicitAllowedTypes} to a set of {@link TreeNodeSchema}s, by eagerly evaluating any
@@ -258,22 +296,13 @@ export function normalizeAllowedTypes(
258
296
  }
259
297
 
260
298
  /**
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.
299
+ * Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist.
268
300
  */
269
- export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema>(
270
- type: T | AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>>,
301
+ export function normalizeToAnnotatedAllowedType<T extends LazyItem<TreeNodeSchema>>(
302
+ type: T | AnnotatedAllowedType<T>,
271
303
  ): AnnotatedAllowedType<T> {
272
304
  return isAnnotatedAllowedType(type)
273
- ? {
274
- metadata: type.metadata,
275
- type: evaluateLazySchema(type.type),
276
- }
305
+ ? type
277
306
  : {
278
307
  metadata: {},
279
308
  type,
@@ -375,7 +404,7 @@ export function evaluateLazySchema<T extends TreeNodeSchema>(value: LazyItem<T>)
375
404
  * Throws a UsageError if the provided schema is undefined, most likely due to being used before it was initialized.
376
405
  */
377
406
  export function checkForUninitializedSchema(
378
- schema: ImplicitAnnotatedAllowedTypes | LazyItem<TreeNodeSchema>,
407
+ schema: ImplicitAnnotatedAllowedTypes | LazyItem<TreeNodeSchema> | AnnotatedAllowedType,
379
408
  ): void {
380
409
  if (schema === undefined) {
381
410
  throw new UsageError(
@@ -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
+ }