@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
@@ -14,11 +14,14 @@ import {
14
14
  type TreeValue,
15
15
  type UpPath,
16
16
  type Value,
17
+ type ChunkedCursor,
18
+ type TreeChunk,
19
+ cursorChunk,
20
+ dummyRoot,
17
21
  } from "../../core/index.js";
18
22
  import { ReferenceCountedBase, fail, hasSome } from "../../util/index.js";
19
23
  import { SynchronousCursor, prefixFieldPath, prefixPath } from "../treeCursorUtils.js";
20
24
 
21
- import { type ChunkedCursor, type TreeChunk, cursorChunk, dummyRoot } from "./chunk.js";
22
25
  import type { SessionSpaceCompressedId, IIdCompressor } from "@fluidframework/id-compressor";
23
26
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
24
27
 
@@ -13,4 +13,5 @@ import { fieldKinds } from "./defaultFieldKinds.js";
13
13
  export const defaultSchemaPolicy: FullSchemaPolicy = {
14
14
  fieldKinds,
15
15
  validateSchema: false,
16
+ allowUnknownOptionalFields: () => false,
16
17
  };
@@ -73,7 +73,10 @@ export function isNodeInSchema(
73
73
  uncheckedFieldsFromNode.delete(fieldKey);
74
74
  }
75
75
  // The node has fields that we did not check as part of looking at every field defined in the node's schema
76
- if (uncheckedFieldsFromNode.size !== 0) {
76
+ if (
77
+ uncheckedFieldsFromNode.size !== 0 &&
78
+ !schemaAndPolicy.policy.allowUnknownOptionalFields(node.type)
79
+ ) {
77
80
  return SchemaValidationErrors.ObjectNode_FieldNotInSchema;
78
81
  }
79
82
  } else if (schema instanceof MapNodeStoredSchema) {
@@ -76,7 +76,20 @@ export {
76
76
  type FieldKindConfigurationEntry,
77
77
  getAllowedContentDiscrepancies,
78
78
  isRepoSuperset,
79
+ type AllowedTypeDiscrepancy,
80
+ type FieldKindDiscrepancy,
81
+ type ValueSchemaDiscrepancy,
82
+ type FieldDiscrepancy,
83
+ type NodeDiscrepancy,
84
+ type NodeKindDiscrepancy,
85
+ type NodeFieldsDiscrepancy,
79
86
  isNeverTree,
87
+ type LinearExtension,
88
+ type Realizer,
89
+ fieldRealizer,
90
+ PosetComparisonResult,
91
+ comparePosetElements,
92
+ posetLte,
80
93
  } from "./modular-schema/index.js";
81
94
 
82
95
  export { mapRootChanges } from "./deltaUtils.js";
@@ -82,6 +82,8 @@ export class AnchorTreeIndex<TKey extends TreeIndexKey, TValue>
82
82
  * @param getValue - a pure and functional function that returns the associated value of one or more anchor nodes, can be used to map and filter the indexed anchor nodes
83
83
  * so that the values returned from the index are more usable
84
84
  * @param checkTreeStatus - a function that gets the tree status from an anchor node, used for filtering out detached nodes
85
+ * @param isShallowIndex - indicates if this index is shallow, meaning that it only allows nodes to be keyed off of fields directly under them rather than anywhere in their subtree.
86
+ * As a performance optimization, re-indexing up the spine can be turned off for shallow indexes.
85
87
  */
86
88
  public constructor(
87
89
  private readonly forest: IForestSubscription,
@@ -90,6 +92,7 @@ export class AnchorTreeIndex<TKey extends TreeIndexKey, TValue>
90
92
  ) => KeyFinder<TKey> | undefined,
91
93
  private readonly getValue: (anchorNodes: TreeIndexNodes<AnchorNode>) => TValue | undefined,
92
94
  private readonly checkTreeStatus: (node: AnchorNode) => TreeStatus | undefined,
95
+ private readonly isShallowIndex = false,
93
96
  ) {
94
97
  this.forest.registerAnnouncedVisitor(this.keyFinder);
95
98
 
@@ -132,6 +135,14 @@ export class AnchorTreeIndex<TKey extends TreeIndexKey, TValue>
132
135
  this.indexField(detachedCursor);
133
136
  detachedCursor.free();
134
137
  },
138
+ afterAttach: () => {
139
+ assert(parent !== undefined, 0xa99 /* must have a parent */);
140
+ this.reIndexSpine(parent);
141
+ },
142
+ afterDetach: () => {
143
+ assert(parent !== undefined, 0xa9a /* must have a parent */);
144
+ this.reIndexSpine(parent);
145
+ },
135
146
  // when a replace happens, the keys of previously indexed nodes could be changed so we must re-index them
136
147
  afterReplace: () => {
137
148
  assert(parent !== undefined, 0xa8b /* must have a parent */);
@@ -142,9 +153,12 @@ export class AnchorTreeIndex<TKey extends TreeIndexKey, TValue>
142
153
  0xa8c /* replace should happen in a node */,
143
154
  );
144
155
  cursor.exitNode();
145
- // we must re-index the spine because the key finders allow for any value under a subtree to be the key
146
- // this means that a replace can cause the key for any node up its spine to be changed
147
- this.indexSpine(cursor);
156
+ this.indexField(cursor);
157
+ if (!this.isShallowIndex) {
158
+ // we must also re-index the spine if the key finders allow for any value under a subtree to be the key
159
+ // this means that a replace can cause the key for any node up its spine to be changed
160
+ this.indexSpine(cursor);
161
+ }
148
162
  cursor.clear();
149
163
  },
150
164
  // the methods below are used to keep track of the path that has been traversed by the visitor
@@ -297,6 +311,23 @@ export class AnchorTreeIndex<TKey extends TreeIndexKey, TValue>
297
311
  this.disposed = true;
298
312
  }
299
313
 
314
+ /**
315
+ * Checks if the spine needs to be re-indexed and if so, re-indexes it starting from the given path.
316
+ */
317
+ private reIndexSpine(path: UpPath): void {
318
+ if (!this.isShallowIndex) {
319
+ const cursor = this.forest.allocateCursor();
320
+ this.forest.moveCursorToPath(path, cursor);
321
+ assert(
322
+ cursor.mode === CursorLocationType.Nodes,
323
+ 0xa9b /* attach should happen in a node */,
324
+ );
325
+ cursor.exitNode();
326
+ this.indexSpine(cursor);
327
+ cursor.clear();
328
+ }
329
+ }
330
+
300
331
  private checkNotDisposed(errorMessage?: string): void {
301
332
  if (this.disposed) {
302
333
  if (errorMessage !== undefined) {
@@ -371,8 +402,6 @@ export class AnchorTreeIndex<TKey extends TreeIndexKey, TValue>
371
402
  * Given a cursor in field mode, indexes all nodes under the field and then indexes all nodes up the spine.
372
403
  */
373
404
  private indexSpine(cursor: ITreeSubscriptionCursor): void {
374
- this.indexField(cursor);
375
-
376
405
  if (keyAsDetachedField(cursor.getFieldKey()) !== rootField) {
377
406
  cursor.exitField();
378
407
  cursor.exitNode();
@@ -6,6 +6,7 @@
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import {
9
+ type FieldKey,
9
10
  type FieldKindIdentifier,
10
11
  LeafNodeStoredSchema,
11
12
  MapNodeStoredSchema,
@@ -25,6 +26,7 @@ import { brand } from "../../util/index.js";
25
26
  // Rather than both existing, one of which just returns boolean and the other which returns additional details, a simple comparison which returns everything needed should be used.
26
27
 
27
28
  /**
29
+ * Discriminated union (keyed on `mismatch`) of discrepancies between a view and stored schema.
28
30
  * @remarks
29
31
  *
30
32
  * 1. FieldDiscrepancy
@@ -60,47 +62,73 @@ export type Discrepancy = FieldDiscrepancy | NodeDiscrepancy;
60
62
 
61
63
  export type NodeDiscrepancy = NodeKindDiscrepancy | NodeFieldsDiscrepancy;
62
64
 
65
+ /**
66
+ * A discrepancy in the declaration of a field.
67
+ */
63
68
  export type FieldDiscrepancy =
64
69
  | AllowedTypeDiscrepancy
65
70
  | FieldKindDiscrepancy
66
71
  | ValueSchemaDiscrepancy;
67
72
 
68
- export interface AllowedTypeDiscrepancy {
69
- identifier: string | undefined; // undefined indicates root field schema
73
+ /**
74
+ * Information about where a field discrepancy is located within a collection of schema.
75
+ */
76
+ export interface FieldDiscrepancyLocation {
77
+ /**
78
+ * The {@link TreeNodeSchemaIdentifier} that contains the discrepancy.
79
+ *
80
+ * Undefined iff the discrepancy is part of the root field schema.
81
+ */
82
+ identifier: TreeNodeSchemaIdentifier | undefined;
83
+ /**
84
+ * The {@link FieldKey} for the field that contains the discrepancy.
85
+ * Undefined when:
86
+ * - the discrepancy is part of the root field schema
87
+ * - the discrepancy is for 'all fields' of a map node
88
+ */
89
+ fieldKey: FieldKey | undefined;
90
+ }
91
+
92
+ /**
93
+ * A discrepancy in the allowed types of a field.
94
+ *
95
+ * @remarks
96
+ * This reports the symmetric difference of allowed types in view/stored to enable more efficient checks for compatibility
97
+ */
98
+ export interface AllowedTypeDiscrepancy extends FieldDiscrepancyLocation {
70
99
  mismatch: "allowedTypes";
71
100
  /**
72
- * List of allowed type identifiers in viewed schema
101
+ * List of allowed type identifiers in viewed schema which are not allowed in stored schema
73
102
  */
74
- view: string[];
103
+ view: TreeNodeSchemaIdentifier[];
75
104
  /**
76
- * List of allowed type identifiers in stored schema
105
+ * List of allowed type identifiers in stored schema which are not allowed in view schema
77
106
  */
78
- stored: string[];
107
+ stored: TreeNodeSchemaIdentifier[];
79
108
  }
80
109
 
81
- export interface FieldKindDiscrepancy {
82
- identifier: string | undefined; // undefined indicates root field schema
110
+ export interface FieldKindDiscrepancy extends FieldDiscrepancyLocation {
83
111
  mismatch: "fieldKind";
84
112
  view: FieldKindIdentifier;
85
113
  stored: FieldKindIdentifier;
86
114
  }
87
115
 
88
116
  export interface ValueSchemaDiscrepancy {
89
- identifier: string;
117
+ identifier: TreeNodeSchemaIdentifier;
90
118
  mismatch: "valueSchema";
91
119
  view: ValueSchema | undefined;
92
120
  stored: ValueSchema | undefined;
93
121
  }
94
122
 
95
123
  export interface NodeKindDiscrepancy {
96
- identifier: string;
124
+ identifier: TreeNodeSchemaIdentifier;
97
125
  mismatch: "nodeKind";
98
126
  view: SchemaFactoryNodeKind | undefined;
99
127
  stored: SchemaFactoryNodeKind | undefined;
100
128
  }
101
129
 
102
130
  export interface NodeFieldsDiscrepancy {
103
- identifier: string;
131
+ identifier: TreeNodeSchemaIdentifier;
104
132
  mismatch: "fields";
105
133
  differences: FieldDiscrepancy[];
106
134
  }
@@ -121,26 +149,25 @@ function getNodeSchemaType(nodeSchema: TreeNodeStoredSchema): SchemaFactoryNodeK
121
149
  /**
122
150
  * Finds and reports discrepancies between a view schema and a stored schema.
123
151
  *
124
- * The workflow for finding schema incompatibilities:
125
- * 1. Compare the two root schemas to identify any `FieldDiscrepancy`.
126
- *
127
- * 2. For each node schema in the `view`:
128
- * - Verify if the node schema exists in the stored. If it does, ensure that the `SchemaFactoryNodeKind` are
129
- * consistent. Otherwise this difference is treated as `NodeKindDiscrepancy`
130
- * - If a node schema with the same identifier exists in both view and stored, and their `SchemaFactoryNodeKind`
131
- * are consistent, perform a exhaustive validation to identify all `FieldDiscrepancy`.
132
- *
133
- * 3. For each node schema in the stored, verify if it exists in the view. The overlapping parts were already
134
- * addressed in the previous step.
152
+ * See documentation on {@link Discrepancy} for details of possible discrepancies.
153
+ * @remarks
154
+ * This function does not attempt to distinguish between equivalent representations of a node/field involving extraneous never trees.
155
+ * For example, a Forbidden field with allowed type set `[]` is equivalent to an optional field with allowed type set `[]`,
156
+ * as well as an optional field with an allowed type set containing only unconstructable types.
135
157
  *
136
- * @returns the discrepancies between two TreeStoredSchema objects
158
+ * It is up to the caller to determine whether such discrepancies matter.
137
159
  */
138
160
  export function* getAllowedContentDiscrepancies(
139
161
  view: TreeStoredSchema,
140
162
  stored: TreeStoredSchema,
141
163
  ): Iterable<Discrepancy> {
142
164
  // check root schema discrepancies
143
- yield* getFieldDiscrepancies(view.rootFieldSchema, stored.rootFieldSchema);
165
+ yield* getFieldDiscrepancies(
166
+ view.rootFieldSchema,
167
+ stored.rootFieldSchema,
168
+ undefined,
169
+ undefined,
170
+ );
144
171
 
145
172
  for (const result of compareMaps(view.nodeSchema, stored.nodeSchema)) {
146
173
  switch (result.type) {
@@ -195,6 +222,7 @@ function* getNodeDiscrepancies(
195
222
  case "object": {
196
223
  const differences = Array.from(
197
224
  trackObjectNodeDiscrepancies(
225
+ identifier,
198
226
  view as ObjectNodeStoredSchema,
199
227
  stored as ObjectNodeStoredSchema,
200
228
  ),
@@ -213,6 +241,7 @@ function* getNodeDiscrepancies(
213
241
  (view as MapNodeStoredSchema).mapFields,
214
242
  (stored as MapNodeStoredSchema).mapFields,
215
243
  identifier,
244
+ undefined,
216
245
  );
217
246
  break;
218
247
  case "leaf": {
@@ -241,7 +270,8 @@ function* getNodeDiscrepancies(
241
270
  function* getFieldDiscrepancies(
242
271
  view: TreeFieldStoredSchema,
243
272
  stored: TreeFieldStoredSchema,
244
- keyOrRoot?: string,
273
+ identifier: TreeNodeSchemaIdentifier | undefined,
274
+ fieldKey: FieldKey | undefined,
245
275
  ): Iterable<FieldDiscrepancy> {
246
276
  // Only track the symmetric differences of two sets.
247
277
  const findSetDiscrepancies = (
@@ -256,7 +286,8 @@ function* getFieldDiscrepancies(
256
286
  const [viewExtra, storedExtra] = findSetDiscrepancies(view.types, stored.types);
257
287
  if (viewExtra.length > 0 || storedExtra.length > 0) {
258
288
  yield {
259
- identifier: keyOrRoot,
289
+ identifier,
290
+ fieldKey,
260
291
  mismatch: "allowedTypes",
261
292
  view: viewExtra,
262
293
  stored: storedExtra,
@@ -265,7 +296,8 @@ function* getFieldDiscrepancies(
265
296
 
266
297
  if (view.kind !== stored.kind) {
267
298
  yield {
268
- identifier: keyOrRoot,
299
+ identifier,
300
+ fieldKey,
269
301
  mismatch: "fieldKind",
270
302
  view: view.kind,
271
303
  stored: stored.kind,
@@ -274,6 +306,7 @@ function* getFieldDiscrepancies(
274
306
  }
275
307
 
276
308
  function* trackObjectNodeDiscrepancies(
309
+ identifier: TreeNodeSchemaIdentifier,
277
310
  view: ObjectNodeStoredSchema,
278
311
  stored: ObjectNodeStoredSchema,
279
312
  ): Iterable<FieldDiscrepancy> {
@@ -298,7 +331,8 @@ function* trackObjectNodeDiscrepancies(
298
331
  break;
299
332
  }
300
333
  yield {
301
- identifier: fieldKey,
334
+ identifier,
335
+ fieldKey,
302
336
  mismatch: "fieldKind",
303
337
  view: result.value.kind,
304
338
  stored: storedEmptyFieldSchema.kind,
@@ -312,7 +346,8 @@ function* trackObjectNodeDiscrepancies(
312
346
  break;
313
347
  }
314
348
  yield {
315
- identifier: fieldKey,
349
+ identifier,
350
+ fieldKey,
316
351
  mismatch: "fieldKind",
317
352
  view: storedEmptyFieldSchema.kind,
318
353
  stored: result.value.kind,
@@ -320,12 +355,11 @@ function* trackObjectNodeDiscrepancies(
320
355
  break;
321
356
  }
322
357
  case "both": {
323
- yield* getFieldDiscrepancies(result.valueA, result.valueB, fieldKey);
358
+ yield* getFieldDiscrepancies(result.valueA, result.valueB, identifier, fieldKey);
324
359
  break;
325
360
  }
326
- default: {
361
+ default:
327
362
  break;
328
- }
329
363
  }
330
364
  }
331
365
  }
@@ -428,13 +462,13 @@ function isFieldDiscrepancyCompatible(discrepancy: FieldDiscrepancy): boolean {
428
462
  *
429
463
  * The linear extension is represented as a lookup from each poset element to its index in the linear extension.
430
464
  */
431
- type LinearExtension<T> = Map<T, number>;
465
+ export type LinearExtension<T> = Map<T, number>;
432
466
 
433
467
  /**
434
468
  * A realizer for a partially-ordered set. See:
435
469
  * https://en.wikipedia.org/wiki/Order_dimension
436
470
  */
437
- type Realizer<T> = LinearExtension<T>[];
471
+ export type Realizer<T> = LinearExtension<T>[];
438
472
 
439
473
  /**
440
474
  * @privateRemarks
@@ -468,7 +502,7 @@ const FieldKindIdentifiers = {
468
502
  * identifier
469
503
  * ```
470
504
  */
471
- const fieldRealizer: Realizer<FieldKindIdentifier> = [
505
+ export const fieldRealizer: Realizer<FieldKindIdentifier> = [
472
506
  [
473
507
  FieldKindIdentifiers.forbidden,
474
508
  FieldKindIdentifiers.identifier,
@@ -485,7 +519,7 @@ const fieldRealizer: Realizer<FieldKindIdentifier> = [
485
519
  ],
486
520
  ].map((extension) => new Map(extension.map((identifier, index) => [identifier, index])));
487
521
 
488
- const PosetComparisonResult = {
522
+ export const PosetComparisonResult = {
489
523
  Less: "<",
490
524
  Greater: ">",
491
525
  Equal: "=",
@@ -494,7 +528,11 @@ const PosetComparisonResult = {
494
528
  type PosetComparisonResult =
495
529
  (typeof PosetComparisonResult)[keyof typeof PosetComparisonResult];
496
530
 
497
- function comparePosetElements<T>(a: T, b: T, realizer: Realizer<T>): PosetComparisonResult {
531
+ export function comparePosetElements<T>(
532
+ a: T,
533
+ b: T,
534
+ realizer: Realizer<T>,
535
+ ): PosetComparisonResult {
498
536
  let hasLessThanResult = false;
499
537
  let hasGreaterThanResult = false;
500
538
  for (const extension of realizer) {
@@ -517,7 +555,7 @@ function comparePosetElements<T>(a: T, b: T, realizer: Realizer<T>): PosetCompar
517
555
  : PosetComparisonResult.Equal;
518
556
  }
519
557
 
520
- function posetLte<T>(a: T, b: T, realizer: Realizer<T>): boolean {
558
+ export function posetLte<T>(a: T, b: T, realizer: Realizer<T>): boolean {
521
559
  const comparison = comparePosetElements(a, b, realizer);
522
560
  return (
523
561
  comparison === PosetComparisonResult.Less || comparison === PosetComparisonResult.Equal
@@ -77,4 +77,17 @@ export type {
77
77
  export {
78
78
  getAllowedContentDiscrepancies,
79
79
  isRepoSuperset,
80
+ type AllowedTypeDiscrepancy,
81
+ type FieldKindDiscrepancy,
82
+ type ValueSchemaDiscrepancy,
83
+ type FieldDiscrepancy,
84
+ type NodeDiscrepancy,
85
+ type NodeKindDiscrepancy,
86
+ type NodeFieldsDiscrepancy,
87
+ type LinearExtension,
88
+ type Realizer,
89
+ fieldRealizer,
90
+ PosetComparisonResult,
91
+ comparePosetElements,
92
+ posetLte,
80
93
  } from "./discrepancies.js";
@@ -19,9 +19,7 @@ import { fail } from "../../util/index.js";
19
19
  import type { FullSchemaPolicy } from "./fieldKind.js";
20
20
 
21
21
  /**
22
- * @internal
23
22
  */
24
-
25
23
  export function isNeverField(
26
24
  policy: FullSchemaPolicy,
27
25
  originalData: TreeStoredSchema,
@@ -25,7 +25,6 @@ export interface HasMoveId {
25
25
  }
26
26
 
27
27
  /**
28
- * @internal
29
28
  */
30
29
  export interface CellId extends ChangeAtomId {}
31
30
 
package/src/index.ts CHANGED
@@ -4,35 +4,15 @@
4
4
  */
5
5
 
6
6
  export {
7
- EmptyKey,
8
- type FieldKey,
9
- type TreeValue,
10
- type FieldMapObject,
11
- type NodeData,
12
- type GenericTreeNode,
13
- type JsonableTree,
14
- type GenericFieldsNode,
15
- type TreeNodeSchemaIdentifier,
16
- type TreeFieldStoredSchema,
17
7
  ValueSchema,
18
- TreeNodeStoredSchema,
19
- type FieldKindIdentifier,
20
- type TreeTypeSet,
21
- type TreeStoredSchema,
22
8
  type Revertible,
23
9
  CommitKind,
24
10
  RevertibleStatus,
25
11
  type CommitMetadata,
26
- type StoredSchemaCollection,
27
- type ErasedTreeNodeSchemaDataFormat,
28
- ObjectNodeStoredSchema,
29
- MapNodeStoredSchema,
30
- LeafNodeStoredSchema,
31
12
  type RevertibleFactory,
32
13
  type RevertibleAlphaFactory,
33
14
  type RevertibleAlpha,
34
15
  } from "./core/index.js";
35
- export { type Brand } from "./util/index.js";
36
16
 
37
17
  export type {
38
18
  Listeners,
@@ -50,10 +30,9 @@ export {
50
30
  } from "./feature-libraries/index.js";
51
31
 
52
32
  export {
53
- type ISharedTree,
33
+ type ITreeInternal,
54
34
  type SharedTreeOptions,
55
35
  ForestType,
56
- type SharedTreeContentSnapshot,
57
36
  type SharedTreeFormatOptions,
58
37
  SharedTreeFormatVersion,
59
38
  Tree,
@@ -190,11 +169,6 @@ export {
190
169
  type SimpleObjectNodeSchema,
191
170
  normalizeAllowedTypes,
192
171
  getSimpleSchema,
193
- numberSchema,
194
- stringSchema,
195
- booleanSchema,
196
- handleSchema,
197
- nullSchema,
198
172
  type ReadonlyArrayNode,
199
173
  type InsertableTreeNodeFromAllowedTypes,
200
174
  type Input,
@@ -217,8 +191,6 @@ export { noopValidator } from "./codec/index.js";
217
191
  export { typeboxValidator } from "./external-utilities/index.js";
218
192
 
219
193
  export {
220
- type Covariant,
221
- BrandedType,
222
194
  type RestrictiveReadonlyRecord,
223
195
  type RestrictiveStringRecord,
224
196
  type MakeNominal,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.11.0";
9
+ export const pkgVersion = "2.12.0";
@@ -16,6 +16,7 @@ export {
16
16
  buildConfiguredForest,
17
17
  defaultSharedTreeOptions,
18
18
  type ForestOptions,
19
+ type ITreeInternal,
19
20
  } from "./sharedTree.js";
20
21
 
21
22
  export {
@@ -7,7 +7,6 @@ import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import {
9
9
  AllowedUpdateType,
10
- Compatibility,
11
10
  CursorLocationType,
12
11
  type ITreeCursorSynchronous,
13
12
  type TreeStoredSchema,
@@ -24,7 +23,7 @@ import {
24
23
  import { fail, isReadonlyArray } from "../util/index.js";
25
24
 
26
25
  import type { ITreeCheckout } from "./treeCheckout.js";
27
- import type { ViewSchema } from "../simple-tree/index.js";
26
+ import { toStoredSchema, type ViewSchema } from "../simple-tree/index.js";
28
27
 
29
28
  /**
30
29
  * Modify `storedSchema` and invoke `setInitialTree` when it's time to set the tree content.
@@ -120,10 +119,7 @@ export function evaluateUpdate(
120
119
  ): UpdateType {
121
120
  const compatibility = viewSchema.checkCompatibility(checkout.storedSchema);
122
121
 
123
- if (
124
- compatibility.read === Compatibility.Compatible &&
125
- compatibility.write === Compatibility.Compatible
126
- ) {
122
+ if (compatibility.canUpgrade && compatibility.canView) {
127
123
  // Compatible as is
128
124
  return UpdateType.None;
129
125
  }
@@ -133,13 +129,13 @@ export function evaluateUpdate(
133
129
  return UpdateType.Initialize;
134
130
  }
135
131
 
136
- if (compatibility.read !== Compatibility.Compatible) {
132
+ if (!compatibility.canUpgrade) {
137
133
  // Existing stored schema permits trees which are incompatible with the view schema, so schema can not be updated
138
134
  return UpdateType.Incompatible;
139
135
  }
140
136
 
141
- assert(compatibility.write === Compatibility.Incompatible, 0x8bd /* unexpected case */);
142
- assert(compatibility.read === Compatibility.Compatible, 0x8be /* unexpected case */);
137
+ assert(!compatibility.canView, 0x8bd /* unexpected case */);
138
+ assert(compatibility.canUpgrade, 0x8be /* unexpected case */);
143
139
 
144
140
  // eslint-disable-next-line no-bitwise
145
141
  return allowedSchemaModifications & AllowedUpdateType.SchemaCompatible
@@ -244,7 +240,7 @@ export function ensureSchema(
244
240
  return false;
245
241
  }
246
242
  case UpdateType.SchemaCompatible: {
247
- checkout.updateSchema(viewSchema.schema);
243
+ checkout.updateSchema(toStoredSchema(viewSchema.schema));
248
244
  return true;
249
245
  }
250
246
  case UpdateType.Initialize: {
@@ -12,12 +12,7 @@ import { createEmitter } from "@fluid-internal/client-utils";
12
12
  import { assert } from "@fluidframework/core-utils/internal";
13
13
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
14
14
 
15
- import {
16
- AllowedUpdateType,
17
- anchorSlot,
18
- Compatibility,
19
- type SchemaPolicy,
20
- } from "../core/index.js";
15
+ import { AllowedUpdateType, anchorSlot, type SchemaPolicy } from "../core/index.js";
21
16
  import {
22
17
  type NodeKeyManager,
23
18
  defaultSchemaPolicy,
@@ -58,7 +53,9 @@ import {
58
53
  HydratedContext,
59
54
  SimpleContextSlot,
60
55
  areImplicitFieldSchemaEqual,
56
+ createUnknownOptionalFieldPolicy,
61
57
  } from "../simple-tree/index.js";
58
+
62
59
  /**
63
60
  * Creating multiple tree views from the same checkout is not supported. This slot is used to detect if one already
64
61
  * exists and error if creating a second.
@@ -116,14 +113,14 @@ export class SchematizingSimpleTreeView<
116
113
  }
117
114
  checkout.forest.anchors.slots.set(ViewSlot, this);
118
115
 
119
- const policy = {
116
+ this.rootFieldSchema = normalizeFieldSchema(config.schema);
117
+ this.schemaPolicy = {
120
118
  ...defaultSchemaPolicy,
121
119
  validateSchema: config.enableSchemaValidation,
120
+ allowUnknownOptionalFields: createUnknownOptionalFieldPolicy(this.rootFieldSchema),
122
121
  };
123
- this.rootFieldSchema = normalizeFieldSchema(config.schema);
124
- this.schemaPolicy = defaultSchemaPolicy;
125
122
 
126
- this.viewSchema = new ViewSchema(policy, {}, toStoredSchema(this.rootFieldSchema));
123
+ this.viewSchema = new ViewSchema(this.schemaPolicy, {}, this.rootFieldSchema);
127
124
  // This must be initialized before `update` can be called.
128
125
  this.currentCompatibility = {
129
126
  canView: false,
@@ -166,16 +163,13 @@ export class SchematizingSimpleTreeView<
166
163
  this.nodeKeyManager,
167
164
  {
168
165
  schema: this.checkout.storedSchema,
169
- policy: {
170
- ...defaultSchemaPolicy,
171
- validateSchema: this.config.enableSchemaValidation,
172
- },
166
+ policy: this.schemaPolicy,
173
167
  },
174
168
  );
175
169
 
176
170
  prepareContentForHydration(mapTree, this.checkout.forest);
177
171
  initialize(this.checkout, {
178
- schema: this.viewSchema.schema,
172
+ schema: toStoredSchema(this.viewSchema.schema),
179
173
  initialTree: mapTree === undefined ? undefined : cursorForMapTreeNode(mapTree),
180
174
  });
181
175
  });
@@ -202,7 +196,7 @@ export class SchematizingSimpleTreeView<
202
196
  AllowedUpdateType.SchemaCompatible,
203
197
  this.checkout,
204
198
  {
205
- schema: this.viewSchema.schema,
199
+ schema: toStoredSchema(this.viewSchema.schema),
206
200
  initialTree: undefined,
207
201
  },
208
202
  );
@@ -432,11 +426,7 @@ export function requireSchema(
432
426
 
433
427
  {
434
428
  const compatibility = viewSchema.checkCompatibility(checkout.storedSchema);
435
- assert(
436
- compatibility.write === Compatibility.Compatible &&
437
- compatibility.read === Compatibility.Compatible,
438
- 0x8c3 /* requireSchema invoked with incompatible schema */,
439
- );
429
+ assert(compatibility.canView, 0x8c3 /* requireSchema invoked with incompatible schema */);
440
430
  }
441
431
 
442
432
  const view = new CheckoutFlexTreeView(checkout, schemaPolicy, nodeKeyManager, onDispose);