@fluidframework/tree 2.51.0 → 2.52.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 (579) hide show
  1. package/.vscode/settings.json +0 -1
  2. package/CHANGELOG.md +43 -0
  3. package/api-report/tree.alpha.api.md +3 -2
  4. package/dist/codec/codec.d.ts +2 -1
  5. package/dist/codec/codec.d.ts.map +1 -1
  6. package/dist/codec/codec.js +4 -3
  7. package/dist/codec/codec.js.map +1 -1
  8. package/dist/core/index.d.ts +1 -1
  9. package/dist/core/index.d.ts.map +1 -1
  10. package/dist/core/index.js +3 -2
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/core/rebase/index.d.ts +1 -1
  13. package/dist/core/rebase/index.d.ts.map +1 -1
  14. package/dist/core/rebase/index.js +2 -1
  15. package/dist/core/rebase/index.js.map +1 -1
  16. package/dist/core/rebase/types.d.ts +3 -1
  17. package/dist/core/rebase/types.d.ts.map +1 -1
  18. package/dist/core/rebase/types.js +2 -1
  19. package/dist/core/rebase/types.js.map +1 -1
  20. package/dist/core/schema-stored/schema.d.ts +1 -23
  21. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  22. package/dist/core/schema-stored/schema.js +2 -2
  23. package/dist/core/schema-stored/schema.js.map +1 -1
  24. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  25. package/dist/core/tree/detachedFieldIndex.js +2 -3
  26. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  27. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  28. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  29. package/dist/core/tree/detachedFieldIndexCodecCommon.js +68 -0
  30. package/dist/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  31. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  32. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  33. package/dist/core/tree/detachedFieldIndexCodecV1.js +55 -0
  34. package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  35. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  36. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  37. package/dist/core/tree/detachedFieldIndexCodecV2.js +49 -0
  38. package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  39. package/dist/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  40. package/dist/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  41. package/dist/core/tree/detachedFieldIndexCodecs.js +26 -0
  42. package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  43. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  44. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  45. package/dist/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +18 -13
  46. package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  47. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  48. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  49. package/dist/core/tree/detachedFieldIndexFormatV1.js +12 -0
  50. package/dist/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  51. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  52. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  53. package/dist/core/tree/detachedFieldIndexFormatV2.js +14 -0
  54. package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  55. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  56. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  57. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +21 -21
  58. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  59. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  60. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  61. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  62. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  64. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  65. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +74 -61
  66. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  67. package/dist/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  68. package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  69. package/dist/feature-libraries/chunked-forest/codec/format.js +18 -12
  70. package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  71. package/{lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts → dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  72. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  73. package/dist/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +23 -17
  74. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  75. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  76. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  77. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +22 -22
  78. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  79. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  80. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  81. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  82. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  83. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  84. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  85. package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  86. package/dist/feature-libraries/default-schema/defaultSchema.js +0 -2
  87. package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  88. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  89. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  90. package/dist/feature-libraries/default-schema/index.js +2 -2
  91. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  92. package/dist/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  93. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  94. package/dist/feature-libraries/default-schema/schemaChecker.js +31 -26
  95. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  96. package/dist/feature-libraries/index.d.ts +1 -2
  97. package/dist/feature-libraries/index.d.ts.map +1 -1
  98. package/dist/feature-libraries/index.js +2 -4
  99. package/dist/feature-libraries/index.js.map +1 -1
  100. package/dist/feature-libraries/modular-schema/comparison.d.ts +5 -6
  101. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  102. package/dist/feature-libraries/modular-schema/comparison.js +15 -16
  103. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  104. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  105. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  106. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  107. package/dist/feature-libraries/object-forest/objectForest.js +2 -3
  108. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +6 -2
  112. package/dist/index.js.map +1 -1
  113. package/dist/packageVersion.d.ts +1 -1
  114. package/dist/packageVersion.js +1 -1
  115. package/dist/packageVersion.js.map +1 -1
  116. package/dist/shared-tree/independentView.d.ts +8 -0
  117. package/dist/shared-tree/independentView.d.ts.map +1 -1
  118. package/dist/shared-tree/independentView.js +23 -11
  119. package/dist/shared-tree/independentView.js.map +1 -1
  120. package/dist/shared-tree/schematizeTree.js +1 -1
  121. package/dist/shared-tree/schematizeTree.js.map +1 -1
  122. package/dist/shared-tree/schematizingTreeView.d.ts +0 -1
  123. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  124. package/dist/shared-tree/schematizingTreeView.js +7 -10
  125. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  126. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  127. package/dist/shared-tree/sharedTree.js +1 -29
  128. package/dist/shared-tree/sharedTree.js.map +1 -1
  129. package/dist/shared-tree/treeAlpha.d.ts +20 -6
  130. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  131. package/dist/shared-tree/treeAlpha.js +9 -4
  132. package/dist/shared-tree/treeAlpha.js.map +1 -1
  133. package/dist/shared-tree/treeCheckout.d.ts +2 -1
  134. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  135. package/dist/shared-tree/treeCheckout.js +32 -0
  136. package/dist/shared-tree/treeCheckout.js.map +1 -1
  137. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  138. package/dist/shared-tree-core/branch.js +1 -1
  139. package/dist/shared-tree-core/branch.js.map +1 -1
  140. package/dist/simple-tree/api/conciseTree.d.ts +2 -2
  141. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  142. package/dist/simple-tree/api/conciseTree.js +6 -6
  143. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  144. package/dist/simple-tree/api/configuration.d.ts +8 -2
  145. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  146. package/dist/simple-tree/api/configuration.js.map +1 -1
  147. package/dist/simple-tree/api/create.d.ts +8 -7
  148. package/dist/simple-tree/api/create.d.ts.map +1 -1
  149. package/dist/simple-tree/api/create.js +35 -22
  150. package/dist/simple-tree/api/create.js.map +1 -1
  151. package/dist/simple-tree/api/customTree.d.ts +25 -4
  152. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  153. package/dist/simple-tree/api/customTree.js +42 -16
  154. package/dist/simple-tree/api/customTree.js.map +1 -1
  155. package/dist/simple-tree/api/discrepancies.d.ts +98 -0
  156. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
  157. package/dist/simple-tree/api/discrepancies.js +255 -0
  158. package/dist/simple-tree/api/discrepancies.js.map +1 -0
  159. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +9 -7
  160. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  161. package/dist/simple-tree/api/schemaCompatibilityTester.js +18 -117
  162. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  163. package/dist/simple-tree/api/schemaFactory.d.ts +7 -4
  164. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  165. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  166. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  167. package/dist/simple-tree/api/storedSchema.js +5 -1
  168. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  169. package/dist/simple-tree/api/treeBeta.d.ts +2 -2
  170. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  171. package/dist/simple-tree/api/treeBeta.js +10 -4
  172. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  173. package/dist/simple-tree/api/verboseTree.d.ts +2 -2
  174. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  175. package/dist/simple-tree/api/verboseTree.js +15 -15
  176. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  177. package/dist/simple-tree/core/allowedTypes.d.ts +20 -4
  178. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  179. package/dist/simple-tree/core/allowedTypes.js +45 -13
  180. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  181. package/dist/simple-tree/core/context.d.ts +13 -2
  182. package/dist/simple-tree/core/context.d.ts.map +1 -1
  183. package/dist/simple-tree/core/context.js +22 -9
  184. package/dist/simple-tree/core/context.js.map +1 -1
  185. package/dist/simple-tree/core/index.d.ts +2 -2
  186. package/dist/simple-tree/core/index.d.ts.map +1 -1
  187. package/dist/simple-tree/core/index.js +3 -1
  188. package/dist/simple-tree/core/index.js.map +1 -1
  189. package/dist/simple-tree/core/treeNodeKernel.d.ts +1 -1
  190. package/dist/simple-tree/core/treeNodeKernel.js +1 -1
  191. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  192. package/dist/simple-tree/core/treeNodeValid.d.ts +1 -1
  193. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  194. package/dist/simple-tree/core/treeNodeValid.js +8 -1
  195. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  196. package/dist/simple-tree/core/walkSchema.d.ts +3 -0
  197. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  198. package/dist/simple-tree/core/walkSchema.js +2 -0
  199. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  200. package/dist/simple-tree/createContext.d.ts +2 -0
  201. package/dist/simple-tree/createContext.d.ts.map +1 -1
  202. package/dist/simple-tree/createContext.js +3 -1
  203. package/dist/simple-tree/createContext.js.map +1 -1
  204. package/dist/simple-tree/fieldSchema.d.ts +1 -0
  205. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  206. package/dist/simple-tree/fieldSchema.js +1 -0
  207. package/dist/simple-tree/fieldSchema.js.map +1 -1
  208. package/dist/simple-tree/index.d.ts +4 -4
  209. package/dist/simple-tree/index.d.ts.map +1 -1
  210. package/dist/simple-tree/index.js +7 -8
  211. package/dist/simple-tree/index.js.map +1 -1
  212. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  213. package/dist/simple-tree/node-kinds/array/arrayNode.js +1 -1
  214. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  215. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  216. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  217. package/dist/simple-tree/node-kinds/index.js +1 -2
  218. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  219. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  220. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  221. package/dist/simple-tree/node-kinds/object/index.js +1 -2
  222. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  223. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  224. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  225. package/dist/simple-tree/node-kinds/object/objectNode.js +4 -18
  226. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  227. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  228. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  229. package/dist/simple-tree/prepareForInsertion.js +9 -3
  230. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  231. package/dist/simple-tree/toStoredSchema.d.ts +3 -0
  232. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  233. package/dist/simple-tree/toStoredSchema.js +3 -0
  234. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  235. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  236. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  237. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  238. package/dist/simple-tree/walkFieldSchema.d.ts +1 -0
  239. package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
  240. package/dist/simple-tree/walkFieldSchema.js +1 -0
  241. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  242. package/lib/codec/codec.d.ts +2 -1
  243. package/lib/codec/codec.d.ts.map +1 -1
  244. package/lib/codec/codec.js +4 -3
  245. package/lib/codec/codec.js.map +1 -1
  246. package/lib/core/index.d.ts +1 -1
  247. package/lib/core/index.d.ts.map +1 -1
  248. package/lib/core/index.js +1 -1
  249. package/lib/core/index.js.map +1 -1
  250. package/lib/core/rebase/index.d.ts +1 -1
  251. package/lib/core/rebase/index.d.ts.map +1 -1
  252. package/lib/core/rebase/index.js +1 -1
  253. package/lib/core/rebase/index.js.map +1 -1
  254. package/lib/core/rebase/types.d.ts +3 -1
  255. package/lib/core/rebase/types.d.ts.map +1 -1
  256. package/lib/core/rebase/types.js +1 -0
  257. package/lib/core/rebase/types.js.map +1 -1
  258. package/lib/core/schema-stored/schema.d.ts +1 -23
  259. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  260. package/lib/core/schema-stored/schema.js +2 -2
  261. package/lib/core/schema-stored/schema.js.map +1 -1
  262. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  263. package/lib/core/tree/detachedFieldIndex.js +2 -3
  264. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  265. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  266. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  267. package/lib/core/tree/detachedFieldIndexCodecCommon.js +64 -0
  268. package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  269. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  270. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  271. package/lib/core/tree/detachedFieldIndexCodecV1.js +51 -0
  272. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  273. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  274. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  275. package/lib/core/tree/detachedFieldIndexCodecV2.js +45 -0
  276. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  277. package/lib/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  278. package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  279. package/lib/core/tree/detachedFieldIndexCodecs.js +21 -0
  280. package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  281. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  282. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  283. package/lib/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +13 -10
  284. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  285. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  286. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  287. package/lib/core/tree/detachedFieldIndexFormatV1.js +9 -0
  288. package/lib/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  289. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  290. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  291. package/lib/core/tree/detachedFieldIndexFormatV2.js +11 -0
  292. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  293. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  294. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  295. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +19 -19
  296. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  297. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  298. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  299. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  300. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  301. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  302. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  303. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +70 -57
  304. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  305. package/lib/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  306. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  307. package/lib/feature-libraries/chunked-forest/codec/format.js +17 -11
  308. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  309. package/{dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts → lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  310. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  311. package/lib/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +21 -15
  312. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  313. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  314. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  315. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +19 -19
  316. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  317. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  318. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  319. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  320. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  321. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  322. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  323. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  324. package/lib/feature-libraries/default-schema/defaultSchema.js +0 -2
  325. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  326. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  327. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  328. package/lib/feature-libraries/default-schema/index.js +1 -1
  329. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  330. package/lib/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  331. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  332. package/lib/feature-libraries/default-schema/schemaChecker.js +29 -24
  333. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  334. package/lib/feature-libraries/index.d.ts +1 -2
  335. package/lib/feature-libraries/index.d.ts.map +1 -1
  336. package/lib/feature-libraries/index.js +1 -2
  337. package/lib/feature-libraries/index.js.map +1 -1
  338. package/lib/feature-libraries/modular-schema/comparison.d.ts +5 -6
  339. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  340. package/lib/feature-libraries/modular-schema/comparison.js +14 -14
  341. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  342. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  343. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  344. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  345. package/lib/feature-libraries/object-forest/objectForest.js +3 -4
  346. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  347. package/lib/index.d.ts +1 -1
  348. package/lib/index.d.ts.map +1 -1
  349. package/lib/index.js +2 -2
  350. package/lib/index.js.map +1 -1
  351. package/lib/packageVersion.d.ts +1 -1
  352. package/lib/packageVersion.js +1 -1
  353. package/lib/packageVersion.js.map +1 -1
  354. package/lib/shared-tree/independentView.d.ts +8 -0
  355. package/lib/shared-tree/independentView.d.ts.map +1 -1
  356. package/lib/shared-tree/independentView.js +21 -10
  357. package/lib/shared-tree/independentView.js.map +1 -1
  358. package/lib/shared-tree/schematizeTree.js +1 -1
  359. package/lib/shared-tree/schematizeTree.js.map +1 -1
  360. package/lib/shared-tree/schematizingTreeView.d.ts +0 -1
  361. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  362. package/lib/shared-tree/schematizingTreeView.js +8 -11
  363. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  364. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  365. package/lib/shared-tree/sharedTree.js +2 -30
  366. package/lib/shared-tree/sharedTree.js.map +1 -1
  367. package/lib/shared-tree/treeAlpha.d.ts +20 -6
  368. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  369. package/lib/shared-tree/treeAlpha.js +10 -5
  370. package/lib/shared-tree/treeAlpha.js.map +1 -1
  371. package/lib/shared-tree/treeCheckout.d.ts +2 -1
  372. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  373. package/lib/shared-tree/treeCheckout.js +33 -1
  374. package/lib/shared-tree/treeCheckout.js.map +1 -1
  375. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  376. package/lib/shared-tree-core/branch.js +1 -1
  377. package/lib/shared-tree-core/branch.js.map +1 -1
  378. package/lib/simple-tree/api/conciseTree.d.ts +2 -2
  379. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  380. package/lib/simple-tree/api/conciseTree.js +6 -6
  381. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  382. package/lib/simple-tree/api/configuration.d.ts +8 -2
  383. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  384. package/lib/simple-tree/api/configuration.js.map +1 -1
  385. package/lib/simple-tree/api/create.d.ts +8 -7
  386. package/lib/simple-tree/api/create.d.ts.map +1 -1
  387. package/lib/simple-tree/api/create.js +38 -25
  388. package/lib/simple-tree/api/create.js.map +1 -1
  389. package/lib/simple-tree/api/customTree.d.ts +25 -4
  390. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  391. package/lib/simple-tree/api/customTree.js +43 -17
  392. package/lib/simple-tree/api/customTree.js.map +1 -1
  393. package/lib/simple-tree/api/discrepancies.d.ts +98 -0
  394. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
  395. package/lib/simple-tree/{discrepancies.js → api/discrepancies.js} +80 -206
  396. package/lib/simple-tree/api/discrepancies.js.map +1 -0
  397. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +9 -7
  398. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  399. package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -118
  400. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  401. package/lib/simple-tree/api/schemaFactory.d.ts +7 -4
  402. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  403. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  404. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  405. package/lib/simple-tree/api/storedSchema.js +6 -2
  406. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  407. package/lib/simple-tree/api/treeBeta.d.ts +2 -2
  408. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  409. package/lib/simple-tree/api/treeBeta.js +8 -2
  410. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  411. package/lib/simple-tree/api/verboseTree.d.ts +2 -2
  412. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  413. package/lib/simple-tree/api/verboseTree.js +9 -9
  414. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  415. package/lib/simple-tree/core/allowedTypes.d.ts +20 -4
  416. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  417. package/lib/simple-tree/core/allowedTypes.js +42 -12
  418. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  419. package/lib/simple-tree/core/context.d.ts +13 -2
  420. package/lib/simple-tree/core/context.d.ts.map +1 -1
  421. package/lib/simple-tree/core/context.js +22 -9
  422. package/lib/simple-tree/core/context.js.map +1 -1
  423. package/lib/simple-tree/core/index.d.ts +2 -2
  424. package/lib/simple-tree/core/index.d.ts.map +1 -1
  425. package/lib/simple-tree/core/index.js +2 -2
  426. package/lib/simple-tree/core/index.js.map +1 -1
  427. package/lib/simple-tree/core/treeNodeKernel.d.ts +1 -1
  428. package/lib/simple-tree/core/treeNodeKernel.js +1 -1
  429. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  430. package/lib/simple-tree/core/treeNodeValid.d.ts +1 -1
  431. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  432. package/lib/simple-tree/core/treeNodeValid.js +8 -1
  433. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  434. package/lib/simple-tree/core/walkSchema.d.ts +3 -0
  435. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  436. package/lib/simple-tree/core/walkSchema.js +2 -0
  437. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  438. package/lib/simple-tree/createContext.d.ts +2 -0
  439. package/lib/simple-tree/createContext.d.ts.map +1 -1
  440. package/lib/simple-tree/createContext.js +3 -1
  441. package/lib/simple-tree/createContext.js.map +1 -1
  442. package/lib/simple-tree/fieldSchema.d.ts +1 -0
  443. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  444. package/lib/simple-tree/fieldSchema.js +1 -0
  445. package/lib/simple-tree/fieldSchema.js.map +1 -1
  446. package/lib/simple-tree/index.d.ts +4 -4
  447. package/lib/simple-tree/index.d.ts.map +1 -1
  448. package/lib/simple-tree/index.js +4 -4
  449. package/lib/simple-tree/index.js.map +1 -1
  450. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  451. package/lib/simple-tree/node-kinds/array/arrayNode.js +1 -1
  452. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  453. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  454. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  455. package/lib/simple-tree/node-kinds/index.js +1 -1
  456. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  457. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  458. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  459. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  460. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  461. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  462. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  463. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -16
  464. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  465. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  466. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  467. package/lib/simple-tree/prepareForInsertion.js +11 -5
  468. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  469. package/lib/simple-tree/toStoredSchema.d.ts +3 -0
  470. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  471. package/lib/simple-tree/toStoredSchema.js +3 -0
  472. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  473. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  474. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  475. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  476. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  477. package/lib/simple-tree/walkFieldSchema.d.ts +1 -0
  478. package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
  479. package/lib/simple-tree/walkFieldSchema.js +1 -0
  480. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  481. package/package.json +23 -23
  482. package/src/codec/codec.ts +4 -3
  483. package/src/core/index.ts +2 -0
  484. package/src/core/rebase/index.ts +2 -0
  485. package/src/core/rebase/types.ts +4 -0
  486. package/src/core/schema-stored/schema.ts +2 -26
  487. package/src/core/tree/detachedFieldIndex.ts +4 -6
  488. package/src/core/tree/detachedFieldIndexCodecCommon.ts +87 -0
  489. package/src/core/tree/{detachedFieldIndexCodec.ts → detachedFieldIndexCodecV1.ts} +22 -68
  490. package/src/core/tree/detachedFieldIndexCodecV2.ts +72 -0
  491. package/src/core/tree/detachedFieldIndexCodecs.ts +44 -0
  492. package/src/core/tree/{detachedFieldIndexFormat.ts → detachedFieldIndexFormatCommon.ts} +32 -23
  493. package/src/core/tree/detachedFieldIndexFormatV1.ts +15 -0
  494. package/src/core/tree/detachedFieldIndexFormatV2.ts +17 -0
  495. package/src/feature-libraries/chunked-forest/codec/README.md +1 -1
  496. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +25 -25
  497. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -6
  498. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +96 -73
  499. package/src/feature-libraries/chunked-forest/codec/format.ts +20 -14
  500. package/src/feature-libraries/chunked-forest/codec/{nodeShape.ts → nodeEncoder.ts} +23 -17
  501. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +34 -34
  502. package/src/feature-libraries/chunked-forest/codec/uncompressedEncode.ts +5 -5
  503. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +10 -0
  504. package/src/feature-libraries/default-schema/defaultSchema.ts +0 -2
  505. package/src/feature-libraries/default-schema/index.ts +1 -1
  506. package/src/feature-libraries/default-schema/schemaChecker.ts +47 -30
  507. package/src/feature-libraries/index.ts +1 -3
  508. package/src/feature-libraries/modular-schema/comparison.ts +14 -29
  509. package/src/feature-libraries/object-forest/objectForest.ts +10 -6
  510. package/src/index.ts +5 -0
  511. package/src/packageVersion.ts +1 -1
  512. package/src/shared-tree/independentView.ts +45 -19
  513. package/src/shared-tree/schematizeTree.ts +1 -1
  514. package/src/shared-tree/schematizingTreeView.ts +16 -13
  515. package/src/shared-tree/sharedTree.ts +2 -42
  516. package/src/shared-tree/treeAlpha.ts +30 -18
  517. package/src/shared-tree/treeCheckout.ts +54 -10
  518. package/src/shared-tree-core/branch.ts +1 -6
  519. package/src/simple-tree/api/conciseTree.ts +9 -7
  520. package/src/simple-tree/api/configuration.ts +8 -2
  521. package/src/simple-tree/api/create.ts +49 -36
  522. package/src/simple-tree/api/customTree.ts +59 -20
  523. package/src/simple-tree/{discrepancies.ts → api/discrepancies.ts} +128 -303
  524. package/src/simple-tree/api/schemaCompatibilityTester.ts +27 -151
  525. package/src/simple-tree/api/schemaFactory.ts +7 -4
  526. package/src/simple-tree/api/storedSchema.ts +6 -9
  527. package/src/simple-tree/api/treeBeta.ts +17 -4
  528. package/src/simple-tree/api/verboseTree.ts +17 -8
  529. package/src/simple-tree/core/allowedTypes.ts +54 -21
  530. package/src/simple-tree/core/context.ts +24 -22
  531. package/src/simple-tree/core/index.ts +2 -1
  532. package/src/simple-tree/core/treeNodeKernel.ts +1 -1
  533. package/src/simple-tree/core/treeNodeValid.ts +9 -2
  534. package/src/simple-tree/core/walkSchema.ts +3 -0
  535. package/src/simple-tree/createContext.ts +6 -1
  536. package/src/simple-tree/fieldSchema.ts +1 -0
  537. package/src/simple-tree/index.ts +5 -10
  538. package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -19
  539. package/src/simple-tree/node-kinds/index.ts +0 -1
  540. package/src/simple-tree/node-kinds/object/index.ts +0 -1
  541. package/src/simple-tree/node-kinds/object/objectNode.ts +9 -27
  542. package/src/simple-tree/prepareForInsertion.ts +17 -9
  543. package/src/simple-tree/toStoredSchema.ts +3 -0
  544. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +6 -2
  545. package/src/simple-tree/walkFieldSchema.ts +1 -0
  546. package/dist/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  547. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  548. package/dist/core/tree/detachedFieldIndexCodec.js +0 -100
  549. package/dist/core/tree/detachedFieldIndexCodec.js.map +0 -1
  550. package/dist/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  551. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  552. package/dist/core/tree/detachedFieldIndexFormat.js.map +0 -1
  553. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  554. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  555. package/dist/feature-libraries/initializeForest.d.ts +0 -18
  556. package/dist/feature-libraries/initializeForest.d.ts.map +0 -1
  557. package/dist/feature-libraries/initializeForest.js +0 -35
  558. package/dist/feature-libraries/initializeForest.js.map +0 -1
  559. package/dist/simple-tree/discrepancies.d.ts +0 -167
  560. package/dist/simple-tree/discrepancies.d.ts.map +0 -1
  561. package/dist/simple-tree/discrepancies.js +0 -382
  562. package/dist/simple-tree/discrepancies.js.map +0 -1
  563. package/lib/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  564. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  565. package/lib/core/tree/detachedFieldIndexCodec.js +0 -96
  566. package/lib/core/tree/detachedFieldIndexCodec.js.map +0 -1
  567. package/lib/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  568. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  569. package/lib/core/tree/detachedFieldIndexFormat.js.map +0 -1
  570. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  571. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  572. package/lib/feature-libraries/initializeForest.d.ts +0 -18
  573. package/lib/feature-libraries/initializeForest.d.ts.map +0 -1
  574. package/lib/feature-libraries/initializeForest.js +0 -31
  575. package/lib/feature-libraries/initializeForest.js.map +0 -1
  576. package/lib/simple-tree/discrepancies.d.ts +0 -167
  577. package/lib/simple-tree/discrepancies.d.ts.map +0 -1
  578. package/lib/simple-tree/discrepancies.js.map +0 -1
  579. package/src/feature-libraries/initializeForest.ts +0 -55
@@ -3,39 +3,25 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
7
-
8
6
  import type { TreeStoredSchema } from "../../core/index.js";
9
- import {
10
- allowsRepoSuperset,
11
- FieldKinds,
12
- type FullSchemaPolicy,
13
- isNeverTree,
14
- } from "../../feature-libraries/index.js";
15
- import type { FieldSchema } from "../fieldSchema.js";
7
+ import { allowsRepoSuperset, defaultSchemaPolicy } from "../../feature-libraries/index.js";
16
8
 
17
9
  import type { SchemaCompatibilityStatus } from "./tree.js";
18
- import {
19
- comparePosetElements,
20
- fieldRealizer,
21
- getAllowedContentDiscrepancies,
22
- PosetComparisonResult,
23
- type FieldDiscrepancy,
24
- } from "../discrepancies.js";
10
+ import { getDiscrepanciesInAllowedContent } from "./discrepancies.js";
25
11
  import { toStoredSchema } from "../toStoredSchema.js";
12
+ import type { TreeSchema } from "./configuration.js";
26
13
 
27
14
  /**
28
- * A collection of View information for schema, including policy.
15
+ * A collection of View information for schema
29
16
  * @remarks
30
17
  * This contains everything needed to determine compatibility with a given stored schema.
31
18
  */
32
19
  export class SchemaCompatibilityTester {
33
- /**
34
- * @param viewSchemaRoot - Schema for the root field.
35
- */
36
20
  public constructor(
37
- public readonly policy: FullSchemaPolicy,
38
- public readonly viewSchemaRoot: FieldSchema,
21
+ /**
22
+ * Schema for the view
23
+ */
24
+ public readonly viewSchema: TreeSchema,
39
25
  ) {}
40
26
 
41
27
  /**
@@ -51,147 +37,37 @@ export class SchemaCompatibilityTester {
51
37
  public checkCompatibility(
52
38
  stored: TreeStoredSchema,
53
39
  ): Omit<SchemaCompatibilityStatus, "canInitialize"> {
40
+ // The public API surface assumes defaultSchemaPolicy
41
+ const policy = defaultSchemaPolicy;
42
+
54
43
  // View schema allows a subset of documents that stored schema does, and the discrepancies are allowed by policy
55
44
  // determined by the view schema (i.e. objects with extra optional fields in the stored schema have opted into allowing this.
56
45
  // In the future, this would also include things like:
57
46
  // - fields with more allowed types in the stored schema than in the view schema have out-of-schema "unknown content" adapters
58
47
  let canView = true;
59
- // View schema allows a superset of documents that stored schema does, hence the document could be upgraded to use a persisted version
60
- // of this view schema as its stored schema.
61
- let canUpgrade = true;
62
-
63
- const updateCompatibilityFromFieldDiscrepancy = (discrepancy: FieldDiscrepancy): void => {
64
- switch (discrepancy.mismatch) {
65
- case "allowedTypes": {
66
- // Since we only track the symmetric difference between the allowed types in the view and
67
- // stored schemas, it's sufficient to check if any extra allowed types still exist in the
68
- // stored schema.
69
- if (
70
- discrepancy.stored.some(
71
- (identifier) =>
72
- !isNeverTree(this.policy, stored, stored.nodeSchema.get(identifier)),
73
- )
74
- ) {
75
- // Stored schema has extra allowed types that the view schema does not.
76
- canUpgrade = false;
77
- canView = false;
78
- }
79
-
80
- if (discrepancy.view.length > 0) {
81
- // View schema has extra allowed types that the stored schema does not.
82
- canView = false;
83
- }
84
- break;
85
- }
86
- case "fieldKind": {
87
- const result = comparePosetElements(
88
- discrepancy.stored,
89
- discrepancy.view,
90
- fieldRealizer,
91
- );
92
-
93
- if (result === PosetComparisonResult.Greater) {
94
- // Stored schema is more relaxed than view schema.
95
- canUpgrade = false;
96
- if (
97
- discrepancy.view === FieldKinds.forbidden.identifier &&
98
- discrepancy.identifier !== undefined &&
99
- this.policy.allowUnknownOptionalFields(discrepancy.identifier)
100
- ) {
101
- // When the application has opted into it, we allow viewing documents which have additional
102
- // optional fields in the stored schema that are not present in the view schema.
103
- } else {
104
- canView = false;
105
- }
106
- }
107
48
 
108
- if (result === PosetComparisonResult.Less) {
109
- // View schema is more relaxed than stored schema.
110
- canView = false;
111
- }
112
-
113
- if (result === PosetComparisonResult.Incomparable) {
114
- canUpgrade = false;
115
- canView = false;
116
- }
117
-
118
- break;
119
- }
120
- case "valueSchema": {
121
- canView = false;
122
- canUpgrade = false;
123
- break;
124
- }
125
- default:
126
- unreachableCase(discrepancy);
127
- }
128
- };
129
-
130
- for (const discrepancy of getAllowedContentDiscrepancies(this.viewSchemaRoot, stored)) {
131
- if (!canView && !canUpgrade) {
132
- break;
133
- }
134
-
135
- switch (discrepancy.mismatch) {
136
- case "nodeKind": {
137
- const storedNodeSchema = stored.nodeSchema.get(discrepancy.identifier);
138
- // We conservatively do not allow node types to change.
139
- // The only time this might be valid in the sense that the data canonically converts is converting an object node
140
- // to a map node over the union of all the object fields' types.
141
- if (discrepancy.stored === undefined) {
142
- // View schema has added a node type that the stored schema doesn't know about.
143
- // Note that all cases which trigger this should also trigger an AllowedTypeDiscrepancy (where the type is used).
144
- // This means this case should be redundant and could be removed in the future if there is a reason to do so
145
- // (like simplifying enablable type support).
146
- // See the TODO in getAllowedContentDiscrepancies.
147
- canView = false;
148
- } else if (discrepancy.view === undefined) {
149
- const storedIsNever =
150
- storedNodeSchema !== undefined
151
- ? isNeverTree(this.policy, stored, storedNodeSchema)
152
- : true;
153
- if (!storedIsNever) {
154
- // Stored schema has a node type that the view schema doesn't know about.
155
- // The design of allowUnknownOptionalFields allows adding new optional content to types,
156
- // and the new optional content can use new types.
157
- // Therefore this case needs to be supported for viewing.
158
- // However, it is not supported for upgrade as the stored document must be newer (or at least more general) than the view in this case.
159
- // The fact that there might be removed trees with a root of this type which only appears in the stored schema is why this must set canUpgrade to false.
160
- canUpgrade = false;
161
- }
162
- } else {
163
- // Node type exists in both schemas but kind has changed. We conservatively never allow this.
164
- // See note above about cases where this could be allowed if needed.
165
- canView = false;
166
- canUpgrade = false;
167
- }
168
- break;
169
- }
170
- case "valueSchema":
171
- case "allowedTypes":
172
- case "fieldKind": {
173
- updateCompatibilityFromFieldDiscrepancy(discrepancy);
174
- break;
175
- }
176
- case "fields": {
177
- discrepancy.differences.forEach(updateCompatibilityFromFieldDiscrepancy);
178
- break;
179
- }
180
- // No default
181
- }
49
+ for (const _discrepancy of getDiscrepanciesInAllowedContent(this.viewSchema, stored)) {
50
+ canView = false;
51
+ break;
182
52
  }
183
53
 
184
- if (canUpgrade) {
185
- assert(
186
- allowsRepoSuperset(this.policy, stored, toStoredSchema(this.viewSchemaRoot)),
187
- 0xbf2 /* View schema must be a superset of the stored schema to allow upgrade */,
188
- );
189
- }
54
+ const canUpgrade = allowsRepoSuperset(
55
+ policy,
56
+ stored,
57
+ toStoredSchema(this.viewSchema.root),
58
+ );
59
+
60
+ // If true, then upgrading has no effect on what can be stored in the document.
61
+ // TODO: This should likely be changed to indicate up a schema upgrade would be a no-op, including stored schema metadata.
62
+ const isEquivalent =
63
+ canView &&
64
+ canUpgrade &&
65
+ allowsRepoSuperset(policy, toStoredSchema(this.viewSchema.root), stored);
190
66
 
191
67
  return {
192
68
  canView,
193
69
  canUpgrade,
194
- isEquivalent: canView && canUpgrade,
70
+ isEquivalent,
195
71
  };
196
72
  }
197
73
  }
@@ -137,12 +137,15 @@ export interface SchemaFactoryObjectOptions<TCustomMetadata = unknown>
137
137
  * // Then the alleged clone wouldn't actually clone the entire person in either case, it would drop the nickname.
138
138
  * ```
139
139
  *
140
- * If an application wants to be particularly careful to preserve all data on a node when editing it, it can use
141
- * {@link (TreeAlpha:interface).importVerbose|import}/{@link (TreeAlpha:interface).exportVerbose|export} APIs with persistent keys.
140
+ * The existing import and export APIs have similar problems.
141
+ * For example currently the {@link (TreeAlpha:interface).exportVerbose|exportVerbose} API with stored keys preserves unknown optional fields,
142
+ * but {@link Unhydrated} nodes produced by {@link TreeNode} constructors, insertable content, and {@link (TreeAlpha:interface).importVerbose|importVerbose} do not.
143
+ * {@link (TreeBeta:interface).clone} however can be used to clone a node preserving unknown optional fields.
142
144
  *
143
145
  * Note that public API methods which operate on entire nodes (such as `moveTo`, `moveToEnd`, etc. on arrays) do not encounter
144
- * this problem as SharedTree's implementation stores the entire node in its lower layers. It's only when application code
145
- * reaches into a node (either by accessing its fields, spreading it, or some other means) that this problem arises.
146
+ * this problem as SharedTree's implementation stores the entire node in its lower layers.
147
+ * It's only when application code reaches into a node
148
+ * (either by accessing its fields, spreading it, or some other means) that this problem arises.
146
149
  */
147
150
  allowUnknownOptionalFields?: boolean;
148
151
  }
@@ -5,11 +5,7 @@
5
5
 
6
6
  import type { FluidClientVersion, ICodecOptions } from "../../codec/index.js";
7
7
  import { SchemaVersion } from "../../core/index.js";
8
- import {
9
- defaultSchemaPolicy,
10
- encodeTreeSchema,
11
- makeSchemaCodec,
12
- } from "../../feature-libraries/index.js";
8
+ import { encodeTreeSchema, makeSchemaCodec } from "../../feature-libraries/index.js";
13
9
  import {
14
10
  clientVersionToSchemaVersion,
15
11
  type FormatV1,
@@ -19,6 +15,7 @@ import type { JsonCompatible } from "../../util/index.js";
19
15
  import { normalizeFieldSchema, type ImplicitFieldSchema } from "../fieldSchema.js";
20
16
  import type { SimpleTreeSchema } from "../simpleSchema.js";
21
17
  import { simpleToStoredSchema } from "../toStoredSchema.js";
18
+ import { TreeViewConfigurationAlpha } from "./configuration.js";
22
19
 
23
20
  import { SchemaCompatibilityTester } from "./schemaCompatibilityTester.js";
24
21
  import type { SchemaCompatibilityStatus } from "./tree.js";
@@ -101,9 +98,9 @@ export function comparePersistedSchema(
101
98
  // We only use the decode part, which always dispatches to the correct codec based on the version in the data, not the version passed to `makeSchemaCodec`.
102
99
  const schemaCodec = makeSchemaCodec(options, SchemaVersion.v1);
103
100
  const stored = schemaCodec.decode(persisted as FormatV1);
104
- const viewSchema = new SchemaCompatibilityTester(
105
- defaultSchemaPolicy,
106
- normalizeFieldSchema(view),
107
- );
101
+ const config = new TreeViewConfigurationAlpha({
102
+ schema: normalizeFieldSchema(view),
103
+ });
104
+ const viewSchema = new SchemaCompatibilityTester(config);
108
105
  return viewSchema.checkCompatibility(stored);
109
106
  }
@@ -3,14 +3,18 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { defaultSchemaPolicy } from "../../feature-libraries/index.js";
6
7
  import {
8
+ Context,
7
9
  getKernel,
8
10
  isTreeNode,
11
+ UnhydratedContext,
9
12
  type NodeKind,
10
13
  type TreeNode,
11
14
  type Unhydrated,
12
15
  type WithType,
13
16
  } from "../core/index.js";
17
+ import { getUnhydratedContext } from "../createContext.js";
14
18
  import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../fieldSchema.js";
15
19
 
16
20
  import { createFromCursor } from "./create.js";
@@ -128,8 +132,8 @@ export interface TreeBeta {
128
132
  *
129
133
  * - The identifiers in the node's subtree will be preserved, i.e., they are not replaced with new values.
130
134
  *
131
- * @privateRemarks
132
- * TODO: AB#43548: How this handles unknown optional fields needs to be figured out, tested and documented.
135
+ * - If the node (or any node in its subtree) contains {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields|unknown optional fields},
136
+ * those fields will be cloned just like the known fields.
133
137
  */
134
138
  clone<const TSchema extends ImplicitFieldSchema>(
135
139
  node: TreeFieldFromImplicitField<TSchema>,
@@ -137,7 +141,7 @@ export interface TreeBeta {
137
141
 
138
142
  // TODO: support more clone options
139
143
  // /**
140
- // * Like {@link TreeBeta.create}, except deeply clones existing nodes.
144
+ // * Like {@link (TreeBeta:interface).create}, except deeply clones existing nodes.
141
145
  // * @remarks
142
146
  // * This only clones the persisted data associated with a node.
143
147
  // * Local state, such as properties added to customized schema classes, will not be cloned:
@@ -178,7 +182,16 @@ export const TreeBeta: TreeBeta = {
178
182
 
179
183
  const kernel = getKernel(node);
180
184
  const cursor = kernel.getOrCreateInnerNode().borrowCursor();
181
- return createFromCursor(kernel.schema, cursor) as Unhydrated<
185
+
186
+ // To handle when the node transitively contains unknown optional fields,
187
+ // derive the context from the source node's stored schema which has stored schema for any such fields and their contents.
188
+ const flexContext = new UnhydratedContext(
189
+ defaultSchemaPolicy,
190
+ kernel.context.flexContext.schema,
191
+ );
192
+ const context = new Context(flexContext, getUnhydratedContext(kernel.schema).schema);
193
+
194
+ return createFromCursor(kernel.schema, cursor, context) as Unhydrated<
182
195
  TreeFieldFromImplicitField<TSchema>
183
196
  >;
184
197
  },
@@ -12,14 +12,15 @@ import {
12
12
  aboveRootPlaceholder,
13
13
  EmptyKey,
14
14
  keyAsDetachedField,
15
+ LeafNodeStoredSchema,
15
16
  type FieldKey,
16
17
  type ITreeCursor,
17
18
  type ITreeCursorSynchronous,
19
+ type TreeNodeStoredSchema,
18
20
  } from "../../core/index.js";
19
21
  import { brand } from "../../util/index.js";
20
22
  import type { ImplicitFieldSchema } from "../fieldSchema.js";
21
- import { NodeKind } from "../core/index.js";
22
- import type { TreeNodeSchema, ImplicitAllowedTypes, TreeLeafValue } from "../core/index.js";
23
+ import type { Context, TreeLeafValue, TreeNodeSchema } from "../core/index.js";
23
24
  import {
24
25
  isTreeValue,
25
26
  stackTreeFieldCursor,
@@ -279,7 +280,7 @@ function verboseTreeAdapter(options: SchemalessParseOptions): CursorAdapter<Verb
279
280
  */
280
281
  export function verboseFromCursor(
281
282
  reader: ITreeCursor,
282
- rootSchema: ImplicitAllowedTypes,
283
+ context: Context,
283
284
  options: TreeEncodingOptions,
284
285
  ): VerboseTree {
285
286
  const config: Required<TreeEncodingOptions> = {
@@ -287,20 +288,28 @@ export function verboseFromCursor(
287
288
  ...options,
288
289
  };
289
290
 
290
- const schemaMap = getUnhydratedContext(rootSchema).schema;
291
+ const storedSchemaMap = context.flexContext.schema.nodeSchema;
292
+ const schemaMap = context.schema;
291
293
 
292
- return verboseFromCursorInner(reader, config, schemaMap);
294
+ return verboseFromCursorInner(reader, config, storedSchemaMap, schemaMap);
293
295
  }
294
296
 
295
297
  function verboseFromCursorInner(
296
298
  reader: ITreeCursor,
297
299
  options: Required<TreeEncodingOptions>,
300
+ storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
298
301
  schema: ReadonlyMap<string, TreeNodeSchema>,
299
302
  ): VerboseTree {
300
- const fields = customFromCursor(reader, options, schema, verboseFromCursorInner);
303
+ const fields = customFromCursor(
304
+ reader,
305
+ options,
306
+ storedSchema,
307
+ schema,
308
+ verboseFromCursorInner,
309
+ );
301
310
  const nodeSchema =
302
- schema.get(reader.type) ?? fail(0xb3c /* missing schema for type in cursor */);
303
- if (nodeSchema.kind === NodeKind.Leaf) {
311
+ storedSchema.get(reader.type) ?? fail(0xb3c /* missing schema for type in cursor */);
312
+ if (nodeSchema instanceof LeafNodeStoredSchema) {
304
313
  return fields as TreeLeafValue;
305
314
  }
306
315
 
@@ -76,6 +76,7 @@ export interface NormalizedAnnotatedAllowedTypes {
76
76
  export function isAnnotatedAllowedTypes(
77
77
  allowedTypes: ImplicitAnnotatedAllowedTypes,
78
78
  ): allowedTypes is AnnotatedAllowedTypes {
79
+ checkForUninitializedSchema(allowedTypes);
79
80
  return (
80
81
  // Class based schema, and lazy schema references report type "function": filtering them out with typeof makes narrowing based on members mostly safe
81
82
  typeof allowedTypes === "object" && "metadata" in allowedTypes && "types" in allowedTypes
@@ -116,7 +117,9 @@ export interface AllowedTypesMetadata {
116
117
  export function isAnnotatedAllowedType(
117
118
  allowedType: AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
118
119
  ): allowedType is AnnotatedAllowedType {
119
- return "metadata" in allowedType && "type" in allowedType;
120
+ checkForUninitializedSchema(allowedType);
121
+ // Class based schema, and lazy schema references report type "function": filtering them out with typeof makes narrowing based on members mostly safe
122
+ return typeof allowedType === "object" && "metadata" in allowedType && "type" in allowedType;
120
123
  }
121
124
 
122
125
  /**
@@ -224,7 +227,7 @@ export type UnannotateAllowedTypes<T extends AnnotatedAllowedTypes> =
224
227
  * Removes annotations from an allowed type.
225
228
  * @system @alpha
226
229
  */
227
- export type UnannotateAllowedType<T extends AnnotatedAllowedType> =
230
+ export type UnannotateAllowedType<T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>> =
228
231
  T extends AnnotatedAllowedType<infer X> ? [X] : T;
229
232
 
230
233
  /**
@@ -237,29 +240,40 @@ export type UnannotateAllowedType<T extends AnnotatedAllowedType> =
237
240
  * @internal
238
241
  */
239
242
  export function normalizeAllowedTypes(
240
- types: ImplicitAllowedTypes,
243
+ types: ImplicitAnnotatedAllowedTypes,
241
244
  ): ReadonlySet<TreeNodeSchema> {
245
+ // remove annotations before normalizing
246
+ const unannotated = unannotateImplicitAllowedTypes(types);
242
247
  const normalized = new Set<TreeNodeSchema>();
243
- if (isReadonlyArray(types)) {
248
+ if (isReadonlyArray(unannotated)) {
244
249
  // Types array must not be modified after it is normalized since that would result in the user of the normalized data having wrong (out of date) content.
245
- Object.freeze(types);
246
- for (const lazyType of types) {
250
+ Object.freeze(unannotated);
251
+ for (const lazyType of unannotated) {
247
252
  normalized.add(evaluateLazySchema(lazyType));
248
253
  }
249
254
  } else {
250
- normalized.add(evaluateLazySchema(types));
255
+ normalized.add(evaluateLazySchema(unannotated));
251
256
  }
252
257
  return normalized;
253
258
  }
254
259
 
255
260
  /**
256
- * Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist.
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.
257
268
  */
258
269
  export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema>(
259
270
  type: T | AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>>,
260
- ): AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>> {
271
+ ): AnnotatedAllowedType<T> {
261
272
  return isAnnotatedAllowedType(type)
262
- ? type
273
+ ? {
274
+ metadata: type.metadata,
275
+ type: evaluateLazySchema(type.type),
276
+ }
263
277
  : {
264
278
  metadata: {},
265
279
  type,
@@ -317,19 +331,28 @@ export function unannotateImplicitAllowedTypes<Types extends ImplicitAnnotatedAl
317
331
  ): UnannotateImplicitAllowedTypes<Types> {
318
332
  return (
319
333
  isAnnotatedAllowedTypes(types)
320
- ? types.types.map((allowedType) =>
321
- isAnnotatedAllowedType(allowedType) ? allowedType.type : allowedType,
322
- )
334
+ ? types.types.map(unannotateAllowedType)
323
335
  : isReadonlyArray(types)
324
- ? types.map((allowedType) =>
325
- isAnnotatedAllowedType(allowedType) ? allowedType.type : allowedType,
326
- )
336
+ ? types.map(unannotateAllowedType)
327
337
  : isAnnotatedAllowedType(types)
328
- ? (types.type as UnannotateImplicitAllowedTypes<Types>)
338
+ ? types.type
329
339
  : types
330
340
  ) as UnannotateImplicitAllowedTypes<Types>;
331
341
  }
332
342
 
343
+ /**
344
+ * Converts an {@link AnnotatedAllowedType} to an {@link LazyItem} by removing any annotations.
345
+ * @remarks
346
+ * This does not evaluate any lazy schemas.
347
+ */
348
+ export function unannotateAllowedType<
349
+ Type extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
350
+ >(allowedType: Type): UnannotateAllowedType<Type> {
351
+ return isAnnotatedAllowedType(allowedType)
352
+ ? (allowedType.type as UnannotateAllowedType<Type>)
353
+ : (allowedType as UnannotateAllowedType<Type>);
354
+ }
355
+
333
356
  const cachedLazyItem = new WeakMap<() => unknown, unknown>();
334
357
 
335
358
  /**
@@ -342,13 +365,23 @@ export function evaluateLazySchema<T extends TreeNodeSchema>(value: LazyItem<T>)
342
365
  const evaluatedSchema = isLazy(value)
343
366
  ? (getOrCreate(cachedLazyItem, value, value) as T)
344
367
  : value;
345
- if (evaluatedSchema === undefined) {
368
+
369
+ checkForUninitializedSchema(evaluatedSchema);
370
+ markSchemaMostDerived(evaluatedSchema);
371
+ return evaluatedSchema;
372
+ }
373
+
374
+ /**
375
+ * Throws a UsageError if the provided schema is undefined, most likely due to being used before it was initialized.
376
+ */
377
+ export function checkForUninitializedSchema(
378
+ schema: ImplicitAnnotatedAllowedTypes | LazyItem<TreeNodeSchema>,
379
+ ): void {
380
+ if (schema === undefined) {
346
381
  throw new UsageError(
347
- `Encountered an undefined schema. This could indicate that some referenced schema has not yet been instantiated.`,
382
+ `Encountered an undefined schema. This could indicate that some referenced schema has not yet been instantiated. Consider using a lazy schema reference (like "() => schema") or delaying the evaluation of the lazy reference if one is already being used.`,
348
383
  );
349
384
  }
350
- markSchemaMostDerived(evaluatedSchema);
351
- return evaluatedSchema;
352
385
  }
353
386
 
354
387
  /**
@@ -28,34 +28,36 @@ import { walkAllowedTypes } from "./walkSchema.js";
28
28
  * This design is the same as {@link FlexTreeContext} with its base type and {@link FlexTreeHydratedContext} extending it.
29
29
  */
30
30
  export class Context {
31
- /**
32
- * All schema which could transitively be used under the associated node.
33
- * @remarks
34
- * While generally {@link TreeNodeSchema} are referenced as objects and thus do not need to be looked up by identifier,
35
- * there are a few cases (mainly constructing new TreeNodes from existing tree data) where such a lookup is useful.
36
- * Having this map in the context addresses this use-case.
37
- * @privateRemarks
38
- * This design mirrors how {@link FlexTreeSchema} are accessed off the {@link FlexTreeContext}, making the migration away from them simpler.
39
- */
40
- public readonly schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema>;
41
-
42
- /**
43
- * Builds the context.
44
- * @remarks
45
- * Since this walks the schema, it must not be invoked during schema declaration or schema forward references could fail to be resolved.
46
- */
47
- public constructor(
31
+ public static schemaMapFromRootSchema(
48
32
  rootSchema: NormalizedAnnotatedAllowedTypes,
49
- public readonly flexContext: FlexTreeContext,
50
- ) {
33
+ ): ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema> {
51
34
  const schema: Map<TreeNodeSchemaIdentifier, TreeNodeSchema> = new Map();
52
35
  walkAllowedTypes(rootSchema, {
53
36
  node(nodeSchema) {
54
37
  schema.set(brand(nodeSchema.identifier), nodeSchema);
55
38
  },
56
39
  });
57
- this.schema = schema;
40
+ return schema;
58
41
  }
42
+
43
+ /**
44
+ * Builds the context.
45
+ * @remarks
46
+ * Since this walks the schema, it must not be invoked during schema declaration or schema forward references could fail to be resolved.
47
+ */
48
+ public constructor(
49
+ public readonly flexContext: FlexTreeContext,
50
+ /**
51
+ * All schema which could transitively be used under the associated node.
52
+ * @remarks
53
+ * While generally {@link TreeNodeSchema} are referenced as objects and thus do not need to be looked up by identifier,
54
+ * there are a few cases (mainly constructing new TreeNodes from existing tree data) where such a lookup is useful.
55
+ * Having this map in the context addresses this use-case.
56
+ * @privateRemarks
57
+ * This design mirrors how {@link FlexTreeSchema} are accessed off the {@link FlexTreeContext}, making the migration away from them simpler.
58
+ */
59
+ public readonly schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema>,
60
+ ) {}
59
61
  }
60
62
 
61
63
  /**
@@ -64,9 +66,9 @@ export class Context {
64
66
  */
65
67
  export class HydratedContext extends Context {
66
68
  public constructor(
67
- rootSchema: NormalizedAnnotatedAllowedTypes,
68
69
  public override readonly flexContext: FlexTreeHydratedContext,
70
+ schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema>,
69
71
  ) {
70
- super(rootSchema, flexContext);
72
+ super(flexContext, schema);
71
73
  }
72
74
  }
@@ -53,6 +53,7 @@ export {
53
53
  isAnnotatedAllowedType,
54
54
  normalizeAllowedTypes,
55
55
  normalizeAnnotatedAllowedTypes,
56
+ normalizeToAnnotatedAllowedType,
56
57
  unannotateImplicitAllowedTypes,
57
58
  markSchemaMostDerived,
58
59
  evaluateLazySchema,
@@ -76,7 +77,7 @@ export type {
76
77
  AllowedTypeMetadata,
77
78
  AnnotatedAllowedTypes,
78
79
  } from "./allowedTypes.js";
79
- export { walkAllowedTypes, type SchemaVisitor } from "./walkSchema.js";
80
+ export { walkAllowedTypes, walkNodeSchema, type SchemaVisitor } from "./walkSchema.js";
80
81
  export { Context, HydratedContext } from "./context.js";
81
82
  export {
82
83
  getOrCreateNodeFromInnerNode,
@@ -131,7 +131,7 @@ export class TreeNodeKernel {
131
131
  /**
132
132
  * Create a TreeNodeKernel which can be looked up with {@link getKernel}.
133
133
  *
134
- * @param initialContext - context from when this node was originally crated.
134
+ * @param initialContext - context from when this node was originally created. Only used when unhydrated.
135
135
  * @param innerNode - When unhydrated/raw or marinated the MapTreeNode. FlexTreeNode when cooked.
136
136
  * @remarks
137
137
  * Exactly one kernel per TreeNode should be created.
@@ -10,7 +10,7 @@ import { type FlexTreeNode, isFlexTreeNode } from "../../feature-libraries/index
10
10
 
11
11
  import { markEager } from "./flexList.js";
12
12
  import { inPrototypeChain, privateToken, TreeNode } from "./treeNode.js";
13
- import type { UnhydratedFlexTreeNode } from "./unhydratedFlexTree.js";
13
+ import { UnhydratedFlexTreeNode } from "./unhydratedFlexTree.js";
14
14
  import {
15
15
  NodeKind,
16
16
  type TreeNodeSchema,
@@ -193,10 +193,17 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
193
193
  );
194
194
 
195
195
  const result = schema.prepareInstance(this, node);
196
+ // For unhydrated nodes, grab the context from the `simpleContext` (which likely is from cache.oneTimeInitialized.context,
197
+ // but might be customized for better schema evolution support like unknown optional fields like in clone)
198
+ // For hydrated nodes, this context is unused, so using the default from cache.oneTimeInitialized.context is always fine.
199
+ const context =
200
+ node instanceof UnhydratedFlexTreeNode
201
+ ? node.simpleContext
202
+ : cache.oneTimeInitialized.context;
196
203
  // The TreeNodeKernel associates itself the TreeNode (result here, not node) so it can be looked up later via getKernel.
197
204
  // If desired this could be put in a non-enumerable symbol property for lookup instead, but that gets messy going through proxies,
198
205
  // so just relying on the WeakMap seems like the cleanest approach.
199
- new TreeNodeKernel(result, schema, node, cache.oneTimeInitialized.context);
206
+ new TreeNodeKernel(result, schema, node, context);
200
207
 
201
208
  return result;
202
209
  }