@fluidframework/tree 2.11.0 → 2.12.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 (537) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/tree.alpha.api.md +2 -2
  3. package/api-report/tree.beta.api.md +1 -1
  4. package/api-report/tree.legacy.alpha.api.md +1 -1
  5. package/api-report/tree.legacy.public.api.md +1 -1
  6. package/api-report/tree.public.api.md +1 -1
  7. package/dist/core/index.d.ts +2 -2
  8. package/dist/core/index.d.ts.map +1 -1
  9. package/dist/core/index.js +5 -3
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/rebase/utils.d.ts.map +1 -1
  12. package/dist/core/rebase/utils.js +2 -9
  13. package/dist/core/rebase/utils.js.map +1 -1
  14. package/dist/core/schema-stored/format.d.ts +0 -3
  15. package/dist/core/schema-stored/format.d.ts.map +1 -1
  16. package/dist/core/schema-stored/format.js.map +1 -1
  17. package/dist/core/schema-stored/schema.d.ts +12 -10
  18. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  19. package/dist/core/schema-stored/schema.js +3 -5
  20. package/dist/core/schema-stored/schema.js.map +1 -1
  21. package/dist/core/schema-view/index.d.ts +1 -1
  22. package/dist/core/schema-view/index.d.ts.map +1 -1
  23. package/dist/core/schema-view/index.js +1 -2
  24. package/dist/core/schema-view/index.js.map +1 -1
  25. package/dist/core/schema-view/view.d.ts +0 -7
  26. package/dist/core/schema-view/view.d.ts.map +1 -1
  27. package/dist/core/schema-view/view.js +1 -12
  28. package/dist/core/schema-view/view.js.map +1 -1
  29. package/dist/{feature-libraries/chunked-forest → core/tree}/chunk.d.ts +2 -1
  30. package/dist/core/tree/chunk.d.ts.map +1 -0
  31. package/dist/{feature-libraries/chunked-forest → core/tree}/chunk.js +2 -2
  32. package/dist/core/tree/chunk.js.map +1 -0
  33. package/dist/core/tree/index.d.ts +1 -0
  34. package/dist/core/tree/index.d.ts.map +1 -1
  35. package/dist/core/tree/index.js +5 -1
  36. package/dist/core/tree/index.js.map +1 -1
  37. package/dist/core/tree/treeTextFormat.d.ts +0 -5
  38. package/dist/core/tree/treeTextFormat.d.ts.map +1 -1
  39. package/dist/core/tree/treeTextFormat.js.map +1 -1
  40. package/dist/core/tree/types.d.ts +0 -5
  41. package/dist/core/tree/types.d.ts.map +1 -1
  42. package/dist/core/tree/types.js +0 -1
  43. package/dist/core/tree/types.js.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts +1 -2
  45. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/basicChunk.js +14 -14
  47. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts +1 -2
  49. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/chunkTree.js +2 -3
  51. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts +1 -2
  53. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  55. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts +1 -2
  56. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts.map +1 -1
  57. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +1 -2
  59. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  61. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +1 -1
  62. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  64. package/dist/feature-libraries/chunked-forest/emptyChunk.d.ts +1 -1
  65. package/dist/feature-libraries/chunked-forest/emptyChunk.d.ts.map +1 -1
  66. package/dist/feature-libraries/chunked-forest/emptyChunk.js +2 -3
  67. package/dist/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
  68. package/dist/feature-libraries/chunked-forest/index.d.ts +1 -1
  69. package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  70. package/dist/feature-libraries/chunked-forest/index.js +5 -5
  71. package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
  72. package/dist/feature-libraries/chunked-forest/sequenceChunk.d.ts +1 -1
  73. package/dist/feature-libraries/chunked-forest/sequenceChunk.d.ts.map +1 -1
  74. package/dist/feature-libraries/chunked-forest/sequenceChunk.js +2 -2
  75. package/dist/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  76. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts +1 -2
  77. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  78. package/dist/feature-libraries/chunked-forest/uniformChunk.js +13 -13
  79. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  80. package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  81. package/dist/feature-libraries/default-schema/defaultSchema.js +1 -0
  82. package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  83. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  84. package/dist/feature-libraries/default-schema/schemaChecker.js +2 -1
  85. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  86. package/dist/feature-libraries/index.d.ts +1 -1
  87. package/dist/feature-libraries/index.d.ts.map +1 -1
  88. package/dist/feature-libraries/index.js +6 -2
  89. package/dist/feature-libraries/index.js.map +1 -1
  90. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts +8 -1
  91. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  92. package/dist/feature-libraries/indexing/anchorTreeIndex.js +31 -5
  93. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  94. package/dist/feature-libraries/modular-schema/discrepancies.d.ts +84 -24
  95. package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -1
  96. package/dist/feature-libraries/modular-schema/discrepancies.js +32 -33
  97. package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  98. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  99. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  100. package/dist/feature-libraries/modular-schema/index.js +5 -1
  101. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  102. package/dist/feature-libraries/modular-schema/isNeverTree.d.ts +0 -1
  103. package/dist/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
  104. package/dist/feature-libraries/modular-schema/isNeverTree.js +0 -1
  105. package/dist/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
  106. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +6 -6
  107. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  108. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +7 -7
  109. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  110. package/dist/feature-libraries/schema-edits/schemaChangeFormat.d.ts +12 -12
  111. package/dist/feature-libraries/sequence-field/formatV1.d.ts +99 -99
  112. package/dist/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  113. package/dist/feature-libraries/sequence-field/formatV2.d.ts +76 -76
  114. package/dist/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  115. package/dist/feature-libraries/sequence-field/formatV3.d.ts +54 -54
  116. package/dist/feature-libraries/sequence-field/types.d.ts +0 -1
  117. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  118. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  119. package/dist/index.d.ts +4 -5
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +1 -14
  122. package/dist/index.js.map +1 -1
  123. package/dist/packageVersion.d.ts +1 -1
  124. package/dist/packageVersion.js +1 -1
  125. package/dist/packageVersion.js.map +1 -1
  126. package/dist/shared-tree/index.d.ts +1 -1
  127. package/dist/shared-tree/index.d.ts.map +1 -1
  128. package/dist/shared-tree/index.js.map +1 -1
  129. package/dist/shared-tree/schematizeTree.d.ts +1 -1
  130. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  131. package/dist/shared-tree/schematizeTree.js +6 -6
  132. package/dist/shared-tree/schematizeTree.js.map +1 -1
  133. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  134. package/dist/shared-tree/schematizingTreeView.js +8 -12
  135. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  136. package/dist/shared-tree/sharedTree.d.ts +25 -7
  137. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  138. package/dist/shared-tree/sharedTree.js +104 -15
  139. package/dist/shared-tree/sharedTree.js.map +1 -1
  140. package/dist/shared-tree/treeCheckout.d.ts +35 -12
  141. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  142. package/dist/shared-tree/treeCheckout.js +159 -127
  143. package/dist/shared-tree/treeCheckout.js.map +1 -1
  144. package/dist/shared-tree-core/branch.d.ts +13 -35
  145. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  146. package/dist/shared-tree-core/branch.js +12 -77
  147. package/dist/shared-tree-core/branch.js.map +1 -1
  148. package/dist/shared-tree-core/branchCommitEnricher.d.ts +7 -1
  149. package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  150. package/dist/shared-tree-core/branchCommitEnricher.js +16 -18
  151. package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
  152. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  153. package/dist/shared-tree-core/editManager.js +2 -2
  154. package/dist/shared-tree-core/editManager.js.map +1 -1
  155. package/dist/shared-tree-core/index.d.ts +3 -3
  156. package/dist/shared-tree-core/index.d.ts.map +1 -1
  157. package/dist/shared-tree-core/index.js +2 -2
  158. package/dist/shared-tree-core/index.js.map +1 -1
  159. package/dist/shared-tree-core/sharedTreeCore.d.ts +2 -9
  160. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  161. package/dist/shared-tree-core/sharedTreeCore.js +4 -16
  162. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  163. package/dist/shared-tree-core/transaction.d.ts +38 -0
  164. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  165. package/dist/shared-tree-core/transaction.js +118 -6
  166. package/dist/shared-tree-core/transaction.js.map +1 -1
  167. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  168. package/dist/simple-tree/api/conciseTree.js +1 -1
  169. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  170. package/dist/simple-tree/api/create.d.ts.map +1 -1
  171. package/dist/simple-tree/api/create.js +5 -1
  172. package/dist/simple-tree/api/create.js.map +1 -1
  173. package/dist/simple-tree/api/customTree.d.ts +14 -2
  174. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  175. package/dist/simple-tree/api/customTree.js +53 -3
  176. package/dist/simple-tree/api/customTree.js.map +1 -1
  177. package/dist/simple-tree/api/index.d.ts +2 -2
  178. package/dist/simple-tree/api/index.d.ts.map +1 -1
  179. package/dist/simple-tree/api/index.js +4 -1
  180. package/dist/simple-tree/api/index.js.map +1 -1
  181. package/dist/simple-tree/api/schemaFactory.d.ts +48 -0
  182. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  183. package/dist/simple-tree/api/schemaFactory.js +5 -2
  184. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  185. package/dist/simple-tree/api/simpleSchema.d.ts +3 -1
  186. package/dist/simple-tree/api/simpleSchema.d.ts.map +1 -1
  187. package/dist/simple-tree/api/simpleSchema.js.map +1 -1
  188. package/dist/simple-tree/api/simpleTreeIndex.js +3 -1
  189. package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
  190. package/dist/simple-tree/api/storedSchema.d.ts +4 -4
  191. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  192. package/dist/simple-tree/api/storedSchema.js +8 -21
  193. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  194. package/dist/simple-tree/api/tree.d.ts +1 -0
  195. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  196. package/dist/simple-tree/api/tree.js.map +1 -1
  197. package/dist/simple-tree/api/verboseTree.js +1 -1
  198. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  199. package/dist/simple-tree/api/view.d.ts +14 -9
  200. package/dist/simple-tree/api/view.d.ts.map +1 -1
  201. package/dist/simple-tree/api/view.js +129 -40
  202. package/dist/simple-tree/api/view.js.map +1 -1
  203. package/dist/simple-tree/index.d.ts +2 -2
  204. package/dist/simple-tree/index.d.ts.map +1 -1
  205. package/dist/simple-tree/index.js +5 -2
  206. package/dist/simple-tree/index.js.map +1 -1
  207. package/dist/simple-tree/leafNodeSchema.d.ts +0 -15
  208. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  209. package/dist/simple-tree/leafNodeSchema.js +0 -15
  210. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  211. package/dist/simple-tree/objectNode.d.ts +8 -3
  212. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  213. package/dist/simple-tree/objectNode.js +18 -2
  214. package/dist/simple-tree/objectNode.js.map +1 -1
  215. package/dist/simple-tree/objectNodeTypes.d.ts +4 -0
  216. package/dist/simple-tree/objectNodeTypes.d.ts.map +1 -1
  217. package/dist/simple-tree/objectNodeTypes.js.map +1 -1
  218. package/dist/simple-tree/schemaTypes.d.ts +4 -2
  219. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  220. package/dist/simple-tree/schemaTypes.js.map +1 -1
  221. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  222. package/dist/simple-tree/toStoredSchema.js +18 -13
  223. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  224. package/dist/util/brand.d.ts +0 -2
  225. package/dist/util/brand.d.ts.map +1 -1
  226. package/dist/util/brand.js +0 -1
  227. package/dist/util/brand.js.map +1 -1
  228. package/dist/util/index.d.ts +1 -1
  229. package/dist/util/index.d.ts.map +1 -1
  230. package/dist/util/index.js +2 -1
  231. package/dist/util/index.js.map +1 -1
  232. package/dist/util/typeCheck.d.ts +0 -2
  233. package/dist/util/typeCheck.d.ts.map +1 -1
  234. package/dist/util/typeCheck.js.map +1 -1
  235. package/dist/util/utils.d.ts +13 -0
  236. package/dist/util/utils.d.ts.map +1 -1
  237. package/dist/util/utils.js +23 -1
  238. package/dist/util/utils.js.map +1 -1
  239. package/lib/core/index.d.ts +2 -2
  240. package/lib/core/index.d.ts.map +1 -1
  241. package/lib/core/index.js +2 -2
  242. package/lib/core/index.js.map +1 -1
  243. package/lib/core/rebase/utils.d.ts.map +1 -1
  244. package/lib/core/rebase/utils.js +3 -10
  245. package/lib/core/rebase/utils.js.map +1 -1
  246. package/lib/core/schema-stored/format.d.ts +0 -3
  247. package/lib/core/schema-stored/format.d.ts.map +1 -1
  248. package/lib/core/schema-stored/format.js.map +1 -1
  249. package/lib/core/schema-stored/schema.d.ts +12 -10
  250. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  251. package/lib/core/schema-stored/schema.js +3 -5
  252. package/lib/core/schema-stored/schema.js.map +1 -1
  253. package/lib/core/schema-view/index.d.ts +1 -1
  254. package/lib/core/schema-view/index.d.ts.map +1 -1
  255. package/lib/core/schema-view/index.js +1 -1
  256. package/lib/core/schema-view/index.js.map +1 -1
  257. package/lib/core/schema-view/view.d.ts +0 -7
  258. package/lib/core/schema-view/view.d.ts.map +1 -1
  259. package/lib/core/schema-view/view.js +0 -11
  260. package/lib/core/schema-view/view.js.map +1 -1
  261. package/lib/{feature-libraries/chunked-forest → core/tree}/chunk.d.ts +2 -1
  262. package/lib/core/tree/chunk.d.ts.map +1 -0
  263. package/lib/{feature-libraries/chunked-forest → core/tree}/chunk.js +1 -1
  264. package/lib/core/tree/chunk.js.map +1 -0
  265. package/lib/core/tree/index.d.ts +1 -0
  266. package/lib/core/tree/index.d.ts.map +1 -1
  267. package/lib/core/tree/index.js +1 -0
  268. package/lib/core/tree/index.js.map +1 -1
  269. package/lib/core/tree/treeTextFormat.d.ts +0 -5
  270. package/lib/core/tree/treeTextFormat.d.ts.map +1 -1
  271. package/lib/core/tree/treeTextFormat.js.map +1 -1
  272. package/lib/core/tree/types.d.ts +0 -5
  273. package/lib/core/tree/types.d.ts.map +1 -1
  274. package/lib/core/tree/types.js +0 -1
  275. package/lib/core/tree/types.js.map +1 -1
  276. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts +1 -2
  277. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  278. package/lib/feature-libraries/chunked-forest/basicChunk.js +1 -1
  279. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  280. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts +1 -2
  281. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  282. package/lib/feature-libraries/chunked-forest/chunkTree.js +1 -2
  283. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  284. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts +1 -2
  285. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  286. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  287. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts +1 -2
  288. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts.map +1 -1
  289. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  290. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +1 -2
  291. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  292. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  293. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +1 -1
  294. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  295. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  296. package/lib/feature-libraries/chunked-forest/emptyChunk.d.ts +1 -1
  297. package/lib/feature-libraries/chunked-forest/emptyChunk.d.ts.map +1 -1
  298. package/lib/feature-libraries/chunked-forest/emptyChunk.js +1 -2
  299. package/lib/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
  300. package/lib/feature-libraries/chunked-forest/index.d.ts +1 -1
  301. package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  302. package/lib/feature-libraries/chunked-forest/index.js +1 -1
  303. package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
  304. package/lib/feature-libraries/chunked-forest/sequenceChunk.d.ts +1 -1
  305. package/lib/feature-libraries/chunked-forest/sequenceChunk.d.ts.map +1 -1
  306. package/lib/feature-libraries/chunked-forest/sequenceChunk.js +1 -1
  307. package/lib/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  308. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts +1 -2
  309. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  310. package/lib/feature-libraries/chunked-forest/uniformChunk.js +1 -1
  311. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  312. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  313. package/lib/feature-libraries/default-schema/defaultSchema.js +1 -0
  314. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  315. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  316. package/lib/feature-libraries/default-schema/schemaChecker.js +2 -1
  317. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  318. package/lib/feature-libraries/index.d.ts +1 -1
  319. package/lib/feature-libraries/index.d.ts.map +1 -1
  320. package/lib/feature-libraries/index.js +1 -1
  321. package/lib/feature-libraries/index.js.map +1 -1
  322. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts +8 -1
  323. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  324. package/lib/feature-libraries/indexing/anchorTreeIndex.js +31 -5
  325. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  326. package/lib/feature-libraries/modular-schema/discrepancies.d.ts +84 -24
  327. package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -1
  328. package/lib/feature-libraries/modular-schema/discrepancies.js +25 -28
  329. package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  330. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  331. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  332. package/lib/feature-libraries/modular-schema/index.js +1 -1
  333. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  334. package/lib/feature-libraries/modular-schema/isNeverTree.d.ts +0 -1
  335. package/lib/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
  336. package/lib/feature-libraries/modular-schema/isNeverTree.js +0 -1
  337. package/lib/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
  338. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +6 -6
  339. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  340. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +7 -7
  341. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  342. package/lib/feature-libraries/schema-edits/schemaChangeFormat.d.ts +12 -12
  343. package/lib/feature-libraries/sequence-field/formatV1.d.ts +99 -99
  344. package/lib/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  345. package/lib/feature-libraries/sequence-field/formatV2.d.ts +76 -76
  346. package/lib/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  347. package/lib/feature-libraries/sequence-field/formatV3.d.ts +54 -54
  348. package/lib/feature-libraries/sequence-field/types.d.ts +0 -1
  349. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  350. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  351. package/lib/index.d.ts +4 -5
  352. package/lib/index.d.ts.map +1 -1
  353. package/lib/index.js +2 -3
  354. package/lib/index.js.map +1 -1
  355. package/lib/packageVersion.d.ts +1 -1
  356. package/lib/packageVersion.js +1 -1
  357. package/lib/packageVersion.js.map +1 -1
  358. package/lib/shared-tree/index.d.ts +1 -1
  359. package/lib/shared-tree/index.d.ts.map +1 -1
  360. package/lib/shared-tree/index.js.map +1 -1
  361. package/lib/shared-tree/schematizeTree.d.ts +1 -1
  362. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  363. package/lib/shared-tree/schematizeTree.js +7 -7
  364. package/lib/shared-tree/schematizeTree.js.map +1 -1
  365. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  366. package/lib/shared-tree/schematizingTreeView.js +10 -14
  367. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  368. package/lib/shared-tree/sharedTree.d.ts +25 -7
  369. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  370. package/lib/shared-tree/sharedTree.js +105 -16
  371. package/lib/shared-tree/sharedTree.js.map +1 -1
  372. package/lib/shared-tree/treeCheckout.d.ts +35 -12
  373. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  374. package/lib/shared-tree/treeCheckout.js +161 -129
  375. package/lib/shared-tree/treeCheckout.js.map +1 -1
  376. package/lib/shared-tree-core/branch.d.ts +13 -35
  377. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  378. package/lib/shared-tree-core/branch.js +12 -76
  379. package/lib/shared-tree-core/branch.js.map +1 -1
  380. package/lib/shared-tree-core/branchCommitEnricher.d.ts +7 -1
  381. package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  382. package/lib/shared-tree-core/branchCommitEnricher.js +16 -18
  383. package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
  384. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  385. package/lib/shared-tree-core/editManager.js +3 -3
  386. package/lib/shared-tree-core/editManager.js.map +1 -1
  387. package/lib/shared-tree-core/index.d.ts +3 -3
  388. package/lib/shared-tree-core/index.d.ts.map +1 -1
  389. package/lib/shared-tree-core/index.js +2 -2
  390. package/lib/shared-tree-core/index.js.map +1 -1
  391. package/lib/shared-tree-core/sharedTreeCore.d.ts +2 -9
  392. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  393. package/lib/shared-tree-core/sharedTreeCore.js +4 -16
  394. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  395. package/lib/shared-tree-core/transaction.d.ts +38 -0
  396. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  397. package/lib/shared-tree-core/transaction.js +112 -1
  398. package/lib/shared-tree-core/transaction.js.map +1 -1
  399. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  400. package/lib/simple-tree/api/conciseTree.js +2 -2
  401. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  402. package/lib/simple-tree/api/create.d.ts.map +1 -1
  403. package/lib/simple-tree/api/create.js +5 -1
  404. package/lib/simple-tree/api/create.js.map +1 -1
  405. package/lib/simple-tree/api/customTree.d.ts +14 -2
  406. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  407. package/lib/simple-tree/api/customTree.js +50 -2
  408. package/lib/simple-tree/api/customTree.js.map +1 -1
  409. package/lib/simple-tree/api/index.d.ts +2 -2
  410. package/lib/simple-tree/api/index.d.ts.map +1 -1
  411. package/lib/simple-tree/api/index.js +2 -1
  412. package/lib/simple-tree/api/index.js.map +1 -1
  413. package/lib/simple-tree/api/schemaFactory.d.ts +48 -0
  414. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  415. package/lib/simple-tree/api/schemaFactory.js +4 -1
  416. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  417. package/lib/simple-tree/api/simpleSchema.d.ts +3 -1
  418. package/lib/simple-tree/api/simpleSchema.d.ts.map +1 -1
  419. package/lib/simple-tree/api/simpleSchema.js.map +1 -1
  420. package/lib/simple-tree/api/simpleTreeIndex.js +3 -1
  421. package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
  422. package/lib/simple-tree/api/storedSchema.d.ts +4 -4
  423. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  424. package/lib/simple-tree/api/storedSchema.js +5 -18
  425. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  426. package/lib/simple-tree/api/tree.d.ts +1 -0
  427. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  428. package/lib/simple-tree/api/tree.js.map +1 -1
  429. package/lib/simple-tree/api/verboseTree.js +2 -2
  430. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  431. package/lib/simple-tree/api/view.d.ts +14 -9
  432. package/lib/simple-tree/api/view.d.ts.map +1 -1
  433. package/lib/simple-tree/api/view.js +131 -42
  434. package/lib/simple-tree/api/view.js.map +1 -1
  435. package/lib/simple-tree/index.d.ts +2 -2
  436. package/lib/simple-tree/index.d.ts.map +1 -1
  437. package/lib/simple-tree/index.js +2 -2
  438. package/lib/simple-tree/index.js.map +1 -1
  439. package/lib/simple-tree/leafNodeSchema.d.ts +0 -15
  440. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  441. package/lib/simple-tree/leafNodeSchema.js +0 -15
  442. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  443. package/lib/simple-tree/objectNode.d.ts +8 -3
  444. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  445. package/lib/simple-tree/objectNode.js +16 -1
  446. package/lib/simple-tree/objectNode.js.map +1 -1
  447. package/lib/simple-tree/objectNodeTypes.d.ts +4 -0
  448. package/lib/simple-tree/objectNodeTypes.d.ts.map +1 -1
  449. package/lib/simple-tree/objectNodeTypes.js.map +1 -1
  450. package/lib/simple-tree/schemaTypes.d.ts +4 -2
  451. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  452. package/lib/simple-tree/schemaTypes.js.map +1 -1
  453. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  454. package/lib/simple-tree/toStoredSchema.js +19 -14
  455. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  456. package/lib/util/brand.d.ts +0 -2
  457. package/lib/util/brand.d.ts.map +1 -1
  458. package/lib/util/brand.js +0 -1
  459. package/lib/util/brand.js.map +1 -1
  460. package/lib/util/index.d.ts +1 -1
  461. package/lib/util/index.d.ts.map +1 -1
  462. package/lib/util/index.js +1 -1
  463. package/lib/util/index.js.map +1 -1
  464. package/lib/util/typeCheck.d.ts +0 -2
  465. package/lib/util/typeCheck.d.ts.map +1 -1
  466. package/lib/util/typeCheck.js.map +1 -1
  467. package/lib/util/utils.d.ts +13 -0
  468. package/lib/util/utils.d.ts.map +1 -1
  469. package/lib/util/utils.js +21 -0
  470. package/lib/util/utils.js.map +1 -1
  471. package/package.json +22 -22
  472. package/src/core/index.ts +5 -1
  473. package/src/core/rebase/utils.ts +17 -20
  474. package/src/core/schema-stored/format.ts +0 -3
  475. package/src/core/schema-stored/schema.ts +13 -10
  476. package/src/core/schema-view/index.ts +0 -1
  477. package/src/core/schema-view/view.ts +0 -11
  478. package/src/{feature-libraries/chunked-forest → core/tree}/chunk.ts +4 -4
  479. package/src/core/tree/index.ts +8 -0
  480. package/src/core/tree/treeTextFormat.ts +0 -5
  481. package/src/core/tree/types.ts +0 -5
  482. package/src/feature-libraries/chunked-forest/basicChunk.ts +4 -2
  483. package/src/feature-libraries/chunked-forest/chunkTree.ts +2 -1
  484. package/src/feature-libraries/chunked-forest/chunkedForest.ts +2 -1
  485. package/src/feature-libraries/chunked-forest/codec/chunkCodecUtilities.ts +1 -2
  486. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +6 -2
  487. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +1 -1
  488. package/src/feature-libraries/chunked-forest/emptyChunk.ts +4 -2
  489. package/src/feature-libraries/chunked-forest/index.ts +1 -1
  490. package/src/feature-libraries/chunked-forest/sequenceChunk.ts +1 -1
  491. package/src/feature-libraries/chunked-forest/uniformChunk.ts +4 -1
  492. package/src/feature-libraries/default-schema/defaultSchema.ts +1 -0
  493. package/src/feature-libraries/default-schema/schemaChecker.ts +4 -1
  494. package/src/feature-libraries/index.ts +13 -0
  495. package/src/feature-libraries/indexing/anchorTreeIndex.ts +34 -5
  496. package/src/feature-libraries/modular-schema/discrepancies.ts +76 -38
  497. package/src/feature-libraries/modular-schema/index.ts +13 -0
  498. package/src/feature-libraries/modular-schema/isNeverTree.ts +0 -2
  499. package/src/feature-libraries/sequence-field/types.ts +0 -1
  500. package/src/index.ts +1 -29
  501. package/src/packageVersion.ts +1 -1
  502. package/src/shared-tree/index.ts +1 -0
  503. package/src/shared-tree/schematizeTree.ts +6 -10
  504. package/src/shared-tree/schematizingTreeView.ts +11 -21
  505. package/src/shared-tree/sharedTree.ts +173 -41
  506. package/src/shared-tree/treeCheckout.ts +224 -175
  507. package/src/shared-tree-core/branch.ts +29 -122
  508. package/src/shared-tree-core/branchCommitEnricher.ts +19 -20
  509. package/src/shared-tree-core/editManager.ts +3 -8
  510. package/src/shared-tree-core/index.ts +2 -1
  511. package/src/shared-tree-core/sharedTreeCore.ts +8 -19
  512. package/src/shared-tree-core/transaction.ts +145 -0
  513. package/src/simple-tree/api/conciseTree.ts +2 -2
  514. package/src/simple-tree/api/create.ts +5 -1
  515. package/src/simple-tree/api/customTree.ts +69 -1
  516. package/src/simple-tree/api/index.ts +12 -2
  517. package/src/simple-tree/api/schemaFactory.ts +62 -1
  518. package/src/simple-tree/api/simpleSchema.ts +3 -1
  519. package/src/simple-tree/api/simpleTreeIndex.ts +2 -0
  520. package/src/simple-tree/api/storedSchema.ts +7 -22
  521. package/src/simple-tree/api/tree.ts +6 -0
  522. package/src/simple-tree/api/verboseTree.ts +2 -2
  523. package/src/simple-tree/api/view.ts +197 -51
  524. package/src/simple-tree/index.ts +6 -0
  525. package/src/simple-tree/leafNodeSchema.ts +0 -19
  526. package/src/simple-tree/objectNode.ts +26 -2
  527. package/src/simple-tree/objectNodeTypes.ts +5 -0
  528. package/src/simple-tree/schemaTypes.ts +7 -2
  529. package/src/simple-tree/toStoredSchema.ts +25 -19
  530. package/src/util/brand.ts +0 -2
  531. package/src/util/index.ts +1 -0
  532. package/src/util/typeCheck.ts +0 -2
  533. package/src/util/utils.ts +26 -0
  534. package/dist/feature-libraries/chunked-forest/chunk.d.ts.map +0 -1
  535. package/dist/feature-libraries/chunked-forest/chunk.js.map +0 -1
  536. package/lib/feature-libraries/chunked-forest/chunk.d.ts.map +0 -1
  537. package/lib/feature-libraries/chunked-forest/chunk.js.map +0 -1
@@ -11,8 +11,12 @@ import {
11
11
  EmptyKey,
12
12
  forEachField,
13
13
  inCursorField,
14
+ LeafNodeStoredSchema,
14
15
  mapCursorField,
16
+ ObjectNodeStoredSchema,
15
17
  type ITreeCursor,
18
+ type TreeNodeSchemaIdentifier,
19
+ type TreeNodeStoredSchema,
16
20
  } from "../../core/index.js";
17
21
  import { fail } from "../../util/index.js";
18
22
  import type { TreeLeafValue } from "../schemaTypes.js";
@@ -25,6 +29,7 @@ import {
25
29
  stringSchema,
26
30
  } from "../leafNodeSchema.js";
27
31
  import { isObjectNodeSchema } from "../objectNodeTypes.js";
32
+ import { FieldKinds, valueSchemaAllows } from "../../feature-libraries/index.js";
28
33
 
29
34
  /**
30
35
  * Options for how to encode a tree.
@@ -63,7 +68,7 @@ export type CustomTreeNode<TChild> = TChild[] | { [key: string]: TChild };
63
68
  /**
64
69
  * Builds an {@link CustomTree} from a cursor in Nodes mode.
65
70
  */
66
- export function customFromCursorInner<TChild, THandle>(
71
+ export function customFromCursor<TChild, THandle>(
67
72
  reader: ITreeCursor,
68
73
  options: Required<EncodeOptions<THandle>>,
69
74
  schema: ReadonlyMap<string, TreeNodeSchema>,
@@ -118,3 +123,66 @@ export function customFromCursorInner<TChild, THandle>(
118
123
  }
119
124
  }
120
125
  }
126
+
127
+ /**
128
+ * Builds an {@link CustomTree} from a cursor in Nodes mode.
129
+ * @remarks
130
+ * Uses stored keys and stored schema.
131
+ */
132
+ export function customFromCursorStored<TChild>(
133
+ reader: ITreeCursor,
134
+ schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>,
135
+ childHandler: (
136
+ reader: ITreeCursor,
137
+ schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>,
138
+ ) => TChild,
139
+ ): CustomTree<TChild, IFluidHandle> {
140
+ const type = reader.type;
141
+ const nodeSchema = schema.get(type) ?? fail("missing schema for type in cursor");
142
+
143
+ if (nodeSchema instanceof LeafNodeStoredSchema) {
144
+ assert(valueSchemaAllows(nodeSchema.leafValue, reader.value), 0xa9c /* invalid value */);
145
+ return reader.value;
146
+ }
147
+
148
+ assert(reader.value === undefined, 0xa9d /* out of schema: unexpected value */);
149
+
150
+ const arrayTypes = tryStoredSchemaAsArray(nodeSchema);
151
+ if (arrayTypes !== undefined) {
152
+ const field = inCursorField(reader, EmptyKey, () =>
153
+ mapCursorField(reader, () => childHandler(reader, schema)),
154
+ );
155
+ return field;
156
+ }
157
+
158
+ const fields: Record<string, TChild> = {};
159
+ forEachField(reader, () => {
160
+ const children = mapCursorField(reader, () => childHandler(reader, schema));
161
+ if (children.length === 1) {
162
+ const storedKey = reader.getFieldKey();
163
+ // Length is checked above.
164
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
165
+ fields[storedKey] = children[0]!;
166
+ } else {
167
+ assert(children.length === 0, 0xa9e /* invalid children number */);
168
+ }
169
+ });
170
+ return fields;
171
+ }
172
+
173
+ /**
174
+ * Assumes `schema` corresponds to a simple-tree schema.
175
+ * If it is an array schema, returns the allowed types for the array field.
176
+ * Otherwise returns `undefined`.
177
+ */
178
+ export function tryStoredSchemaAsArray(
179
+ schema: TreeNodeStoredSchema,
180
+ ): ReadonlySet<string> | undefined {
181
+ if (schema instanceof ObjectNodeStoredSchema) {
182
+ const empty = schema.getFieldSchema(EmptyKey);
183
+ if (empty.kind === FieldKinds.sequence.identifier) {
184
+ assert(schema.objectNodeFields.size === 1, 0xa9f /* invalid schema */);
185
+ return empty.types;
186
+ }
187
+ }
188
+ }
@@ -17,7 +17,11 @@ export {
17
17
  type TreeBranchEvents,
18
18
  asTreeViewAlpha,
19
19
  } from "./tree.js";
20
- export { SchemaFactory, type ScopedSchemaName } from "./schemaFactory.js";
20
+ export {
21
+ SchemaFactory,
22
+ type ScopedSchemaName,
23
+ type SchemaFactoryObjectOptions,
24
+ } from "./schemaFactory.js";
21
25
  export type {
22
26
  ValidateRecursiveSchema,
23
27
  FixRecursiveArraySchema,
@@ -90,7 +94,13 @@ export {
90
94
  verboseFromCursor,
91
95
  } from "./verboseTree.js";
92
96
 
93
- export type { EncodeOptions } from "./customTree.js";
97
+ export {
98
+ type EncodeOptions,
99
+ customFromCursorStored,
100
+ type CustomTreeNode,
101
+ type CustomTreeValue,
102
+ tryStoredSchemaAsArray,
103
+ } from "./customTree.js";
94
104
 
95
105
  export { type ConciseTree, conciseFromCursor } from "./conciseTree.js";
96
106
 
@@ -18,6 +18,9 @@ import {
18
18
  getOrCreate,
19
19
  isReadonlyArray,
20
20
  } from "../../util/index.js";
21
+ // This import is required for intellisense in @link doc comments on mouseover in VSCode.
22
+ // eslint-disable-next-line unused-imports/no-unused-imports, @typescript-eslint/no-unused-vars
23
+ import type { TreeAlpha } from "../../shared-tree/index.js";
21
24
 
22
25
  import {
23
26
  booleanSchema,
@@ -74,6 +77,7 @@ import type {
74
77
  import { createFieldSchemaUnsafe } from "./schemaFactoryRecursive.js";
75
78
  import { TreeNodeValid } from "../treeNodeValid.js";
76
79
  import { isLazy } from "../flexList.js";
80
+
77
81
  /**
78
82
  * Gets the leaf domain schema compatible with a given {@link TreeValue}.
79
83
  */
@@ -97,6 +101,58 @@ export function schemaFromValue(value: TreeValue): TreeNodeSchema {
97
101
  }
98
102
  }
99
103
 
104
+ /**
105
+ * Options when declaring an {@link SchemaFactory.object|object node}'s schema
106
+ */
107
+ export interface SchemaFactoryObjectOptions {
108
+ /**
109
+ * Opt in to viewing documents which have unknown optional fields for this object's identifier, i.e. optional fields
110
+ * in the document schema which are not present in this object schema declaration.
111
+ *
112
+ * @defaultValue `false`
113
+ * @remarks
114
+ * The advantage of enabling this option is that it allows an application ecosystem with staged rollout to more quickly
115
+ * upgrade documents to include schema for new optional features.
116
+ *
117
+ * However, it does come with trade-offs that applications should weigh carefully when it comes to interactions between
118
+ * code and documents.
119
+ * When opening such documents, the API presented is still determined by the view schema.
120
+ * This can have implications on the behavior of edits or code which uses portions of the view schema,
121
+ * since this may inadvertently drop data which is present in those optional fields in the document schema.
122
+ *
123
+ * Consider the following example:
124
+ *
125
+ * ```typescript
126
+ * const sf = new SchemaFactory("com.example");
127
+ * class PersonView extends sf.object("Person", { name: sf.string }, { allowUnknownOptionalFields: true }) {}
128
+ * class PersonStored extends sf.object("Person", { name: sf.string, nickname: sf.optional(sf.string) }) {}
129
+ *
130
+ * // Say we have a document which uses `PersonStored` in its schema, and application code constructs
131
+ * // a tree view using `PersonView`. If the application for some reason had implemented a function like this:
132
+ * function clonePerson(a: PersonView): PersonView {
133
+ * return new PersonView({ name: a.name });
134
+ * }
135
+ * // ...or even like this:
136
+ * function clonePerson(a: PersonView): PersonView {
137
+ * return new PersonView({ ...a})
138
+ * }
139
+ * // Then the alleged clone wouldn't actually clone the entire person in either case, it would drop the nickname.
140
+ * ```
141
+ *
142
+ * If an application wants to be particularly careful to preserve all data on a node when editing it, it can use
143
+ * {@link TreeAlpha.(importVerbose:2)|import}/{@link TreeAlpha.(exportVerbose:2)|export} APIs with persistent keys.
144
+ *
145
+ * Note that public API methods which operate on entire nodes (such as `moveTo`, `moveToEnd`, etc. on arrays) do not encounter
146
+ * this problem as SharedTree's implementation stores the entire node in its lower layers. It's only when application code
147
+ * reaches into a node (either by accessing its fields, spreading it, or some other means) that this problem arises.
148
+ */
149
+ allowUnknownOptionalFields?: boolean;
150
+ }
151
+
152
+ export const defaultSchemaFactoryObjectOptions: Required<SchemaFactoryObjectOptions> = {
153
+ allowUnknownOptionalFields: false,
154
+ };
155
+
100
156
  /**
101
157
  * The name of a schema produced by {@link SchemaFactory}, including its optional scope prefix.
102
158
  *
@@ -333,7 +389,12 @@ export class SchemaFactory<
333
389
  true,
334
390
  T
335
391
  > {
336
- return objectSchema(this.scoped(name), fields, true);
392
+ return objectSchema(
393
+ this.scoped(name),
394
+ fields,
395
+ true,
396
+ defaultSchemaFactoryObjectOptions.allowUnknownOptionalFields,
397
+ );
337
398
  }
338
399
 
339
400
  /**
@@ -30,7 +30,9 @@ export interface SimpleNodeSchemaBase<TNodeKind extends NodeKind> {
30
30
  */
31
31
  export interface SimpleObjectNodeSchema extends SimpleNodeSchemaBase<NodeKind.Object> {
32
32
  /**
33
- * Schemas for each of the object's fields, keyed off of schema's property keys.
33
+ * Schemas for each of the object's fields, keyed off of schema's keys.
34
+ * @remarks
35
+ * Depending on how this schema was exported, the string keys may be either the property keys or the stored keys.
34
36
  */
35
37
  readonly fields: Record<string, SimpleFieldSchema>;
36
38
  }
@@ -200,6 +200,8 @@ export function createSimpleTreeIndex<
200
200
  return treeNodeApi.status(simpleTree);
201
201
  }
202
202
  },
203
+ // simple tree indexes are shallow indexes, indicating so allows for a performance optimization
204
+ true,
203
205
  );
204
206
 
205
207
  // all the type checking guarantees that we put nodes of the correct type in the index
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import type { ICodecOptions } from "../../codec/index.js";
7
- import { Compatibility, type TreeStoredSchema } from "../../core/index.js";
7
+ import type { TreeStoredSchema } from "../../core/index.js";
8
8
  import {
9
9
  defaultSchemaPolicy,
10
10
  encodeTreeSchema,
@@ -59,7 +59,7 @@ export function extractPersistedSchema(schema: ImplicitFieldSchema): JsonCompati
59
59
  * opening a document that used the `persisted` schema and provided `view` to {@link ViewableTree.viewWith}.
60
60
  *
61
61
  * @param persisted - Schema persisted for a document. Typically persisted alongside the data and assumed to describe that data.
62
- * @param view - Schema which would be used to view persisted content. Use {@link extractPersistedSchema} to convert the view schema into this format.
62
+ * @param view - Schema which would be used to view persisted content.
63
63
  * @param options - {@link ICodecOptions} used when parsing the provided schema.
64
64
  * @param canInitialize - Passed through to the return value unchanged and otherwise unused.
65
65
  * @returns The {@link SchemaCompatibilityStatus} a {@link TreeView} would report for this combination of schema.
@@ -75,7 +75,7 @@ export function extractPersistedSchema(schema: ImplicitFieldSchema): JsonCompati
75
75
  * assert(
76
76
  * comparePersistedSchema(
77
77
  * require("./schema.json"),
78
- * extractPersistedSchema(MySchema),
78
+ * MySchema,
79
79
  * { jsonValidator: typeboxValidator },
80
80
  * false,
81
81
  * ).canUpgrade,
@@ -85,14 +85,13 @@ export function extractPersistedSchema(schema: ImplicitFieldSchema): JsonCompati
85
85
  */
86
86
  export function comparePersistedSchema(
87
87
  persisted: JsonCompatible,
88
- view: JsonCompatible,
88
+ view: ImplicitFieldSchema,
89
89
  options: ICodecOptions,
90
90
  canInitialize: boolean,
91
91
  ): SchemaCompatibilityStatus {
92
92
  const schemaCodec = makeSchemaCodec(options);
93
93
  const stored = schemaCodec.decode(persisted as Format);
94
- const viewParsed = schemaCodec.decode(view as Format);
95
- const viewSchema = new ViewSchema(defaultSchemaPolicy, {}, viewParsed);
94
+ const viewSchema = new ViewSchema(defaultSchemaPolicy, {}, view);
96
95
  return comparePersistedSchemaInternal(stored, viewSchema, canInitialize);
97
96
  }
98
97
 
@@ -105,22 +104,8 @@ export function comparePersistedSchemaInternal(
105
104
  viewSchema: ViewSchema,
106
105
  canInitialize: boolean,
107
106
  ): SchemaCompatibilityStatus {
108
- const result = viewSchema.checkCompatibility(stored);
109
-
110
- // TODO: AB#8121: Weaken this check to support viewing under additional circumstances.
111
- // In the near term, this should support viewing documents with additional optional fields in their schema on object types.
112
- // Longer-term (as demand arises), we could also add APIs to constructing view schema to allow for more flexibility
113
- // (e.g. out-of-schema content handlers could allow support for viewing docs which have extra allowed types in a particular field)
114
- const canView =
115
- result.write === Compatibility.Compatible && result.read === Compatibility.Compatible;
116
- const canUpgrade = result.read === Compatibility.Compatible;
117
- const isEquivalent = canView && canUpgrade;
118
- const compatibility: SchemaCompatibilityStatus = {
119
- canView,
120
- canUpgrade,
121
- isEquivalent,
107
+ return {
108
+ ...viewSchema.checkCompatibility(stored),
122
109
  canInitialize,
123
110
  };
124
-
125
- return compatibility;
126
111
  }
@@ -12,6 +12,10 @@ import type {
12
12
  RevertibleFactory,
13
13
  } from "../../core/index.js";
14
14
 
15
+ // This is referenced by doc comments.
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-imports
17
+ import type { TreeAlpha } from "../../shared-tree/index.js";
18
+
15
19
  import {
16
20
  type ImplicitFieldSchema,
17
21
  type InsertableField,
@@ -31,6 +35,7 @@ import { markSchemaMostDerived } from "./schemaFactory.js";
31
35
  import { fail, getOrCreate } from "../../util/index.js";
32
36
  import type { MakeNominal } from "../../util/index.js";
33
37
  import { walkFieldSchema } from "../walkFieldSchema.js";
38
+
34
39
  /**
35
40
  * A tree from which a {@link TreeView} can be created.
36
41
  *
@@ -41,6 +46,7 @@ import { walkFieldSchema } from "../walkFieldSchema.js";
41
46
  * Maybe rename "exportJsonSchema" to align on "concise" terminology.
42
47
  * Ensure schema exporting APIs here align and reference APIs for exporting view schema to the same formats (which should include stored vs property key choice).
43
48
  * Make sure users of independentView can use these export APIs (maybe provide a reference back to the ViewableTree from the TreeView to accomplish that).
49
+ * Some of these APIs are on ISharedTree and can get moved here.
44
50
  * @system @sealed @public
45
51
  */
46
52
  export interface ViewableTree {
@@ -38,7 +38,7 @@ import {
38
38
  } from "../leafNodeSchema.js";
39
39
  import { isObjectNodeSchema } from "../objectNodeTypes.js";
40
40
  import {
41
- customFromCursorInner,
41
+ customFromCursor,
42
42
  type CustomTreeNode,
43
43
  type CustomTreeValue,
44
44
  type EncodeOptions,
@@ -344,7 +344,7 @@ function verboseFromCursorInner<TCustom>(
344
344
  options: Required<EncodeOptions<TCustom>>,
345
345
  schema: ReadonlyMap<string, TreeNodeSchema>,
346
346
  ): VerboseTree<TCustom> {
347
- const fields = customFromCursorInner(reader, options, schema, verboseFromCursorInner);
347
+ const fields = customFromCursor(reader, options, schema, verboseFromCursorInner);
348
348
  const nodeSchema = schema.get(reader.type) ?? fail("missing schema for type in cursor");
349
349
  if (nodeSchema.kind === NodeKind.Leaf) {
350
350
  return fields as CustomTreeValue<TCustom>;
@@ -5,32 +5,56 @@
5
5
 
6
6
  import {
7
7
  AdaptedViewSchema,
8
+ type TreeNodeStoredSchema,
8
9
  type Adapters,
9
- Compatibility,
10
10
  type TreeFieldStoredSchema,
11
11
  type TreeNodeSchemaIdentifier,
12
- type TreeNodeStoredSchema,
13
12
  type TreeStoredSchema,
14
13
  } from "../../core/index.js";
15
14
  import { fail } from "../../util/index.js";
16
15
  import {
16
+ FieldKinds,
17
17
  type FullSchemaPolicy,
18
- allowsRepoSuperset,
18
+ type FieldDiscrepancy,
19
+ getAllowedContentDiscrepancies,
19
20
  isNeverTree,
21
+ PosetComparisonResult,
22
+ fieldRealizer,
23
+ comparePosetElements,
20
24
  } from "../../feature-libraries/index.js";
25
+ import {
26
+ normalizeFieldSchema,
27
+ type FieldSchema,
28
+ type ImplicitFieldSchema,
29
+ } from "../schemaTypes.js";
30
+ import { toStoredSchema } from "../toStoredSchema.js";
31
+ import { unreachableCase } from "@fluidframework/core-utils/internal";
32
+ import type { SchemaCompatibilityStatus } from "./tree.js";
21
33
 
22
34
  /**
23
35
  * A collection of View information for schema, including policy.
24
36
  */
25
37
  export class ViewSchema {
26
38
  /**
27
- * @param schema - Cached conversion of view schema in the stored schema format.
39
+ * Cached conversion of the view schema in the stored schema format.
40
+ */
41
+ private readonly viewSchemaAsStored: TreeStoredSchema;
42
+ /**
43
+ * Normalized view schema (implicitly allowed view schema types are converted to their canonical form).
44
+ */
45
+ public readonly schema: FieldSchema;
46
+
47
+ /**
48
+ * @param viewSchema - Schema for the root field of this view.
28
49
  */
29
50
  public constructor(
30
51
  public readonly policy: FullSchemaPolicy,
31
52
  public readonly adapters: Adapters,
32
- public readonly schema: TreeStoredSchema,
33
- ) {}
53
+ viewSchema: ImplicitFieldSchema,
54
+ ) {
55
+ this.schema = normalizeFieldSchema(viewSchema);
56
+ this.viewSchemaAsStored = toStoredSchema(this.schema);
57
+ }
34
58
 
35
59
  /**
36
60
  * Determines the compatibility of a stored document
@@ -42,53 +66,168 @@ export class ViewSchema {
42
66
  * TODO: this API violates the parse don't validate design philosophy.
43
67
  * It should be wrapped with (or replaced by) a parse style API.
44
68
  */
45
- public checkCompatibility(stored: TreeStoredSchema): {
46
- read: Compatibility;
47
- write: Compatibility;
48
- writeAllowingStoredSchemaUpdates: Compatibility;
49
- } {
69
+ public checkCompatibility(
70
+ stored: TreeStoredSchema,
71
+ ): Omit<SchemaCompatibilityStatus, "canInitialize"> {
50
72
  // TODO: support adapters
51
73
  // const adapted = this.adaptRepo(stored);
52
74
 
53
- const read = allowsRepoSuperset(this.policy, stored, this.schema)
54
- ? Compatibility.Compatible
55
- : // TODO: support adapters
56
- // : allowsRepoSuperset(this.policy, adapted.adaptedForViewSchema, this.storedSchema)
57
- // ? Compatibility.RequiresAdapters
58
- Compatibility.Incompatible;
59
- // TODO: Extract subset of adapters that are valid to use on stored
60
- // TODO: separate adapters from schema updates
61
- const write = allowsRepoSuperset(this.policy, this.schema, stored)
62
- ? Compatibility.Compatible
63
- : // TODO: support adapters
64
- // : allowsRepoSuperset(this.policy, this.storedSchema, adapted.adaptedForViewSchema)
65
- // TODO: IThis assumes adapters are bidirectional.
66
- // Compatibility.RequiresAdapters
67
- Compatibility.Incompatible;
68
-
69
- // TODO: compute this properly (and maybe include the set of schema changes needed for it?).
70
- // Maybe updates would happen lazily when needed to store data?
71
- // When willingness to updates can avoid need for some adapters,
72
- // how should it be decided if the adapter should be used to avoid the update?
73
- // TODO: is this case actually bi-variant, making this correct if we did it for each schema independently?
74
- let writeAllowingStoredSchemaUpdates =
75
- // TODO: This should consider just the updates needed
76
- // (ex: when view covers a subset of stored after stored has a update to that subset).
77
- allowsRepoSuperset(this.policy, stored, this.schema)
78
- ? Compatibility.Compatible
79
- : // TODO: this assumes adapters can translate in both directions. In general this will not be true.
80
- // TODO: this also assumes that schema updates to the adapted repo would translate to
81
- // updates on the stored schema, which is also likely untrue.
82
- // // TODO: support adapters
83
- // allowsRepoSuperset(this.policy, adapted.adaptedForViewSchema, this.storedSchema)
84
- // ? Compatibility.RequiresAdapters // Requires schema updates. TODO: consider adapters that can update writes.
85
- Compatibility.Incompatible;
86
-
87
- // Since the above does not consider partial updates,
88
- // we can improve the tolerance a bit by considering the op-op update:
89
- writeAllowingStoredSchemaUpdates = Math.max(writeAllowingStoredSchemaUpdates, write);
90
-
91
- return { read, write, writeAllowingStoredSchemaUpdates };
75
+ // View schema allows a subset of documents that stored schema does, and the discrepancies are allowed by policy
76
+ // determined by the view schema (i.e. objects with extra optional fields in the stored schema have opted into allowing this.
77
+ // In the future, this would also include things like:
78
+ // - fields with more allowed types in the stored schema than in the view schema have out-of-schema "unknown content" adapters
79
+ let canView = true;
80
+ // View schema allows a superset of documents that stored schema does, hence the document could be upgraded to use a persisted version
81
+ // of this view schema as its stored schema.
82
+ let canUpgrade = true;
83
+
84
+ const updateCompatibilityFromFieldDiscrepancy = (discrepancy: FieldDiscrepancy): void => {
85
+ switch (discrepancy.mismatch) {
86
+ case "allowedTypes": {
87
+ // Since we only track the symmetric difference between the allowed types in the view and
88
+ // stored schemas, it's sufficient to check if any extra allowed types still exist in the
89
+ // stored schema.
90
+ if (
91
+ discrepancy.stored.some(
92
+ (identifier) =>
93
+ !isNeverTree(this.policy, stored, stored.nodeSchema.get(identifier)),
94
+ )
95
+ ) {
96
+ // Stored schema has extra allowed types that the view schema does not.
97
+ canUpgrade = false;
98
+ canView = false;
99
+ }
100
+
101
+ if (
102
+ discrepancy.view.some(
103
+ (identifier) =>
104
+ !isNeverTree(
105
+ this.policy,
106
+ this.viewSchemaAsStored,
107
+ this.viewSchemaAsStored.nodeSchema.get(identifier),
108
+ ),
109
+ )
110
+ ) {
111
+ // View schema has extra allowed types that the stored schema does not.
112
+ canView = false;
113
+ }
114
+ break;
115
+ }
116
+ case "fieldKind": {
117
+ const result = comparePosetElements(
118
+ discrepancy.stored,
119
+ discrepancy.view,
120
+ fieldRealizer,
121
+ );
122
+
123
+ if (result === PosetComparisonResult.Greater) {
124
+ // Stored schema is more relaxed than view schema.
125
+ canUpgrade = false;
126
+ if (
127
+ discrepancy.view === FieldKinds.forbidden.identifier &&
128
+ discrepancy.identifier !== undefined &&
129
+ this.policy.allowUnknownOptionalFields(discrepancy.identifier)
130
+ ) {
131
+ // When the application has opted into it, we allow viewing documents which have additional
132
+ // optional fields in the stored schema that are not present in the view schema.
133
+ } else {
134
+ canView = false;
135
+ }
136
+ }
137
+
138
+ if (result === PosetComparisonResult.Less) {
139
+ // View schema is more relaxed than stored schema.
140
+ canView = false;
141
+ }
142
+
143
+ if (result === PosetComparisonResult.Incomparable) {
144
+ canUpgrade = false;
145
+ canView = false;
146
+ }
147
+
148
+ break;
149
+ }
150
+ case "valueSchema": {
151
+ canView = false;
152
+ canUpgrade = false;
153
+ break;
154
+ }
155
+ default:
156
+ unreachableCase(discrepancy);
157
+ }
158
+ };
159
+
160
+ for (const discrepancy of getAllowedContentDiscrepancies(
161
+ this.viewSchemaAsStored,
162
+ stored,
163
+ )) {
164
+ if (!canView && !canUpgrade) {
165
+ break;
166
+ }
167
+
168
+ switch (discrepancy.mismatch) {
169
+ case "nodeKind": {
170
+ const viewNodeSchema = this.viewSchemaAsStored.nodeSchema.get(
171
+ discrepancy.identifier,
172
+ );
173
+ const storedNodeSchema = stored.nodeSchema.get(discrepancy.identifier);
174
+ // We conservatively do not allow node types to change.
175
+ // The only time this might be valid in the sense that the data canonically converts is converting an object node
176
+ // to a map node over the union of all the object fields' types.
177
+ if (discrepancy.stored === undefined) {
178
+ const viewIsNever =
179
+ viewNodeSchema !== undefined
180
+ ? isNeverTree(this.policy, this.viewSchemaAsStored, viewNodeSchema)
181
+ : true;
182
+ if (!viewIsNever) {
183
+ // View schema has added a node type that the stored schema doesn't know about.
184
+ canView = false;
185
+ }
186
+ } else if (discrepancy.view === undefined) {
187
+ const storedIsNever =
188
+ storedNodeSchema !== undefined
189
+ ? isNeverTree(this.policy, stored, storedNodeSchema)
190
+ : true;
191
+ if (!storedIsNever) {
192
+ // Stored schema has a node type that the view schema doesn't know about.
193
+ canUpgrade = false;
194
+ }
195
+ } else {
196
+ // Node type exists in both schemas but has changed. We conservatively never allow this.
197
+ const storedIsNever =
198
+ storedNodeSchema !== undefined
199
+ ? isNeverTree(this.policy, stored, storedNodeSchema)
200
+ : true;
201
+ const viewIsNever =
202
+ viewNodeSchema !== undefined
203
+ ? isNeverTree(this.policy, this.viewSchemaAsStored, viewNodeSchema)
204
+ : true;
205
+ if (!storedIsNever || !viewIsNever) {
206
+ canView = false;
207
+ canUpgrade = false;
208
+ }
209
+ }
210
+ break;
211
+ }
212
+ case "valueSchema":
213
+ case "allowedTypes":
214
+ case "fieldKind": {
215
+ updateCompatibilityFromFieldDiscrepancy(discrepancy);
216
+ break;
217
+ }
218
+ case "fields": {
219
+ discrepancy.differences.forEach(updateCompatibilityFromFieldDiscrepancy);
220
+ break;
221
+ }
222
+ // No default
223
+ }
224
+ }
225
+
226
+ return {
227
+ canView,
228
+ canUpgrade,
229
+ isEquivalent: canView && canUpgrade,
230
+ };
92
231
  }
93
232
 
94
233
  /**
@@ -102,8 +241,15 @@ export class ViewSchema {
102
241
  // since there never is a reason to have a never type as an adapter input,
103
242
  // and its impossible for an adapter to be correctly implemented if its output type is never
104
243
  // (unless its input is also never).
244
+
105
245
  for (const adapter of this.adapters?.tree ?? []) {
106
- if (isNeverTree(this.policy, this.schema, this.schema.nodeSchema.get(adapter.output))) {
246
+ if (
247
+ isNeverTree(
248
+ this.policy,
249
+ this.viewSchemaAsStored,
250
+ this.viewSchemaAsStored.nodeSchema.get(adapter.output),
251
+ )
252
+ ) {
107
253
  fail("tree adapter for stored adapter.output should not be never");
108
254
  }
109
255
  }
@@ -35,6 +35,7 @@ export {
35
35
  type SchemaCompatibilityStatus,
36
36
  type ITreeConfigurationOptions,
37
37
  SchemaFactory,
38
+ type SchemaFactoryObjectOptions,
38
39
  type ScopedSchemaName,
39
40
  type ValidateRecursiveSchema,
40
41
  type FixRecursiveArraySchema,
@@ -118,6 +119,10 @@ export {
118
119
  conciseFromCursor,
119
120
  createFromCursor,
120
121
  asTreeViewAlpha,
122
+ customFromCursorStored,
123
+ type CustomTreeNode,
124
+ type CustomTreeValue,
125
+ tryStoredSchemaAsArray,
121
126
  } from "./api/index.js";
122
127
  export {
123
128
  type NodeFromSchema,
@@ -166,6 +171,7 @@ export {
166
171
  type ObjectFromSchemaRecord,
167
172
  type TreeObjectNode,
168
173
  setField,
174
+ createUnknownOptionalFieldPolicy,
169
175
  } from "./objectNode.js";
170
176
  export type { TreeMapNode, MapNodeInsertableData } from "./mapNode.js";
171
177
  export {