@fluidframework/tree 2.11.0 → 2.13.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 (704) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/api-report/tree.alpha.api.md +88 -12
  3. package/api-report/tree.beta.api.md +23 -11
  4. package/api-report/tree.legacy.alpha.api.md +23 -11
  5. package/api-report/tree.legacy.public.api.md +23 -11
  6. package/api-report/tree.public.api.md +23 -11
  7. package/dist/alpha.d.ts +11 -0
  8. package/dist/beta.d.ts +2 -0
  9. package/dist/core/index.d.ts +2 -2
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +5 -3
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/utils.d.ts.map +1 -1
  14. package/dist/core/rebase/utils.js +2 -9
  15. package/dist/core/rebase/utils.js.map +1 -1
  16. package/dist/core/schema-stored/format.d.ts +0 -3
  17. package/dist/core/schema-stored/format.d.ts.map +1 -1
  18. package/dist/core/schema-stored/format.js.map +1 -1
  19. package/dist/core/schema-stored/schema.d.ts +12 -10
  20. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  21. package/dist/core/schema-stored/schema.js +3 -5
  22. package/dist/core/schema-stored/schema.js.map +1 -1
  23. package/dist/core/schema-view/index.d.ts +1 -1
  24. package/dist/core/schema-view/index.d.ts.map +1 -1
  25. package/dist/core/schema-view/index.js +1 -2
  26. package/dist/core/schema-view/index.js.map +1 -1
  27. package/dist/core/schema-view/view.d.ts +0 -7
  28. package/dist/core/schema-view/view.d.ts.map +1 -1
  29. package/dist/core/schema-view/view.js +1 -12
  30. package/dist/core/schema-view/view.js.map +1 -1
  31. package/dist/{feature-libraries/chunked-forest → core/tree}/chunk.d.ts +2 -1
  32. package/dist/core/tree/chunk.d.ts.map +1 -0
  33. package/dist/{feature-libraries/chunked-forest → core/tree}/chunk.js +2 -2
  34. package/dist/core/tree/chunk.js.map +1 -0
  35. package/dist/core/tree/index.d.ts +1 -0
  36. package/dist/core/tree/index.d.ts.map +1 -1
  37. package/dist/core/tree/index.js +5 -1
  38. package/dist/core/tree/index.js.map +1 -1
  39. package/dist/core/tree/treeTextFormat.d.ts +0 -5
  40. package/dist/core/tree/treeTextFormat.d.ts.map +1 -1
  41. package/dist/core/tree/treeTextFormat.js.map +1 -1
  42. package/dist/core/tree/types.d.ts +0 -5
  43. package/dist/core/tree/types.d.ts.map +1 -1
  44. package/dist/core/tree/types.js +0 -1
  45. package/dist/core/tree/types.js.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts +1 -2
  47. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/basicChunk.js +14 -14
  49. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts +1 -2
  51. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/chunkTree.js +2 -3
  53. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts +1 -2
  55. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  57. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts +1 -2
  58. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts.map +1 -1
  59. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +1 -2
  61. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  62. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +1 -1
  64. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  65. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  66. package/dist/feature-libraries/chunked-forest/emptyChunk.d.ts +1 -1
  67. package/dist/feature-libraries/chunked-forest/emptyChunk.d.ts.map +1 -1
  68. package/dist/feature-libraries/chunked-forest/emptyChunk.js +2 -3
  69. package/dist/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
  70. package/dist/feature-libraries/chunked-forest/index.d.ts +1 -1
  71. package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  72. package/dist/feature-libraries/chunked-forest/index.js +5 -5
  73. package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
  74. package/dist/feature-libraries/chunked-forest/sequenceChunk.d.ts +1 -1
  75. package/dist/feature-libraries/chunked-forest/sequenceChunk.d.ts.map +1 -1
  76. package/dist/feature-libraries/chunked-forest/sequenceChunk.js +2 -2
  77. package/dist/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  78. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts +1 -2
  79. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  80. package/dist/feature-libraries/chunked-forest/uniformChunk.js +13 -13
  81. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  82. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +10 -0
  83. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  84. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +3 -0
  85. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  86. package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  87. package/dist/feature-libraries/default-schema/defaultSchema.js +1 -0
  88. package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  89. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  90. package/dist/feature-libraries/default-schema/schemaChecker.js +2 -1
  91. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  92. package/dist/feature-libraries/index.d.ts +1 -2
  93. package/dist/feature-libraries/index.d.ts.map +1 -1
  94. package/dist/feature-libraries/index.js +6 -4
  95. package/dist/feature-libraries/index.js.map +1 -1
  96. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts +8 -1
  97. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  98. package/dist/feature-libraries/indexing/anchorTreeIndex.js +31 -5
  99. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  100. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +1 -1
  101. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  102. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +8 -2
  103. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  104. package/dist/feature-libraries/modular-schema/discrepancies.d.ts +84 -24
  105. package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -1
  106. package/dist/feature-libraries/modular-schema/discrepancies.js +32 -33
  107. package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  108. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +12 -5
  109. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  110. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  111. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  112. package/dist/feature-libraries/modular-schema/genericFieldKind.js +2 -1
  113. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  114. package/dist/feature-libraries/modular-schema/index.d.ts +2 -2
  115. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  116. package/dist/feature-libraries/modular-schema/index.js +5 -1
  117. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  118. package/dist/feature-libraries/modular-schema/isNeverTree.d.ts +0 -1
  119. package/dist/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
  120. package/dist/feature-libraries/modular-schema/isNeverTree.js +0 -1
  121. package/dist/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
  122. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +1 -0
  123. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  124. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +89 -25
  125. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  126. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +12 -0
  127. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  128. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  129. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  130. package/dist/feature-libraries/optional-field/optionalField.js +24 -4
  131. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  132. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +6 -6
  133. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  134. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +7 -7
  135. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  136. package/dist/feature-libraries/schema-edits/schemaChangeFormat.d.ts +12 -12
  137. package/dist/feature-libraries/sequence-field/formatV1.d.ts +99 -99
  138. package/dist/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  139. package/dist/feature-libraries/sequence-field/formatV2.d.ts +76 -76
  140. package/dist/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  141. package/dist/feature-libraries/sequence-field/formatV3.d.ts +54 -54
  142. package/dist/feature-libraries/sequence-field/types.d.ts +0 -1
  143. package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
  144. package/dist/feature-libraries/sequence-field/types.js.map +1 -1
  145. package/dist/feature-libraries/sequence-field/utils.d.ts +2 -2
  146. package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  147. package/dist/feature-libraries/sequence-field/utils.js +14 -5
  148. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  149. package/dist/index.d.ts +4 -5
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +2 -14
  152. package/dist/index.js.map +1 -1
  153. package/dist/legacy.d.ts +2 -0
  154. package/dist/packageVersion.d.ts +1 -1
  155. package/dist/packageVersion.js +1 -1
  156. package/dist/packageVersion.js.map +1 -1
  157. package/dist/public.d.ts +2 -0
  158. package/dist/shared-tree/index.d.ts +3 -2
  159. package/dist/shared-tree/index.d.ts.map +1 -1
  160. package/dist/shared-tree/index.js +2 -1
  161. package/dist/shared-tree/index.js.map +1 -1
  162. package/dist/shared-tree/schematizeTree.d.ts +1 -1
  163. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  164. package/dist/shared-tree/schematizeTree.js +6 -6
  165. package/dist/shared-tree/schematizeTree.js.map +1 -1
  166. package/dist/shared-tree/schematizingTreeView.d.ts +10 -1
  167. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  168. package/dist/shared-tree/schematizingTreeView.js +51 -12
  169. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  170. package/dist/shared-tree/sharedTree.d.ts +31 -10
  171. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  172. package/dist/shared-tree/sharedTree.js +106 -15
  173. package/dist/shared-tree/sharedTree.js.map +1 -1
  174. package/dist/shared-tree/transactionTypes.d.ts +105 -0
  175. package/dist/shared-tree/transactionTypes.d.ts.map +1 -0
  176. package/dist/shared-tree/transactionTypes.js +13 -0
  177. package/dist/shared-tree/transactionTypes.js.map +1 -0
  178. package/dist/shared-tree/treeApi.d.ts +1 -25
  179. package/dist/shared-tree/treeApi.d.ts.map +1 -1
  180. package/dist/shared-tree/treeApi.js +4 -8
  181. package/dist/shared-tree/treeApi.js.map +1 -1
  182. package/dist/shared-tree/treeCheckout.d.ts +39 -13
  183. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  184. package/dist/shared-tree/treeCheckout.js +275 -128
  185. package/dist/shared-tree/treeCheckout.js.map +1 -1
  186. package/dist/shared-tree-core/branch.d.ts +13 -35
  187. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  188. package/dist/shared-tree-core/branch.js +12 -77
  189. package/dist/shared-tree-core/branch.js.map +1 -1
  190. package/dist/shared-tree-core/branchCommitEnricher.d.ts +7 -1
  191. package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  192. package/dist/shared-tree-core/branchCommitEnricher.js +16 -18
  193. package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
  194. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  195. package/dist/shared-tree-core/editManager.js +2 -2
  196. package/dist/shared-tree-core/editManager.js.map +1 -1
  197. package/dist/shared-tree-core/index.d.ts +3 -3
  198. package/dist/shared-tree-core/index.d.ts.map +1 -1
  199. package/dist/shared-tree-core/index.js +2 -2
  200. package/dist/shared-tree-core/index.js.map +1 -1
  201. package/dist/shared-tree-core/sharedTreeCore.d.ts +2 -9
  202. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  203. package/dist/shared-tree-core/sharedTreeCore.js +4 -16
  204. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  205. package/dist/shared-tree-core/transaction.d.ts +38 -0
  206. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  207. package/dist/shared-tree-core/transaction.js +118 -6
  208. package/dist/shared-tree-core/transaction.js.map +1 -1
  209. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  210. package/dist/simple-tree/api/conciseTree.js +1 -1
  211. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  212. package/dist/simple-tree/api/create.d.ts.map +1 -1
  213. package/dist/simple-tree/api/create.js +5 -1
  214. package/dist/simple-tree/api/create.js.map +1 -1
  215. package/dist/simple-tree/api/customTree.d.ts +14 -2
  216. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  217. package/dist/simple-tree/api/customTree.js +53 -3
  218. package/dist/simple-tree/api/customTree.js.map +1 -1
  219. package/dist/simple-tree/api/index.d.ts +3 -2
  220. package/dist/simple-tree/api/index.d.ts.map +1 -1
  221. package/dist/simple-tree/api/index.js +6 -1
  222. package/dist/simple-tree/api/index.js.map +1 -1
  223. package/dist/simple-tree/api/jsonSchema.d.ts +6 -0
  224. package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
  225. package/dist/simple-tree/api/jsonSchema.js.map +1 -1
  226. package/dist/simple-tree/api/schemaFactory.d.ts +65 -8
  227. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  228. package/dist/simple-tree/api/schemaFactory.js +10 -4
  229. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  230. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +83 -0
  231. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -0
  232. package/dist/simple-tree/api/schemaFactoryAlpha.js +90 -0
  233. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -0
  234. package/dist/simple-tree/api/simpleSchema.d.ts +8 -2
  235. package/dist/simple-tree/api/simpleSchema.d.ts.map +1 -1
  236. package/dist/simple-tree/api/simpleSchema.js.map +1 -1
  237. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +13 -10
  238. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  239. package/dist/simple-tree/api/simpleTreeIndex.js +3 -1
  240. package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
  241. package/dist/simple-tree/api/storedSchema.d.ts +4 -4
  242. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  243. package/dist/simple-tree/api/storedSchema.js +8 -21
  244. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  245. package/dist/simple-tree/api/testRecursiveDomain.d.ts +5 -5
  246. package/dist/simple-tree/api/tree.d.ts +61 -0
  247. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  248. package/dist/simple-tree/api/tree.js.map +1 -1
  249. package/dist/simple-tree/api/verboseTree.js +1 -1
  250. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  251. package/dist/simple-tree/api/view.d.ts +14 -9
  252. package/dist/simple-tree/api/view.d.ts.map +1 -1
  253. package/dist/simple-tree/api/view.js +129 -40
  254. package/dist/simple-tree/api/view.js.map +1 -1
  255. package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  256. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +11 -11
  257. package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  258. package/dist/simple-tree/arrayNode.d.ts +2 -2
  259. package/dist/simple-tree/arrayNode.d.ts.map +1 -1
  260. package/dist/simple-tree/arrayNode.js +2 -1
  261. package/dist/simple-tree/arrayNode.js.map +1 -1
  262. package/dist/simple-tree/core/treeNodeSchema.d.ts +10 -6
  263. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  264. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  265. package/dist/simple-tree/index.d.ts +3 -3
  266. package/dist/simple-tree/index.d.ts.map +1 -1
  267. package/dist/simple-tree/index.js +6 -2
  268. package/dist/simple-tree/index.js.map +1 -1
  269. package/dist/simple-tree/leafNodeSchema.d.ts +5 -20
  270. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  271. package/dist/simple-tree/leafNodeSchema.js +0 -15
  272. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  273. package/dist/simple-tree/mapNode.d.ts +2 -2
  274. package/dist/simple-tree/mapNode.d.ts.map +1 -1
  275. package/dist/simple-tree/mapNode.js +2 -1
  276. package/dist/simple-tree/mapNode.js.map +1 -1
  277. package/dist/simple-tree/objectNode.d.ts +9 -4
  278. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  279. package/dist/simple-tree/objectNode.js +19 -2
  280. package/dist/simple-tree/objectNode.js.map +1 -1
  281. package/dist/simple-tree/objectNodeTypes.d.ts +6 -2
  282. package/dist/simple-tree/objectNodeTypes.d.ts.map +1 -1
  283. package/dist/simple-tree/objectNodeTypes.js.map +1 -1
  284. package/dist/simple-tree/schemaTypes.d.ts +51 -3
  285. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  286. package/dist/simple-tree/schemaTypes.js.map +1 -1
  287. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  288. package/dist/simple-tree/toStoredSchema.js +18 -13
  289. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  290. package/dist/util/brand.d.ts +0 -2
  291. package/dist/util/brand.d.ts.map +1 -1
  292. package/dist/util/brand.js +0 -1
  293. package/dist/util/brand.js.map +1 -1
  294. package/dist/util/index.d.ts +2 -2
  295. package/dist/util/index.d.ts.map +1 -1
  296. package/dist/util/index.js +4 -5
  297. package/dist/util/index.js.map +1 -1
  298. package/dist/util/rangeMap.d.ts +72 -42
  299. package/dist/util/rangeMap.d.ts.map +1 -1
  300. package/dist/util/rangeMap.js +161 -151
  301. package/dist/util/rangeMap.js.map +1 -1
  302. package/dist/util/typeCheck.d.ts +0 -2
  303. package/dist/util/typeCheck.d.ts.map +1 -1
  304. package/dist/util/typeCheck.js.map +1 -1
  305. package/dist/util/utils.d.ts +35 -1
  306. package/dist/util/utils.d.ts.map +1 -1
  307. package/dist/util/utils.js +32 -1
  308. package/dist/util/utils.js.map +1 -1
  309. package/lib/alpha.d.ts +11 -0
  310. package/lib/beta.d.ts +2 -0
  311. package/lib/core/index.d.ts +2 -2
  312. package/lib/core/index.d.ts.map +1 -1
  313. package/lib/core/index.js +2 -2
  314. package/lib/core/index.js.map +1 -1
  315. package/lib/core/rebase/utils.d.ts.map +1 -1
  316. package/lib/core/rebase/utils.js +3 -10
  317. package/lib/core/rebase/utils.js.map +1 -1
  318. package/lib/core/schema-stored/format.d.ts +0 -3
  319. package/lib/core/schema-stored/format.d.ts.map +1 -1
  320. package/lib/core/schema-stored/format.js.map +1 -1
  321. package/lib/core/schema-stored/schema.d.ts +12 -10
  322. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  323. package/lib/core/schema-stored/schema.js +3 -5
  324. package/lib/core/schema-stored/schema.js.map +1 -1
  325. package/lib/core/schema-view/index.d.ts +1 -1
  326. package/lib/core/schema-view/index.d.ts.map +1 -1
  327. package/lib/core/schema-view/index.js +1 -1
  328. package/lib/core/schema-view/index.js.map +1 -1
  329. package/lib/core/schema-view/view.d.ts +0 -7
  330. package/lib/core/schema-view/view.d.ts.map +1 -1
  331. package/lib/core/schema-view/view.js +0 -11
  332. package/lib/core/schema-view/view.js.map +1 -1
  333. package/lib/{feature-libraries/chunked-forest → core/tree}/chunk.d.ts +2 -1
  334. package/lib/core/tree/chunk.d.ts.map +1 -0
  335. package/lib/{feature-libraries/chunked-forest → core/tree}/chunk.js +1 -1
  336. package/lib/core/tree/chunk.js.map +1 -0
  337. package/lib/core/tree/index.d.ts +1 -0
  338. package/lib/core/tree/index.d.ts.map +1 -1
  339. package/lib/core/tree/index.js +1 -0
  340. package/lib/core/tree/index.js.map +1 -1
  341. package/lib/core/tree/treeTextFormat.d.ts +0 -5
  342. package/lib/core/tree/treeTextFormat.d.ts.map +1 -1
  343. package/lib/core/tree/treeTextFormat.js.map +1 -1
  344. package/lib/core/tree/types.d.ts +0 -5
  345. package/lib/core/tree/types.d.ts.map +1 -1
  346. package/lib/core/tree/types.js +0 -1
  347. package/lib/core/tree/types.js.map +1 -1
  348. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts +1 -2
  349. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  350. package/lib/feature-libraries/chunked-forest/basicChunk.js +1 -1
  351. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  352. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts +1 -2
  353. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  354. package/lib/feature-libraries/chunked-forest/chunkTree.js +1 -2
  355. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  356. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts +1 -2
  357. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  358. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  359. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts +1 -2
  360. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.d.ts.map +1 -1
  361. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  362. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +1 -2
  363. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  364. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  365. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +1 -1
  366. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  367. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  368. package/lib/feature-libraries/chunked-forest/emptyChunk.d.ts +1 -1
  369. package/lib/feature-libraries/chunked-forest/emptyChunk.d.ts.map +1 -1
  370. package/lib/feature-libraries/chunked-forest/emptyChunk.js +1 -2
  371. package/lib/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
  372. package/lib/feature-libraries/chunked-forest/index.d.ts +1 -1
  373. package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  374. package/lib/feature-libraries/chunked-forest/index.js +1 -1
  375. package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
  376. package/lib/feature-libraries/chunked-forest/sequenceChunk.d.ts +1 -1
  377. package/lib/feature-libraries/chunked-forest/sequenceChunk.d.ts.map +1 -1
  378. package/lib/feature-libraries/chunked-forest/sequenceChunk.js +1 -1
  379. package/lib/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  380. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts +1 -2
  381. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  382. package/lib/feature-libraries/chunked-forest/uniformChunk.js +1 -1
  383. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  384. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +10 -0
  385. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  386. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +3 -0
  387. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  388. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  389. package/lib/feature-libraries/default-schema/defaultSchema.js +1 -0
  390. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  391. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  392. package/lib/feature-libraries/default-schema/schemaChecker.js +2 -1
  393. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  394. package/lib/feature-libraries/index.d.ts +1 -2
  395. package/lib/feature-libraries/index.d.ts.map +1 -1
  396. package/lib/feature-libraries/index.js +1 -2
  397. package/lib/feature-libraries/index.js.map +1 -1
  398. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts +8 -1
  399. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  400. package/lib/feature-libraries/indexing/anchorTreeIndex.js +31 -5
  401. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  402. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +1 -1
  403. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  404. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +9 -3
  405. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  406. package/lib/feature-libraries/modular-schema/discrepancies.d.ts +84 -24
  407. package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -1
  408. package/lib/feature-libraries/modular-schema/discrepancies.js +25 -28
  409. package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  410. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +12 -5
  411. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  412. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  413. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  414. package/lib/feature-libraries/modular-schema/genericFieldKind.js +2 -1
  415. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  416. package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
  417. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  418. package/lib/feature-libraries/modular-schema/index.js +1 -1
  419. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  420. package/lib/feature-libraries/modular-schema/isNeverTree.d.ts +0 -1
  421. package/lib/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
  422. package/lib/feature-libraries/modular-schema/isNeverTree.js +0 -1
  423. package/lib/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
  424. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +1 -0
  425. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  426. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +89 -25
  427. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  428. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +12 -0
  429. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  430. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  431. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  432. package/lib/feature-libraries/optional-field/optionalField.js +24 -4
  433. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  434. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +6 -6
  435. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  436. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +7 -7
  437. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  438. package/lib/feature-libraries/schema-edits/schemaChangeFormat.d.ts +12 -12
  439. package/lib/feature-libraries/sequence-field/formatV1.d.ts +99 -99
  440. package/lib/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  441. package/lib/feature-libraries/sequence-field/formatV2.d.ts +76 -76
  442. package/lib/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  443. package/lib/feature-libraries/sequence-field/formatV3.d.ts +54 -54
  444. package/lib/feature-libraries/sequence-field/types.d.ts +0 -1
  445. package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
  446. package/lib/feature-libraries/sequence-field/types.js.map +1 -1
  447. package/lib/feature-libraries/sequence-field/utils.d.ts +2 -2
  448. package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
  449. package/lib/feature-libraries/sequence-field/utils.js +14 -5
  450. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  451. package/lib/index.d.ts +4 -5
  452. package/lib/index.d.ts.map +1 -1
  453. package/lib/index.js +3 -4
  454. package/lib/index.js.map +1 -1
  455. package/lib/legacy.d.ts +2 -0
  456. package/lib/packageVersion.d.ts +1 -1
  457. package/lib/packageVersion.js +1 -1
  458. package/lib/packageVersion.js.map +1 -1
  459. package/lib/public.d.ts +2 -0
  460. package/lib/shared-tree/index.d.ts +3 -2
  461. package/lib/shared-tree/index.d.ts.map +1 -1
  462. package/lib/shared-tree/index.js +2 -1
  463. package/lib/shared-tree/index.js.map +1 -1
  464. package/lib/shared-tree/schematizeTree.d.ts +1 -1
  465. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  466. package/lib/shared-tree/schematizeTree.js +7 -7
  467. package/lib/shared-tree/schematizeTree.js.map +1 -1
  468. package/lib/shared-tree/schematizingTreeView.d.ts +10 -1
  469. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  470. package/lib/shared-tree/schematizingTreeView.js +56 -17
  471. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  472. package/lib/shared-tree/sharedTree.d.ts +31 -10
  473. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  474. package/lib/shared-tree/sharedTree.js +107 -16
  475. package/lib/shared-tree/sharedTree.js.map +1 -1
  476. package/lib/shared-tree/transactionTypes.d.ts +105 -0
  477. package/lib/shared-tree/transactionTypes.d.ts.map +1 -0
  478. package/lib/shared-tree/transactionTypes.js +10 -0
  479. package/lib/shared-tree/transactionTypes.js.map +1 -0
  480. package/lib/shared-tree/treeApi.d.ts +1 -25
  481. package/lib/shared-tree/treeApi.d.ts.map +1 -1
  482. package/lib/shared-tree/treeApi.js +1 -5
  483. package/lib/shared-tree/treeApi.js.map +1 -1
  484. package/lib/shared-tree/treeCheckout.d.ts +39 -13
  485. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  486. package/lib/shared-tree/treeCheckout.js +277 -130
  487. package/lib/shared-tree/treeCheckout.js.map +1 -1
  488. package/lib/shared-tree-core/branch.d.ts +13 -35
  489. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  490. package/lib/shared-tree-core/branch.js +12 -76
  491. package/lib/shared-tree-core/branch.js.map +1 -1
  492. package/lib/shared-tree-core/branchCommitEnricher.d.ts +7 -1
  493. package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  494. package/lib/shared-tree-core/branchCommitEnricher.js +16 -18
  495. package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
  496. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  497. package/lib/shared-tree-core/editManager.js +3 -3
  498. package/lib/shared-tree-core/editManager.js.map +1 -1
  499. package/lib/shared-tree-core/index.d.ts +3 -3
  500. package/lib/shared-tree-core/index.d.ts.map +1 -1
  501. package/lib/shared-tree-core/index.js +2 -2
  502. package/lib/shared-tree-core/index.js.map +1 -1
  503. package/lib/shared-tree-core/sharedTreeCore.d.ts +2 -9
  504. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  505. package/lib/shared-tree-core/sharedTreeCore.js +4 -16
  506. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  507. package/lib/shared-tree-core/transaction.d.ts +38 -0
  508. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  509. package/lib/shared-tree-core/transaction.js +112 -1
  510. package/lib/shared-tree-core/transaction.js.map +1 -1
  511. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  512. package/lib/simple-tree/api/conciseTree.js +2 -2
  513. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  514. package/lib/simple-tree/api/create.d.ts.map +1 -1
  515. package/lib/simple-tree/api/create.js +5 -1
  516. package/lib/simple-tree/api/create.js.map +1 -1
  517. package/lib/simple-tree/api/customTree.d.ts +14 -2
  518. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  519. package/lib/simple-tree/api/customTree.js +50 -2
  520. package/lib/simple-tree/api/customTree.js.map +1 -1
  521. package/lib/simple-tree/api/index.d.ts +3 -2
  522. package/lib/simple-tree/api/index.d.ts.map +1 -1
  523. package/lib/simple-tree/api/index.js +3 -1
  524. package/lib/simple-tree/api/index.js.map +1 -1
  525. package/lib/simple-tree/api/jsonSchema.d.ts +6 -0
  526. package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
  527. package/lib/simple-tree/api/jsonSchema.js.map +1 -1
  528. package/lib/simple-tree/api/schemaFactory.d.ts +65 -8
  529. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  530. package/lib/simple-tree/api/schemaFactory.js +9 -3
  531. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  532. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +83 -0
  533. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -0
  534. package/lib/simple-tree/api/schemaFactoryAlpha.js +86 -0
  535. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -0
  536. package/lib/simple-tree/api/simpleSchema.d.ts +8 -2
  537. package/lib/simple-tree/api/simpleSchema.d.ts.map +1 -1
  538. package/lib/simple-tree/api/simpleSchema.js.map +1 -1
  539. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +14 -11
  540. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  541. package/lib/simple-tree/api/simpleTreeIndex.js +3 -1
  542. package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
  543. package/lib/simple-tree/api/storedSchema.d.ts +4 -4
  544. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  545. package/lib/simple-tree/api/storedSchema.js +5 -18
  546. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  547. package/lib/simple-tree/api/testRecursiveDomain.d.ts +5 -5
  548. package/lib/simple-tree/api/tree.d.ts +61 -0
  549. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  550. package/lib/simple-tree/api/tree.js.map +1 -1
  551. package/lib/simple-tree/api/verboseTree.js +2 -2
  552. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  553. package/lib/simple-tree/api/view.d.ts +14 -9
  554. package/lib/simple-tree/api/view.d.ts.map +1 -1
  555. package/lib/simple-tree/api/view.js +131 -42
  556. package/lib/simple-tree/api/view.js.map +1 -1
  557. package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
  558. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +12 -12
  559. package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
  560. package/lib/simple-tree/arrayNode.d.ts +2 -2
  561. package/lib/simple-tree/arrayNode.d.ts.map +1 -1
  562. package/lib/simple-tree/arrayNode.js +2 -1
  563. package/lib/simple-tree/arrayNode.js.map +1 -1
  564. package/lib/simple-tree/core/treeNodeSchema.d.ts +10 -6
  565. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  566. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  567. package/lib/simple-tree/index.d.ts +3 -3
  568. package/lib/simple-tree/index.d.ts.map +1 -1
  569. package/lib/simple-tree/index.js +2 -2
  570. package/lib/simple-tree/index.js.map +1 -1
  571. package/lib/simple-tree/leafNodeSchema.d.ts +5 -20
  572. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  573. package/lib/simple-tree/leafNodeSchema.js +0 -15
  574. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  575. package/lib/simple-tree/mapNode.d.ts +2 -2
  576. package/lib/simple-tree/mapNode.d.ts.map +1 -1
  577. package/lib/simple-tree/mapNode.js +2 -1
  578. package/lib/simple-tree/mapNode.js.map +1 -1
  579. package/lib/simple-tree/objectNode.d.ts +9 -4
  580. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  581. package/lib/simple-tree/objectNode.js +17 -1
  582. package/lib/simple-tree/objectNode.js.map +1 -1
  583. package/lib/simple-tree/objectNodeTypes.d.ts +6 -2
  584. package/lib/simple-tree/objectNodeTypes.d.ts.map +1 -1
  585. package/lib/simple-tree/objectNodeTypes.js.map +1 -1
  586. package/lib/simple-tree/schemaTypes.d.ts +51 -3
  587. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  588. package/lib/simple-tree/schemaTypes.js.map +1 -1
  589. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  590. package/lib/simple-tree/toStoredSchema.js +19 -14
  591. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  592. package/lib/util/brand.d.ts +0 -2
  593. package/lib/util/brand.d.ts.map +1 -1
  594. package/lib/util/brand.js +0 -1
  595. package/lib/util/brand.js.map +1 -1
  596. package/lib/util/index.d.ts +2 -2
  597. package/lib/util/index.d.ts.map +1 -1
  598. package/lib/util/index.js +2 -2
  599. package/lib/util/index.js.map +1 -1
  600. package/lib/util/rangeMap.d.ts +72 -42
  601. package/lib/util/rangeMap.d.ts.map +1 -1
  602. package/lib/util/rangeMap.js +159 -146
  603. package/lib/util/rangeMap.js.map +1 -1
  604. package/lib/util/typeCheck.d.ts +0 -2
  605. package/lib/util/typeCheck.d.ts.map +1 -1
  606. package/lib/util/typeCheck.js.map +1 -1
  607. package/lib/util/utils.d.ts +35 -1
  608. package/lib/util/utils.d.ts.map +1 -1
  609. package/lib/util/utils.js +29 -0
  610. package/lib/util/utils.js.map +1 -1
  611. package/package.json +23 -23
  612. package/src/core/index.ts +5 -1
  613. package/src/core/rebase/utils.ts +17 -20
  614. package/src/core/schema-stored/format.ts +0 -3
  615. package/src/core/schema-stored/schema.ts +13 -10
  616. package/src/core/schema-view/index.ts +0 -1
  617. package/src/core/schema-view/view.ts +0 -11
  618. package/src/{feature-libraries/chunked-forest → core/tree}/chunk.ts +4 -4
  619. package/src/core/tree/index.ts +8 -0
  620. package/src/core/tree/treeTextFormat.ts +0 -5
  621. package/src/core/tree/types.ts +0 -5
  622. package/src/feature-libraries/chunked-forest/basicChunk.ts +4 -2
  623. package/src/feature-libraries/chunked-forest/chunkTree.ts +2 -1
  624. package/src/feature-libraries/chunked-forest/chunkedForest.ts +2 -1
  625. package/src/feature-libraries/chunked-forest/codec/chunkCodecUtilities.ts +1 -2
  626. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +6 -2
  627. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +1 -1
  628. package/src/feature-libraries/chunked-forest/emptyChunk.ts +4 -2
  629. package/src/feature-libraries/chunked-forest/index.ts +1 -1
  630. package/src/feature-libraries/chunked-forest/sequenceChunk.ts +1 -1
  631. package/src/feature-libraries/chunked-forest/uniformChunk.ts +4 -1
  632. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +14 -1
  633. package/src/feature-libraries/default-schema/defaultSchema.ts +1 -0
  634. package/src/feature-libraries/default-schema/schemaChecker.ts +4 -1
  635. package/src/feature-libraries/index.ts +13 -1
  636. package/src/feature-libraries/indexing/anchorTreeIndex.ts +34 -5
  637. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +9 -9
  638. package/src/feature-libraries/modular-schema/discrepancies.ts +76 -38
  639. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +13 -9
  640. package/src/feature-libraries/modular-schema/genericFieldKind.ts +4 -2
  641. package/src/feature-libraries/modular-schema/index.ts +14 -0
  642. package/src/feature-libraries/modular-schema/isNeverTree.ts +0 -2
  643. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +124 -31
  644. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +12 -0
  645. package/src/feature-libraries/optional-field/optionalField.ts +34 -5
  646. package/src/feature-libraries/sequence-field/types.ts +0 -1
  647. package/src/feature-libraries/sequence-field/utils.ts +18 -7
  648. package/src/index.ts +12 -29
  649. package/src/packageVersion.ts +1 -1
  650. package/src/shared-tree/index.ts +13 -2
  651. package/src/shared-tree/schematizeTree.ts +6 -10
  652. package/src/shared-tree/schematizingTreeView.ts +102 -23
  653. package/src/shared-tree/sharedTree.ts +181 -44
  654. package/src/shared-tree/transactionTypes.ts +125 -0
  655. package/src/shared-tree/treeApi.ts +1 -28
  656. package/src/shared-tree/treeCheckout.ts +358 -175
  657. package/src/shared-tree-core/branch.ts +29 -122
  658. package/src/shared-tree-core/branchCommitEnricher.ts +19 -20
  659. package/src/shared-tree-core/editManager.ts +3 -8
  660. package/src/shared-tree-core/index.ts +2 -1
  661. package/src/shared-tree-core/sharedTreeCore.ts +8 -19
  662. package/src/shared-tree-core/transaction.ts +145 -0
  663. package/src/simple-tree/api/conciseTree.ts +2 -2
  664. package/src/simple-tree/api/create.ts +5 -1
  665. package/src/simple-tree/api/customTree.ts +69 -1
  666. package/src/simple-tree/api/index.ts +13 -2
  667. package/src/simple-tree/api/jsonSchema.ts +7 -0
  668. package/src/simple-tree/api/schemaFactory.ts +91 -3
  669. package/src/simple-tree/api/schemaFactoryAlpha.ts +253 -0
  670. package/src/simple-tree/api/simpleSchema.ts +9 -2
  671. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +22 -12
  672. package/src/simple-tree/api/simpleTreeIndex.ts +2 -0
  673. package/src/simple-tree/api/storedSchema.ts +7 -22
  674. package/src/simple-tree/api/tree.ts +78 -0
  675. package/src/simple-tree/api/verboseTree.ts +2 -2
  676. package/src/simple-tree/api/view.ts +197 -51
  677. package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +19 -13
  678. package/src/simple-tree/arrayNode.ts +7 -1
  679. package/src/simple-tree/core/treeNodeSchema.ts +51 -7
  680. package/src/simple-tree/index.ts +9 -0
  681. package/src/simple-tree/leafNodeSchema.ts +0 -19
  682. package/src/simple-tree/mapNode.ts +7 -1
  683. package/src/simple-tree/objectNode.ts +33 -3
  684. package/src/simple-tree/objectNodeTypes.ts +9 -1
  685. package/src/simple-tree/schemaTypes.ts +57 -3
  686. package/src/simple-tree/toStoredSchema.ts +25 -19
  687. package/src/util/brand.ts +0 -2
  688. package/src/util/index.ts +3 -6
  689. package/src/util/rangeMap.ts +199 -189
  690. package/src/util/typeCheck.ts +0 -2
  691. package/src/util/utils.ts +73 -1
  692. package/dist/feature-libraries/chunked-forest/chunk.d.ts.map +0 -1
  693. package/dist/feature-libraries/chunked-forest/chunk.js.map +0 -1
  694. package/dist/feature-libraries/memoizedIdRangeAllocator.d.ts +0 -38
  695. package/dist/feature-libraries/memoizedIdRangeAllocator.d.ts.map +0 -1
  696. package/dist/feature-libraries/memoizedIdRangeAllocator.js +0 -74
  697. package/dist/feature-libraries/memoizedIdRangeAllocator.js.map +0 -1
  698. package/lib/feature-libraries/chunked-forest/chunk.d.ts.map +0 -1
  699. package/lib/feature-libraries/chunked-forest/chunk.js.map +0 -1
  700. package/lib/feature-libraries/memoizedIdRangeAllocator.d.ts +0 -38
  701. package/lib/feature-libraries/memoizedIdRangeAllocator.d.ts.map +0 -1
  702. package/lib/feature-libraries/memoizedIdRangeAllocator.js +0 -71
  703. package/lib/feature-libraries/memoizedIdRangeAllocator.js.map +0 -1
  704. package/src/feature-libraries/memoizedIdRangeAllocator.ts +0 -112
@@ -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,17 @@ import type {
12
12
  RevertibleFactory,
13
13
  } from "../../core/index.js";
14
14
 
15
+ import type {
16
+ RunTransactionParams,
17
+ VoidTransactionCallbackStatus,
18
+ TransactionCallbackStatus,
19
+ TransactionResult,
20
+ TransactionResultExt,
21
+ // This is referenced by doc comments.
22
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-imports
23
+ TreeAlpha,
24
+ } from "../../shared-tree/index.js";
25
+
15
26
  import {
16
27
  type ImplicitFieldSchema,
17
28
  type InsertableField,
@@ -41,6 +52,7 @@ import { walkFieldSchema } from "../walkFieldSchema.js";
41
52
  * Maybe rename "exportJsonSchema" to align on "concise" terminology.
42
53
  * 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
54
  * Make sure users of independentView can use these export APIs (maybe provide a reference back to the ViewableTree from the TreeView to accomplish that).
55
+ * Some of these APIs are on ISharedTree and can get moved here.
44
56
  * @system @sealed @public
45
57
  */
46
58
  export interface ViewableTree {
@@ -536,6 +548,72 @@ export interface TreeViewAlpha<
536
548
 
537
549
  // Override the base branch method to return a typed view rather than merely a branch.
538
550
  fork(): ReturnType<TreeBranch["fork"]> & TreeViewAlpha<TSchema>;
551
+
552
+ /**
553
+ * Run a transaction which applies one or more edits to the tree as a single atomic unit.
554
+ * @param transaction - The function to run as the body of the transaction.
555
+ * It should return a status object of {@link TransactionCallbackStatus | TransactionCallbackStatus } type.
556
+ * It includes a "rollback" property which may be returned as true at any point during the transaction. This will
557
+ * abort the transaction and discard any changes it made so far.
558
+ * "rollback" can be set to false or left undefined to indicate that the body of the transaction has successfully run.
559
+ * @param params - The optional parameters for the transaction. It includes the constraints that will be checked before the transaction begins.
560
+ * @returns A result object of {@link TransactionResultExt | TransactionResultExt} type. It includes the following:
561
+ * - A "success" flag indicating whether the transaction was successful or not.
562
+ * - The success of failure value as returned by the transaction function.
563
+ * @remarks
564
+ * This API will throw an error if the constraints are not met or something unexpected happens.
565
+ * All of the changes in the transaction are applied synchronously and therefore no other changes (either from this client or from a remote client) can be interleaved with those changes.
566
+ * Note that this is guaranteed by Fluid for any sequence of changes that are submitted synchronously, whether in a transaction or not.
567
+ * However, using a transaction has the following additional consequences:
568
+ * - If reverted (e.g. via an "undo" operation), all the changes in the transaction are reverted together.
569
+ * - The internal data representation of a transaction with many changes is generally smaller and more efficient than that of the changes when separate.
570
+ *
571
+ * Local change events will be emitted for each change as the transaction is being applied.
572
+ * If the transaction is rolled back, a corresponding change event will also be emitted for the rollback.
573
+ *
574
+ * Nested transactions:
575
+ * This API can be called from within the transaction callback of another runTransaction call. That will have slightly different behavior:
576
+ * - If the inner transaction fails, only the inner transaction will be rolled back and the outer transaction will continue.
577
+ * - Constraints will apply to the outermost transaction. Constraints are applied per commit and there will be one commit generated
578
+ * for the outermost transaction which includes all inner transactions.
579
+ * - Undo will undo the outermost transaction and all inner transactions.
580
+ */
581
+ runTransaction<TSuccessValue, TFailureValue>(
582
+ transaction: () => TransactionCallbackStatus<TSuccessValue, TFailureValue>,
583
+ params?: RunTransactionParams,
584
+ ): TransactionResultExt<TSuccessValue, TFailureValue>;
585
+ /**
586
+ * Run a transaction which applies one or more edits to the tree as a single atomic unit.
587
+ * @param transaction - The function to run as the body of the transaction. It may return the following:
588
+ * - Nothing to indicate that the body of the transaction has successfully run.
589
+ * - A status object of {@link VoidTransactionCallbackStatus | VoidTransactionCallbackStatus } type. It includes a "rollback" property which
590
+ * may be returned as true at any point during the transaction. This will abort the transaction and discard any changes it made so
591
+ * far. "rollback" can be set to false or left undefined to indicate that the body of the transaction has successfully run.
592
+ * @param params - The optional parameters for the transaction. It includes the constraints that will be checked before the transaction begins.
593
+ * @returns A result object of {@link TransactionResult | TransactionResult} type. It includes a "success" flag indicating whether the
594
+ * transaction was successful or not.
595
+ * @remarks
596
+ * This API will throw an error if the constraints are not met or something unexpected happens.
597
+ * All of the changes in the transaction are applied synchronously and therefore no other changes (either from this client or from a remote client) can be interleaved with those changes.
598
+ * Note that this is guaranteed by Fluid for any sequence of changes that are submitted synchronously, whether in a transaction or not.
599
+ * However, using a transaction has the following additional consequences:
600
+ * - If reverted (e.g. via an "undo" operation), all the changes in the transaction are reverted together.
601
+ * - The internal data representation of a transaction with many changes is generally smaller and more efficient than that of the changes when separate.
602
+ *
603
+ * Local change events will be emitted for each change as the transaction is being applied.
604
+ * If the transaction is rolled back, a corresponding change event will also be emitted for the rollback.
605
+ *
606
+ * Nested transactions:
607
+ * This API can be called from within the transaction callback of another runTransaction call. That will have slightly different behavior:
608
+ * - If the inner transaction fails, only the inner transaction will be rolled back and the outer transaction will continue.
609
+ * - Constraints will apply to the outermost transaction. Constraints are applied per commit and there will be one commit generated
610
+ * for the outermost transaction which includes all inner transactions.
611
+ * - Undo will undo the outermost transaction and all inner transactions.
612
+ */
613
+ runTransaction(
614
+ transaction: () => VoidTransactionCallbackStatus | void,
615
+ params?: RunTransactionParams,
616
+ ): TransactionResult;
539
617
  }
540
618
 
541
619
  /**
@@ -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
  }
@@ -20,7 +20,7 @@ import type {
20
20
  SimpleTreeSchema,
21
21
  } from "./simpleSchema.js";
22
22
  import type { ValueSchema } from "../../core/index.js";
23
- import { getOrCreate, type Mutable } from "../../util/index.js";
23
+ import { copyProperty, getOrCreate, type Mutable } from "../../util/index.js";
24
24
  import { isObjectNodeSchema, type ObjectNodeSchema } from "../objectNodeTypes.js";
25
25
  import { NodeKind, type TreeNodeSchema } from "../core/index.js";
26
26
 
@@ -41,11 +41,7 @@ export function toSimpleTreeSchema(schema: ImplicitFieldSchema): SimpleTreeSchem
41
41
  definitions,
42
42
  };
43
43
 
44
- // Include the "description" property only if it's present on the input.
45
- if (normalizedSchema.metadata !== undefined) {
46
- output.metadata = normalizedSchema.metadata;
47
- }
48
-
44
+ copyProperty(normalizedSchema, "metadata", output);
49
45
  return output;
50
46
  }
51
47
 
@@ -95,20 +91,28 @@ function leafSchemaToSimpleSchema(schema: TreeNodeSchema): SimpleLeafNodeSchema
95
91
  function arraySchemaToSimpleSchema(schema: TreeNodeSchema): SimpleArrayNodeSchema {
96
92
  const fieldSchema = normalizeFieldSchema(schema.info as ImplicitAllowedTypes);
97
93
  const allowedTypes = allowedTypesFromFieldSchema(fieldSchema);
98
- return {
94
+ const output: Mutable<SimpleArrayNodeSchema> = {
99
95
  kind: NodeKind.Array,
100
96
  allowedTypes,
101
97
  };
98
+
99
+ copyProperty(schema, "metadata", output);
100
+
101
+ return output;
102
102
  }
103
103
 
104
104
  // TODO: Use a stronger type for map schemas once one is available (see object schema handler for an example).
105
105
  function mapSchemaToSimpleSchema(schema: TreeNodeSchema): SimpleMapNodeSchema {
106
106
  const fieldSchema = normalizeFieldSchema(schema.info as ImplicitAllowedTypes);
107
107
  const allowedTypes = allowedTypesFromFieldSchema(fieldSchema);
108
- return {
108
+ const output: Mutable<SimpleMapNodeSchema> = {
109
109
  kind: NodeKind.Map,
110
110
  allowedTypes,
111
111
  };
112
+
113
+ copyProperty(schema, "metadata", output);
114
+
115
+ return output;
112
116
  }
113
117
 
114
118
  function objectSchemaToSimpleSchema(schema: ObjectNodeSchema): SimpleObjectNodeSchema {
@@ -116,10 +120,15 @@ function objectSchemaToSimpleSchema(schema: ObjectNodeSchema): SimpleObjectNodeS
116
120
  for (const [key, field] of schema.fields) {
117
121
  fields[key] = fieldSchemaToSimpleSchema(field);
118
122
  }
119
- return {
123
+
124
+ const output: Mutable<SimpleObjectNodeSchema> = {
120
125
  kind: NodeKind.Object,
121
126
  fields,
122
127
  };
128
+
129
+ copyProperty(schema, "metadata", output);
130
+
131
+ return output;
123
132
  }
124
133
 
125
134
  /**
@@ -140,10 +149,7 @@ function fieldSchemaToSimpleSchema(schema: FieldSchema): SimpleFieldSchema {
140
149
  allowedTypes,
141
150
  };
142
151
 
143
- // Don't include "metadata" property at all if it's not present.
144
- if (schema.metadata !== undefined) {
145
- result.metadata = schema.metadata;
146
- }
152
+ copyProperty(schema, "metadata", result);
147
153
 
148
154
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
155
  (schema as any)[simpleFieldSchemaCacheSymbol] = result;
@@ -18,6 +18,7 @@ import {
18
18
  normalizeAllowedTypes,
19
19
  type ImplicitAllowedTypes,
20
20
  type InsertableTreeNodeFromImplicitAllowedTypes,
21
+ type NodeSchemaMetadata,
21
22
  type TreeLeafValue,
22
23
  type TreeNodeFromImplicitAllowedTypes,
23
24
  } from "./schemaTypes.js";
@@ -1062,11 +1063,13 @@ export function arraySchema<
1062
1063
  TName extends string,
1063
1064
  const T extends ImplicitAllowedTypes,
1064
1065
  const ImplicitlyConstructable extends boolean,
1066
+ const TCustomMetadata = unknown,
1065
1067
  >(
1066
1068
  identifier: TName,
1067
1069
  info: T,
1068
1070
  implicitlyConstructable: ImplicitlyConstructable,
1069
1071
  customizable: boolean,
1072
+ metadata?: NodeSchemaMetadata<TCustomMetadata>,
1070
1073
  ) {
1071
1074
  type Output = TreeNodeSchemaBoth<
1072
1075
  TName,
@@ -1075,7 +1078,8 @@ export function arraySchema<
1075
1078
  Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>,
1076
1079
  ImplicitlyConstructable,
1077
1080
  T,
1078
- undefined
1081
+ undefined,
1082
+ TCustomMetadata
1079
1083
  >;
1080
1084
 
1081
1085
  const lazyChildTypes = new Lazy(() => normalizeAllowedTypes(info));
@@ -1157,6 +1161,8 @@ export function arraySchema<
1157
1161
  public static get childTypes(): ReadonlySet<TreeNodeSchema> {
1158
1162
  return lazyChildTypes.value;
1159
1163
  }
1164
+ public static readonly metadata: NodeSchemaMetadata<TCustomMetadata> | undefined =
1165
+ metadata;
1160
1166
 
1161
1167
  // eslint-disable-next-line import/no-deprecated
1162
1168
  public get [typeNameSymbol](): TName {