@fluidframework/tree 2.51.0 → 2.53.0-350190

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (730) hide show
  1. package/.vscode/settings.json +0 -1
  2. package/CHANGELOG.md +43 -0
  3. package/api-report/tree.alpha.api.md +40 -30
  4. package/dist/alpha.d.ts +2 -1
  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 +15 -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 +1 -2
  98. package/dist/feature-libraries/index.d.ts.map +1 -1
  99. package/dist/feature-libraries/index.js +2 -4
  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 -16
  104. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  105. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
  106. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  107. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
  108. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  109. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  110. package/dist/feature-libraries/modular-schema/genericFieldKind.js +1 -0
  111. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  112. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
  113. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  114. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +49 -20
  115. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  116. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  117. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  118. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  119. package/dist/feature-libraries/object-forest/objectForest.js +2 -3
  120. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  121. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  122. package/dist/feature-libraries/optional-field/optionalField.js +3 -0
  123. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  124. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
  125. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  126. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
  127. package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  128. package/dist/index.d.ts +1 -1
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +6 -2
  131. package/dist/index.js.map +1 -1
  132. package/dist/jsonDomainSchema.d.ts +5 -3
  133. package/dist/jsonDomainSchema.d.ts.map +1 -1
  134. package/dist/jsonDomainSchema.js.map +1 -1
  135. package/dist/packageVersion.d.ts +1 -1
  136. package/dist/packageVersion.d.ts.map +1 -1
  137. package/dist/packageVersion.js +1 -1
  138. package/dist/packageVersion.js.map +1 -1
  139. package/dist/shared-tree/independentView.d.ts +8 -0
  140. package/dist/shared-tree/independentView.d.ts.map +1 -1
  141. package/dist/shared-tree/independentView.js +23 -11
  142. package/dist/shared-tree/independentView.js.map +1 -1
  143. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  144. package/dist/shared-tree/schematizeTree.js +1 -1
  145. package/dist/shared-tree/schematizeTree.js.map +1 -1
  146. package/dist/shared-tree/schematizingTreeView.d.ts +0 -1
  147. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  148. package/dist/shared-tree/schematizingTreeView.js +9 -12
  149. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  150. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  151. package/dist/shared-tree/sharedTree.js +1 -29
  152. package/dist/shared-tree/sharedTree.js.map +1 -1
  153. package/dist/shared-tree/treeAlpha.d.ts +20 -6
  154. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  155. package/dist/shared-tree/treeAlpha.js +18 -7
  156. package/dist/shared-tree/treeAlpha.js.map +1 -1
  157. package/dist/shared-tree/treeCheckout.d.ts +2 -1
  158. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  159. package/dist/shared-tree/treeCheckout.js +32 -0
  160. package/dist/shared-tree/treeCheckout.js.map +1 -1
  161. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  162. package/dist/shared-tree-core/branch.js +1 -1
  163. package/dist/shared-tree-core/branch.js.map +1 -1
  164. package/dist/simple-tree/api/conciseTree.d.ts +2 -2
  165. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  166. package/dist/simple-tree/api/conciseTree.js +6 -6
  167. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  168. package/dist/simple-tree/api/configuration.d.ts +11 -2
  169. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  170. package/dist/simple-tree/api/configuration.js +5 -1
  171. package/dist/simple-tree/api/configuration.js.map +1 -1
  172. package/dist/simple-tree/api/create.d.ts +8 -7
  173. package/dist/simple-tree/api/create.d.ts.map +1 -1
  174. package/dist/simple-tree/api/create.js +33 -23
  175. package/dist/simple-tree/api/create.js.map +1 -1
  176. package/dist/simple-tree/api/customTree.d.ts +25 -4
  177. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  178. package/dist/simple-tree/api/customTree.js +42 -16
  179. package/dist/simple-tree/api/customTree.js.map +1 -1
  180. package/dist/simple-tree/api/discrepancies.d.ts +94 -0
  181. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
  182. package/dist/simple-tree/api/discrepancies.js +256 -0
  183. package/dist/simple-tree/api/discrepancies.js.map +1 -0
  184. package/dist/simple-tree/api/index.d.ts +3 -2
  185. package/dist/simple-tree/api/index.d.ts.map +1 -1
  186. package/dist/simple-tree/api/index.js +3 -2
  187. package/dist/simple-tree/api/index.js.map +1 -1
  188. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +9 -7
  189. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  190. package/dist/simple-tree/api/schemaCompatibilityTester.js +17 -117
  191. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  192. package/dist/simple-tree/api/schemaFactory.d.ts +16 -159
  193. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  194. package/dist/simple-tree/api/schemaFactory.js +4 -47
  195. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  196. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
  197. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  198. package/dist/simple-tree/api/schemaFactoryAlpha.js +33 -11
  199. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  200. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
  201. package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  202. package/dist/simple-tree/api/schemaFactoryRecursive.js +1 -7
  203. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  204. package/dist/simple-tree/api/schemaStatics.d.ts +158 -0
  205. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -0
  206. package/dist/simple-tree/api/schemaStatics.js +59 -0
  207. package/dist/simple-tree/api/schemaStatics.js.map +1 -0
  208. package/dist/simple-tree/api/storedSchema.d.ts +5 -3
  209. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  210. package/dist/simple-tree/api/storedSchema.js +9 -3
  211. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  212. package/dist/simple-tree/api/treeBeta.d.ts +2 -2
  213. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  214. package/dist/simple-tree/api/treeBeta.js +16 -4
  215. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  216. package/dist/simple-tree/api/verboseTree.d.ts +2 -2
  217. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  218. package/dist/simple-tree/api/verboseTree.js +15 -15
  219. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  220. package/dist/simple-tree/core/allowedTypes.d.ts +43 -11
  221. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  222. package/dist/simple-tree/core/allowedTypes.js +51 -11
  223. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  224. package/dist/simple-tree/core/context.d.ts +13 -2
  225. package/dist/simple-tree/core/context.d.ts.map +1 -1
  226. package/dist/simple-tree/core/context.js +22 -9
  227. package/dist/simple-tree/core/context.js.map +1 -1
  228. package/dist/simple-tree/core/index.d.ts +6 -4
  229. package/dist/simple-tree/core/index.d.ts.map +1 -1
  230. package/dist/simple-tree/core/index.js +8 -1
  231. package/dist/simple-tree/core/index.js.map +1 -1
  232. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
  233. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
  234. package/dist/simple-tree/core/simpleNodeSchemaBase.js +7 -0
  235. package/dist/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
  236. package/dist/simple-tree/core/toStored.d.ts +32 -0
  237. package/dist/simple-tree/core/toStored.d.ts.map +1 -0
  238. package/dist/simple-tree/core/toStored.js +37 -0
  239. package/dist/simple-tree/core/toStored.js.map +1 -0
  240. package/dist/simple-tree/core/treeNodeKernel.d.ts +1 -1
  241. package/dist/simple-tree/core/treeNodeKernel.js +1 -1
  242. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  243. package/dist/simple-tree/core/treeNodeSchema.d.ts +7 -2
  244. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  245. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  246. package/dist/simple-tree/core/treeNodeValid.d.ts +7 -2
  247. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  248. package/dist/simple-tree/core/treeNodeValid.js +19 -4
  249. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  250. package/dist/simple-tree/core/walkSchema.d.ts +22 -5
  251. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  252. package/dist/simple-tree/core/walkSchema.js +6 -2
  253. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  254. package/dist/simple-tree/createContext.d.ts +2 -0
  255. package/dist/simple-tree/createContext.d.ts.map +1 -1
  256. package/dist/simple-tree/createContext.js +4 -2
  257. package/dist/simple-tree/createContext.js.map +1 -1
  258. package/dist/simple-tree/fieldSchema.d.ts +1 -0
  259. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  260. package/dist/simple-tree/fieldSchema.js +2 -1
  261. package/dist/simple-tree/fieldSchema.js.map +1 -1
  262. package/dist/simple-tree/index.d.ts +7 -7
  263. package/dist/simple-tree/index.d.ts.map +1 -1
  264. package/dist/simple-tree/index.js +13 -8
  265. package/dist/simple-tree/index.js.map +1 -1
  266. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  267. package/dist/simple-tree/leafNodeSchema.js +1 -0
  268. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  269. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  270. package/dist/simple-tree/node-kinds/array/arrayNode.js +18 -4
  271. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  272. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  273. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  274. package/dist/simple-tree/node-kinds/index.js +1 -2
  275. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  276. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  277. package/dist/simple-tree/node-kinds/map/mapNode.js +9 -2
  278. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  279. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  280. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  281. package/dist/simple-tree/node-kinds/object/index.js +1 -2
  282. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  283. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +3 -8
  284. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  285. package/dist/simple-tree/node-kinds/object/objectNode.js +41 -44
  286. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  287. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  288. package/dist/simple-tree/node-kinds/record/recordNode.js +9 -2
  289. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  290. package/dist/simple-tree/prepareForInsertion.d.ts +6 -6
  291. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  292. package/dist/simple-tree/prepareForInsertion.js +19 -13
  293. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  294. package/dist/simple-tree/simpleSchema.d.ts +6 -21
  295. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  296. package/dist/simple-tree/simpleSchema.js.map +1 -1
  297. package/dist/simple-tree/toStoredSchema.d.ts +38 -11
  298. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  299. package/dist/simple-tree/toStoredSchema.js +71 -33
  300. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  301. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  302. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  303. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  304. package/dist/simple-tree/walkFieldSchema.d.ts +1 -0
  305. package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
  306. package/dist/simple-tree/walkFieldSchema.js +1 -0
  307. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  308. package/lib/alpha.d.ts +2 -1
  309. package/lib/codec/codec.d.ts +2 -1
  310. package/lib/codec/codec.d.ts.map +1 -1
  311. package/lib/codec/codec.js +4 -3
  312. package/lib/codec/codec.js.map +1 -1
  313. package/lib/core/index.d.ts +1 -1
  314. package/lib/core/index.d.ts.map +1 -1
  315. package/lib/core/index.js +1 -1
  316. package/lib/core/index.js.map +1 -1
  317. package/lib/core/rebase/index.d.ts +1 -1
  318. package/lib/core/rebase/index.d.ts.map +1 -1
  319. package/lib/core/rebase/index.js +1 -1
  320. package/lib/core/rebase/index.js.map +1 -1
  321. package/lib/core/rebase/types.d.ts +3 -1
  322. package/lib/core/rebase/types.d.ts.map +1 -1
  323. package/lib/core/rebase/types.js +1 -0
  324. package/lib/core/rebase/types.js.map +1 -1
  325. package/lib/core/schema-stored/schema.d.ts +1 -23
  326. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  327. package/lib/core/schema-stored/schema.js +2 -2
  328. package/lib/core/schema-stored/schema.js.map +1 -1
  329. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  330. package/lib/core/tree/detachedFieldIndex.js +2 -3
  331. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  332. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  333. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  334. package/lib/core/tree/detachedFieldIndexCodecCommon.js +64 -0
  335. package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  336. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  337. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  338. package/lib/core/tree/detachedFieldIndexCodecV1.js +51 -0
  339. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  340. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  341. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  342. package/lib/core/tree/detachedFieldIndexCodecV2.js +45 -0
  343. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  344. package/lib/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  345. package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  346. package/lib/core/tree/detachedFieldIndexCodecs.js +21 -0
  347. package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  348. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  349. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  350. package/lib/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +13 -10
  351. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  352. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  353. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  354. package/lib/core/tree/detachedFieldIndexFormatV1.js +9 -0
  355. package/lib/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  356. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  357. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  358. package/lib/core/tree/detachedFieldIndexFormatV2.js +11 -0
  359. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  360. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  361. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  362. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +19 -19
  363. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  364. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  365. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  366. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  367. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  368. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  369. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  370. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +70 -57
  371. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  372. package/lib/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  373. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  374. package/lib/feature-libraries/chunked-forest/codec/format.js +17 -11
  375. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  376. package/{dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts → lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  377. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  378. package/lib/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +21 -15
  379. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  380. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  381. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  382. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +19 -19
  383. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  384. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  385. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  386. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  387. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  388. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +15 -2
  389. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  390. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  391. package/lib/feature-libraries/default-schema/defaultSchema.js +0 -2
  392. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  393. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  394. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  395. package/lib/feature-libraries/default-schema/index.js +1 -1
  396. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  397. package/lib/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  398. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  399. package/lib/feature-libraries/default-schema/schemaChecker.js +29 -24
  400. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  401. package/lib/feature-libraries/index.d.ts +1 -2
  402. package/lib/feature-libraries/index.d.ts.map +1 -1
  403. package/lib/feature-libraries/index.js +1 -2
  404. package/lib/feature-libraries/index.js.map +1 -1
  405. package/lib/feature-libraries/modular-schema/comparison.d.ts +5 -6
  406. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  407. package/lib/feature-libraries/modular-schema/comparison.js +14 -14
  408. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  409. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
  410. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  411. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
  412. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  413. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  414. package/lib/feature-libraries/modular-schema/genericFieldKind.js +1 -0
  415. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  416. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
  417. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  418. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +50 -21
  419. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  420. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  421. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  422. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  423. package/lib/feature-libraries/object-forest/objectForest.js +3 -4
  424. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  425. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  426. package/lib/feature-libraries/optional-field/optionalField.js +3 -0
  427. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  428. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
  429. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
  430. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
  431. package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
  432. package/lib/index.d.ts +1 -1
  433. package/lib/index.d.ts.map +1 -1
  434. package/lib/index.js +2 -2
  435. package/lib/index.js.map +1 -1
  436. package/lib/jsonDomainSchema.d.ts +5 -3
  437. package/lib/jsonDomainSchema.d.ts.map +1 -1
  438. package/lib/jsonDomainSchema.js.map +1 -1
  439. package/lib/packageVersion.d.ts +1 -1
  440. package/lib/packageVersion.d.ts.map +1 -1
  441. package/lib/packageVersion.js +1 -1
  442. package/lib/packageVersion.js.map +1 -1
  443. package/lib/shared-tree/independentView.d.ts +8 -0
  444. package/lib/shared-tree/independentView.d.ts.map +1 -1
  445. package/lib/shared-tree/independentView.js +21 -10
  446. package/lib/shared-tree/independentView.js.map +1 -1
  447. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  448. package/lib/shared-tree/schematizeTree.js +2 -2
  449. package/lib/shared-tree/schematizeTree.js.map +1 -1
  450. package/lib/shared-tree/schematizingTreeView.d.ts +0 -1
  451. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  452. package/lib/shared-tree/schematizingTreeView.js +10 -13
  453. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  454. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  455. package/lib/shared-tree/sharedTree.js +2 -30
  456. package/lib/shared-tree/sharedTree.js.map +1 -1
  457. package/lib/shared-tree/treeAlpha.d.ts +20 -6
  458. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  459. package/lib/shared-tree/treeAlpha.js +19 -8
  460. package/lib/shared-tree/treeAlpha.js.map +1 -1
  461. package/lib/shared-tree/treeCheckout.d.ts +2 -1
  462. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  463. package/lib/shared-tree/treeCheckout.js +33 -1
  464. package/lib/shared-tree/treeCheckout.js.map +1 -1
  465. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  466. package/lib/shared-tree-core/branch.js +1 -1
  467. package/lib/shared-tree-core/branch.js.map +1 -1
  468. package/lib/simple-tree/api/conciseTree.d.ts +2 -2
  469. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  470. package/lib/simple-tree/api/conciseTree.js +6 -6
  471. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  472. package/lib/simple-tree/api/configuration.d.ts +11 -2
  473. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  474. package/lib/simple-tree/api/configuration.js +6 -2
  475. package/lib/simple-tree/api/configuration.js.map +1 -1
  476. package/lib/simple-tree/api/create.d.ts +8 -7
  477. package/lib/simple-tree/api/create.d.ts.map +1 -1
  478. package/lib/simple-tree/api/create.js +35 -25
  479. package/lib/simple-tree/api/create.js.map +1 -1
  480. package/lib/simple-tree/api/customTree.d.ts +25 -4
  481. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  482. package/lib/simple-tree/api/customTree.js +43 -17
  483. package/lib/simple-tree/api/customTree.js.map +1 -1
  484. package/lib/simple-tree/api/discrepancies.d.ts +94 -0
  485. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
  486. package/lib/simple-tree/api/discrepancies.js +251 -0
  487. package/lib/simple-tree/api/discrepancies.js.map +1 -0
  488. package/lib/simple-tree/api/index.d.ts +3 -2
  489. package/lib/simple-tree/api/index.d.ts.map +1 -1
  490. package/lib/simple-tree/api/index.js +2 -1
  491. package/lib/simple-tree/api/index.js.map +1 -1
  492. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +9 -7
  493. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  494. package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -119
  495. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  496. package/lib/simple-tree/api/schemaFactory.d.ts +16 -159
  497. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  498. package/lib/simple-tree/api/schemaFactory.js +2 -45
  499. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  500. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
  501. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  502. package/lib/simple-tree/api/schemaFactoryAlpha.js +23 -1
  503. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  504. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
  505. package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
  506. package/lib/simple-tree/api/schemaFactoryRecursive.js +0 -5
  507. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  508. package/lib/simple-tree/api/schemaStatics.d.ts +158 -0
  509. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -0
  510. package/lib/simple-tree/api/schemaStatics.js +56 -0
  511. package/lib/simple-tree/api/schemaStatics.js.map +1 -0
  512. package/lib/simple-tree/api/storedSchema.d.ts +5 -3
  513. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  514. package/lib/simple-tree/api/storedSchema.js +12 -6
  515. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  516. package/lib/simple-tree/api/treeBeta.d.ts +2 -2
  517. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  518. package/lib/simple-tree/api/treeBeta.js +14 -2
  519. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  520. package/lib/simple-tree/api/verboseTree.d.ts +2 -2
  521. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  522. package/lib/simple-tree/api/verboseTree.js +9 -9
  523. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  524. package/lib/simple-tree/core/allowedTypes.d.ts +43 -11
  525. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  526. package/lib/simple-tree/core/allowedTypes.js +52 -11
  527. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  528. package/lib/simple-tree/core/context.d.ts +13 -2
  529. package/lib/simple-tree/core/context.d.ts.map +1 -1
  530. package/lib/simple-tree/core/context.js +22 -9
  531. package/lib/simple-tree/core/context.js.map +1 -1
  532. package/lib/simple-tree/core/index.d.ts +6 -4
  533. package/lib/simple-tree/core/index.d.ts.map +1 -1
  534. package/lib/simple-tree/core/index.js +4 -3
  535. package/lib/simple-tree/core/index.js.map +1 -1
  536. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
  537. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
  538. package/lib/simple-tree/core/simpleNodeSchemaBase.js +6 -0
  539. package/lib/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
  540. package/lib/simple-tree/core/toStored.d.ts +32 -0
  541. package/lib/simple-tree/core/toStored.d.ts.map +1 -0
  542. package/lib/simple-tree/core/toStored.js +32 -0
  543. package/lib/simple-tree/core/toStored.js.map +1 -0
  544. package/lib/simple-tree/core/treeNodeKernel.d.ts +1 -1
  545. package/lib/simple-tree/core/treeNodeKernel.js +1 -1
  546. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  547. package/lib/simple-tree/core/treeNodeSchema.d.ts +7 -2
  548. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  549. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  550. package/lib/simple-tree/core/treeNodeValid.d.ts +7 -2
  551. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  552. package/lib/simple-tree/core/treeNodeValid.js +17 -3
  553. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  554. package/lib/simple-tree/core/walkSchema.d.ts +22 -5
  555. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  556. package/lib/simple-tree/core/walkSchema.js +6 -2
  557. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  558. package/lib/simple-tree/createContext.d.ts +2 -0
  559. package/lib/simple-tree/createContext.d.ts.map +1 -1
  560. package/lib/simple-tree/createContext.js +5 -3
  561. package/lib/simple-tree/createContext.js.map +1 -1
  562. package/lib/simple-tree/fieldSchema.d.ts +1 -0
  563. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  564. package/lib/simple-tree/fieldSchema.js +2 -1
  565. package/lib/simple-tree/fieldSchema.js.map +1 -1
  566. package/lib/simple-tree/index.d.ts +7 -7
  567. package/lib/simple-tree/index.d.ts.map +1 -1
  568. package/lib/simple-tree/index.js +5 -5
  569. package/lib/simple-tree/index.js.map +1 -1
  570. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  571. package/lib/simple-tree/leafNodeSchema.js +2 -1
  572. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  573. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  574. package/lib/simple-tree/node-kinds/array/arrayNode.js +21 -7
  575. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  576. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  577. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  578. package/lib/simple-tree/node-kinds/index.js +1 -1
  579. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  580. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  581. package/lib/simple-tree/node-kinds/map/mapNode.js +12 -5
  582. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  583. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  584. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  585. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  586. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  587. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +3 -8
  588. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  589. package/lib/simple-tree/node-kinds/object/objectNode.js +19 -21
  590. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  591. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  592. package/lib/simple-tree/node-kinds/record/recordNode.js +12 -5
  593. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  594. package/lib/simple-tree/prepareForInsertion.d.ts +6 -6
  595. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  596. package/lib/simple-tree/prepareForInsertion.js +21 -15
  597. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  598. package/lib/simple-tree/simpleSchema.d.ts +6 -21
  599. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  600. package/lib/simple-tree/simpleSchema.js.map +1 -1
  601. package/lib/simple-tree/toStoredSchema.d.ts +38 -11
  602. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  603. package/lib/simple-tree/toStoredSchema.js +70 -34
  604. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  605. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  606. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  607. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  608. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  609. package/lib/simple-tree/walkFieldSchema.d.ts +1 -0
  610. package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
  611. package/lib/simple-tree/walkFieldSchema.js +1 -0
  612. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  613. package/package.json +23 -23
  614. package/src/codec/codec.ts +4 -3
  615. package/src/core/index.ts +2 -0
  616. package/src/core/rebase/index.ts +2 -0
  617. package/src/core/rebase/types.ts +4 -0
  618. package/src/core/schema-stored/schema.ts +2 -26
  619. package/src/core/tree/detachedFieldIndex.ts +4 -6
  620. package/src/core/tree/detachedFieldIndexCodecCommon.ts +87 -0
  621. package/src/core/tree/{detachedFieldIndexCodec.ts → detachedFieldIndexCodecV1.ts} +22 -68
  622. package/src/core/tree/detachedFieldIndexCodecV2.ts +72 -0
  623. package/src/core/tree/detachedFieldIndexCodecs.ts +44 -0
  624. package/src/core/tree/{detachedFieldIndexFormat.ts → detachedFieldIndexFormatCommon.ts} +32 -23
  625. package/src/core/tree/detachedFieldIndexFormatV1.ts +15 -0
  626. package/src/core/tree/detachedFieldIndexFormatV2.ts +17 -0
  627. package/src/feature-libraries/chunked-forest/codec/README.md +1 -1
  628. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +25 -25
  629. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -6
  630. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +96 -73
  631. package/src/feature-libraries/chunked-forest/codec/format.ts +20 -14
  632. package/src/feature-libraries/chunked-forest/codec/{nodeShape.ts → nodeEncoder.ts} +23 -17
  633. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +34 -34
  634. package/src/feature-libraries/chunked-forest/codec/uncompressedEncode.ts +5 -5
  635. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +11 -0
  636. package/src/feature-libraries/default-schema/defaultSchema.ts +0 -2
  637. package/src/feature-libraries/default-schema/index.ts +1 -1
  638. package/src/feature-libraries/default-schema/schemaChecker.ts +47 -30
  639. package/src/feature-libraries/index.ts +1 -3
  640. package/src/feature-libraries/modular-schema/comparison.ts +14 -29
  641. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +9 -0
  642. package/src/feature-libraries/modular-schema/genericFieldKind.ts +1 -0
  643. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +61 -19
  644. package/src/feature-libraries/object-forest/objectForest.ts +10 -6
  645. package/src/feature-libraries/optional-field/optionalField.ts +4 -0
  646. package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +4 -0
  647. package/src/index.ts +7 -1
  648. package/src/jsonDomainSchema.ts +4 -0
  649. package/src/packageVersion.ts +1 -1
  650. package/src/shared-tree/independentView.ts +45 -19
  651. package/src/shared-tree/schematizeTree.ts +2 -2
  652. package/src/shared-tree/schematizingTreeView.ts +24 -15
  653. package/src/shared-tree/sharedTree.ts +2 -42
  654. package/src/shared-tree/treeAlpha.ts +48 -22
  655. package/src/shared-tree/treeCheckout.ts +54 -10
  656. package/src/shared-tree-core/branch.ts +1 -6
  657. package/src/simple-tree/api/conciseTree.ts +9 -7
  658. package/src/simple-tree/api/configuration.ts +18 -4
  659. package/src/simple-tree/api/create.ts +44 -36
  660. package/src/simple-tree/api/customTree.ts +59 -20
  661. package/src/simple-tree/api/discrepancies.ts +474 -0
  662. package/src/simple-tree/api/index.ts +2 -3
  663. package/src/simple-tree/api/schemaCompatibilityTester.ts +23 -151
  664. package/src/simple-tree/api/schemaFactory.ts +13 -254
  665. package/src/simple-tree/api/schemaFactoryAlpha.ts +174 -1
  666. package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -25
  667. package/src/simple-tree/api/schemaStatics.ts +291 -0
  668. package/src/simple-tree/api/storedSchema.ts +18 -14
  669. package/src/simple-tree/api/treeBeta.ts +24 -4
  670. package/src/simple-tree/api/verboseTree.ts +17 -8
  671. package/src/simple-tree/core/allowedTypes.ts +87 -34
  672. package/src/simple-tree/core/context.ts +24 -22
  673. package/src/simple-tree/core/index.ts +11 -2
  674. package/src/simple-tree/core/simpleNodeSchemaBase.ts +30 -0
  675. package/src/simple-tree/core/toStored.ts +58 -0
  676. package/src/simple-tree/core/treeNodeKernel.ts +1 -1
  677. package/src/simple-tree/core/treeNodeSchema.ts +8 -2
  678. package/src/simple-tree/core/treeNodeValid.ts +23 -4
  679. package/src/simple-tree/core/walkSchema.ts +26 -6
  680. package/src/simple-tree/createContext.ts +11 -3
  681. package/src/simple-tree/fieldSchema.ts +3 -1
  682. package/src/simple-tree/index.ts +19 -13
  683. package/src/simple-tree/leafNodeSchema.ts +2 -1
  684. package/src/simple-tree/node-kinds/array/arrayNode.ts +64 -23
  685. package/src/simple-tree/node-kinds/index.ts +0 -1
  686. package/src/simple-tree/node-kinds/map/mapNode.ts +23 -2
  687. package/src/simple-tree/node-kinds/object/index.ts +0 -1
  688. package/src/simple-tree/node-kinds/object/objectNode.ts +42 -30
  689. package/src/simple-tree/node-kinds/record/recordNode.ts +20 -2
  690. package/src/simple-tree/prepareForInsertion.ts +28 -15
  691. package/src/simple-tree/simpleSchema.ts +6 -26
  692. package/src/simple-tree/toStoredSchema.ts +110 -44
  693. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +6 -2
  694. package/src/simple-tree/walkFieldSchema.ts +1 -0
  695. package/dist/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  696. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  697. package/dist/core/tree/detachedFieldIndexCodec.js +0 -100
  698. package/dist/core/tree/detachedFieldIndexCodec.js.map +0 -1
  699. package/dist/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  700. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  701. package/dist/core/tree/detachedFieldIndexFormat.js.map +0 -1
  702. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  703. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  704. package/dist/feature-libraries/initializeForest.d.ts +0 -18
  705. package/dist/feature-libraries/initializeForest.d.ts.map +0 -1
  706. package/dist/feature-libraries/initializeForest.js +0 -35
  707. package/dist/feature-libraries/initializeForest.js.map +0 -1
  708. package/dist/simple-tree/discrepancies.d.ts +0 -167
  709. package/dist/simple-tree/discrepancies.d.ts.map +0 -1
  710. package/dist/simple-tree/discrepancies.js +0 -382
  711. package/dist/simple-tree/discrepancies.js.map +0 -1
  712. package/lib/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  713. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  714. package/lib/core/tree/detachedFieldIndexCodec.js +0 -96
  715. package/lib/core/tree/detachedFieldIndexCodec.js.map +0 -1
  716. package/lib/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  717. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  718. package/lib/core/tree/detachedFieldIndexFormat.js.map +0 -1
  719. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  720. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  721. package/lib/feature-libraries/initializeForest.d.ts +0 -18
  722. package/lib/feature-libraries/initializeForest.d.ts.map +0 -1
  723. package/lib/feature-libraries/initializeForest.js +0 -31
  724. package/lib/feature-libraries/initializeForest.js.map +0 -1
  725. package/lib/simple-tree/discrepancies.d.ts +0 -167
  726. package/lib/simple-tree/discrepancies.d.ts.map +0 -1
  727. package/lib/simple-tree/discrepancies.js +0 -376
  728. package/lib/simple-tree/discrepancies.js.map +0 -1
  729. package/src/feature-libraries/initializeForest.ts +0 -55
  730. package/src/simple-tree/discrepancies.ts +0 -648
@@ -36,7 +36,6 @@ import {
36
36
  verboseFromCursor,
37
37
  type TreeEncodingOptions,
38
38
  type VerboseTree,
39
- toStoredSchema,
40
39
  extractPersistedSchema,
41
40
  type TreeBranch,
42
41
  TreeViewConfigurationAlpha,
@@ -51,6 +50,10 @@ import {
51
50
  NodeKind,
52
51
  tryGetTreeNodeForField,
53
52
  isObjectNodeSchema,
53
+ isTreeNode,
54
+ toInitialSchema,
55
+ convertField,
56
+ toUnhydratedSchema,
54
57
  } from "../simple-tree/index.js";
55
58
  import { brand, extractFromOpaque, type JsonCompatible } from "../util/index.js";
56
59
  import {
@@ -191,11 +194,19 @@ export interface TreeIdentifierUtils {
191
194
  * Extensions to {@link (Tree:interface)} and {@link (TreeBeta:interface)} which are not yet stable.
192
195
  * @remarks
193
196
  * Use via the {@link (TreeAlpha:variable)} singleton.
197
+ *
198
+ * The unhydrated node creation APIs in this interface do not support {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}.
199
+ * This is because unknown optional fields still must have a schema: its just that the schema may come from the document's stored schema.
200
+ * Unhydrated nodes created via this interface are not associated with any document, so there is nowhere for them to get schema for unknown optional fields.
201
+ * Note that {@link (TreeBeta:interface).clone} can create an unhydrated node with unknown optional fields, as it uses the source node's stored schema (if any).
202
+ *
203
+ * Export APIs in this interface include {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}
204
+ * if they are using {@link TreeEncodingOptions.useStoredKeys | stored keys}.
205
+ *
194
206
  * @privateRemarks
195
- * TODO: AB#43548:
196
- * How all the create and all the import and export APIs handle unknown optional fields needs to be figured out, tested and documented.
197
- * This will need to be extended/generalized to cover other future schema evolution options as well once they exist.
198
- * See also TreeBeta.clone with a similar issue.
207
+ * TODO:
208
+ * There should be a way to provide a source for defaulted identifiers for unhydrated node creation, either via these APIs or some way to add them to its output later.
209
+ * If an option were added to these APIs, it could also be used to enable unknown optional fields.
199
210
  *
200
211
  * @system @sealed @alpha
201
212
  */
@@ -219,8 +230,6 @@ export interface TreeAlpha {
219
230
  * When providing a {@link TreeNodeSchemaClass}, this is the same as invoking its constructor except that an unhydrated node can also be provided.
220
231
  * This function exists as a generalization that can be used in other cases as well,
221
232
  * such as when `undefined` might be allowed (for an optional field), or when the type should be inferred from the data when more than one type is possible.
222
- * @privateRemarks
223
- * TODO: AB#43548: There should be a way to provide a source for defaulted identifiers, either via this API or some way to add them to its output later.
224
233
  */
225
234
  create<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(
226
235
  schema: UnsafeUnknownSchema extends TSchema
@@ -263,6 +272,14 @@ export interface TreeAlpha {
263
272
  * Construct tree content compatible with a field defined by the provided `schema`.
264
273
  * @param schema - The schema for what to construct. As this is an {@link ImplicitFieldSchema}, a {@link FieldSchema}, {@link TreeNodeSchema} or {@link AllowedTypes} array can be provided.
265
274
  * @param data - The data used to construct the field content. See {@link (TreeAlpha:interface).(exportVerbose:1)}.
275
+ * @remarks
276
+ * This currently does not support input containing {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields| unknown optional fields}.
277
+ * @privateRemarks
278
+ * See TODOs in {@link TreeEncodingOptions}.
279
+ *
280
+ * TODO: clarify how this handles out of schema data.
281
+ * Does it robustly validate? How do you use it with schema evolution features like staged allowed types and allowUnknownOptionalFields? Which errors are deferred until insertion/hydration?
282
+ * Ensure whatever policy is chosen is documented, enforces, tested and applied consistently to all import code paths.
266
283
  */
267
284
  importVerbose<const TSchema extends ImplicitFieldSchema>(
268
285
  schema: TSchema,
@@ -478,20 +495,24 @@ export const TreeAlpha: TreeAlpha = {
478
495
  return undefined as Unhydrated<TreeFieldFromImplicitField<TSchema>>;
479
496
  }
480
497
  const cursor = cursorFromVerbose(data, schemalessConfig);
481
- return createFromCursor(schema, cursor);
498
+ return createFromCursor(
499
+ schema,
500
+ cursor,
501
+ convertField(normalizeFieldSchema(schema), toUnhydratedSchema),
502
+ );
482
503
  },
483
504
 
484
505
  exportConcise,
485
506
 
486
507
  exportVerbose(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): VerboseTree {
508
+ if (isTreeValue(node)) {
509
+ return node;
510
+ }
487
511
  const config: TreeEncodingOptions = { ...options };
488
512
 
489
513
  const cursor = borrowCursorFromTreeNodeOrValue(node);
490
- return verboseFromCursor(
491
- cursor,
492
- tryGetSchema(node) ?? fail(0xace /* invalid input */),
493
- config,
494
- );
514
+ const kernel = getKernel(node);
515
+ return verboseFromCursor(cursor, kernel.context, config);
495
516
  },
496
517
 
497
518
  exportCompressed(
@@ -508,11 +529,18 @@ export const TreeAlpha: TreeAlpha = {
508
529
  const batch: FieldBatch = [cursor];
509
530
  // If none provided, create a compressor which will not compress anything.
510
531
  const idCompressor = options.idCompressor ?? createIdCompressor();
532
+
533
+ // Grabbing an existing stored schema from the node is important to ensure that unknown optional fields can be preserved.
534
+ // Note that if the node is unhydrated, this can result in all staged allowed types being included in the schema, which might be undesired.
535
+ const storedSchema = isTreeNode(node)
536
+ ? getKernel(node).context.flexContext.schema
537
+ : toInitialSchema(schema);
538
+
511
539
  const context: FieldBatchEncodingContext = {
512
540
  encodeType: TreeCompressionStrategy.Compressed,
513
541
  idCompressor,
514
542
  originatorId: idCompressor.localSessionId, // TODO: Why is this needed?
515
- schema: { schema: toStoredSchema(schema), policy: defaultSchemaPolicy },
543
+ schema: { schema: storedSchema, policy: defaultSchemaPolicy },
516
544
  };
517
545
  const result = codec.encode(batch, context);
518
546
  return result;
@@ -528,7 +556,8 @@ export const TreeAlpha: TreeAlpha = {
528
556
  const config = new TreeViewConfigurationAlpha({ schema });
529
557
  const content: ViewContent = {
530
558
  // Always use a v1 schema codec for consistency.
531
- schema: extractPersistedSchema(config, FluidClientVersion.v2_0),
559
+ // TODO: reevaluate how staged schema should behave in schema import/export APIs before stabilizing this.
560
+ schema: extractPersistedSchema(config.schema, FluidClientVersion.v2_0, () => true),
532
561
  tree: compressedData,
533
562
  idCompressor: options.idCompressor ?? createIdCompressor(),
534
563
  };
@@ -701,17 +730,14 @@ function exportConcise(
701
730
  node: TreeNode | TreeLeafValue | undefined,
702
731
  options?: TreeEncodingOptions,
703
732
  ): ConciseTree | undefined {
704
- if (node === undefined) {
705
- return undefined;
733
+ if (!isTreeNode(node)) {
734
+ return node;
706
735
  }
707
736
  const config: TreeEncodingOptions = { ...options };
708
737
 
738
+ const kernel = getKernel(node);
709
739
  const cursor = borrowCursorFromTreeNodeOrValue(node);
710
- return conciseFromCursor(
711
- cursor,
712
- tryGetSchema(node) ?? fail(0xacd /* invalid input */),
713
- config,
714
- );
740
+ return conciseFromCursor(cursor, kernel.context, config);
715
741
  }
716
742
 
717
743
  /**
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { assert, unreachableCase, fail } from "@fluidframework/core-utils/internal";
7
- import type { Listenable } from "@fluidframework/core-interfaces/internal";
7
+ import type { IFluidHandle, Listenable } from "@fluidframework/core-interfaces/internal";
8
8
  import { createEmitter } from "@fluid-internal/client-utils";
9
9
  import type { IIdCompressor } from "@fluidframework/id-compressor";
10
10
  import {
@@ -42,6 +42,11 @@ import {
42
42
  type RevertibleAlpha,
43
43
  type GraphCommit,
44
44
  isAncestor,
45
+ moveToDetachedField,
46
+ type ITreeCursor,
47
+ type TreeNodeSchemaIdentifier,
48
+ type TreeNodeStoredSchema,
49
+ LeafNodeStoredSchema,
45
50
  } from "../core/index.js";
46
51
  import {
47
52
  type FieldBatchCodec,
@@ -68,15 +73,19 @@ import { SharedTreeChangeFamily, hasSchemaChange } from "./sharedTreeChangeFamil
68
73
  import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
69
74
  import type { ISharedTreeEditor, SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
70
75
  import type { IDisposable } from "@fluidframework/core-interfaces";
71
- import type {
72
- ImplicitFieldSchema,
73
- ReadSchema,
74
- TreeView,
75
- TreeViewConfiguration,
76
- UnsafeUnknownSchema,
77
- ViewableTree,
78
- TreeBranch,
79
- TreeChangeEvents,
76
+ import {
77
+ type ImplicitFieldSchema,
78
+ type ReadSchema,
79
+ type TreeView,
80
+ type TreeViewConfiguration,
81
+ type UnsafeUnknownSchema,
82
+ type ViewableTree,
83
+ type TreeBranch,
84
+ type TreeChangeEvents,
85
+ type VerboseTree,
86
+ customFromCursorStored,
87
+ type CustomTreeValue,
88
+ type CustomTreeNode,
80
89
  } from "../simple-tree/index.js";
81
90
  import { getCheckout, SchematizingSimpleTreeView } from "./schematizingTreeView.js";
82
91
 
@@ -495,6 +504,24 @@ export class TreeCheckout implements ITreeCheckoutFork {
495
504
  this.#transaction.activeBranchEvents.on("ancestryTrimmed", this.onAncestryTrimmed);
496
505
  }
497
506
 
507
+ public exportVerbose(): VerboseTree | undefined {
508
+ const cursor = this.forest.allocateCursor("contentSnapshot");
509
+ try {
510
+ moveToDetachedField(this.forest, cursor);
511
+ const length = cursor.getFieldLength();
512
+ if (length === 0) {
513
+ return undefined;
514
+ } else if (length === 1) {
515
+ cursor.enterNode(0);
516
+ return verboseFromCursor(cursor, this.storedSchema.nodeSchema);
517
+ } else {
518
+ fail(0xac8 /* Invalid document root length */);
519
+ }
520
+ } finally {
521
+ cursor.free();
522
+ }
523
+ }
524
+
498
525
  private readonly onAfterChange = (event: SharedTreeBranchChange<SharedTreeChange>): void => {
499
526
  this.editLock.lock();
500
527
  this.#events.emit("beforeBatch", event);
@@ -1110,3 +1137,20 @@ function trackForksForDisposal(checkout: TreeCheckout): () => void {
1110
1137
  disposed = true;
1111
1138
  };
1112
1139
  }
1140
+
1141
+ function verboseFromCursor(
1142
+ reader: ITreeCursor,
1143
+ schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>,
1144
+ ): VerboseTree {
1145
+ const fields = customFromCursorStored(reader, schema, verboseFromCursor);
1146
+ const nodeSchema =
1147
+ schema.get(reader.type) ?? fail(0xac9 /* missing schema for type in cursor */);
1148
+ if (nodeSchema instanceof LeafNodeStoredSchema) {
1149
+ return fields as CustomTreeValue;
1150
+ }
1151
+
1152
+ return {
1153
+ type: reader.type,
1154
+ fields: fields as CustomTreeNode<IFluidHandle>,
1155
+ };
1156
+ }
@@ -251,12 +251,7 @@ export class SharedTreeBranch<TEditor extends ChangeFamilyEditor, TChange> {
251
251
  // TODO: Pull this side effect out if/when more diverse ancestry walking helpers are available
252
252
  if (c !== commit) {
253
253
  const revision = this.mintRevisionTag();
254
- const inverse = this.changeFamily.rebaser.changeRevision(
255
- this.changeFamily.rebaser.invert(c, true, revision),
256
- revision,
257
- c.revision,
258
- );
259
-
254
+ const inverse = this.changeFamily.rebaser.invert(c, true, revision);
260
255
  inverses.push(tagRollbackInverse(inverse, revision, c.revision));
261
256
  return false;
262
257
  }
@@ -5,9 +5,8 @@
5
5
 
6
6
  import type { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
 
8
- import type { ITreeCursor } from "../../core/index.js";
9
- import type { TreeNodeSchema, TreeLeafValue, ImplicitAllowedTypes } from "../core/index.js";
10
- import { getUnhydratedContext } from "../createContext.js";
8
+ import type { ITreeCursor, TreeNodeStoredSchema } from "../../core/index.js";
9
+ import type { TreeNodeSchema, TreeLeafValue, Context } from "../core/index.js";
11
10
 
12
11
  import {
13
12
  customFromCursor,
@@ -43,7 +42,7 @@ export type ConciseTree<THandle = IFluidHandle> =
43
42
  */
44
43
  export function conciseFromCursor(
45
44
  reader: ITreeCursor,
46
- rootSchema: ImplicitAllowedTypes,
45
+ context: Context,
47
46
  options: TreeEncodingOptions,
48
47
  ): ConciseTree {
49
48
  const config: Required<TreeEncodingOptions> = {
@@ -51,16 +50,19 @@ export function conciseFromCursor(
51
50
  ...options,
52
51
  };
53
52
 
54
- const schemaMap = getUnhydratedContext(rootSchema).schema;
55
- return conciseFromCursorInner(reader, config, schemaMap);
53
+ const storedSchemaMap = context.flexContext.schema.nodeSchema;
54
+ const schemaMap = context.schema;
55
+
56
+ return conciseFromCursorInner(reader, config, storedSchemaMap, schemaMap);
56
57
  }
57
58
 
58
59
  function conciseFromCursorInner(
59
60
  reader: ITreeCursor,
60
61
  options: Required<TreeEncodingOptions>,
62
+ storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
61
63
  schema: ReadonlyMap<string, TreeNodeSchema>,
62
64
  ): ConciseTree {
63
- return customFromCursor(reader, options, schema, conciseFromCursorInner);
65
+ return customFromCursor(reader, options, storedSchema, schema, conciseFromCursorInner);
64
66
  }
65
67
 
66
68
  /**
@@ -25,7 +25,11 @@ import {
25
25
  evaluateLazySchema,
26
26
  markSchemaMostDerived,
27
27
  } from "../core/index.js";
28
- import { toStoredSchema } from "../toStoredSchema.js";
28
+ import {
29
+ permissiveStoredSchemaGenerationOptions,
30
+ restrictiveStoredSchemaGenerationOptions,
31
+ toStoredSchema,
32
+ } from "../toStoredSchema.js";
29
33
  import {
30
34
  isArrayNodeSchema,
31
35
  isMapNodeSchema,
@@ -47,14 +51,20 @@ import type { SimpleNodeSchema, SimpleTreeSchema } from "../simpleSchema.js";
47
51
  */
48
52
  export interface ITreeConfigurationOptions {
49
53
  /**
50
- * If `true`, the tree will validate new content against its stored schema at insertion time
54
+ * If `true`, the tree will perform additional validation of content against its stored schema
51
55
  * and throw an error if the new content doesn't match the expected schema.
52
56
  *
53
57
  * @defaultValue `false`.
54
58
  *
55
- * @remarks Enabling schema validation has a performance penalty when inserting new content into the tree because
59
+ * @remarks
60
+ * Currently most cases already have some schema validation, so this is mainly for additional validation which may be useful when debugging issues,
61
+ * working with untyped APIs, or when the small performance overhead is a non-issue.
62
+ *
63
+ * Enabling schema validation has a performance penalty when inserting new content into the tree because
56
64
  * additional checks are done. Enable this option only in scenarios where you are ok with that operation being a
57
65
  * bit slower.
66
+ *
67
+ * For additional validation in more cases, see {@link ForestTypeExpensiveDebug}.
58
68
  */
59
69
  enableSchemaValidation?: boolean;
60
70
 
@@ -155,6 +165,9 @@ export interface ITreeViewConfiguration<
155
165
 
156
166
  /**
157
167
  * Configuration for {@link ViewableTree.viewWith}.
168
+ * @privateRemarks
169
+ * When `ImplicitAnnotatedFieldSchema` is stabilized, TSchema should be updated to use it.
170
+ * When doing this, the example for `staged` will need to be updated/simplified.
158
171
  * @sealed @public
159
172
  */
160
173
  export class TreeViewConfiguration<
@@ -207,7 +220,8 @@ export class TreeViewConfiguration<
207
220
 
208
221
  // Eagerly perform this conversion to surface errors sooner.
209
222
  // Includes detection of duplicate schema identifiers.
210
- toStoredSchema(config.schema);
223
+ toStoredSchema(config.schema, restrictiveStoredSchemaGenerationOptions);
224
+ toStoredSchema(config.schema, permissiveStoredSchemaGenerationOptions);
211
225
 
212
226
  const definitions = new Map<string, SimpleNodeSchema & TreeNodeSchema>();
213
227
 
@@ -4,65 +4,56 @@
4
4
  */
5
5
 
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
+ import { UsageError } from "@fluidframework/telemetry-utils/internal";
7
8
 
8
9
  import {
9
10
  CursorLocationType,
11
+ forbiddenFieldKindIdentifier,
10
12
  mapCursorField,
11
13
  mapCursorFields,
12
14
  type ITreeCursorSynchronous,
13
15
  type SchemaAndPolicy,
16
+ type TreeFieldStoredSchema,
14
17
  } from "../../core/index.js";
15
18
  import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../fieldSchema.js";
16
19
  import {
17
20
  type Context,
18
21
  getOrCreateNodeFromInnerNode,
19
- type NodeKind,
20
22
  type Unhydrated,
21
23
  UnhydratedFlexTreeNode,
22
24
  createField,
23
25
  } from "../core/index.js";
24
26
  import {
25
27
  defaultSchemaPolicy,
26
- inSchemaOrThrow,
27
28
  isFieldInSchema,
29
+ throwOutOfSchema,
28
30
  } from "../../feature-libraries/index.js";
29
31
  import { getUnhydratedContext } from "../createContext.js";
30
- import { createUnknownOptionalFieldPolicy } from "../node-kinds/index.js";
31
- import type { SimpleNodeSchema, SimpleNodeSchemaBase } from "../simpleSchema.js";
32
- import { getStoredSchema } from "../toStoredSchema.js";
33
32
  import { unknownTypeError } from "./customTree.js";
34
33
 
35
34
  /**
36
35
  * Creates an unhydrated simple-tree field from a cursor in nodes mode.
37
36
  * @remarks
38
- * Does not support defaults.
39
- * Validates the field is in schema.
40
- *
41
- * TODO: AB#43548: How this handles unknown optional fields needs to be figured out, tested and documented.
37
+ * Does not support providing missing defaults values.
38
+ * Validates the field is in schema using `destinationSchema` the provided `contextForNewNodes` or the default unhydrated context if not provided.
42
39
  */
43
40
  export function createFromCursor<const TSchema extends ImplicitFieldSchema>(
44
41
  schema: TSchema,
45
42
  cursor: ITreeCursorSynchronous | undefined,
43
+ destinationSchema: TreeFieldStoredSchema,
44
+ contextForNewNodes?: Context,
46
45
  ): Unhydrated<TreeFieldFromImplicitField<TSchema>> {
47
- const context = getUnhydratedContext(schema);
46
+ const context = contextForNewNodes ?? getUnhydratedContext(schema);
47
+ assert(context.flexContext.isHydrated() === false, 0xbfe /* Expected unhydrated context */);
48
48
  const mapTrees = cursor === undefined ? [] : [unhydratedFlexTreeFromCursor(context, cursor)];
49
49
 
50
- const flexSchema = context.flexContext.schema;
51
-
52
- const schemaValidationPolicy: SchemaAndPolicy = {
53
- policy: {
54
- ...defaultSchemaPolicy,
55
- allowUnknownOptionalFields: createUnknownOptionalFieldPolicy(schema),
56
- },
50
+ const schemaAndPolicy: SchemaAndPolicy = {
51
+ policy: defaultSchemaPolicy,
57
52
  schema: context.flexContext.schema,
58
53
  };
59
54
 
60
- const maybeError = isFieldInSchema(
61
- mapTrees,
62
- flexSchema.rootFieldSchema,
63
- schemaValidationPolicy,
64
- );
65
- inSchemaOrThrow(maybeError);
55
+ // Assuming the caller provides the correct `contextForNewNodes`, this should handle unknown optional fields.
56
+ isFieldInSchema(mapTrees, destinationSchema, schemaAndPolicy, throwOutOfSchema);
66
57
 
67
58
  if (mapTrees.length === 0) {
68
59
  return undefined as Unhydrated<TreeFieldFromImplicitField<TSchema>>;
@@ -80,27 +71,44 @@ export function createFromCursor<const TSchema extends ImplicitFieldSchema>(
80
71
  /**
81
72
  * Construct an {@link UnhydratedFlexTreeNode} from a cursor in Nodes mode.
82
73
  * @remarks
83
- * This does not validate the node is in schema.
74
+ * This does not fully validate the node is in schema, but does throw UsageErrors for some cases of out-of-schema content.
75
+ *
76
+ * Does not support unknown optional fields: will throw a UsageError if the field is not in schema.
77
+ * This cannot easily be fixed as this code requires a schema for each subtree to process, and none is available for unknown optional fields.
84
78
  */
85
79
  export function unhydratedFlexTreeFromCursor(
86
80
  context: Context,
87
81
  cursor: ITreeCursorSynchronous,
88
82
  ): UnhydratedFlexTreeNode {
89
83
  assert(cursor.mode === CursorLocationType.Nodes, 0xbb4 /* Expected nodes cursor */);
90
- const schema = context.schema.get(cursor.type) ?? unknownTypeError(cursor.type);
91
- const storedSchema = getStoredSchema(
92
- schema as SimpleNodeSchemaBase<NodeKind> as SimpleNodeSchema,
93
- );
84
+ const identifier = cursor.type;
85
+ const storedSchema =
86
+ context.flexContext.schema.nodeSchema.get(identifier) ?? unknownTypeError(identifier);
87
+
94
88
  const fields = new Map(
95
- mapCursorFields(cursor, () => [
96
- cursor.getFieldKey(),
97
- createField(
98
- context.flexContext,
99
- storedSchema.getFieldSchema(cursor.getFieldKey()).kind,
89
+ mapCursorFields(cursor, () => {
90
+ const fieldSchema = storedSchema.getFieldSchema(cursor.getFieldKey());
91
+ if (fieldSchema.kind === forbiddenFieldKindIdentifier) {
92
+ // Check for unexpected fields before recursing into children:
93
+ // Code which hits this case is very likely to also use an unknown type in the unexpected field, which would give a more confusing error message.
94
+ // This case is detected here to improve error quality.
95
+ // Also note that if using the view schema from above to suppress this error for unknownOptionalFields, that would not provide a way to handle unknown types in those fields:
96
+ // they would still error, but with that more confusing message about unknown types.
97
+ throw new UsageError(
98
+ // Using JSON.stringify to handle quoting and escaping since both key and identifier can technically contain quotes themselves.
99
+ `Field ${JSON.stringify(cursor.getFieldKey())} is not defined in the schema ${JSON.stringify(identifier)}.`,
100
+ );
101
+ }
102
+ return [
100
103
  cursor.getFieldKey(),
101
- mapCursorField(cursor, () => unhydratedFlexTreeFromCursor(context, cursor)),
102
- ),
103
- ]),
104
+ createField(
105
+ context.flexContext,
106
+ fieldSchema.kind,
107
+ cursor.getFieldKey(),
108
+ mapCursorField(cursor, () => unhydratedFlexTreeFromCursor(context, cursor)),
109
+ ),
110
+ ];
111
+ }),
104
112
  );
105
113
  return new UnhydratedFlexTreeNode(
106
114
  { type: cursor.type, value: cursor.value },
@@ -19,6 +19,7 @@ import {
19
19
  type ITreeCursor,
20
20
  type TreeNodeSchemaIdentifier,
21
21
  type TreeNodeStoredSchema,
22
+ type TreeTypeSet,
22
23
  } from "../../core/index.js";
23
24
  import { FieldKinds, valueSchemaAllows } from "../../feature-libraries/index.js";
24
25
  import { cloneWithReplacements } from "../../util/index.js";
@@ -30,7 +31,7 @@ import {
30
31
  numberSchema,
31
32
  stringSchema,
32
33
  } from "../leafNodeSchema.js";
33
- import { isArrayNodeSchema, isObjectNodeSchema } from "../node-kinds/index.js";
34
+ import { isObjectNodeSchema } from "../node-kinds/index.js";
34
35
 
35
36
  /**
36
37
  * Options for how to interpret or encode a tree when schema information is available.
@@ -42,7 +43,15 @@ export interface TreeEncodingOptions {
42
43
  * If false, use the property keys.
43
44
  * @remarks
44
45
  * Has no effect on {@link NodeKind}s other than {@link NodeKind.Object}.
46
+ *
47
+ * {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields|Unknown optional field} will be omitted when using property keys.
45
48
  * @defaultValue false.
49
+ * @privateRemarks
50
+ * TODO AB#43548:
51
+ * Replace this with an enum that provides three options:
52
+ * - `usePropertyKeys`: use property keys. Supported for import and export.
53
+ * - `allStoredKeys`: use stored keys, and include unknown optional fields. Supported for export only, at least for the short term.
54
+ * - `knownStoredKeys`: use stored keys but do not include unknown optional fields. Supported for import and export.
46
55
  */
47
56
  readonly useStoredKeys?: boolean;
48
57
  }
@@ -77,19 +86,31 @@ export type CustomTreeNode<TChild> = TChild[] | { [key: string]: TChild };
77
86
 
78
87
  /**
79
88
  * Builds an {@link CustomTree} from a cursor in Nodes mode.
89
+ *
90
+ * @param reader - The cursor to read from.
91
+ * @param options - Options for how to interpret the tree.
92
+ * @param storedSchema - Schema which the cursor must comply with.
93
+ * Must be be possible to map to a view schema (mainly that sequences can only occur in the special ArrayNode pattern).
94
+ * Must include even unknown optional fields.
95
+ * @param schema - View schema used to derive the property keys for fields when `options` selects them via {@link TreeEncodingOptions.useStoredKeys}.
96
+ * @param childHandler - Function to handle children of the cursor.
97
+ *
98
+ * @remarks
99
+ * This can handle unknown optional fields only because they are included in the `storedSchema` and `schema` is only needed when using property keys, which also skips unknown optional fields.
80
100
  */
81
101
  export function customFromCursor<TChild>(
82
102
  reader: ITreeCursor,
83
103
  options: Required<TreeEncodingOptions>,
104
+ storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
84
105
  schema: ReadonlyMap<string, TreeNodeSchema>,
85
106
  childHandler: (
86
107
  reader: ITreeCursor,
87
108
  options: Required<TreeEncodingOptions>,
109
+ storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
88
110
  schema: ReadonlyMap<string, TreeNodeSchema>,
89
111
  ) => TChild,
90
112
  ): CustomTree<TChild> {
91
113
  const type = reader.type;
92
- const nodeSchema = schema.get(type) ?? fail(0xb2e /* missing schema for type in cursor */);
93
114
 
94
115
  switch (type) {
95
116
  case numberSchema.identifier:
@@ -105,28 +126,44 @@ export function customFromCursor<TChild>(
105
126
  return reader.value;
106
127
  default: {
107
128
  assert(reader.value === undefined, 0xa54 /* out of schema: unexpected value */);
108
- if (isArrayNodeSchema(nodeSchema)) {
129
+ const nodeSchema =
130
+ storedSchema.get(type) ?? fail(0xb2e /* missing schema for type in cursor */);
131
+ const arrayTypes = tryStoredSchemaAsArray(nodeSchema);
132
+
133
+ if (arrayTypes !== undefined) {
109
134
  const fields = inCursorField(reader, EmptyKey, () =>
110
- mapCursorField(reader, () => childHandler(reader, options, schema)),
135
+ mapCursorField(reader, () => childHandler(reader, options, storedSchema, schema)),
111
136
  );
112
137
  return fields;
113
138
  } else {
114
139
  const fields: Record<string, TChild> = {};
115
140
  forEachField(reader, () => {
116
- const children = mapCursorField(reader, () => childHandler(reader, options, schema));
117
- if (children.length === 1) {
118
- const storedKey = reader.getFieldKey();
119
- const key =
120
- isObjectNodeSchema(nodeSchema) && !options.useStoredKeys
121
- ? (nodeSchema.storedKeyToPropertyKey.get(storedKey) ??
122
- fail(0xb2f /* missing property key */))
123
- : storedKey;
124
- // Length is checked above.
125
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
126
- fields[key] = children[0]!;
141
+ assert(reader.getFieldLength() === 1, 0xa19 /* invalid children number */);
142
+ const storedKey = reader.getFieldKey();
143
+ let key: string;
144
+ if (!options.useStoredKeys) {
145
+ const viewSchema =
146
+ schema.get(type) ?? fail(0xbff /* missing schema for type in cursor */);
147
+ if (isObjectNodeSchema(viewSchema)) {
148
+ const propertyKey = viewSchema.storedKeyToPropertyKey.get(storedKey);
149
+ if (propertyKey === undefined) {
150
+ assert(
151
+ viewSchema.allowUnknownOptionalFields,
152
+ 0xc00 /* found unknown field where not allowed */,
153
+ );
154
+ // Skip unknown optional fields when using property keys.
155
+ return;
156
+ }
157
+ key = propertyKey;
158
+ } else {
159
+ key = storedKey;
160
+ }
127
161
  } else {
128
- assert(children.length === 0, 0xa19 /* invalid children number */);
162
+ key = storedKey;
129
163
  }
164
+ reader.enterNode(0);
165
+ fields[key] = childHandler(reader, options, storedSchema, schema);
166
+ reader.exitNode();
130
167
  });
131
168
  return fields;
132
169
  }
@@ -181,16 +218,18 @@ export function customFromCursorStored<TChild>(
181
218
  }
182
219
 
183
220
  /**
184
- * Assumes `schema` corresponds to a simple-tree schema.
221
+ * Checks if `schema` could correspond to a simple-tree array node.
185
222
  * If it is an array schema, returns the allowed types for the array field.
186
223
  * Otherwise returns `undefined`.
224
+ * @remarks
225
+ * If the schema was defined by the public API, this will be accurate since there is no way to define an object node with a sequence field.
187
226
  */
188
- export function tryStoredSchemaAsArray(
189
- schema: TreeNodeStoredSchema,
190
- ): ReadonlySet<string> | undefined {
227
+ export function tryStoredSchemaAsArray(schema: TreeNodeStoredSchema): TreeTypeSet | undefined {
191
228
  if (schema instanceof ObjectNodeStoredSchema) {
192
229
  const empty = schema.getFieldSchema(EmptyKey);
193
230
  if (empty.kind === FieldKinds.sequence.identifier) {
231
+ // This assert can only be hit by schema created not using the public API surface.
232
+ // If at some point this case needs to be tolerated, it can be replaced by "return undefined"
194
233
  assert(schema.objectNodeFields.size === 1, 0xa9f /* invalid schema */);
195
234
  return empty.types;
196
235
  }