@fluidframework/tree 2.51.0-347100 → 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 (609) hide show
  1. package/.eslintrc.cjs +3 -2
  2. package/.vscode/settings.json +0 -1
  3. package/CHANGELOG.md +92 -0
  4. package/api-report/tree.alpha.api.md +3 -2
  5. package/dist/codec/codec.d.ts +2 -1
  6. package/dist/codec/codec.d.ts.map +1 -1
  7. package/dist/codec/codec.js +4 -3
  8. package/dist/codec/codec.js.map +1 -1
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +3 -2
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/index.d.ts +1 -1
  14. package/dist/core/rebase/index.d.ts.map +1 -1
  15. package/dist/core/rebase/index.js +2 -1
  16. package/dist/core/rebase/index.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +3 -1
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js +2 -1
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/schema-stored/schema.d.ts +1 -23
  22. package/dist/core/schema-stored/schema.d.ts.map +1 -1
  23. package/dist/core/schema-stored/schema.js +2 -2
  24. package/dist/core/schema-stored/schema.js.map +1 -1
  25. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  26. package/dist/core/tree/detachedFieldIndex.js +2 -3
  27. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  28. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  29. package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  30. package/dist/core/tree/detachedFieldIndexCodecCommon.js +68 -0
  31. package/dist/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  32. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  33. package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  34. package/dist/core/tree/detachedFieldIndexCodecV1.js +55 -0
  35. package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  36. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  37. package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  38. package/dist/core/tree/detachedFieldIndexCodecV2.js +49 -0
  39. package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  40. package/dist/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  41. package/dist/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  42. package/dist/core/tree/detachedFieldIndexCodecs.js +26 -0
  43. package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  44. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  45. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  46. package/dist/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +18 -13
  47. package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  48. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  49. package/dist/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  50. package/dist/core/tree/detachedFieldIndexFormatV1.js +12 -0
  51. package/dist/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  52. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  53. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  54. package/dist/core/tree/detachedFieldIndexFormatV2.js +14 -0
  55. package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  56. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  57. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +21 -21
  59. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  61. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  62. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  63. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  64. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  65. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  66. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +74 -61
  67. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  68. package/dist/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  69. package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  70. package/dist/feature-libraries/chunked-forest/codec/format.js +18 -12
  71. package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  72. package/{lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts → dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  73. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  74. package/dist/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +23 -17
  75. package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  76. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  77. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  78. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +22 -22
  79. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  80. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  81. package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  82. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  83. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  84. package/dist/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  85. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  86. package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  87. package/dist/feature-libraries/default-schema/defaultSchema.js +0 -2
  88. package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  89. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  90. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  91. package/dist/feature-libraries/default-schema/index.js +2 -2
  92. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  93. package/dist/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  94. package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  95. package/dist/feature-libraries/default-schema/schemaChecker.js +31 -26
  96. package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  97. package/dist/feature-libraries/index.d.ts +2 -3
  98. package/dist/feature-libraries/index.d.ts.map +1 -1
  99. package/dist/feature-libraries/index.js +3 -11
  100. package/dist/feature-libraries/index.js.map +1 -1
  101. package/dist/feature-libraries/modular-schema/comparison.d.ts +5 -6
  102. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  103. package/dist/feature-libraries/modular-schema/comparison.js +15 -19
  104. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  105. package/dist/feature-libraries/modular-schema/index.d.ts +0 -1
  106. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  107. package/dist/feature-libraries/modular-schema/index.js +1 -8
  108. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  109. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  110. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  111. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  112. package/dist/feature-libraries/object-forest/objectForest.js +2 -3
  113. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  114. package/dist/index.d.ts +1 -1
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +6 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/packageVersion.d.ts +1 -1
  119. package/dist/packageVersion.d.ts.map +1 -1
  120. package/dist/packageVersion.js +1 -1
  121. package/dist/packageVersion.js.map +1 -1
  122. package/dist/shared-tree/independentView.d.ts +8 -0
  123. package/dist/shared-tree/independentView.d.ts.map +1 -1
  124. package/dist/shared-tree/independentView.js +23 -11
  125. package/dist/shared-tree/independentView.js.map +1 -1
  126. package/dist/shared-tree/schematizeTree.d.ts +1 -1
  127. package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
  128. package/dist/shared-tree/schematizeTree.js +5 -4
  129. package/dist/shared-tree/schematizeTree.js.map +1 -1
  130. package/dist/shared-tree/schematizingTreeView.d.ts +0 -1
  131. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  132. package/dist/shared-tree/schematizingTreeView.js +7 -10
  133. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  134. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  135. package/dist/shared-tree/sharedTree.js +1 -29
  136. package/dist/shared-tree/sharedTree.js.map +1 -1
  137. package/dist/shared-tree/tree.js +1 -1
  138. package/dist/shared-tree/tree.js.map +1 -1
  139. package/dist/shared-tree/treeAlpha.d.ts +20 -6
  140. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  141. package/dist/shared-tree/treeAlpha.js +9 -4
  142. package/dist/shared-tree/treeAlpha.js.map +1 -1
  143. package/dist/shared-tree/treeCheckout.d.ts +2 -1
  144. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  145. package/dist/shared-tree/treeCheckout.js +33 -1
  146. package/dist/shared-tree/treeCheckout.js.map +1 -1
  147. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  148. package/dist/shared-tree-core/branch.js +1 -1
  149. package/dist/shared-tree-core/branch.js.map +1 -1
  150. package/dist/simple-tree/api/conciseTree.d.ts +2 -2
  151. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  152. package/dist/simple-tree/api/conciseTree.js +6 -6
  153. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  154. package/dist/simple-tree/api/configuration.d.ts +8 -2
  155. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  156. package/dist/simple-tree/api/configuration.js.map +1 -1
  157. package/dist/simple-tree/api/create.d.ts +8 -7
  158. package/dist/simple-tree/api/create.d.ts.map +1 -1
  159. package/dist/simple-tree/api/create.js +35 -22
  160. package/dist/simple-tree/api/create.js.map +1 -1
  161. package/dist/simple-tree/api/customTree.d.ts +25 -4
  162. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  163. package/dist/simple-tree/api/customTree.js +42 -16
  164. package/dist/simple-tree/api/customTree.js.map +1 -1
  165. package/dist/simple-tree/api/discrepancies.d.ts +98 -0
  166. package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
  167. package/dist/simple-tree/api/discrepancies.js +255 -0
  168. package/dist/simple-tree/api/discrepancies.js.map +1 -0
  169. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +8 -21
  170. package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  171. package/dist/simple-tree/api/schemaCompatibilityTester.js +19 -169
  172. package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  173. package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  174. package/dist/simple-tree/api/schemaCreationUtilities.js +2 -2
  175. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  176. package/dist/simple-tree/api/schemaFactory.d.ts +7 -4
  177. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  178. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  179. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  180. package/dist/simple-tree/api/storedSchema.js +5 -1
  181. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  182. package/dist/simple-tree/api/treeBeta.d.ts +2 -2
  183. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  184. package/dist/simple-tree/api/treeBeta.js +10 -4
  185. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  186. package/dist/simple-tree/api/verboseTree.d.ts +2 -2
  187. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  188. package/dist/simple-tree/api/verboseTree.js +15 -15
  189. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  190. package/dist/simple-tree/core/allowedTypes.d.ts +20 -4
  191. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  192. package/dist/simple-tree/core/allowedTypes.js +45 -13
  193. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  194. package/dist/simple-tree/core/context.d.ts +13 -2
  195. package/dist/simple-tree/core/context.d.ts.map +1 -1
  196. package/dist/simple-tree/core/context.js +22 -9
  197. package/dist/simple-tree/core/context.js.map +1 -1
  198. package/dist/simple-tree/core/index.d.ts +2 -2
  199. package/dist/simple-tree/core/index.d.ts.map +1 -1
  200. package/dist/simple-tree/core/index.js +3 -1
  201. package/dist/simple-tree/core/index.js.map +1 -1
  202. package/dist/simple-tree/core/treeNodeKernel.d.ts +1 -1
  203. package/dist/simple-tree/core/treeNodeKernel.js +1 -1
  204. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  205. package/dist/simple-tree/core/treeNodeValid.d.ts +1 -1
  206. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  207. package/dist/simple-tree/core/treeNodeValid.js +8 -1
  208. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  209. package/dist/simple-tree/core/walkSchema.d.ts +3 -0
  210. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  211. package/dist/simple-tree/core/walkSchema.js +2 -0
  212. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  213. package/dist/simple-tree/createContext.d.ts +2 -0
  214. package/dist/simple-tree/createContext.d.ts.map +1 -1
  215. package/dist/simple-tree/createContext.js +3 -1
  216. package/dist/simple-tree/createContext.js.map +1 -1
  217. package/dist/simple-tree/fieldSchema.d.ts +1 -0
  218. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  219. package/dist/simple-tree/fieldSchema.js +1 -0
  220. package/dist/simple-tree/fieldSchema.js.map +1 -1
  221. package/dist/simple-tree/index.d.ts +5 -4
  222. package/dist/simple-tree/index.d.ts.map +1 -1
  223. package/dist/simple-tree/index.js +8 -3
  224. package/dist/simple-tree/index.js.map +1 -1
  225. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  226. package/dist/simple-tree/node-kinds/array/arrayNode.js +1 -1
  227. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  228. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  229. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  230. package/dist/simple-tree/node-kinds/index.js +1 -2
  231. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  232. package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
  233. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  234. package/dist/simple-tree/node-kinds/object/index.js +1 -2
  235. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  236. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  237. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  238. package/dist/simple-tree/node-kinds/object/objectNode.js +4 -18
  239. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  240. package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
  241. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  242. package/dist/simple-tree/prepareForInsertion.js +9 -3
  243. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  244. package/dist/simple-tree/toStoredSchema.d.ts +3 -0
  245. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  246. package/dist/simple-tree/toStoredSchema.js +3 -0
  247. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  248. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  249. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  250. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  251. package/dist/simple-tree/walkFieldSchema.d.ts +1 -0
  252. package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
  253. package/dist/simple-tree/walkFieldSchema.js +1 -0
  254. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  255. package/lib/codec/codec.d.ts +2 -1
  256. package/lib/codec/codec.d.ts.map +1 -1
  257. package/lib/codec/codec.js +4 -3
  258. package/lib/codec/codec.js.map +1 -1
  259. package/lib/core/index.d.ts +1 -1
  260. package/lib/core/index.d.ts.map +1 -1
  261. package/lib/core/index.js +1 -1
  262. package/lib/core/index.js.map +1 -1
  263. package/lib/core/rebase/index.d.ts +1 -1
  264. package/lib/core/rebase/index.d.ts.map +1 -1
  265. package/lib/core/rebase/index.js +1 -1
  266. package/lib/core/rebase/index.js.map +1 -1
  267. package/lib/core/rebase/types.d.ts +3 -1
  268. package/lib/core/rebase/types.d.ts.map +1 -1
  269. package/lib/core/rebase/types.js +1 -0
  270. package/lib/core/rebase/types.js.map +1 -1
  271. package/lib/core/schema-stored/schema.d.ts +1 -23
  272. package/lib/core/schema-stored/schema.d.ts.map +1 -1
  273. package/lib/core/schema-stored/schema.js +2 -2
  274. package/lib/core/schema-stored/schema.js.map +1 -1
  275. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  276. package/lib/core/tree/detachedFieldIndex.js +2 -3
  277. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  278. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
  279. package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
  280. package/lib/core/tree/detachedFieldIndexCodecCommon.js +64 -0
  281. package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
  282. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
  283. package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
  284. package/lib/core/tree/detachedFieldIndexCodecV1.js +51 -0
  285. package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
  286. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
  287. package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
  288. package/lib/core/tree/detachedFieldIndexCodecV2.js +45 -0
  289. package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
  290. package/lib/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
  291. package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
  292. package/lib/core/tree/detachedFieldIndexCodecs.js +21 -0
  293. package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -0
  294. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
  295. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
  296. package/lib/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +13 -10
  297. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
  298. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
  299. package/lib/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
  300. package/lib/core/tree/detachedFieldIndexFormatV1.js +9 -0
  301. package/lib/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
  302. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
  303. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
  304. package/lib/core/tree/detachedFieldIndexFormatV2.js +11 -0
  305. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
  306. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
  307. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  308. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +19 -19
  309. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  310. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
  311. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  312. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
  313. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  314. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
  315. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  316. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +70 -57
  317. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  318. package/lib/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
  319. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  320. package/lib/feature-libraries/chunked-forest/codec/format.js +17 -11
  321. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  322. package/{dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts → lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
  323. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
  324. package/lib/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +21 -15
  325. package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
  326. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
  327. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  328. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +19 -19
  329. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  330. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
  331. package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
  332. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
  333. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  334. package/lib/feature-libraries/default-schema/defaultFieldKinds.js +14 -2
  335. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  336. package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
  337. package/lib/feature-libraries/default-schema/defaultSchema.js +0 -2
  338. package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
  339. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  340. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  341. package/lib/feature-libraries/default-schema/index.js +1 -1
  342. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  343. package/lib/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
  344. package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
  345. package/lib/feature-libraries/default-schema/schemaChecker.js +29 -24
  346. package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
  347. package/lib/feature-libraries/index.d.ts +2 -3
  348. package/lib/feature-libraries/index.d.ts.map +1 -1
  349. package/lib/feature-libraries/index.js +2 -3
  350. package/lib/feature-libraries/index.js.map +1 -1
  351. package/lib/feature-libraries/modular-schema/comparison.d.ts +5 -6
  352. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  353. package/lib/feature-libraries/modular-schema/comparison.js +14 -17
  354. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  355. package/lib/feature-libraries/modular-schema/index.d.ts +0 -1
  356. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  357. package/lib/feature-libraries/modular-schema/index.js +0 -1
  358. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  359. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts +9 -3
  360. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  361. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  362. package/lib/feature-libraries/object-forest/objectForest.js +3 -4
  363. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  364. package/lib/index.d.ts +1 -1
  365. package/lib/index.d.ts.map +1 -1
  366. package/lib/index.js +2 -2
  367. package/lib/index.js.map +1 -1
  368. package/lib/packageVersion.d.ts +1 -1
  369. package/lib/packageVersion.d.ts.map +1 -1
  370. package/lib/packageVersion.js +1 -1
  371. package/lib/packageVersion.js.map +1 -1
  372. package/lib/shared-tree/independentView.d.ts +8 -0
  373. package/lib/shared-tree/independentView.d.ts.map +1 -1
  374. package/lib/shared-tree/independentView.js +21 -10
  375. package/lib/shared-tree/independentView.js.map +1 -1
  376. package/lib/shared-tree/schematizeTree.d.ts +1 -1
  377. package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
  378. package/lib/shared-tree/schematizeTree.js +3 -2
  379. package/lib/shared-tree/schematizeTree.js.map +1 -1
  380. package/lib/shared-tree/schematizingTreeView.d.ts +0 -1
  381. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  382. package/lib/shared-tree/schematizingTreeView.js +8 -11
  383. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  384. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  385. package/lib/shared-tree/sharedTree.js +2 -30
  386. package/lib/shared-tree/sharedTree.js.map +1 -1
  387. package/lib/shared-tree/tree.js +1 -1
  388. package/lib/shared-tree/tree.js.map +1 -1
  389. package/lib/shared-tree/treeAlpha.d.ts +20 -6
  390. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  391. package/lib/shared-tree/treeAlpha.js +10 -5
  392. package/lib/shared-tree/treeAlpha.js.map +1 -1
  393. package/lib/shared-tree/treeCheckout.d.ts +2 -1
  394. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  395. package/lib/shared-tree/treeCheckout.js +34 -2
  396. package/lib/shared-tree/treeCheckout.js.map +1 -1
  397. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  398. package/lib/shared-tree-core/branch.js +1 -1
  399. package/lib/shared-tree-core/branch.js.map +1 -1
  400. package/lib/simple-tree/api/conciseTree.d.ts +2 -2
  401. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  402. package/lib/simple-tree/api/conciseTree.js +6 -6
  403. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  404. package/lib/simple-tree/api/configuration.d.ts +8 -2
  405. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  406. package/lib/simple-tree/api/configuration.js.map +1 -1
  407. package/lib/simple-tree/api/create.d.ts +8 -7
  408. package/lib/simple-tree/api/create.d.ts.map +1 -1
  409. package/lib/simple-tree/api/create.js +38 -25
  410. package/lib/simple-tree/api/create.js.map +1 -1
  411. package/lib/simple-tree/api/customTree.d.ts +25 -4
  412. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  413. package/lib/simple-tree/api/customTree.js +43 -17
  414. package/lib/simple-tree/api/customTree.js.map +1 -1
  415. package/lib/simple-tree/api/discrepancies.d.ts +98 -0
  416. package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
  417. package/lib/simple-tree/api/discrepancies.js +250 -0
  418. package/lib/simple-tree/api/discrepancies.js.map +1 -0
  419. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +8 -21
  420. package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
  421. package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -169
  422. package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
  423. package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  424. package/lib/simple-tree/api/schemaCreationUtilities.js +2 -2
  425. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  426. package/lib/simple-tree/api/schemaFactory.d.ts +7 -4
  427. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  428. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  429. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  430. package/lib/simple-tree/api/storedSchema.js +6 -2
  431. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  432. package/lib/simple-tree/api/treeBeta.d.ts +2 -2
  433. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  434. package/lib/simple-tree/api/treeBeta.js +8 -2
  435. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  436. package/lib/simple-tree/api/verboseTree.d.ts +2 -2
  437. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  438. package/lib/simple-tree/api/verboseTree.js +9 -9
  439. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  440. package/lib/simple-tree/core/allowedTypes.d.ts +20 -4
  441. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  442. package/lib/simple-tree/core/allowedTypes.js +42 -12
  443. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  444. package/lib/simple-tree/core/context.d.ts +13 -2
  445. package/lib/simple-tree/core/context.d.ts.map +1 -1
  446. package/lib/simple-tree/core/context.js +22 -9
  447. package/lib/simple-tree/core/context.js.map +1 -1
  448. package/lib/simple-tree/core/index.d.ts +2 -2
  449. package/lib/simple-tree/core/index.d.ts.map +1 -1
  450. package/lib/simple-tree/core/index.js +2 -2
  451. package/lib/simple-tree/core/index.js.map +1 -1
  452. package/lib/simple-tree/core/treeNodeKernel.d.ts +1 -1
  453. package/lib/simple-tree/core/treeNodeKernel.js +1 -1
  454. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  455. package/lib/simple-tree/core/treeNodeValid.d.ts +1 -1
  456. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  457. package/lib/simple-tree/core/treeNodeValid.js +8 -1
  458. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  459. package/lib/simple-tree/core/walkSchema.d.ts +3 -0
  460. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  461. package/lib/simple-tree/core/walkSchema.js +2 -0
  462. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  463. package/lib/simple-tree/createContext.d.ts +2 -0
  464. package/lib/simple-tree/createContext.d.ts.map +1 -1
  465. package/lib/simple-tree/createContext.js +3 -1
  466. package/lib/simple-tree/createContext.js.map +1 -1
  467. package/lib/simple-tree/fieldSchema.d.ts +1 -0
  468. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  469. package/lib/simple-tree/fieldSchema.js +1 -0
  470. package/lib/simple-tree/fieldSchema.js.map +1 -1
  471. package/lib/simple-tree/index.d.ts +5 -4
  472. package/lib/simple-tree/index.d.ts.map +1 -1
  473. package/lib/simple-tree/index.js +5 -4
  474. package/lib/simple-tree/index.js.map +1 -1
  475. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  476. package/lib/simple-tree/node-kinds/array/arrayNode.js +1 -1
  477. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  478. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  479. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  480. package/lib/simple-tree/node-kinds/index.js +1 -1
  481. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  482. package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
  483. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  484. package/lib/simple-tree/node-kinds/object/index.js +1 -1
  485. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  486. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -7
  487. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  488. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -16
  489. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  490. package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
  491. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  492. package/lib/simple-tree/prepareForInsertion.js +11 -5
  493. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  494. package/lib/simple-tree/toStoredSchema.d.ts +3 -0
  495. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  496. package/lib/simple-tree/toStoredSchema.js +3 -0
  497. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  498. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  499. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  500. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  501. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  502. package/lib/simple-tree/walkFieldSchema.d.ts +1 -0
  503. package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
  504. package/lib/simple-tree/walkFieldSchema.js +1 -0
  505. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  506. package/package.json +23 -23
  507. package/src/codec/codec.ts +4 -3
  508. package/src/core/index.ts +2 -0
  509. package/src/core/rebase/index.ts +2 -0
  510. package/src/core/rebase/types.ts +4 -0
  511. package/src/core/schema-stored/schema.ts +2 -26
  512. package/src/core/tree/detachedFieldIndex.ts +4 -6
  513. package/src/core/tree/detachedFieldIndexCodecCommon.ts +87 -0
  514. package/src/core/tree/{detachedFieldIndexCodec.ts → detachedFieldIndexCodecV1.ts} +22 -68
  515. package/src/core/tree/detachedFieldIndexCodecV2.ts +72 -0
  516. package/src/core/tree/detachedFieldIndexCodecs.ts +44 -0
  517. package/src/core/tree/{detachedFieldIndexFormat.ts → detachedFieldIndexFormatCommon.ts} +32 -23
  518. package/src/core/tree/detachedFieldIndexFormatV1.ts +15 -0
  519. package/src/core/tree/detachedFieldIndexFormatV2.ts +17 -0
  520. package/src/feature-libraries/chunked-forest/codec/README.md +1 -1
  521. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +25 -25
  522. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -6
  523. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +96 -73
  524. package/src/feature-libraries/chunked-forest/codec/format.ts +20 -14
  525. package/src/feature-libraries/chunked-forest/codec/{nodeShape.ts → nodeEncoder.ts} +23 -17
  526. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +34 -34
  527. package/src/feature-libraries/chunked-forest/codec/uncompressedEncode.ts +5 -5
  528. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +10 -0
  529. package/src/feature-libraries/default-schema/defaultSchema.ts +0 -2
  530. package/src/feature-libraries/default-schema/index.ts +1 -1
  531. package/src/feature-libraries/default-schema/schemaChecker.ts +47 -30
  532. package/src/feature-libraries/index.ts +1 -18
  533. package/src/feature-libraries/modular-schema/comparison.ts +14 -33
  534. package/src/feature-libraries/modular-schema/index.ts +0 -17
  535. package/src/feature-libraries/object-forest/objectForest.ts +10 -6
  536. package/src/index.ts +5 -0
  537. package/src/packageVersion.ts +1 -1
  538. package/src/shared-tree/independentView.ts +45 -19
  539. package/src/shared-tree/schematizeTree.ts +3 -3
  540. package/src/shared-tree/schematizingTreeView.ts +17 -17
  541. package/src/shared-tree/sharedTree.ts +2 -42
  542. package/src/shared-tree/tree.ts +1 -1
  543. package/src/shared-tree/treeAlpha.ts +30 -18
  544. package/src/shared-tree/treeCheckout.ts +55 -11
  545. package/src/shared-tree-core/branch.ts +1 -6
  546. package/src/simple-tree/api/conciseTree.ts +9 -7
  547. package/src/simple-tree/api/configuration.ts +8 -2
  548. package/src/simple-tree/api/create.ts +49 -36
  549. package/src/simple-tree/api/customTree.ts +59 -20
  550. package/src/simple-tree/api/discrepancies.ts +473 -0
  551. package/src/simple-tree/api/schemaCompatibilityTester.ts +28 -242
  552. package/src/simple-tree/api/schemaCreationUtilities.ts +5 -2
  553. package/src/simple-tree/api/schemaFactory.ts +7 -4
  554. package/src/simple-tree/api/storedSchema.ts +6 -10
  555. package/src/simple-tree/api/treeBeta.ts +17 -4
  556. package/src/simple-tree/api/verboseTree.ts +17 -8
  557. package/src/simple-tree/core/allowedTypes.ts +54 -21
  558. package/src/simple-tree/core/context.ts +24 -22
  559. package/src/simple-tree/core/index.ts +2 -1
  560. package/src/simple-tree/core/treeNodeKernel.ts +1 -1
  561. package/src/simple-tree/core/treeNodeValid.ts +9 -2
  562. package/src/simple-tree/core/walkSchema.ts +3 -0
  563. package/src/simple-tree/createContext.ts +6 -1
  564. package/src/simple-tree/fieldSchema.ts +1 -0
  565. package/src/simple-tree/index.ts +6 -3
  566. package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -19
  567. package/src/simple-tree/node-kinds/index.ts +1 -1
  568. package/src/simple-tree/node-kinds/object/index.ts +1 -1
  569. package/src/simple-tree/node-kinds/object/objectNode.ts +9 -27
  570. package/src/simple-tree/prepareForInsertion.ts +17 -9
  571. package/src/simple-tree/toStoredSchema.ts +3 -0
  572. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +6 -2
  573. package/src/simple-tree/walkFieldSchema.ts +1 -0
  574. package/dist/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  575. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  576. package/dist/core/tree/detachedFieldIndexCodec.js +0 -100
  577. package/dist/core/tree/detachedFieldIndexCodec.js.map +0 -1
  578. package/dist/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  579. package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  580. package/dist/core/tree/detachedFieldIndexFormat.js.map +0 -1
  581. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  582. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  583. package/dist/feature-libraries/initializeForest.d.ts +0 -18
  584. package/dist/feature-libraries/initializeForest.d.ts.map +0 -1
  585. package/dist/feature-libraries/initializeForest.js +0 -35
  586. package/dist/feature-libraries/initializeForest.js.map +0 -1
  587. package/dist/feature-libraries/modular-schema/discrepancies.d.ts +0 -174
  588. package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +0 -1
  589. package/dist/feature-libraries/modular-schema/discrepancies.js +0 -361
  590. package/dist/feature-libraries/modular-schema/discrepancies.js.map +0 -1
  591. package/lib/core/tree/detachedFieldIndexCodec.d.ts +0 -11
  592. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
  593. package/lib/core/tree/detachedFieldIndexCodec.js +0 -96
  594. package/lib/core/tree/detachedFieldIndexCodec.js.map +0 -1
  595. package/lib/core/tree/detachedFieldIndexFormat.d.ts +0 -33
  596. package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
  597. package/lib/core/tree/detachedFieldIndexFormat.js.map +0 -1
  598. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
  599. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
  600. package/lib/feature-libraries/initializeForest.d.ts +0 -18
  601. package/lib/feature-libraries/initializeForest.d.ts.map +0 -1
  602. package/lib/feature-libraries/initializeForest.js +0 -31
  603. package/lib/feature-libraries/initializeForest.js.map +0 -1
  604. package/lib/feature-libraries/modular-schema/discrepancies.d.ts +0 -174
  605. package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +0 -1
  606. package/lib/feature-libraries/modular-schema/discrepancies.js +0 -354
  607. package/lib/feature-libraries/modular-schema/discrepancies.js.map +0 -1
  608. package/src/feature-libraries/initializeForest.ts +0 -55
  609. package/src/feature-libraries/modular-schema/discrepancies.ts +0 -567
@@ -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
  }
@@ -84,22 +84,7 @@ export {
84
84
  type FieldChangeEncodingContext,
85
85
  type FieldKindConfiguration,
86
86
  type FieldKindConfigurationEntry,
87
- getAllowedContentDiscrepancies,
88
- isRepoSuperset,
89
- type AllowedTypeDiscrepancy,
90
- type FieldKindDiscrepancy,
91
- type ValueSchemaDiscrepancy,
92
- type FieldDiscrepancy,
93
- type NodeDiscrepancy,
94
- type NodeKindDiscrepancy,
95
- type NodeFieldsDiscrepancy,
96
87
  isNeverTree,
97
- type LinearExtension,
98
- type Realizer,
99
- fieldRealizer,
100
- PosetComparisonResult,
101
- comparePosetElements,
102
- posetLte,
103
88
  } from "./modular-schema/index.js";
104
89
 
105
90
  export { mapRootChanges } from "./deltaUtils.js";
@@ -151,7 +136,7 @@ export {
151
136
  SchemaValidationError,
152
137
  isNodeInSchema,
153
138
  isFieldInSchema,
154
- inSchemaOrThrow,
139
+ throwOutOfSchema,
155
140
  } from "./default-schema/index.js";
156
141
 
157
142
  export {
@@ -208,5 +193,3 @@ export {
208
193
  type TreeIndexKey,
209
194
  type TreeIndexNodes,
210
195
  } from "./indexing/index.js";
211
-
212
- export { initializeForest } from "./initializeForest.js";
@@ -22,12 +22,8 @@ import type { FullSchemaPolicy } from "./fieldKind.js";
22
22
  import { withEditor } from "./fieldKindWithEditor.js";
23
23
  import { isNeverTree } from "./isNeverTree.js";
24
24
 
25
- // TODO:
26
- // The comparisons in this file seem redundant with those in discrepancies.ts.
27
- // Rather than both existing, one of which just returns boolean and the other which returns additional details, a simple comparison which returns everything needed should be used.
28
-
29
25
  /**
30
- * @returns true iff `superset` is a superset of `original`.
26
+ * Returns true iff `superset` is a superset of `original`.
31
27
  *
32
28
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
33
29
  *
@@ -69,12 +65,7 @@ export function allowsTreeSuperset(
69
65
 
70
66
  if (original instanceof MapNodeStoredSchema) {
71
67
  if (superset instanceof MapNodeStoredSchema) {
72
- return allowsFieldSuperset(
73
- policy,
74
- originalData,
75
- normalizeField(original.mapFields),
76
- normalizeField(superset.mapFields),
77
- );
68
+ return allowsFieldSuperset(policy, originalData, original.mapFields, superset.mapFields);
78
69
  }
79
70
  return false;
80
71
  }
@@ -82,14 +73,7 @@ export function allowsTreeSuperset(
82
73
  assert(original instanceof ObjectNodeStoredSchema, 0x895 /* unsupported node kind */);
83
74
  if (superset instanceof MapNodeStoredSchema) {
84
75
  for (const [_key, field] of original.objectNodeFields) {
85
- if (
86
- !allowsFieldSuperset(
87
- policy,
88
- originalData,
89
- normalizeField(field),
90
- normalizeField(superset.mapFields),
91
- )
92
- ) {
76
+ if (!allowsFieldSuperset(policy, originalData, field, superset.mapFields)) {
93
77
  return false;
94
78
  }
95
79
  }
@@ -106,13 +90,13 @@ export function allowsTreeSuperset(
106
90
  originalData,
107
91
  original.objectNodeFields.get(originalField) ??
108
92
  fail(0xb17 /* missing expected field */),
109
- normalizeField(undefined),
93
+ storedEmptyFieldSchema,
110
94
  ),
111
95
  bExtra: (supersetField) =>
112
96
  allowsFieldSuperset(
113
97
  policy,
114
98
  originalData,
115
- normalizeField(undefined),
99
+ storedEmptyFieldSchema,
116
100
  superset.objectNodeFields.get(supersetField) ??
117
101
  fail(0xb18 /* missing expected field */),
118
102
  ),
@@ -127,7 +111,7 @@ export function allowsTreeSuperset(
127
111
  }
128
112
 
129
113
  /**
130
- * @returns true iff `superset` is a superset of `original`.
114
+ * Returns true iff `superset` is a superset of `original`.
131
115
  *
132
116
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
133
117
  */
@@ -139,7 +123,7 @@ export function allowsValueSuperset(
139
123
  }
140
124
 
141
125
  /**
142
- * @returns true iff `superset` is a superset of `original`.
126
+ * Returns true iff `superset` is a superset of `original`.
143
127
  *
144
128
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
145
129
  */
@@ -155,7 +139,7 @@ export function allowsFieldSuperset(
155
139
  }
156
140
 
157
141
  /**
158
- * @returns true iff `superset` is a superset of `original`.
142
+ * Returns true iff `superset` is a superset of `original`.
159
143
  *
160
144
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
161
145
  */
@@ -172,7 +156,7 @@ export function allowsTreeSchemaIdentifierSuperset(
172
156
  }
173
157
 
174
158
  /**
175
- * @returns true iff `superset` is a superset of `original`.
159
+ * Returns true iff `superset` is a superset of `original`.
176
160
  *
177
161
  * This does not require a strict (aka proper) superset: equivalent schema will return true.
178
162
  *
@@ -186,7 +170,6 @@ export function allowsRepoSuperset(
186
170
  superset: TreeStoredSchema,
187
171
  ): boolean {
188
172
  {
189
- // TODO: I think its ok to use the field from superset here, but I should confirm it is, and document why.
190
173
  if (
191
174
  !allowsFieldSuperset(
192
175
  policy,
@@ -198,17 +181,15 @@ export function allowsRepoSuperset(
198
181
  return false;
199
182
  }
200
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.
201
187
  for (const [key, schema] of original.nodeSchema) {
202
- // TODO: I think its ok to use the tree from superset here, but I should confirm it is, and document why.
203
188
  if (!allowsTreeSuperset(policy, original, schema, superset.nodeSchema.get(key))) {
204
189
  return false;
205
190
  }
206
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.
207
194
  return true;
208
195
  }
209
-
210
- export function normalizeField(
211
- schema: TreeFieldStoredSchema | undefined,
212
- ): TreeFieldStoredSchema {
213
- return schema ?? storedEmptyFieldSchema;
214
- }