@fluidframework/tree 2.51.0 → 2.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/.vscode/settings.json +0 -1
  2. package/CHANGELOG.md +43 -0
  3. package/api-report/tree.alpha.api.md +3 -2
  4. package/dist/codec/codec.d.ts +2 -1
  5. package/dist/codec/codec.d.ts.map +1 -1
  6. package/dist/codec/codec.js +4 -3
  7. package/dist/codec/codec.js.map +1 -1
  8. package/dist/core/index.d.ts +1 -1
  9. package/dist/core/index.d.ts.map +1 -1
  10. package/dist/core/index.js +3 -2
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/core/rebase/index.d.ts +1 -1
  13. package/dist/core/rebase/index.d.ts.map +1 -1
  14. package/dist/core/rebase/index.js +2 -1
  15. package/dist/core/rebase/index.js.map +1 -1
  16. package/dist/core/rebase/types.d.ts +3 -1
  17. package/dist/core/rebase/types.d.ts.map +1 -1
  18. package/dist/core/rebase/types.js +2 -1
  19. package/dist/core/rebase/types.js.map +1 -1
  20. package/dist/core/schema-stored/schema.d.ts +1 -23
  21. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  22. package/dist/core/schema-stored/schema.js +2 -2
  23. package/dist/core/schema-stored/schema.js.map +1 -1
  24. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  25. package/dist/core/tree/detachedFieldIndex.js +2 -3
  26. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  27. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  28. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  29. package/dist/core/tree/detachedFieldIndexCodecCommon.js +68 -0
  30. package/dist/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  31. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  32. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  33. package/dist/core/tree/detachedFieldIndexCodecV1.js +55 -0
  34. package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  35. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  36. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  37. package/dist/core/tree/detachedFieldIndexCodecV2.js +49 -0
  38. package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  39. package/dist/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  40. package/dist/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  41. package/dist/core/tree/detachedFieldIndexCodecs.js +26 -0
  42. package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  43. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  44. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  45. package/dist/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +18 -13
  46. package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  47. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  48. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  49. package/dist/core/tree/detachedFieldIndexFormatV1.js +12 -0
  50. package/dist/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  51. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  52. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  53. package/dist/core/tree/detachedFieldIndexFormatV2.js +14 -0
  54. package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  55. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  56. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  57. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +21 -21
  58. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  59. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  60. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  61. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  62. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  64. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  65. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +74 -61
  66. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  67. package/dist/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  68. package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  69. package/dist/feature-libraries/chunked-forest/codec/format.js +18 -12
  70. package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  71. package/{lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts → dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  72. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  73. package/dist/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +23 -17
  74. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  75. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  76. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  77. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +22 -22
  78. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  79. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  80. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  81. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  82. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  83. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  84. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  85. package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  86. package/dist/feature-libraries/default-schema/defaultSchema.js +0 -2
  87. package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  88. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  89. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  90. package/dist/feature-libraries/default-schema/index.js +2 -2
  91. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  92. package/dist/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  93. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  94. package/dist/feature-libraries/default-schema/schemaChecker.js +31 -26
  95. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  96. package/dist/feature-libraries/index.d.ts +1 -2
  97. package/dist/feature-libraries/index.d.ts.map +1 -1
  98. package/dist/feature-libraries/index.js +2 -4
  99. package/dist/feature-libraries/index.js.map +1 -1
  100. package/dist/feature-libraries/modular-schema/comparison.d.ts +5 -6
  101. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  102. package/dist/feature-libraries/modular-schema/comparison.js +15 -16
  103. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  104. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  105. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  106. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  107. package/dist/feature-libraries/object-forest/objectForest.js +2 -3
  108. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +6 -2
  112. package/dist/index.js.map +1 -1
  113. package/dist/packageVersion.d.ts +1 -1
  114. package/dist/packageVersion.js +1 -1
  115. package/dist/packageVersion.js.map +1 -1
  116. package/dist/shared-tree/independentView.d.ts +8 -0
  117. package/dist/shared-tree/independentView.d.ts.map +1 -1
  118. package/dist/shared-tree/independentView.js +23 -11
  119. package/dist/shared-tree/independentView.js.map +1 -1
  120. package/dist/shared-tree/schematizeTree.js +1 -1
  121. package/dist/shared-tree/schematizeTree.js.map +1 -1
  122. package/dist/shared-tree/schematizingTreeView.d.ts +0 -1
  123. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  124. package/dist/shared-tree/schematizingTreeView.js +7 -10
  125. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  126. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  127. package/dist/shared-tree/sharedTree.js +1 -29
  128. package/dist/shared-tree/sharedTree.js.map +1 -1
  129. package/dist/shared-tree/treeAlpha.d.ts +20 -6
  130. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  131. package/dist/shared-tree/treeAlpha.js +9 -4
  132. package/dist/shared-tree/treeAlpha.js.map +1 -1
  133. package/dist/shared-tree/treeCheckout.d.ts +2 -1
  134. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  135. package/dist/shared-tree/treeCheckout.js +32 -0
  136. package/dist/shared-tree/treeCheckout.js.map +1 -1
  137. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  138. package/dist/shared-tree-core/branch.js +1 -1
  139. package/dist/shared-tree-core/branch.js.map +1 -1
  140. package/dist/simple-tree/api/conciseTree.d.ts +2 -2
  141. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  142. package/dist/simple-tree/api/conciseTree.js +6 -6
  143. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  144. package/dist/simple-tree/api/configuration.d.ts +8 -2
  145. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  146. package/dist/simple-tree/api/configuration.js.map +1 -1
  147. package/dist/simple-tree/api/create.d.ts +8 -7
  148. package/dist/simple-tree/api/create.d.ts.map +1 -1
  149. package/dist/simple-tree/api/create.js +35 -22
  150. package/dist/simple-tree/api/create.js.map +1 -1
  151. package/dist/simple-tree/api/customTree.d.ts +25 -4
  152. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  153. package/dist/simple-tree/api/customTree.js +42 -16
  154. package/dist/simple-tree/api/customTree.js.map +1 -1
  155. package/dist/simple-tree/api/discrepancies.d.ts +98 -0
  156. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
  157. package/dist/simple-tree/api/discrepancies.js +255 -0
  158. package/dist/simple-tree/api/discrepancies.js.map +1 -0
  159. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +9 -7
  160. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  161. package/dist/simple-tree/api/schemaCompatibilityTester.js +18 -117
  162. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  163. package/dist/simple-tree/api/schemaFactory.d.ts +7 -4
  164. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  165. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  166. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  167. package/dist/simple-tree/api/storedSchema.js +5 -1
  168. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  169. package/dist/simple-tree/api/treeBeta.d.ts +2 -2
  170. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  171. package/dist/simple-tree/api/treeBeta.js +10 -4
  172. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  173. package/dist/simple-tree/api/verboseTree.d.ts +2 -2
  174. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  175. package/dist/simple-tree/api/verboseTree.js +15 -15
  176. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  177. package/dist/simple-tree/core/allowedTypes.d.ts +20 -4
  178. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  179. package/dist/simple-tree/core/allowedTypes.js +45 -13
  180. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  181. package/dist/simple-tree/core/context.d.ts +13 -2
  182. package/dist/simple-tree/core/context.d.ts.map +1 -1
  183. package/dist/simple-tree/core/context.js +22 -9
  184. package/dist/simple-tree/core/context.js.map +1 -1
  185. package/dist/simple-tree/core/index.d.ts +2 -2
  186. package/dist/simple-tree/core/index.d.ts.map +1 -1
  187. package/dist/simple-tree/core/index.js +3 -1
  188. package/dist/simple-tree/core/index.js.map +1 -1
  189. package/dist/simple-tree/core/treeNodeKernel.d.ts +1 -1
  190. package/dist/simple-tree/core/treeNodeKernel.js +1 -1
  191. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  192. package/dist/simple-tree/core/treeNodeValid.d.ts +1 -1
  193. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  194. package/dist/simple-tree/core/treeNodeValid.js +8 -1
  195. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  196. package/dist/simple-tree/core/walkSchema.d.ts +3 -0
  197. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  198. package/dist/simple-tree/core/walkSchema.js +2 -0
  199. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  200. package/dist/simple-tree/createContext.d.ts +2 -0
  201. package/dist/simple-tree/createContext.d.ts.map +1 -1
  202. package/dist/simple-tree/createContext.js +3 -1
  203. package/dist/simple-tree/createContext.js.map +1 -1
  204. package/dist/simple-tree/fieldSchema.d.ts +1 -0
  205. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  206. package/dist/simple-tree/fieldSchema.js +1 -0
  207. package/dist/simple-tree/fieldSchema.js.map +1 -1
  208. package/dist/simple-tree/index.d.ts +4 -4
  209. package/dist/simple-tree/index.d.ts.map +1 -1
  210. package/dist/simple-tree/index.js +7 -8
  211. package/dist/simple-tree/index.js.map +1 -1
  212. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  213. package/dist/simple-tree/node-kinds/array/arrayNode.js +1 -1
  214. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  215. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  216. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  217. package/dist/simple-tree/node-kinds/index.js +1 -2
  218. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  219. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  220. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  221. package/dist/simple-tree/node-kinds/object/index.js +1 -2
  222. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  223. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  224. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  225. package/dist/simple-tree/node-kinds/object/objectNode.js +4 -18
  226. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  227. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  228. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  229. package/dist/simple-tree/prepareForInsertion.js +9 -3
  230. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  231. package/dist/simple-tree/toStoredSchema.d.ts +3 -0
  232. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  233. package/dist/simple-tree/toStoredSchema.js +3 -0
  234. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  235. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  236. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  237. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  238. package/dist/simple-tree/walkFieldSchema.d.ts +1 -0
  239. package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
  240. package/dist/simple-tree/walkFieldSchema.js +1 -0
  241. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  242. package/lib/codec/codec.d.ts +2 -1
  243. package/lib/codec/codec.d.ts.map +1 -1
  244. package/lib/codec/codec.js +4 -3
  245. package/lib/codec/codec.js.map +1 -1
  246. package/lib/core/index.d.ts +1 -1
  247. package/lib/core/index.d.ts.map +1 -1
  248. package/lib/core/index.js +1 -1
  249. package/lib/core/index.js.map +1 -1
  250. package/lib/core/rebase/index.d.ts +1 -1
  251. package/lib/core/rebase/index.d.ts.map +1 -1
  252. package/lib/core/rebase/index.js +1 -1
  253. package/lib/core/rebase/index.js.map +1 -1
  254. package/lib/core/rebase/types.d.ts +3 -1
  255. package/lib/core/rebase/types.d.ts.map +1 -1
  256. package/lib/core/rebase/types.js +1 -0
  257. package/lib/core/rebase/types.js.map +1 -1
  258. package/lib/core/schema-stored/schema.d.ts +1 -23
  259. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  260. package/lib/core/schema-stored/schema.js +2 -2
  261. package/lib/core/schema-stored/schema.js.map +1 -1
  262. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  263. package/lib/core/tree/detachedFieldIndex.js +2 -3
  264. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  265. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  266. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  267. package/lib/core/tree/detachedFieldIndexCodecCommon.js +64 -0
  268. package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  269. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  270. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  271. package/lib/core/tree/detachedFieldIndexCodecV1.js +51 -0
  272. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  273. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  274. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  275. package/lib/core/tree/detachedFieldIndexCodecV2.js +45 -0
  276. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  277. package/lib/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  278. package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  279. package/lib/core/tree/detachedFieldIndexCodecs.js +21 -0
  280. package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  281. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  282. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  283. package/lib/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +13 -10
  284. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  285. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  286. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  287. package/lib/core/tree/detachedFieldIndexFormatV1.js +9 -0
  288. package/lib/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  289. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  290. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  291. package/lib/core/tree/detachedFieldIndexFormatV2.js +11 -0
  292. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  293. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  294. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  295. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +19 -19
  296. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  297. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  298. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  299. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  300. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  301. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  302. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  303. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +70 -57
  304. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  305. package/lib/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  306. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  307. package/lib/feature-libraries/chunked-forest/codec/format.js +17 -11
  308. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  309. package/{dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts → lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  310. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  311. package/lib/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +21 -15
  312. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  313. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  314. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  315. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +19 -19
  316. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  317. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  318. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  319. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  320. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  321. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  322. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  323. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  324. package/lib/feature-libraries/default-schema/defaultSchema.js +0 -2
  325. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  326. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  327. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  328. package/lib/feature-libraries/default-schema/index.js +1 -1
  329. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  330. package/lib/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  331. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  332. package/lib/feature-libraries/default-schema/schemaChecker.js +29 -24
  333. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  334. package/lib/feature-libraries/index.d.ts +1 -2
  335. package/lib/feature-libraries/index.d.ts.map +1 -1
  336. package/lib/feature-libraries/index.js +1 -2
  337. package/lib/feature-libraries/index.js.map +1 -1
  338. package/lib/feature-libraries/modular-schema/comparison.d.ts +5 -6
  339. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  340. package/lib/feature-libraries/modular-schema/comparison.js +14 -14
  341. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  342. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  343. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  344. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  345. package/lib/feature-libraries/object-forest/objectForest.js +3 -4
  346. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  347. package/lib/index.d.ts +1 -1
  348. package/lib/index.d.ts.map +1 -1
  349. package/lib/index.js +2 -2
  350. package/lib/index.js.map +1 -1
  351. package/lib/packageVersion.d.ts +1 -1
  352. package/lib/packageVersion.js +1 -1
  353. package/lib/packageVersion.js.map +1 -1
  354. package/lib/shared-tree/independentView.d.ts +8 -0
  355. package/lib/shared-tree/independentView.d.ts.map +1 -1
  356. package/lib/shared-tree/independentView.js +21 -10
  357. package/lib/shared-tree/independentView.js.map +1 -1
  358. package/lib/shared-tree/schematizeTree.js +1 -1
  359. package/lib/shared-tree/schematizeTree.js.map +1 -1
  360. package/lib/shared-tree/schematizingTreeView.d.ts +0 -1
  361. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  362. package/lib/shared-tree/schematizingTreeView.js +8 -11
  363. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  364. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  365. package/lib/shared-tree/sharedTree.js +2 -30
  366. package/lib/shared-tree/sharedTree.js.map +1 -1
  367. package/lib/shared-tree/treeAlpha.d.ts +20 -6
  368. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  369. package/lib/shared-tree/treeAlpha.js +10 -5
  370. package/lib/shared-tree/treeAlpha.js.map +1 -1
  371. package/lib/shared-tree/treeCheckout.d.ts +2 -1
  372. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  373. package/lib/shared-tree/treeCheckout.js +33 -1
  374. package/lib/shared-tree/treeCheckout.js.map +1 -1
  375. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  376. package/lib/shared-tree-core/branch.js +1 -1
  377. package/lib/shared-tree-core/branch.js.map +1 -1
  378. package/lib/simple-tree/api/conciseTree.d.ts +2 -2
  379. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  380. package/lib/simple-tree/api/conciseTree.js +6 -6
  381. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  382. package/lib/simple-tree/api/configuration.d.ts +8 -2
  383. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  384. package/lib/simple-tree/api/configuration.js.map +1 -1
  385. package/lib/simple-tree/api/create.d.ts +8 -7
  386. package/lib/simple-tree/api/create.d.ts.map +1 -1
  387. package/lib/simple-tree/api/create.js +38 -25
  388. package/lib/simple-tree/api/create.js.map +1 -1
  389. package/lib/simple-tree/api/customTree.d.ts +25 -4
  390. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  391. package/lib/simple-tree/api/customTree.js +43 -17
  392. package/lib/simple-tree/api/customTree.js.map +1 -1
  393. package/lib/simple-tree/api/discrepancies.d.ts +98 -0
  394. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
  395. package/lib/simple-tree/{discrepancies.js → api/discrepancies.js} +80 -206
  396. package/lib/simple-tree/api/discrepancies.js.map +1 -0
  397. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +9 -7
  398. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  399. package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -118
  400. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  401. package/lib/simple-tree/api/schemaFactory.d.ts +7 -4
  402. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  403. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  404. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  405. package/lib/simple-tree/api/storedSchema.js +6 -2
  406. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  407. package/lib/simple-tree/api/treeBeta.d.ts +2 -2
  408. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  409. package/lib/simple-tree/api/treeBeta.js +8 -2
  410. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  411. package/lib/simple-tree/api/verboseTree.d.ts +2 -2
  412. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  413. package/lib/simple-tree/api/verboseTree.js +9 -9
  414. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  415. package/lib/simple-tree/core/allowedTypes.d.ts +20 -4
  416. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  417. package/lib/simple-tree/core/allowedTypes.js +42 -12
  418. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  419. package/lib/simple-tree/core/context.d.ts +13 -2
  420. package/lib/simple-tree/core/context.d.ts.map +1 -1
  421. package/lib/simple-tree/core/context.js +22 -9
  422. package/lib/simple-tree/core/context.js.map +1 -1
  423. package/lib/simple-tree/core/index.d.ts +2 -2
  424. package/lib/simple-tree/core/index.d.ts.map +1 -1
  425. package/lib/simple-tree/core/index.js +2 -2
  426. package/lib/simple-tree/core/index.js.map +1 -1
  427. package/lib/simple-tree/core/treeNodeKernel.d.ts +1 -1
  428. package/lib/simple-tree/core/treeNodeKernel.js +1 -1
  429. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  430. package/lib/simple-tree/core/treeNodeValid.d.ts +1 -1
  431. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  432. package/lib/simple-tree/core/treeNodeValid.js +8 -1
  433. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  434. package/lib/simple-tree/core/walkSchema.d.ts +3 -0
  435. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  436. package/lib/simple-tree/core/walkSchema.js +2 -0
  437. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  438. package/lib/simple-tree/createContext.d.ts +2 -0
  439. package/lib/simple-tree/createContext.d.ts.map +1 -1
  440. package/lib/simple-tree/createContext.js +3 -1
  441. package/lib/simple-tree/createContext.js.map +1 -1
  442. package/lib/simple-tree/fieldSchema.d.ts +1 -0
  443. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  444. package/lib/simple-tree/fieldSchema.js +1 -0
  445. package/lib/simple-tree/fieldSchema.js.map +1 -1
  446. package/lib/simple-tree/index.d.ts +4 -4
  447. package/lib/simple-tree/index.d.ts.map +1 -1
  448. package/lib/simple-tree/index.js +4 -4
  449. package/lib/simple-tree/index.js.map +1 -1
  450. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  451. package/lib/simple-tree/node-kinds/array/arrayNode.js +1 -1
  452. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  453. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  454. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  455. package/lib/simple-tree/node-kinds/index.js +1 -1
  456. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  457. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  458. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  459. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  460. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  461. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  462. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  463. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -16
  464. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  465. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  466. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  467. package/lib/simple-tree/prepareForInsertion.js +11 -5
  468. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  469. package/lib/simple-tree/toStoredSchema.d.ts +3 -0
  470. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  471. package/lib/simple-tree/toStoredSchema.js +3 -0
  472. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  473. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  474. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  475. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  476. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  477. package/lib/simple-tree/walkFieldSchema.d.ts +1 -0
  478. package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
  479. package/lib/simple-tree/walkFieldSchema.js +1 -0
  480. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  481. package/package.json +23 -23
  482. package/src/codec/codec.ts +4 -3
  483. package/src/core/index.ts +2 -0
  484. package/src/core/rebase/index.ts +2 -0
  485. package/src/core/rebase/types.ts +4 -0
  486. package/src/core/schema-stored/schema.ts +2 -26
  487. package/src/core/tree/detachedFieldIndex.ts +4 -6
  488. package/src/core/tree/detachedFieldIndexCodecCommon.ts +87 -0
  489. package/src/core/tree/{detachedFieldIndexCodec.ts → detachedFieldIndexCodecV1.ts} +22 -68
  490. package/src/core/tree/detachedFieldIndexCodecV2.ts +72 -0
  491. package/src/core/tree/detachedFieldIndexCodecs.ts +44 -0
  492. package/src/core/tree/{detachedFieldIndexFormat.ts → detachedFieldIndexFormatCommon.ts} +32 -23
  493. package/src/core/tree/detachedFieldIndexFormatV1.ts +15 -0
  494. package/src/core/tree/detachedFieldIndexFormatV2.ts +17 -0
  495. package/src/feature-libraries/chunked-forest/codec/README.md +1 -1
  496. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +25 -25
  497. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -6
  498. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +96 -73
  499. package/src/feature-libraries/chunked-forest/codec/format.ts +20 -14
  500. package/src/feature-libraries/chunked-forest/codec/{nodeShape.ts → nodeEncoder.ts} +23 -17
  501. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +34 -34
  502. package/src/feature-libraries/chunked-forest/codec/uncompressedEncode.ts +5 -5
  503. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +10 -0
  504. package/src/feature-libraries/default-schema/defaultSchema.ts +0 -2
  505. package/src/feature-libraries/default-schema/index.ts +1 -1
  506. package/src/feature-libraries/default-schema/schemaChecker.ts +47 -30
  507. package/src/feature-libraries/index.ts +1 -3
  508. package/src/feature-libraries/modular-schema/comparison.ts +14 -29
  509. package/src/feature-libraries/object-forest/objectForest.ts +10 -6
  510. package/src/index.ts +5 -0
  511. package/src/packageVersion.ts +1 -1
  512. package/src/shared-tree/independentView.ts +45 -19
  513. package/src/shared-tree/schematizeTree.ts +1 -1
  514. package/src/shared-tree/schematizingTreeView.ts +16 -13
  515. package/src/shared-tree/sharedTree.ts +2 -42
  516. package/src/shared-tree/treeAlpha.ts +30 -18
  517. package/src/shared-tree/treeCheckout.ts +54 -10
  518. package/src/shared-tree-core/branch.ts +1 -6
  519. package/src/simple-tree/api/conciseTree.ts +9 -7
  520. package/src/simple-tree/api/configuration.ts +8 -2
  521. package/src/simple-tree/api/create.ts +49 -36
  522. package/src/simple-tree/api/customTree.ts +59 -20
  523. package/src/simple-tree/{discrepancies.ts → api/discrepancies.ts} +128 -303
  524. package/src/simple-tree/api/schemaCompatibilityTester.ts +27 -151
  525. package/src/simple-tree/api/schemaFactory.ts +7 -4
  526. package/src/simple-tree/api/storedSchema.ts +6 -9
  527. package/src/simple-tree/api/treeBeta.ts +17 -4
  528. package/src/simple-tree/api/verboseTree.ts +17 -8
  529. package/src/simple-tree/core/allowedTypes.ts +54 -21
  530. package/src/simple-tree/core/context.ts +24 -22
  531. package/src/simple-tree/core/index.ts +2 -1
  532. package/src/simple-tree/core/treeNodeKernel.ts +1 -1
  533. package/src/simple-tree/core/treeNodeValid.ts +9 -2
  534. package/src/simple-tree/core/walkSchema.ts +3 -0
  535. package/src/simple-tree/createContext.ts +6 -1
  536. package/src/simple-tree/fieldSchema.ts +1 -0
  537. package/src/simple-tree/index.ts +5 -10
  538. package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -19
  539. package/src/simple-tree/node-kinds/index.ts +0 -1
  540. package/src/simple-tree/node-kinds/object/index.ts +0 -1
  541. package/src/simple-tree/node-kinds/object/objectNode.ts +9 -27
  542. package/src/simple-tree/prepareForInsertion.ts +17 -9
  543. package/src/simple-tree/toStoredSchema.ts +3 -0
  544. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +6 -2
  545. package/src/simple-tree/walkFieldSchema.ts +1 -0
  546. package/dist/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  547. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  548. package/dist/core/tree/detachedFieldIndexCodec.js +0 -100
  549. package/dist/core/tree/detachedFieldIndexCodec.js.map +0 -1
  550. package/dist/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  551. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  552. package/dist/core/tree/detachedFieldIndexFormat.js.map +0 -1
  553. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  554. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  555. package/dist/feature-libraries/initializeForest.d.ts +0 -18
  556. package/dist/feature-libraries/initializeForest.d.ts.map +0 -1
  557. package/dist/feature-libraries/initializeForest.js +0 -35
  558. package/dist/feature-libraries/initializeForest.js.map +0 -1
  559. package/dist/simple-tree/discrepancies.d.ts +0 -167
  560. package/dist/simple-tree/discrepancies.d.ts.map +0 -1
  561. package/dist/simple-tree/discrepancies.js +0 -382
  562. package/dist/simple-tree/discrepancies.js.map +0 -1
  563. package/lib/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  564. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  565. package/lib/core/tree/detachedFieldIndexCodec.js +0 -96
  566. package/lib/core/tree/detachedFieldIndexCodec.js.map +0 -1
  567. package/lib/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  568. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  569. package/lib/core/tree/detachedFieldIndexFormat.js.map +0 -1
  570. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  571. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  572. package/lib/feature-libraries/initializeForest.d.ts +0 -18
  573. package/lib/feature-libraries/initializeForest.d.ts.map +0 -1
  574. package/lib/feature-libraries/initializeForest.js +0 -31
  575. package/lib/feature-libraries/initializeForest.js.map +0 -1
  576. package/lib/simple-tree/discrepancies.d.ts +0 -167
  577. package/lib/simple-tree/discrepancies.d.ts.map +0 -1
  578. package/lib/simple-tree/discrepancies.js.map +0 -1
  579. package/src/feature-libraries/initializeForest.ts +0 -55
@@ -18,7 +18,7 @@ import { brand } from "../../../util/index.js";
18
18
  import type { Counter, DeduplicationTable } from "./chunkCodecUtilities.js";
19
19
  import { type BufferFormat, IdentifierToken, Shape } from "./chunkEncodingGeneric.js";
20
20
  import {
21
- type EncoderCache,
21
+ type EncoderContext,
22
22
  type FieldEncoder,
23
23
  type KeyedFieldEncoder,
24
24
  type NodeEncoder,
@@ -26,9 +26,15 @@ import {
26
26
  } from "./compressedEncode.js";
27
27
  import type { EncodedChunkShape, EncodedFieldShape, EncodedValueShape } from "./format.js";
28
28
 
29
- export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
29
+ /**
30
+ * Encodes a node with the {@link EncodedNodeShape} shape.
31
+ * @remarks
32
+ * The fact this is also a Shape is an implementation detail of the encoder: that allows the shape it uses to be itself,
33
+ * which is an easy way to keep all the related code together without extra objects.
34
+ */
35
+ export class NodeShapeBasedEncoder extends Shape<EncodedChunkShape> implements NodeEncoder {
30
36
  /**
31
- * Set of keys for fields that are encoded using {@link NodeShape.specializedFieldEncoders}.
37
+ * Set of keys for fields that are encoded using {@link NodeShapeBasedEncoder.specializedFieldEncoders}.
32
38
  * TODO: Ensure uniform chunks, encoding and identifier generation sort fields the same.
33
39
  */
34
40
  private readonly specializedFieldKeys: Set<FieldKey>;
@@ -39,17 +45,17 @@ export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
39
45
  /**
40
46
  * Encoders for a specific set of fields, by key, in the order they will be encoded.
41
47
  * These are fields for which specialized encoding is provided as an optimization.
42
- * Using these for a given field instead of falling back to {@link NodeShape.specializedFieldEncoders} is often more efficient:
48
+ * Using these for a given field instead of falling back to {@link NodeShapeBasedEncoder.specializedFieldEncoders} is often more efficient:
43
49
  * this avoids the need to explicitly include the key and shape in the encoded data for each node instance.
44
50
  * Instead, this information is here, and thus is encoded only once as part of the node shape.
45
51
  * These encoders will be used, even if the field they apply to is empty (which can add overhead for fields which are usually empty).
46
52
  *
47
- * Any fields not included here will be encoded using {@link NodeShape.otherFieldsEncoder}.
48
- * If {@link NodeShape.otherFieldsEncoder} is undefined, then this must handle all non-empty fields.
53
+ * Any fields not included here will be encoded using {@link NodeShapeBasedEncoder.otherFieldsEncoder}.
54
+ * If {@link NodeShapeBasedEncoder.otherFieldsEncoder} is undefined, then this must handle all non-empty fields.
49
55
  */
50
56
  public readonly specializedFieldEncoders: readonly KeyedFieldEncoder[],
51
57
  /**
52
- * Encoder for all other fields that are not in {@link NodeShape.specializedFieldEncoders}. These fields must
58
+ * Encoder for all other fields that are not in {@link NodeShapeBasedEncoder.specializedFieldEncoders}. These fields must
53
59
  * be encoded after the specialized fields.
54
60
  */
55
61
  public readonly otherFieldsEncoder: undefined | FieldEncoder,
@@ -58,13 +64,13 @@ export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
58
64
  this.specializedFieldKeys = new Set(this.specializedFieldEncoders.map((f) => f.key));
59
65
  }
60
66
 
61
- private getValueToEncode(cursor: ITreeCursorSynchronous, cache: EncoderCache): Value {
67
+ private getValueToEncode(cursor: ITreeCursorSynchronous, context: EncoderContext): Value {
62
68
  if (this.value === 0) {
63
69
  assert(typeof cursor.value === "string", 0x9aa /* identifier must be type string */);
64
70
  if (isStableId(cursor.value)) {
65
- const sessionSpaceCompressedId = cache.idCompressor.tryRecompress(cursor.value);
71
+ const sessionSpaceCompressedId = context.idCompressor.tryRecompress(cursor.value);
66
72
  if (sessionSpaceCompressedId !== undefined) {
67
- return cache.idCompressor.normalizeToOpSpace(sessionSpaceCompressedId);
73
+ return context.idCompressor.normalizeToOpSpace(sessionSpaceCompressedId);
68
74
  }
69
75
  }
70
76
  }
@@ -73,7 +79,7 @@ export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
73
79
 
74
80
  public encodeNode(
75
81
  cursor: ITreeCursorSynchronous,
76
- cache: EncoderCache,
82
+ context: EncoderContext,
77
83
  outputBuffer: BufferFormat<EncodedChunkShape>,
78
84
  ): void {
79
85
  if (this.type === undefined) {
@@ -81,10 +87,10 @@ export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
81
87
  } else {
82
88
  assert(cursor.type === this.type, 0x741 /* type must match shape */);
83
89
  }
84
- encodeValue(this.getValueToEncode(cursor, cache), this.value, outputBuffer);
90
+ encodeValue(this.getValueToEncode(cursor, context), this.value, outputBuffer);
85
91
  for (const fieldEncoder of this.specializedFieldEncoders) {
86
92
  cursor.enterField(brand(fieldEncoder.key));
87
- fieldEncoder.encoder.encodeField(cursor, cache, outputBuffer);
93
+ fieldEncoder.encoder.encodeField(cursor, context, outputBuffer);
88
94
  cursor.exitField();
89
95
  }
90
96
 
@@ -98,7 +104,7 @@ export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
98
104
  0x742 /* had extra local fields when shape does not support them */,
99
105
  );
100
106
  otherFieldsBuffer.push(new IdentifierToken(key));
101
- this.otherFieldsEncoder.encodeField(cursor, cache, otherFieldsBuffer);
107
+ this.otherFieldsEncoder.encodeField(cursor, context, otherFieldsBuffer);
102
108
  }
103
109
  });
104
110
 
@@ -139,7 +145,7 @@ export class NodeShape extends Shape<EncodedChunkShape> implements NodeEncoder {
139
145
  }
140
146
  }
141
147
 
142
- public get shape(): NodeShape {
148
+ public get shape(): Shape<EncodedChunkShape> {
143
149
  return this;
144
150
  }
145
151
  }
@@ -175,10 +181,10 @@ function encodeOptionalIdentifier(
175
181
  }
176
182
 
177
183
  function encodeOptionalFieldShape(
178
- shape: FieldEncoder | undefined,
184
+ encoder: FieldEncoder | undefined,
179
185
  shapes: DeduplicationTable<Shape<EncodedChunkShape>>,
180
186
  ): number | undefined {
181
- return shape === undefined ? undefined : dedupShape(shape.shape, shapes);
187
+ return encoder === undefined ? undefined : dedupShape(encoder.shape, shapes);
182
188
  }
183
189
 
184
190
  function dedupShape(
@@ -20,18 +20,18 @@ import {
20
20
  import type { FullSchemaPolicy } from "../../modular-schema/index.js";
21
21
 
22
22
  import {
23
- EncoderCache,
23
+ EncoderContext,
24
24
  type FieldEncoder,
25
- type FieldShaper,
25
+ type FieldEncodeBuilder,
26
26
  type KeyedFieldEncoder,
27
- type TreeShaper,
27
+ type NodeEncodeBuilder,
28
28
  anyNodeEncoder,
29
29
  asFieldEncoder,
30
30
  compressedEncode,
31
31
  } from "./compressedEncode.js";
32
32
  import type { FieldBatch } from "./fieldBatch.js";
33
33
  import { type EncodedFieldBatch, type EncodedValueShape, SpecialField } from "./format.js";
34
- import { NodeShape } from "./nodeShape.js";
34
+ import { NodeShapeBasedEncoder } from "./nodeEncoder.js";
35
35
 
36
36
  /**
37
37
  * Encode data from `fieldBatch` in into an `EncodedChunk`.
@@ -45,37 +45,38 @@ export function schemaCompressedEncode(
45
45
  fieldBatch: FieldBatch,
46
46
  idCompressor: IIdCompressor,
47
47
  ): EncodedFieldBatch {
48
- return compressedEncode(fieldBatch, buildCache(schema, policy, idCompressor));
48
+ return compressedEncode(fieldBatch, buildContext(schema, policy, idCompressor));
49
49
  }
50
50
 
51
- export function buildCache(
52
- schema: StoredSchemaCollection,
51
+ export function buildContext(
52
+ storedSchema: StoredSchemaCollection,
53
53
  policy: FullSchemaPolicy,
54
54
  idCompressor: IIdCompressor,
55
- ): EncoderCache {
56
- const cache: EncoderCache = new EncoderCache(
57
- (fieldHandler: FieldShaper, schemaName: TreeNodeSchemaIdentifier) =>
58
- treeShaper(schema, policy, fieldHandler, schemaName),
59
- (treeHandler: TreeShaper, field: TreeFieldStoredSchema) =>
60
- fieldShaper(treeHandler, field, cache, schema),
55
+ ): EncoderContext {
56
+ const context: EncoderContext = new EncoderContext(
57
+ (fieldBuilder: FieldEncodeBuilder, schemaName: TreeNodeSchemaIdentifier) =>
58
+ getNodeEncoder(fieldBuilder, storedSchema, schemaName),
59
+ (nodeBuilder: NodeEncodeBuilder, fieldSchema: TreeFieldStoredSchema) =>
60
+ getFieldEncoder(nodeBuilder, fieldSchema, context, storedSchema),
61
61
  policy.fieldKinds,
62
62
  idCompressor,
63
63
  );
64
- return cache;
64
+ return context;
65
65
  }
66
66
 
67
67
  /**
68
- * Selects shapes to use to encode fields.
68
+ * Selects an encoder to use to encode fields.
69
69
  */
70
- export function fieldShaper(
71
- treeHandler: TreeShaper,
70
+ export function getFieldEncoder(
71
+ nodeBuilder: NodeEncodeBuilder,
72
72
  field: TreeFieldStoredSchema,
73
- cache: EncoderCache,
73
+ context: EncoderContext,
74
74
  storedSchema: StoredSchemaCollection,
75
75
  ): FieldEncoder {
76
- const kind = cache.fieldShapes.get(field.kind) ?? fail(0xb52 /* missing FieldKind */);
76
+ const kind = context.fieldShapes.get(field.kind) ?? fail(0xb52 /* missing FieldKind */);
77
77
  const type = oneFromSet(field.types);
78
- const nodeEncoder = type !== undefined ? treeHandler.shapeFromTree(type) : anyNodeEncoder;
78
+ const nodeEncoder =
79
+ type !== undefined ? nodeBuilder.nodeEncoderFromSchema(type) : anyNodeEncoder;
79
80
  if (kind.multiplicity === Multiplicity.Single) {
80
81
  if (field.kind === identifierFieldKindIdentifier) {
81
82
  assert(type !== undefined, 0x999 /* field type must be defined in identifier field */);
@@ -89,7 +90,7 @@ export function fieldShaper(
89
90
  nodeSchema.leafValue === ValueSchema.String,
90
91
  0x99c /* identifier field can only be type string */,
91
92
  );
92
- const identifierNodeEncoder = new NodeShape(
93
+ const identifierNodeEncoder = new NodeShapeBasedEncoder(
93
94
  type,
94
95
  SpecialField.Identifier,
95
96
  [],
@@ -99,21 +100,20 @@ export function fieldShaper(
99
100
  }
100
101
  return asFieldEncoder(nodeEncoder);
101
102
  } else {
102
- return cache.nestedArray(nodeEncoder);
103
+ return context.nestedArrayEncoder(nodeEncoder);
103
104
  }
104
105
  }
105
106
 
106
107
  /**
107
- * Selects shapes to use to encode trees.
108
+ * Selects an encoder to use to encode nodes.
108
109
  */
109
- export function treeShaper(
110
- fullSchema: StoredSchemaCollection,
111
- policy: FullSchemaPolicy,
112
- fieldHandler: FieldShaper,
110
+ export function getNodeEncoder(
111
+ fieldBuilder: FieldEncodeBuilder,
112
+ storedSchema: StoredSchemaCollection,
113
113
  schemaName: TreeNodeSchemaIdentifier,
114
- ): NodeShape {
114
+ ): NodeShapeBasedEncoder {
115
115
  const schema =
116
- fullSchema.nodeSchema.get(schemaName) ?? fail(0xb53 /* missing node schema */);
116
+ storedSchema.nodeSchema.get(schemaName) ?? fail(0xb53 /* missing node schema */);
117
117
 
118
118
  if (schema instanceof ObjectNodeStoredSchema) {
119
119
  // TODO:Performance:
@@ -122,14 +122,14 @@ export function treeShaper(
122
122
 
123
123
  const objectNodeFields: KeyedFieldEncoder[] = [];
124
124
  for (const [key, field] of schema.objectNodeFields ?? []) {
125
- objectNodeFields.push({ key, encoder: fieldHandler.shapeFromField(field) });
125
+ objectNodeFields.push({ key, encoder: fieldBuilder.fieldEncoderFromSchema(field) });
126
126
  }
127
127
 
128
- const shape = new NodeShape(schemaName, false, objectNodeFields, undefined);
128
+ const shape = new NodeShapeBasedEncoder(schemaName, false, objectNodeFields, undefined);
129
129
  return shape;
130
130
  }
131
131
  if (schema instanceof LeafNodeStoredSchema) {
132
- const shape = new NodeShape(
132
+ const shape = new NodeShapeBasedEncoder(
133
133
  schemaName,
134
134
  valueShapeFromSchema(schema.leafValue),
135
135
  [],
@@ -138,11 +138,11 @@ export function treeShaper(
138
138
  return shape;
139
139
  }
140
140
  if (schema instanceof MapNodeStoredSchema) {
141
- const shape = new NodeShape(
141
+ const shape = new NodeShapeBasedEncoder(
142
142
  schemaName,
143
143
  false,
144
144
  [],
145
- fieldHandler.shapeFromField(schema.mapFields),
145
+ fieldBuilder.fieldEncoderFromSchema(schema.mapFields),
146
146
  );
147
147
  return shape;
148
148
  }
@@ -13,8 +13,8 @@ import type { FluidSerializableReadOnly } from "../../valueUtilities.js";
13
13
  import type { FieldBatch } from "./fieldBatch.js";
14
14
  import {
15
15
  type EncodedFieldBatch,
16
- type EncodedNestedArray,
17
- type EncodedTreeShape,
16
+ type EncodedNestedArrayShape,
17
+ type EncodedNodeShape,
18
18
  version,
19
19
  } from "./format.js";
20
20
  import type { ShapeIndex } from "./formatGeneric.js";
@@ -33,7 +33,7 @@ export function uncompressedEncode(batch: FieldBatch): EncodedFieldBatch {
33
33
  version,
34
34
  identifiers: [],
35
35
  // A single shape used to encode all fields.
36
- shapes: [{ c: anyTreeShape }, { a: anyArray }],
36
+ shapes: [{ c: anyNodeShape }, { a: anyArray }],
37
37
  // Wrap up each field as an indicator to use the above shape, and its encoded data.
38
38
  data: rootFields.map((data) => [arrayIndex, data]),
39
39
  };
@@ -42,11 +42,11 @@ export function uncompressedEncode(batch: FieldBatch): EncodedFieldBatch {
42
42
  const treeIndex: ShapeIndex = 0;
43
43
  const arrayIndex: ShapeIndex = 1;
44
44
 
45
- const anyTreeShape: EncodedTreeShape = {
45
+ const anyNodeShape: EncodedNodeShape = {
46
46
  extraFields: arrayIndex,
47
47
  };
48
48
 
49
- const anyArray: EncodedNestedArray = treeIndex;
49
+ const anyArray: EncodedNestedArrayShape = treeIndex;
50
50
 
51
51
  /**
52
52
  * Encode a field using the hard coded shape above.
@@ -97,6 +97,11 @@ export const required = new FieldKindWithEditor(
97
97
  Multiplicity.Single,
98
98
  valueChangeHandler,
99
99
  (types, other) =>
100
+ // By omitting Identifier here,
101
+ // this is making a policy choice that a schema upgrade cannot be done from required to identifier.
102
+ // Since an identifier can be upgraded into a required field,
103
+ // preventing the inverse helps ensure that schema upgrades are monotonic.
104
+ // Which direction is allowed is a subjective policy choice.
100
105
  (other.kind === sequence.identifier ||
101
106
  other.kind === requiredIdentifier ||
102
107
  other.kind === optional.identifier ||
@@ -125,6 +130,10 @@ const nodeKeyIdentifier = "NodeKey";
125
130
 
126
131
  /**
127
132
  * Exactly one identifier.
133
+ *
134
+ * TODO: this is almost the same as identifier, but apparently unused.
135
+ * Confirm if this is truly unused since before the document format was stabilized, and remove if possible.
136
+ * @deprecated Superseded by {@link identifier}.
128
137
  */
129
138
  export const nodeKey = new FieldKindWithEditor(
130
139
  nodeKeyIdentifier,
@@ -149,6 +158,7 @@ export const identifier = new FieldKindWithEditor(
149
158
  Multiplicity.Single,
150
159
  noChangeHandler,
151
160
  (types, other) =>
161
+ // Allows upgrading from identifier to required: which way this upgrade is allowed to go is a subjective policy choice.
152
162
  (other.kind === sequence.identifier ||
153
163
  other.kind === requiredIdentifier ||
154
164
  other.kind === optional.identifier ||
@@ -12,6 +12,4 @@ import { fieldKinds } from "./defaultFieldKinds.js";
12
12
  */
13
13
  export const defaultSchemaPolicy: FullSchemaPolicy = {
14
14
  fieldKinds,
15
- validateSchema: false,
16
- allowUnknownOptionalFields: () => false,
17
15
  };
@@ -30,7 +30,7 @@ export {
30
30
  SchemaValidationError,
31
31
  isNodeInSchema,
32
32
  isFieldInSchema,
33
- inSchemaOrThrow,
33
+ throwOutOfSchema,
34
34
  } from "./schemaChecker.js";
35
35
 
36
36
  export { defaultSchemaPolicy } from "./defaultSchema.js";
@@ -32,66 +32,78 @@ export enum SchemaValidationError {
32
32
  }
33
33
 
34
34
  /**
35
- * Throws a UsageError if maybeError indicates a tree is out of schema.
35
+ * Throws a UsageError indicating a tree is out of schema.
36
36
  */
37
- export function inSchemaOrThrow(maybeError: SchemaValidationError | undefined): void {
38
- if (maybeError !== undefined) {
39
- throw new UsageError(
40
- `Tree does not conform to schema: ${SchemaValidationError[maybeError]}`,
41
- );
42
- }
37
+ export function throwOutOfSchema(maybeError: SchemaValidationError): never {
38
+ throw new UsageError(
39
+ `Tree does not conform to schema: ${SchemaValidationError[maybeError]}`,
40
+ );
43
41
  }
44
42
 
43
+ type NotUndefined = number | string | boolean | bigint | symbol | object;
44
+
45
45
  /**
46
46
  * Deeply checks that the provided node complies with the schema based on its identifier.
47
+ *
48
+ * @param onError - Called with the first error (if any).
49
+ *
50
+ * @returns the return value from `onError` if the node or anything inside of it is out of schema, otherwise `undefined`.
47
51
  */
48
- export function isNodeInSchema(
52
+ export function isNodeInSchema<T extends NotUndefined>(
49
53
  node: MinimalMapTreeNodeView,
50
54
  schemaAndPolicy: SchemaAndPolicy,
51
- ): SchemaValidationError | undefined {
55
+ onError: (error: SchemaValidationError) => T,
56
+ ): T | undefined {
52
57
  // Validate the schema declared by the node exists
53
58
  const schema = schemaAndPolicy.schema.nodeSchema.get(node.type);
54
59
  if (schema === undefined) {
55
- return SchemaValidationError.Node_MissingSchema;
60
+ return onError(SchemaValidationError.Node_MissingSchema);
56
61
  }
57
62
 
58
63
  // Validate the node is well formed according to its schema
59
64
 
60
65
  if (schema instanceof LeafNodeStoredSchema) {
61
66
  if (iterableHasSome(node.fields)) {
62
- return SchemaValidationError.LeafNode_FieldsNotAllowed;
67
+ return onError(SchemaValidationError.LeafNode_FieldsNotAllowed);
63
68
  }
64
69
  if (!allowsValue(schema.leafValue, node.value)) {
65
- return SchemaValidationError.LeafNode_InvalidValue;
70
+ return onError(SchemaValidationError.LeafNode_InvalidValue);
66
71
  }
67
72
  } else {
68
73
  if (node.value !== undefined) {
69
- return SchemaValidationError.NonLeafNode_ValueNotAllowed;
74
+ return onError(SchemaValidationError.NonLeafNode_ValueNotAllowed);
70
75
  }
71
76
 
72
77
  if (schema instanceof ObjectNodeStoredSchema) {
73
78
  const uncheckedFieldsFromNode = new Set(mapIterable(node.fields, ([key, field]) => key));
74
79
  for (const [fieldKey, fieldSchema] of schema.objectNodeFields) {
75
80
  const nodeField = node.fields.get(fieldKey) ?? [];
76
- const fieldInSchemaResult = isFieldInSchema(nodeField, fieldSchema, schemaAndPolicy);
81
+ const fieldInSchemaResult = isFieldInSchema(
82
+ nodeField,
83
+ fieldSchema,
84
+ schemaAndPolicy,
85
+ onError,
86
+ );
77
87
  if (fieldInSchemaResult !== undefined) {
78
88
  return fieldInSchemaResult;
79
89
  }
80
90
  uncheckedFieldsFromNode.delete(fieldKey);
81
91
  }
82
- // The node has fields that we did not check as part of looking at every field defined in the node's schema
83
- if (
84
- uncheckedFieldsFromNode.size !== 0 &&
85
- // TODO: AB#43547: This check is wrong. If a given view schema allows an unknown optional field, that does NOT mean the stored schema should allow unknown:
86
- // In-fact, any data the view schema does not know about must still comply with the stored schema:
87
- // if this were not the case schema evolution could not add any fields since they might already have out of schema data.
88
- !schemaAndPolicy.policy.allowUnknownOptionalFields(node.type)
89
- ) {
90
- return SchemaValidationError.ObjectNode_FieldNotInSchema;
92
+ // The node has fields that we did not check as part of looking at every field defined in the node's schema.
93
+ // Since this is testing compatibility with a stored schema (not view schema), "allowUnknownOptionalFields" does not exist at this layer.
94
+ // Code using this with a stored schema derived from a view schema rather than the document can be problematic because it may be missing unknown fields that the actual document has.
95
+ // Other schema evolution features like "staged" allowed types will likely cause similar issues elsewhere in this checker.
96
+ if (uncheckedFieldsFromNode.size !== 0) {
97
+ return onError(SchemaValidationError.ObjectNode_FieldNotInSchema);
91
98
  }
92
99
  } else if (schema instanceof MapNodeStoredSchema) {
93
100
  for (const [_key, field] of node.fields) {
94
- const fieldInSchemaResult = isFieldInSchema(field, schema.mapFields, schemaAndPolicy);
101
+ const fieldInSchemaResult = isFieldInSchema(
102
+ field,
103
+ schema.mapFields,
104
+ schemaAndPolicy,
105
+ onError,
106
+ );
95
107
  if (fieldInSchemaResult !== undefined) {
96
108
  return fieldInSchemaResult;
97
109
  }
@@ -106,34 +118,39 @@ export function isNodeInSchema(
106
118
 
107
119
  /**
108
120
  * Deeply checks that the nodes comply with the field schema and included schema.
121
+ *
122
+ * @param onError - Called with the first error (if any).
123
+ *
124
+ * @returns the return value from `onError` if the field or anything inside of it is out of schema, otherwise `undefined`.
109
125
  */
110
- export function isFieldInSchema(
126
+ export function isFieldInSchema<T extends NotUndefined>(
111
127
  childNodes: MapTreeFieldViewGeneric<MinimalMapTreeNodeView>,
112
128
  schema: TreeFieldStoredSchema,
113
129
  schemaAndPolicy: SchemaAndPolicy,
114
- ): SchemaValidationError | undefined {
130
+ onError: (error: SchemaValidationError) => T,
131
+ ): T | undefined {
115
132
  // Validate that the field kind is handled by the schema policy
116
133
  const kind = schemaAndPolicy.policy.fieldKinds.get(schema.kind);
117
134
  if (kind === undefined) {
118
- return SchemaValidationError.Field_KindNotInSchemaPolicy;
135
+ return onError(SchemaValidationError.Field_KindNotInSchemaPolicy);
119
136
  }
120
137
 
121
138
  // Validate that the field doesn't contain more nodes than its type supports
122
139
  {
123
140
  const multiplicityCheck = compliesWithMultiplicity(childNodes.length, kind.multiplicity);
124
141
  if (multiplicityCheck !== undefined) {
125
- return multiplicityCheck;
142
+ return onError(multiplicityCheck);
126
143
  }
127
144
  }
128
145
 
129
146
  for (const node of childNodes) {
130
147
  // Validate the type declared by the node is allowed in this field
131
148
  if (schema.types !== undefined && !schema.types.has(node.type)) {
132
- return SchemaValidationError.Field_NodeTypeNotAllowed;
149
+ return onError(SchemaValidationError.Field_NodeTypeNotAllowed);
133
150
  }
134
151
 
135
152
  // Validate the node complies with the type it declares to be.
136
- const nodeInSchemaResult = isNodeInSchema(node, schemaAndPolicy);
153
+ const nodeInSchemaResult = isNodeInSchema(node, schemaAndPolicy, onError);
137
154
  if (nodeInSchemaResult !== undefined) {
138
155
  return nodeInSchemaResult;
139
156
  }
@@ -136,7 +136,7 @@ export {
136
136
  SchemaValidationError,
137
137
  isNodeInSchema,
138
138
  isFieldInSchema,
139
- inSchemaOrThrow,
139
+ throwOutOfSchema,
140
140
  } from "./default-schema/index.js";
141
141
 
142
142
  export {
@@ -193,5 +193,3 @@ export {
193
193
  type TreeIndexKey,
194
194
  type TreeIndexNodes,
195
195
  } from "./indexing/index.js";
196
-
197
- export { initializeForest } from "./initializeForest.js";
@@ -23,7 +23,7 @@ import { withEditor } from "./fieldKindWithEditor.js";
23
23
  import { isNeverTree } from "./isNeverTree.js";
24
24
 
25
25
  /**
26
- * @returns true iff `superset` is a superset of `original`.
26
+ * Returns true iff `superset` is a superset of `original`.
27
27
  *
28
28
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
29
29
  *
@@ -65,12 +65,7 @@ export function allowsTreeSuperset(
65
65
 
66
66
  if (original instanceof MapNodeStoredSchema) {
67
67
  if (superset instanceof MapNodeStoredSchema) {
68
- return allowsFieldSuperset(
69
- policy,
70
- originalData,
71
- normalizeField(original.mapFields),
72
- normalizeField(superset.mapFields),
73
- );
68
+ return allowsFieldSuperset(policy, originalData, original.mapFields, superset.mapFields);
74
69
  }
75
70
  return false;
76
71
  }
@@ -78,14 +73,7 @@ export function allowsTreeSuperset(
78
73
  assert(original instanceof ObjectNodeStoredSchema, 0x895 /* unsupported node kind */);
79
74
  if (superset instanceof MapNodeStoredSchema) {
80
75
  for (const [_key, field] of original.objectNodeFields) {
81
- if (
82
- !allowsFieldSuperset(
83
- policy,
84
- originalData,
85
- normalizeField(field),
86
- normalizeField(superset.mapFields),
87
- )
88
- ) {
76
+ if (!allowsFieldSuperset(policy, originalData, field, superset.mapFields)) {
89
77
  return false;
90
78
  }
91
79
  }
@@ -102,13 +90,13 @@ export function allowsTreeSuperset(
102
90
  originalData,
103
91
  original.objectNodeFields.get(originalField) ??
104
92
  fail(0xb17 /* missing expected field */),
105
- normalizeField(undefined),
93
+ storedEmptyFieldSchema,
106
94
  ),
107
95
  bExtra: (supersetField) =>
108
96
  allowsFieldSuperset(
109
97
  policy,
110
98
  originalData,
111
- normalizeField(undefined),
99
+ storedEmptyFieldSchema,
112
100
  superset.objectNodeFields.get(supersetField) ??
113
101
  fail(0xb18 /* missing expected field */),
114
102
  ),
@@ -123,7 +111,7 @@ export function allowsTreeSuperset(
123
111
  }
124
112
 
125
113
  /**
126
- * @returns true iff `superset` is a superset of `original`.
114
+ * Returns true iff `superset` is a superset of `original`.
127
115
  *
128
116
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
129
117
  */
@@ -135,7 +123,7 @@ export function allowsValueSuperset(
135
123
  }
136
124
 
137
125
  /**
138
- * @returns true iff `superset` is a superset of `original`.
126
+ * Returns true iff `superset` is a superset of `original`.
139
127
  *
140
128
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
141
129
  */
@@ -151,7 +139,7 @@ export function allowsFieldSuperset(
151
139
  }
152
140
 
153
141
  /**
154
- * @returns true iff `superset` is a superset of `original`.
142
+ * Returns true iff `superset` is a superset of `original`.
155
143
  *
156
144
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
157
145
  */
@@ -168,7 +156,7 @@ export function allowsTreeSchemaIdentifierSuperset(
168
156
  }
169
157
 
170
158
  /**
171
- * @returns true iff `superset` is a superset of `original`.
159
+ * Returns true iff `superset` is a superset of `original`.
172
160
  *
173
161
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
174
162
  *
@@ -182,7 +170,6 @@ export function allowsRepoSuperset(
182
170
  superset: TreeStoredSchema,
183
171
  ): boolean {
184
172
  {
185
- // TODO: I think its ok to use the field from superset here, but I should confirm it is, and document why.
186
173
  if (
187
174
  !allowsFieldSuperset(
188
175
  policy,
@@ -194,17 +181,15 @@ export function allowsRepoSuperset(
194
181
  return false;
195
182
  }
196
183
  }
184
+ // Check if all schema in original are included in superset, and permit a superset of the node content.
185
+ // Note that any schema from `original.nodeSchema` can be used as the schema for a node at the root of a detached field,
186
+ // so we must check all of them, even if they are not reachable from the root field schema.
197
187
  for (const [key, schema] of original.nodeSchema) {
198
- // TODO: I think its ok to use the tree from superset here, but I should confirm it is, and document why.
199
188
  if (!allowsTreeSuperset(policy, original, schema, superset.nodeSchema.get(key))) {
200
189
  return false;
201
190
  }
202
191
  }
192
+ // Any schema in superset not in original are already known to be superset of original since they are "never" due to being missing.
193
+ // Therefore, we do not need to check them.
203
194
  return true;
204
195
  }
205
-
206
- export function normalizeField(
207
- schema: TreeFieldStoredSchema | undefined,
208
- ): TreeFieldStoredSchema {
209
- return schema ?? storedEmptyFieldSchema;
210
- }
@@ -55,8 +55,8 @@ import { type CursorWithNode, SynchronousCursor } from "../treeCursorUtils.js";
55
55
  import {
56
56
  defaultSchemaPolicy,
57
57
  FieldKinds,
58
- inSchemaOrThrow,
59
58
  isFieldInSchema,
59
+ throwOutOfSchema,
60
60
  } from "../default-schema/index.js";
61
61
 
62
62
  /** A `MapTree` with mutable fields */
@@ -158,11 +158,15 @@ export class ObjectForest implements IEditableForest, WithBreakable {
158
158
  // Metadata is not used for schema checks
159
159
  persistedMetadata: undefined,
160
160
  };
161
- const maybeError = isFieldInSchema(documentRoot, fieldSchema, {
162
- schema,
163
- policy: defaultSchemaPolicy,
164
- });
165
- inSchemaOrThrow(maybeError);
161
+ isFieldInSchema(
162
+ documentRoot,
163
+ fieldSchema,
164
+ {
165
+ schema,
166
+ policy: defaultSchemaPolicy,
167
+ },
168
+ throwOutOfSchema,
169
+ );
166
170
  }
167
171
  }
168
172
  }