@fluidframework/tree 2.51.0-347100 → 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 (609) hide show
  1. package/.eslintrc.cjs +3 -2
  2. package/.vscode/settings.json +0 -1
  3. package/CHANGELOG.md +92 -0
  4. package/api-report/tree.alpha.api.md +3 -2
  5. package/dist/codec/codec.d.ts +2 -1
  6. package/dist/codec/codec.d.ts.map +1 -1
  7. package/dist/codec/codec.js +4 -3
  8. package/dist/codec/codec.js.map +1 -1
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +3 -2
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/index.d.ts +1 -1
  14. package/dist/core/rebase/index.d.ts.map +1 -1
  15. package/dist/core/rebase/index.js +2 -1
  16. package/dist/core/rebase/index.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +3 -1
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js +2 -1
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/schema-stored/schema.d.ts +1 -23
  22. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  23. package/dist/core/schema-stored/schema.js +2 -2
  24. package/dist/core/schema-stored/schema.js.map +1 -1
  25. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  26. package/dist/core/tree/detachedFieldIndex.js +2 -3
  27. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  28. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  29. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  30. package/dist/core/tree/detachedFieldIndexCodecCommon.js +68 -0
  31. package/dist/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  32. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  33. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  34. package/dist/core/tree/detachedFieldIndexCodecV1.js +55 -0
  35. package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  36. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  37. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  38. package/dist/core/tree/detachedFieldIndexCodecV2.js +49 -0
  39. package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  40. package/dist/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  41. package/dist/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  42. package/dist/core/tree/detachedFieldIndexCodecs.js +26 -0
  43. package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  44. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  45. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  46. package/dist/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +18 -13
  47. package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  48. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  49. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  50. package/dist/core/tree/detachedFieldIndexFormatV1.js +12 -0
  51. package/dist/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  52. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  53. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  54. package/dist/core/tree/detachedFieldIndexFormatV2.js +14 -0
  55. package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  56. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  57. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +21 -21
  59. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  61. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  62. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  63. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  64. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  65. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  66. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +74 -61
  67. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  68. package/dist/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  69. package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  70. package/dist/feature-libraries/chunked-forest/codec/format.js +18 -12
  71. package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  72. package/{lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts → dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  73. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  74. package/dist/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +23 -17
  75. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  76. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  77. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  78. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +22 -22
  79. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  80. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  81. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  82. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  83. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  84. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  85. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  86. package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  87. package/dist/feature-libraries/default-schema/defaultSchema.js +0 -2
  88. package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  89. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  90. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  91. package/dist/feature-libraries/default-schema/index.js +2 -2
  92. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  93. package/dist/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  94. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  95. package/dist/feature-libraries/default-schema/schemaChecker.js +31 -26
  96. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  97. package/dist/feature-libraries/index.d.ts +2 -3
  98. package/dist/feature-libraries/index.d.ts.map +1 -1
  99. package/dist/feature-libraries/index.js +3 -11
  100. package/dist/feature-libraries/index.js.map +1 -1
  101. package/dist/feature-libraries/modular-schema/comparison.d.ts +5 -6
  102. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  103. package/dist/feature-libraries/modular-schema/comparison.js +15 -19
  104. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  105. package/dist/feature-libraries/modular-schema/index.d.ts +0 -1
  106. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  107. package/dist/feature-libraries/modular-schema/index.js +1 -8
  108. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  109. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  110. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  111. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  112. package/dist/feature-libraries/object-forest/objectForest.js +2 -3
  113. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  114. package/dist/index.d.ts +1 -1
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +6 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/packageVersion.d.ts +1 -1
  119. package/dist/packageVersion.d.ts.map +1 -1
  120. package/dist/packageVersion.js +1 -1
  121. package/dist/packageVersion.js.map +1 -1
  122. package/dist/shared-tree/independentView.d.ts +8 -0
  123. package/dist/shared-tree/independentView.d.ts.map +1 -1
  124. package/dist/shared-tree/independentView.js +23 -11
  125. package/dist/shared-tree/independentView.js.map +1 -1
  126. package/dist/shared-tree/schematizeTree.d.ts +1 -1
  127. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  128. package/dist/shared-tree/schematizeTree.js +5 -4
  129. package/dist/shared-tree/schematizeTree.js.map +1 -1
  130. package/dist/shared-tree/schematizingTreeView.d.ts +0 -1
  131. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  132. package/dist/shared-tree/schematizingTreeView.js +7 -10
  133. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  134. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  135. package/dist/shared-tree/sharedTree.js +1 -29
  136. package/dist/shared-tree/sharedTree.js.map +1 -1
  137. package/dist/shared-tree/tree.js +1 -1
  138. package/dist/shared-tree/tree.js.map +1 -1
  139. package/dist/shared-tree/treeAlpha.d.ts +20 -6
  140. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  141. package/dist/shared-tree/treeAlpha.js +9 -4
  142. package/dist/shared-tree/treeAlpha.js.map +1 -1
  143. package/dist/shared-tree/treeCheckout.d.ts +2 -1
  144. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  145. package/dist/shared-tree/treeCheckout.js +33 -1
  146. package/dist/shared-tree/treeCheckout.js.map +1 -1
  147. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  148. package/dist/shared-tree-core/branch.js +1 -1
  149. package/dist/shared-tree-core/branch.js.map +1 -1
  150. package/dist/simple-tree/api/conciseTree.d.ts +2 -2
  151. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  152. package/dist/simple-tree/api/conciseTree.js +6 -6
  153. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  154. package/dist/simple-tree/api/configuration.d.ts +8 -2
  155. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  156. package/dist/simple-tree/api/configuration.js.map +1 -1
  157. package/dist/simple-tree/api/create.d.ts +8 -7
  158. package/dist/simple-tree/api/create.d.ts.map +1 -1
  159. package/dist/simple-tree/api/create.js +35 -22
  160. package/dist/simple-tree/api/create.js.map +1 -1
  161. package/dist/simple-tree/api/customTree.d.ts +25 -4
  162. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  163. package/dist/simple-tree/api/customTree.js +42 -16
  164. package/dist/simple-tree/api/customTree.js.map +1 -1
  165. package/dist/simple-tree/api/discrepancies.d.ts +98 -0
  166. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
  167. package/dist/simple-tree/api/discrepancies.js +255 -0
  168. package/dist/simple-tree/api/discrepancies.js.map +1 -0
  169. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +8 -21
  170. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  171. package/dist/simple-tree/api/schemaCompatibilityTester.js +19 -169
  172. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  173. package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  174. package/dist/simple-tree/api/schemaCreationUtilities.js +2 -2
  175. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  176. package/dist/simple-tree/api/schemaFactory.d.ts +7 -4
  177. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  178. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  179. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  180. package/dist/simple-tree/api/storedSchema.js +5 -1
  181. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  182. package/dist/simple-tree/api/treeBeta.d.ts +2 -2
  183. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  184. package/dist/simple-tree/api/treeBeta.js +10 -4
  185. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  186. package/dist/simple-tree/api/verboseTree.d.ts +2 -2
  187. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  188. package/dist/simple-tree/api/verboseTree.js +15 -15
  189. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  190. package/dist/simple-tree/core/allowedTypes.d.ts +20 -4
  191. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  192. package/dist/simple-tree/core/allowedTypes.js +45 -13
  193. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  194. package/dist/simple-tree/core/context.d.ts +13 -2
  195. package/dist/simple-tree/core/context.d.ts.map +1 -1
  196. package/dist/simple-tree/core/context.js +22 -9
  197. package/dist/simple-tree/core/context.js.map +1 -1
  198. package/dist/simple-tree/core/index.d.ts +2 -2
  199. package/dist/simple-tree/core/index.d.ts.map +1 -1
  200. package/dist/simple-tree/core/index.js +3 -1
  201. package/dist/simple-tree/core/index.js.map +1 -1
  202. package/dist/simple-tree/core/treeNodeKernel.d.ts +1 -1
  203. package/dist/simple-tree/core/treeNodeKernel.js +1 -1
  204. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  205. package/dist/simple-tree/core/treeNodeValid.d.ts +1 -1
  206. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  207. package/dist/simple-tree/core/treeNodeValid.js +8 -1
  208. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  209. package/dist/simple-tree/core/walkSchema.d.ts +3 -0
  210. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  211. package/dist/simple-tree/core/walkSchema.js +2 -0
  212. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  213. package/dist/simple-tree/createContext.d.ts +2 -0
  214. package/dist/simple-tree/createContext.d.ts.map +1 -1
  215. package/dist/simple-tree/createContext.js +3 -1
  216. package/dist/simple-tree/createContext.js.map +1 -1
  217. package/dist/simple-tree/fieldSchema.d.ts +1 -0
  218. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  219. package/dist/simple-tree/fieldSchema.js +1 -0
  220. package/dist/simple-tree/fieldSchema.js.map +1 -1
  221. package/dist/simple-tree/index.d.ts +5 -4
  222. package/dist/simple-tree/index.d.ts.map +1 -1
  223. package/dist/simple-tree/index.js +8 -3
  224. package/dist/simple-tree/index.js.map +1 -1
  225. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  226. package/dist/simple-tree/node-kinds/array/arrayNode.js +1 -1
  227. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  228. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  229. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  230. package/dist/simple-tree/node-kinds/index.js +1 -2
  231. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  232. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  233. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  234. package/dist/simple-tree/node-kinds/object/index.js +1 -2
  235. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  236. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  237. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  238. package/dist/simple-tree/node-kinds/object/objectNode.js +4 -18
  239. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  240. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  241. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  242. package/dist/simple-tree/prepareForInsertion.js +9 -3
  243. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  244. package/dist/simple-tree/toStoredSchema.d.ts +3 -0
  245. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  246. package/dist/simple-tree/toStoredSchema.js +3 -0
  247. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  248. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  249. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  250. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  251. package/dist/simple-tree/walkFieldSchema.d.ts +1 -0
  252. package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
  253. package/dist/simple-tree/walkFieldSchema.js +1 -0
  254. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  255. package/lib/codec/codec.d.ts +2 -1
  256. package/lib/codec/codec.d.ts.map +1 -1
  257. package/lib/codec/codec.js +4 -3
  258. package/lib/codec/codec.js.map +1 -1
  259. package/lib/core/index.d.ts +1 -1
  260. package/lib/core/index.d.ts.map +1 -1
  261. package/lib/core/index.js +1 -1
  262. package/lib/core/index.js.map +1 -1
  263. package/lib/core/rebase/index.d.ts +1 -1
  264. package/lib/core/rebase/index.d.ts.map +1 -1
  265. package/lib/core/rebase/index.js +1 -1
  266. package/lib/core/rebase/index.js.map +1 -1
  267. package/lib/core/rebase/types.d.ts +3 -1
  268. package/lib/core/rebase/types.d.ts.map +1 -1
  269. package/lib/core/rebase/types.js +1 -0
  270. package/lib/core/rebase/types.js.map +1 -1
  271. package/lib/core/schema-stored/schema.d.ts +1 -23
  272. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  273. package/lib/core/schema-stored/schema.js +2 -2
  274. package/lib/core/schema-stored/schema.js.map +1 -1
  275. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  276. package/lib/core/tree/detachedFieldIndex.js +2 -3
  277. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  278. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  279. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  280. package/lib/core/tree/detachedFieldIndexCodecCommon.js +64 -0
  281. package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  282. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  283. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  284. package/lib/core/tree/detachedFieldIndexCodecV1.js +51 -0
  285. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  286. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  287. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  288. package/lib/core/tree/detachedFieldIndexCodecV2.js +45 -0
  289. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  290. package/lib/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  291. package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  292. package/lib/core/tree/detachedFieldIndexCodecs.js +21 -0
  293. package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  294. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  295. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  296. package/lib/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +13 -10
  297. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  298. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  299. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  300. package/lib/core/tree/detachedFieldIndexFormatV1.js +9 -0
  301. package/lib/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  302. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  303. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  304. package/lib/core/tree/detachedFieldIndexFormatV2.js +11 -0
  305. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  306. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  307. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  308. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +19 -19
  309. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  310. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  311. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  312. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  313. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  314. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  315. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  316. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +70 -57
  317. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  318. package/lib/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  319. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  320. package/lib/feature-libraries/chunked-forest/codec/format.js +17 -11
  321. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  322. package/{dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts → lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  323. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  324. package/lib/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +21 -15
  325. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  326. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  327. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  328. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +19 -19
  329. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  330. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  331. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  332. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  333. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  334. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  335. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  336. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  337. package/lib/feature-libraries/default-schema/defaultSchema.js +0 -2
  338. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  339. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  340. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  341. package/lib/feature-libraries/default-schema/index.js +1 -1
  342. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  343. package/lib/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  344. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  345. package/lib/feature-libraries/default-schema/schemaChecker.js +29 -24
  346. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  347. package/lib/feature-libraries/index.d.ts +2 -3
  348. package/lib/feature-libraries/index.d.ts.map +1 -1
  349. package/lib/feature-libraries/index.js +2 -3
  350. package/lib/feature-libraries/index.js.map +1 -1
  351. package/lib/feature-libraries/modular-schema/comparison.d.ts +5 -6
  352. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  353. package/lib/feature-libraries/modular-schema/comparison.js +14 -17
  354. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  355. package/lib/feature-libraries/modular-schema/index.d.ts +0 -1
  356. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  357. package/lib/feature-libraries/modular-schema/index.js +0 -1
  358. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  359. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  360. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  361. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  362. package/lib/feature-libraries/object-forest/objectForest.js +3 -4
  363. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  364. package/lib/index.d.ts +1 -1
  365. package/lib/index.d.ts.map +1 -1
  366. package/lib/index.js +2 -2
  367. package/lib/index.js.map +1 -1
  368. package/lib/packageVersion.d.ts +1 -1
  369. package/lib/packageVersion.d.ts.map +1 -1
  370. package/lib/packageVersion.js +1 -1
  371. package/lib/packageVersion.js.map +1 -1
  372. package/lib/shared-tree/independentView.d.ts +8 -0
  373. package/lib/shared-tree/independentView.d.ts.map +1 -1
  374. package/lib/shared-tree/independentView.js +21 -10
  375. package/lib/shared-tree/independentView.js.map +1 -1
  376. package/lib/shared-tree/schematizeTree.d.ts +1 -1
  377. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  378. package/lib/shared-tree/schematizeTree.js +3 -2
  379. package/lib/shared-tree/schematizeTree.js.map +1 -1
  380. package/lib/shared-tree/schematizingTreeView.d.ts +0 -1
  381. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  382. package/lib/shared-tree/schematizingTreeView.js +8 -11
  383. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  384. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  385. package/lib/shared-tree/sharedTree.js +2 -30
  386. package/lib/shared-tree/sharedTree.js.map +1 -1
  387. package/lib/shared-tree/tree.js +1 -1
  388. package/lib/shared-tree/tree.js.map +1 -1
  389. package/lib/shared-tree/treeAlpha.d.ts +20 -6
  390. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  391. package/lib/shared-tree/treeAlpha.js +10 -5
  392. package/lib/shared-tree/treeAlpha.js.map +1 -1
  393. package/lib/shared-tree/treeCheckout.d.ts +2 -1
  394. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  395. package/lib/shared-tree/treeCheckout.js +34 -2
  396. package/lib/shared-tree/treeCheckout.js.map +1 -1
  397. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  398. package/lib/shared-tree-core/branch.js +1 -1
  399. package/lib/shared-tree-core/branch.js.map +1 -1
  400. package/lib/simple-tree/api/conciseTree.d.ts +2 -2
  401. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  402. package/lib/simple-tree/api/conciseTree.js +6 -6
  403. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  404. package/lib/simple-tree/api/configuration.d.ts +8 -2
  405. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  406. package/lib/simple-tree/api/configuration.js.map +1 -1
  407. package/lib/simple-tree/api/create.d.ts +8 -7
  408. package/lib/simple-tree/api/create.d.ts.map +1 -1
  409. package/lib/simple-tree/api/create.js +38 -25
  410. package/lib/simple-tree/api/create.js.map +1 -1
  411. package/lib/simple-tree/api/customTree.d.ts +25 -4
  412. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  413. package/lib/simple-tree/api/customTree.js +43 -17
  414. package/lib/simple-tree/api/customTree.js.map +1 -1
  415. package/lib/simple-tree/api/discrepancies.d.ts +98 -0
  416. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
  417. package/lib/simple-tree/api/discrepancies.js +250 -0
  418. package/lib/simple-tree/api/discrepancies.js.map +1 -0
  419. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +8 -21
  420. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  421. package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -169
  422. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  423. package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  424. package/lib/simple-tree/api/schemaCreationUtilities.js +2 -2
  425. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  426. package/lib/simple-tree/api/schemaFactory.d.ts +7 -4
  427. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  428. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  429. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  430. package/lib/simple-tree/api/storedSchema.js +6 -2
  431. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  432. package/lib/simple-tree/api/treeBeta.d.ts +2 -2
  433. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  434. package/lib/simple-tree/api/treeBeta.js +8 -2
  435. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  436. package/lib/simple-tree/api/verboseTree.d.ts +2 -2
  437. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  438. package/lib/simple-tree/api/verboseTree.js +9 -9
  439. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  440. package/lib/simple-tree/core/allowedTypes.d.ts +20 -4
  441. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  442. package/lib/simple-tree/core/allowedTypes.js +42 -12
  443. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  444. package/lib/simple-tree/core/context.d.ts +13 -2
  445. package/lib/simple-tree/core/context.d.ts.map +1 -1
  446. package/lib/simple-tree/core/context.js +22 -9
  447. package/lib/simple-tree/core/context.js.map +1 -1
  448. package/lib/simple-tree/core/index.d.ts +2 -2
  449. package/lib/simple-tree/core/index.d.ts.map +1 -1
  450. package/lib/simple-tree/core/index.js +2 -2
  451. package/lib/simple-tree/core/index.js.map +1 -1
  452. package/lib/simple-tree/core/treeNodeKernel.d.ts +1 -1
  453. package/lib/simple-tree/core/treeNodeKernel.js +1 -1
  454. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  455. package/lib/simple-tree/core/treeNodeValid.d.ts +1 -1
  456. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  457. package/lib/simple-tree/core/treeNodeValid.js +8 -1
  458. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  459. package/lib/simple-tree/core/walkSchema.d.ts +3 -0
  460. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  461. package/lib/simple-tree/core/walkSchema.js +2 -0
  462. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  463. package/lib/simple-tree/createContext.d.ts +2 -0
  464. package/lib/simple-tree/createContext.d.ts.map +1 -1
  465. package/lib/simple-tree/createContext.js +3 -1
  466. package/lib/simple-tree/createContext.js.map +1 -1
  467. package/lib/simple-tree/fieldSchema.d.ts +1 -0
  468. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  469. package/lib/simple-tree/fieldSchema.js +1 -0
  470. package/lib/simple-tree/fieldSchema.js.map +1 -1
  471. package/lib/simple-tree/index.d.ts +5 -4
  472. package/lib/simple-tree/index.d.ts.map +1 -1
  473. package/lib/simple-tree/index.js +5 -4
  474. package/lib/simple-tree/index.js.map +1 -1
  475. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  476. package/lib/simple-tree/node-kinds/array/arrayNode.js +1 -1
  477. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  478. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  479. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  480. package/lib/simple-tree/node-kinds/index.js +1 -1
  481. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  482. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  483. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  484. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  485. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  486. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  487. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  488. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -16
  489. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  490. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  491. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  492. package/lib/simple-tree/prepareForInsertion.js +11 -5
  493. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  494. package/lib/simple-tree/toStoredSchema.d.ts +3 -0
  495. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  496. package/lib/simple-tree/toStoredSchema.js +3 -0
  497. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  498. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  499. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  500. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  501. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  502. package/lib/simple-tree/walkFieldSchema.d.ts +1 -0
  503. package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
  504. package/lib/simple-tree/walkFieldSchema.js +1 -0
  505. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  506. package/package.json +23 -23
  507. package/src/codec/codec.ts +4 -3
  508. package/src/core/index.ts +2 -0
  509. package/src/core/rebase/index.ts +2 -0
  510. package/src/core/rebase/types.ts +4 -0
  511. package/src/core/schema-stored/schema.ts +2 -26
  512. package/src/core/tree/detachedFieldIndex.ts +4 -6
  513. package/src/core/tree/detachedFieldIndexCodecCommon.ts +87 -0
  514. package/src/core/tree/{detachedFieldIndexCodec.ts → detachedFieldIndexCodecV1.ts} +22 -68
  515. package/src/core/tree/detachedFieldIndexCodecV2.ts +72 -0
  516. package/src/core/tree/detachedFieldIndexCodecs.ts +44 -0
  517. package/src/core/tree/{detachedFieldIndexFormat.ts → detachedFieldIndexFormatCommon.ts} +32 -23
  518. package/src/core/tree/detachedFieldIndexFormatV1.ts +15 -0
  519. package/src/core/tree/detachedFieldIndexFormatV2.ts +17 -0
  520. package/src/feature-libraries/chunked-forest/codec/README.md +1 -1
  521. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +25 -25
  522. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -6
  523. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +96 -73
  524. package/src/feature-libraries/chunked-forest/codec/format.ts +20 -14
  525. package/src/feature-libraries/chunked-forest/codec/{nodeShape.ts → nodeEncoder.ts} +23 -17
  526. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +34 -34
  527. package/src/feature-libraries/chunked-forest/codec/uncompressedEncode.ts +5 -5
  528. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +10 -0
  529. package/src/feature-libraries/default-schema/defaultSchema.ts +0 -2
  530. package/src/feature-libraries/default-schema/index.ts +1 -1
  531. package/src/feature-libraries/default-schema/schemaChecker.ts +47 -30
  532. package/src/feature-libraries/index.ts +1 -18
  533. package/src/feature-libraries/modular-schema/comparison.ts +14 -33
  534. package/src/feature-libraries/modular-schema/index.ts +0 -17
  535. package/src/feature-libraries/object-forest/objectForest.ts +10 -6
  536. package/src/index.ts +5 -0
  537. package/src/packageVersion.ts +1 -1
  538. package/src/shared-tree/independentView.ts +45 -19
  539. package/src/shared-tree/schematizeTree.ts +3 -3
  540. package/src/shared-tree/schematizingTreeView.ts +17 -17
  541. package/src/shared-tree/sharedTree.ts +2 -42
  542. package/src/shared-tree/tree.ts +1 -1
  543. package/src/shared-tree/treeAlpha.ts +30 -18
  544. package/src/shared-tree/treeCheckout.ts +55 -11
  545. package/src/shared-tree-core/branch.ts +1 -6
  546. package/src/simple-tree/api/conciseTree.ts +9 -7
  547. package/src/simple-tree/api/configuration.ts +8 -2
  548. package/src/simple-tree/api/create.ts +49 -36
  549. package/src/simple-tree/api/customTree.ts +59 -20
  550. package/src/simple-tree/api/discrepancies.ts +473 -0
  551. package/src/simple-tree/api/schemaCompatibilityTester.ts +28 -242
  552. package/src/simple-tree/api/schemaCreationUtilities.ts +5 -2
  553. package/src/simple-tree/api/schemaFactory.ts +7 -4
  554. package/src/simple-tree/api/storedSchema.ts +6 -10
  555. package/src/simple-tree/api/treeBeta.ts +17 -4
  556. package/src/simple-tree/api/verboseTree.ts +17 -8
  557. package/src/simple-tree/core/allowedTypes.ts +54 -21
  558. package/src/simple-tree/core/context.ts +24 -22
  559. package/src/simple-tree/core/index.ts +2 -1
  560. package/src/simple-tree/core/treeNodeKernel.ts +1 -1
  561. package/src/simple-tree/core/treeNodeValid.ts +9 -2
  562. package/src/simple-tree/core/walkSchema.ts +3 -0
  563. package/src/simple-tree/createContext.ts +6 -1
  564. package/src/simple-tree/fieldSchema.ts +1 -0
  565. package/src/simple-tree/index.ts +6 -3
  566. package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -19
  567. package/src/simple-tree/node-kinds/index.ts +1 -1
  568. package/src/simple-tree/node-kinds/object/index.ts +1 -1
  569. package/src/simple-tree/node-kinds/object/objectNode.ts +9 -27
  570. package/src/simple-tree/prepareForInsertion.ts +17 -9
  571. package/src/simple-tree/toStoredSchema.ts +3 -0
  572. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +6 -2
  573. package/src/simple-tree/walkFieldSchema.ts +1 -0
  574. package/dist/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  575. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  576. package/dist/core/tree/detachedFieldIndexCodec.js +0 -100
  577. package/dist/core/tree/detachedFieldIndexCodec.js.map +0 -1
  578. package/dist/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  579. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  580. package/dist/core/tree/detachedFieldIndexFormat.js.map +0 -1
  581. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  582. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  583. package/dist/feature-libraries/initializeForest.d.ts +0 -18
  584. package/dist/feature-libraries/initializeForest.d.ts.map +0 -1
  585. package/dist/feature-libraries/initializeForest.js +0 -35
  586. package/dist/feature-libraries/initializeForest.js.map +0 -1
  587. package/dist/feature-libraries/modular-schema/discrepancies.d.ts +0 -174
  588. package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +0 -1
  589. package/dist/feature-libraries/modular-schema/discrepancies.js +0 -361
  590. package/dist/feature-libraries/modular-schema/discrepancies.js.map +0 -1
  591. package/lib/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  592. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  593. package/lib/core/tree/detachedFieldIndexCodec.js +0 -96
  594. package/lib/core/tree/detachedFieldIndexCodec.js.map +0 -1
  595. package/lib/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  596. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  597. package/lib/core/tree/detachedFieldIndexFormat.js.map +0 -1
  598. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  599. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  600. package/lib/feature-libraries/initializeForest.d.ts +0 -18
  601. package/lib/feature-libraries/initializeForest.d.ts.map +0 -1
  602. package/lib/feature-libraries/initializeForest.js +0 -31
  603. package/lib/feature-libraries/initializeForest.js.map +0 -1
  604. package/lib/feature-libraries/modular-schema/discrepancies.d.ts +0 -174
  605. package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +0 -1
  606. package/lib/feature-libraries/modular-schema/discrepancies.js +0 -354
  607. package/lib/feature-libraries/modular-schema/discrepancies.js.map +0 -1
  608. package/src/feature-libraries/initializeForest.ts +0 -55
  609. package/src/feature-libraries/modular-schema/discrepancies.ts +0 -567
@@ -3,52 +3,26 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { unreachableCase, fail } from "@fluidframework/core-utils/internal";
7
-
8
- import {
9
- AdaptedViewSchema,
10
- type TreeNodeStoredSchema,
11
- type Adapters,
12
- type TreeFieldStoredSchema,
13
- type TreeNodeSchemaIdentifier,
14
- type TreeStoredSchema,
15
- } from "../../core/index.js";
16
- import {
17
- FieldKinds,
18
- type FullSchemaPolicy,
19
- type FieldDiscrepancy,
20
- getAllowedContentDiscrepancies,
21
- isNeverTree,
22
- PosetComparisonResult,
23
- fieldRealizer,
24
- comparePosetElements,
25
- } from "../../feature-libraries/index.js";
26
- import type { FieldSchema } from "../fieldSchema.js";
27
- import { toStoredSchema } from "../toStoredSchema.js";
6
+ import type { TreeStoredSchema } from "../../core/index.js";
7
+ import { allowsRepoSuperset, defaultSchemaPolicy } from "../../feature-libraries/index.js";
28
8
 
29
9
  import type { SchemaCompatibilityStatus } from "./tree.js";
10
+ import { getDiscrepanciesInAllowedContent } from "./discrepancies.js";
11
+ import { toStoredSchema } from "../toStoredSchema.js";
12
+ import type { TreeSchema } from "./configuration.js";
30
13
 
31
14
  /**
32
- * A collection of View information for schema, including policy.
15
+ * A collection of View information for schema
33
16
  * @remarks
34
17
  * This contains everything needed to determine compatibility with a given stored schema.
35
18
  */
36
19
  export class SchemaCompatibilityTester {
37
- /**
38
- * Cached conversion of the view schema in the stored schema format.
39
- */
40
- public readonly viewSchemaAsStored: TreeStoredSchema;
41
-
42
- /**
43
- * @param viewSchemaRoot - Schema for the root field.
44
- */
45
20
  public constructor(
46
- public readonly policy: FullSchemaPolicy,
47
- public readonly adapters: Adapters,
48
- viewSchemaRoot: FieldSchema,
49
- ) {
50
- this.viewSchemaAsStored = toStoredSchema(viewSchemaRoot);
51
- }
21
+ /**
22
+ * Schema for the view
23
+ */
24
+ public readonly viewSchema: TreeSchema,
25
+ ) {}
52
26
 
53
27
  /**
54
28
  * Determines the compatibility of a stored document
@@ -63,225 +37,37 @@ export class SchemaCompatibilityTester {
63
37
  public checkCompatibility(
64
38
  stored: TreeStoredSchema,
65
39
  ): Omit<SchemaCompatibilityStatus, "canInitialize"> {
66
- // TODO: support adapters
67
- // const adapted = this.adaptRepo(stored);
40
+ // The public API surface assumes defaultSchemaPolicy
41
+ const policy = defaultSchemaPolicy;
68
42
 
69
43
  // View schema allows a subset of documents that stored schema does, and the discrepancies are allowed by policy
70
44
  // determined by the view schema (i.e. objects with extra optional fields in the stored schema have opted into allowing this.
71
45
  // In the future, this would also include things like:
72
46
  // - fields with more allowed types in the stored schema than in the view schema have out-of-schema "unknown content" adapters
73
47
  let canView = true;
74
- // View schema allows a superset of documents that stored schema does, hence the document could be upgraded to use a persisted version
75
- // of this view schema as its stored schema.
76
- let canUpgrade = true;
77
-
78
- const updateCompatibilityFromFieldDiscrepancy = (discrepancy: FieldDiscrepancy): void => {
79
- switch (discrepancy.mismatch) {
80
- case "allowedTypes": {
81
- // Since we only track the symmetric difference between the allowed types in the view and
82
- // stored schemas, it's sufficient to check if any extra allowed types still exist in the
83
- // stored schema.
84
- if (
85
- discrepancy.stored.some(
86
- (identifier) =>
87
- !isNeverTree(this.policy, stored, stored.nodeSchema.get(identifier)),
88
- )
89
- ) {
90
- // Stored schema has extra allowed types that the view schema does not.
91
- canUpgrade = false;
92
- canView = false;
93
- }
94
48
 
95
- if (
96
- discrepancy.view.some(
97
- (identifier) =>
98
- !isNeverTree(
99
- this.policy,
100
- this.viewSchemaAsStored,
101
- this.viewSchemaAsStored.nodeSchema.get(identifier),
102
- ),
103
- )
104
- ) {
105
- // View schema has extra allowed types that the stored schema does not.
106
- canView = false;
107
- }
108
- break;
109
- }
110
- case "fieldKind": {
111
- const result = comparePosetElements(
112
- discrepancy.stored,
113
- discrepancy.view,
114
- fieldRealizer,
115
- );
116
-
117
- if (result === PosetComparisonResult.Greater) {
118
- // Stored schema is more relaxed than view schema.
119
- canUpgrade = false;
120
- if (
121
- discrepancy.view === FieldKinds.forbidden.identifier &&
122
- discrepancy.identifier !== undefined &&
123
- this.policy.allowUnknownOptionalFields(discrepancy.identifier)
124
- ) {
125
- // When the application has opted into it, we allow viewing documents which have additional
126
- // optional fields in the stored schema that are not present in the view schema.
127
- } else {
128
- canView = false;
129
- }
130
- }
131
-
132
- if (result === PosetComparisonResult.Less) {
133
- // View schema is more relaxed than stored schema.
134
- canView = false;
135
- }
136
-
137
- if (result === PosetComparisonResult.Incomparable) {
138
- canUpgrade = false;
139
- canView = false;
140
- }
141
-
142
- break;
143
- }
144
- case "valueSchema": {
145
- canView = false;
146
- canUpgrade = false;
147
- break;
148
- }
149
- default:
150
- unreachableCase(discrepancy);
151
- }
152
- };
49
+ for (const _discrepancy of getDiscrepanciesInAllowedContent(this.viewSchema, stored)) {
50
+ canView = false;
51
+ break;
52
+ }
153
53
 
154
- for (const discrepancy of getAllowedContentDiscrepancies(
155
- this.viewSchemaAsStored,
54
+ const canUpgrade = allowsRepoSuperset(
55
+ policy,
156
56
  stored,
157
- )) {
158
- if (!canView && !canUpgrade) {
159
- break;
160
- }
57
+ toStoredSchema(this.viewSchema.root),
58
+ );
161
59
 
162
- switch (discrepancy.mismatch) {
163
- case "nodeKind": {
164
- const viewNodeSchema = this.viewSchemaAsStored.nodeSchema.get(
165
- discrepancy.identifier,
166
- );
167
- const storedNodeSchema = stored.nodeSchema.get(discrepancy.identifier);
168
- // We conservatively do not allow node types to change.
169
- // The only time this might be valid in the sense that the data canonically converts is converting an object node
170
- // to a map node over the union of all the object fields' types.
171
- if (discrepancy.stored === undefined) {
172
- const viewIsNever =
173
- viewNodeSchema !== undefined
174
- ? isNeverTree(this.policy, this.viewSchemaAsStored, viewNodeSchema)
175
- : true;
176
- if (!viewIsNever) {
177
- // View schema has added a node type that the stored schema doesn't know about.
178
- canView = false;
179
- }
180
- } else if (discrepancy.view === undefined) {
181
- const storedIsNever =
182
- storedNodeSchema !== undefined
183
- ? isNeverTree(this.policy, stored, storedNodeSchema)
184
- : true;
185
- if (!storedIsNever) {
186
- // Stored schema has a node type that the view schema doesn't know about.
187
- canUpgrade = false;
188
- }
189
- } else {
190
- // Node type exists in both schemas but has changed. We conservatively never allow this.
191
- const storedIsNever =
192
- storedNodeSchema !== undefined
193
- ? isNeverTree(this.policy, stored, storedNodeSchema)
194
- : true;
195
- const viewIsNever =
196
- viewNodeSchema !== undefined
197
- ? isNeverTree(this.policy, this.viewSchemaAsStored, viewNodeSchema)
198
- : true;
199
- if (!storedIsNever || !viewIsNever) {
200
- canView = false;
201
- canUpgrade = false;
202
- }
203
- }
204
- break;
205
- }
206
- case "valueSchema":
207
- case "allowedTypes":
208
- case "fieldKind": {
209
- updateCompatibilityFromFieldDiscrepancy(discrepancy);
210
- break;
211
- }
212
- case "fields": {
213
- discrepancy.differences.forEach(updateCompatibilityFromFieldDiscrepancy);
214
- break;
215
- }
216
- // No default
217
- }
218
- }
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);
219
66
 
220
67
  return {
221
68
  canView,
222
69
  canUpgrade,
223
- isEquivalent: canView && canUpgrade,
70
+ isEquivalent,
224
71
  };
225
72
  }
226
-
227
- /**
228
- * Compute a schema that `original` could be viewed as using adapters as needed.
229
- *
230
- * TODO: have a way for callers to get invalidated on schema updates.
231
- */
232
- public adaptRepo(stored: TreeStoredSchema): AdaptedViewSchema {
233
- // Sanity check on adapters:
234
- // it's probably a bug if they use the never types,
235
- // since there never is a reason to have a never type as an adapter input,
236
- // and its impossible for an adapter to be correctly implemented if its output type is never
237
- // (unless its input is also never).
238
-
239
- for (const adapter of this.adapters?.tree ?? []) {
240
- if (
241
- isNeverTree(
242
- this.policy,
243
- this.viewSchemaAsStored,
244
- this.viewSchemaAsStored.nodeSchema.get(adapter.output),
245
- )
246
- ) {
247
- fail(0xb3d /* tree adapter for stored adapter.output should not be never */);
248
- }
249
- }
250
-
251
- const adapted = {
252
- rootFieldSchema: this.adaptField(stored.rootFieldSchema),
253
- nodeSchema: new Map<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>(),
254
- };
255
-
256
- for (const [key, schema] of stored.nodeSchema) {
257
- const adapatedTree = this.adaptTree(schema);
258
- adapted.nodeSchema.set(key, adapatedTree);
259
- }
260
-
261
- // TODO: subset these adapters to the ones that were needed/used.
262
- return new AdaptedViewSchema(this.adapters, adapted);
263
- }
264
-
265
- /**
266
- * Adapt original such that it allows member types which can be adapted to its specified types.
267
- */
268
- private adaptField(original: TreeFieldStoredSchema): TreeFieldStoredSchema {
269
- if (original.types !== undefined) {
270
- const types: Set<TreeNodeSchemaIdentifier> = new Set(original.types);
271
- for (const treeAdapter of this.adapters?.tree ?? []) {
272
- if (types.has(treeAdapter.input)) {
273
- types.delete(treeAdapter.input);
274
- types.add(treeAdapter.output);
275
- }
276
- }
277
-
278
- return { kind: original.kind, types, persistedMetadata: undefined };
279
- }
280
- return original;
281
- }
282
-
283
- private adaptTree(original: TreeNodeStoredSchema): TreeNodeStoredSchema {
284
- // TODO: support adapters like missing field adapters.
285
- return original;
286
- }
287
73
  }
@@ -197,10 +197,13 @@ export function enumEntries(
197
197
  }
198
198
  // At this point, it is expected that all remaining cases are reverse mappings,
199
199
  // but do some asserts to ensure that the above logic is sufficient.
200
- assert(typeof value === "string", "expected reverse mapping and thus a string value");
200
+ assert(
201
+ typeof value === "string",
202
+ 0xbe4 /* expected reverse mapping and thus a string value */,
203
+ );
201
204
  assert(
202
205
  Number.parseFloat(key).toString() === key,
203
- "expected reverse mapping and thus a key that is a normalized number",
206
+ 0xbe5 /* expected reverse mapping and thus a key that is a normalized number */,
204
207
  );
205
208
  // Discard the reverse mapping.
206
209
  return false;
@@ -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,10 +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
- {},
107
- normalizeFieldSchema(view),
108
- );
101
+ const config = new TreeViewConfigurationAlpha({
102
+ schema: normalizeFieldSchema(view),
103
+ });
104
+ const viewSchema = new SchemaCompatibilityTester(config);
109
105
  return viewSchema.checkCompatibility(stored);
110
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
  /**