@fluidframework/tree 2.63.0-359461 → 2.63.0-359962

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 (510) hide show
  1. package/.mocharc.cjs +9 -1
  2. package/api-report/tree.alpha.api.md +126 -96
  3. package/api-report/tree.beta.api.md +37 -2
  4. package/api-report/tree.legacy.beta.api.md +37 -2
  5. package/api-report/tree.legacy.public.api.md +9 -2
  6. package/api-report/tree.public.api.md +9 -2
  7. package/dist/alpha.d.ts +18 -13
  8. package/dist/beta.d.ts +5 -0
  9. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts +67 -13
  10. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  11. package/dist/feature-libraries/chunked-forest/chunkTree.js +70 -35
  12. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  13. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +5 -5
  14. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  15. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  16. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +23 -0
  17. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -0
  18. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js +15 -0
  19. package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -0
  20. package/dist/feature-libraries/chunked-forest/codec/index.d.ts +1 -0
  21. package/dist/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
  22. package/dist/feature-libraries/chunked-forest/codec/index.js +3 -1
  23. package/dist/feature-libraries/chunked-forest/codec/index.js.map +1 -1
  24. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  25. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +3 -2
  26. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  27. package/dist/feature-libraries/chunked-forest/index.d.ts +1 -1
  28. package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  29. package/dist/feature-libraries/chunked-forest/index.js +2 -1
  30. package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
  31. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -1
  32. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  33. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  34. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +3 -3
  35. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  36. package/dist/feature-libraries/forest-summary/forestSummarizer.js +3 -3
  37. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  38. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +4 -11
  39. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  40. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +2 -6
  41. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  42. package/dist/feature-libraries/index.d.ts +1 -1
  43. package/dist/feature-libraries/index.d.ts.map +1 -1
  44. package/dist/feature-libraries/index.js +2 -1
  45. package/dist/feature-libraries/index.js.map +1 -1
  46. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  47. package/dist/feature-libraries/treeCursorUtils.js +17 -15
  48. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  49. package/dist/index.d.ts +1 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/jsonDomainSchema.d.ts +5 -5
  53. package/dist/jsonDomainSchema.js +5 -5
  54. package/dist/jsonDomainSchema.js.map +1 -1
  55. package/dist/legacy.d.ts +5 -0
  56. package/dist/packageVersion.d.ts +1 -1
  57. package/dist/packageVersion.js +1 -1
  58. package/dist/packageVersion.js.map +1 -1
  59. package/dist/public.d.ts +1 -0
  60. package/dist/serializableDomainSchema.d.ts +6 -6
  61. package/dist/serializableDomainSchema.js +5 -5
  62. package/dist/serializableDomainSchema.js.map +1 -1
  63. package/dist/shared-tree/independentView.d.ts.map +1 -1
  64. package/dist/shared-tree/independentView.js +2 -2
  65. package/dist/shared-tree/independentView.js.map +1 -1
  66. package/dist/shared-tree/schematizingTreeView.d.ts +5 -0
  67. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  68. package/dist/shared-tree/schematizingTreeView.js +38 -8
  69. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  70. package/dist/shared-tree/sharedTree.d.ts +6 -8
  71. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  72. package/dist/shared-tree/sharedTree.js +6 -8
  73. package/dist/shared-tree/sharedTree.js.map +1 -1
  74. package/dist/shared-tree/tree.js +1 -1
  75. package/dist/shared-tree/tree.js.map +1 -1
  76. package/dist/shared-tree/treeAlpha.d.ts +20 -28
  77. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  78. package/dist/shared-tree/treeAlpha.js +6 -31
  79. package/dist/shared-tree/treeAlpha.js.map +1 -1
  80. package/dist/simple-tree/api/conciseTree.d.ts +1 -1
  81. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  82. package/dist/simple-tree/api/configuration.d.ts +0 -3
  83. package/dist/simple-tree/api/configuration.d.ts.map +1 -1
  84. package/dist/simple-tree/api/configuration.js +1 -4
  85. package/dist/simple-tree/api/configuration.js.map +1 -1
  86. package/dist/simple-tree/api/customTree.d.ts +7 -7
  87. package/dist/simple-tree/api/customTree.js +5 -5
  88. package/dist/simple-tree/api/customTree.js.map +1 -1
  89. package/dist/simple-tree/api/discrepancies.js +2 -2
  90. package/dist/simple-tree/api/discrepancies.js.map +1 -1
  91. package/dist/simple-tree/api/index.d.ts +3 -3
  92. package/dist/simple-tree/api/index.d.ts.map +1 -1
  93. package/dist/simple-tree/api/index.js +4 -1
  94. package/dist/simple-tree/api/index.js.map +1 -1
  95. package/dist/simple-tree/api/schemaFactory.d.ts +12 -4
  96. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  97. package/dist/simple-tree/api/schemaFactory.js +3 -8
  98. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  99. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +64 -28
  100. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  101. package/dist/simple-tree/api/schemaFactoryAlpha.js +42 -11
  102. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  103. package/dist/simple-tree/api/schemaFactoryBeta.d.ts +13 -2
  104. package/dist/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  105. package/dist/simple-tree/api/schemaFactoryBeta.js +14 -0
  106. package/dist/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  107. package/dist/simple-tree/api/schemaStatics.d.ts +9 -14
  108. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -1
  109. package/dist/simple-tree/api/schemaStatics.js +12 -12
  110. package/dist/simple-tree/api/schemaStatics.js.map +1 -1
  111. package/dist/simple-tree/api/storedSchema.d.ts +2 -2
  112. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  113. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  114. package/dist/simple-tree/api/tree.d.ts +3 -3
  115. package/dist/simple-tree/api/tree.js.map +1 -1
  116. package/dist/simple-tree/api/treeBeta.d.ts +52 -2
  117. package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
  118. package/dist/simple-tree/api/treeBeta.js +37 -2
  119. package/dist/simple-tree/api/treeBeta.js.map +1 -1
  120. package/dist/simple-tree/api/treeNodeApi.js +4 -4
  121. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  122. package/dist/simple-tree/api/typesUnsafe.d.ts +60 -1
  123. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  124. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  125. package/dist/simple-tree/core/allowedTypes.d.ts +120 -62
  126. package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
  127. package/dist/simple-tree/core/allowedTypes.js +162 -84
  128. package/dist/simple-tree/core/allowedTypes.js.map +1 -1
  129. package/dist/simple-tree/core/context.d.ts +2 -2
  130. package/dist/simple-tree/core/context.d.ts.map +1 -1
  131. package/dist/simple-tree/core/context.js.map +1 -1
  132. package/dist/simple-tree/core/index.d.ts +3 -3
  133. package/dist/simple-tree/core/index.d.ts.map +1 -1
  134. package/dist/simple-tree/core/index.js +5 -4
  135. package/dist/simple-tree/core/index.js.map +1 -1
  136. package/dist/simple-tree/core/toStored.d.ts +3 -3
  137. package/dist/simple-tree/core/toStored.d.ts.map +1 -1
  138. package/dist/simple-tree/core/toStored.js +2 -2
  139. package/dist/simple-tree/core/toStored.js.map +1 -1
  140. package/dist/simple-tree/core/treeNode.d.ts +1 -1
  141. package/dist/simple-tree/core/treeNode.js +1 -1
  142. package/dist/simple-tree/core/treeNode.js.map +1 -1
  143. package/dist/simple-tree/core/treeNodeKernel.d.ts +7 -11
  144. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  145. package/dist/simple-tree/core/treeNodeKernel.js +24 -47
  146. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  147. package/dist/simple-tree/core/treeNodeSchema.d.ts +3 -3
  148. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  149. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  150. package/dist/simple-tree/core/treeNodeValid.d.ts +2 -2
  151. package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  152. package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
  153. package/dist/simple-tree/core/walkSchema.d.ts +3 -3
  154. package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
  155. package/dist/simple-tree/core/walkSchema.js +1 -1
  156. package/dist/simple-tree/core/walkSchema.js.map +1 -1
  157. package/dist/simple-tree/createContext.js +2 -2
  158. package/dist/simple-tree/createContext.js.map +1 -1
  159. package/dist/simple-tree/fieldSchema.d.ts +9 -32
  160. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  161. package/dist/simple-tree/fieldSchema.js +12 -20
  162. package/dist/simple-tree/fieldSchema.js.map +1 -1
  163. package/dist/simple-tree/getTreeNodeForField.js +1 -1
  164. package/dist/simple-tree/getTreeNodeForField.js.map +1 -1
  165. package/dist/simple-tree/index.d.ts +4 -4
  166. package/dist/simple-tree/index.d.ts.map +1 -1
  167. package/dist/simple-tree/index.js +7 -3
  168. package/dist/simple-tree/index.js.map +1 -1
  169. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +2 -2
  170. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  171. package/dist/simple-tree/node-kinds/array/arrayNode.js +7 -8
  172. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  173. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
  174. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
  175. package/dist/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
  176. package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
  177. package/dist/simple-tree/node-kinds/common.js +2 -2
  178. package/dist/simple-tree/node-kinds/common.js.map +1 -1
  179. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  180. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  181. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  182. package/dist/simple-tree/node-kinds/map/mapNode.d.ts +2 -2
  183. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  184. package/dist/simple-tree/node-kinds/map/mapNode.js +5 -5
  185. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  186. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
  187. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  188. package/dist/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  189. package/dist/simple-tree/node-kinds/object/index.d.ts +2 -2
  190. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  191. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  192. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +5 -18
  193. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  194. package/dist/simple-tree/node-kinds/object/objectNode.js +8 -18
  195. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  196. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +4 -11
  197. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  198. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  199. package/dist/simple-tree/node-kinds/record/recordNode.d.ts +3 -3
  200. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  201. package/dist/simple-tree/node-kinds/record/recordNode.js +9 -9
  202. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  203. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +5 -5
  204. package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
  205. package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
  206. package/dist/simple-tree/prepareForInsertion.d.ts +39 -7
  207. package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
  208. package/dist/simple-tree/prepareForInsertion.js +43 -15
  209. package/dist/simple-tree/prepareForInsertion.js.map +1 -1
  210. package/dist/simple-tree/toStoredSchema.d.ts +8 -8
  211. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  212. package/dist/simple-tree/toStoredSchema.js +5 -5
  213. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  214. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  215. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  216. package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  217. package/dist/simple-tree/unsafeUnknownSchema.d.ts.map +1 -1
  218. package/dist/simple-tree/unsafeUnknownSchema.js.map +1 -1
  219. package/dist/simple-tree/walkFieldSchema.js +1 -1
  220. package/dist/simple-tree/walkFieldSchema.js.map +1 -1
  221. package/dist/tableSchema.d.ts +19 -19
  222. package/dist/tableSchema.d.ts.map +1 -1
  223. package/dist/tableSchema.js +2 -2
  224. package/dist/tableSchema.js.map +1 -1
  225. package/lib/alpha.d.ts +18 -13
  226. package/lib/beta.d.ts +5 -0
  227. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts +67 -13
  228. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  229. package/lib/feature-libraries/chunked-forest/chunkTree.js +68 -32
  230. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  231. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +5 -5
  232. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  233. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  234. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +23 -0
  235. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -0
  236. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js +11 -0
  237. package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -0
  238. package/lib/feature-libraries/chunked-forest/codec/index.d.ts +1 -0
  239. package/lib/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
  240. package/lib/feature-libraries/chunked-forest/codec/index.js +1 -0
  241. package/lib/feature-libraries/chunked-forest/codec/index.js.map +1 -1
  242. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  243. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +3 -2
  244. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  245. package/lib/feature-libraries/chunked-forest/index.d.ts +1 -1
  246. package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  247. package/lib/feature-libraries/chunked-forest/index.js +1 -1
  248. package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
  249. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -1
  250. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  251. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  252. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +3 -3
  253. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  254. package/lib/feature-libraries/forest-summary/forestSummarizer.js +3 -3
  255. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  256. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +4 -11
  257. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  258. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +2 -6
  259. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  260. package/lib/feature-libraries/index.d.ts +1 -1
  261. package/lib/feature-libraries/index.d.ts.map +1 -1
  262. package/lib/feature-libraries/index.js +1 -1
  263. package/lib/feature-libraries/index.js.map +1 -1
  264. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  265. package/lib/feature-libraries/treeCursorUtils.js +17 -15
  266. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  267. package/lib/index.d.ts +1 -1
  268. package/lib/index.d.ts.map +1 -1
  269. package/lib/index.js.map +1 -1
  270. package/lib/jsonDomainSchema.d.ts +5 -5
  271. package/lib/jsonDomainSchema.js +5 -5
  272. package/lib/jsonDomainSchema.js.map +1 -1
  273. package/lib/legacy.d.ts +5 -0
  274. package/lib/packageVersion.d.ts +1 -1
  275. package/lib/packageVersion.js +1 -1
  276. package/lib/packageVersion.js.map +1 -1
  277. package/lib/public.d.ts +1 -0
  278. package/lib/serializableDomainSchema.d.ts +6 -6
  279. package/lib/serializableDomainSchema.js +5 -5
  280. package/lib/serializableDomainSchema.js.map +1 -1
  281. package/lib/shared-tree/independentView.d.ts.map +1 -1
  282. package/lib/shared-tree/independentView.js +3 -3
  283. package/lib/shared-tree/independentView.js.map +1 -1
  284. package/lib/shared-tree/schematizingTreeView.d.ts +5 -0
  285. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  286. package/lib/shared-tree/schematizingTreeView.js +41 -11
  287. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  288. package/lib/shared-tree/sharedTree.d.ts +6 -8
  289. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  290. package/lib/shared-tree/sharedTree.js +7 -9
  291. package/lib/shared-tree/sharedTree.js.map +1 -1
  292. package/lib/shared-tree/tree.js +2 -2
  293. package/lib/shared-tree/tree.js.map +1 -1
  294. package/lib/shared-tree/treeAlpha.d.ts +20 -28
  295. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  296. package/lib/shared-tree/treeAlpha.js +5 -30
  297. package/lib/shared-tree/treeAlpha.js.map +1 -1
  298. package/lib/simple-tree/api/conciseTree.d.ts +1 -1
  299. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  300. package/lib/simple-tree/api/configuration.d.ts +0 -3
  301. package/lib/simple-tree/api/configuration.d.ts.map +1 -1
  302. package/lib/simple-tree/api/configuration.js +2 -5
  303. package/lib/simple-tree/api/configuration.js.map +1 -1
  304. package/lib/simple-tree/api/customTree.d.ts +7 -7
  305. package/lib/simple-tree/api/customTree.js +5 -5
  306. package/lib/simple-tree/api/customTree.js.map +1 -1
  307. package/lib/simple-tree/api/discrepancies.js +3 -3
  308. package/lib/simple-tree/api/discrepancies.js.map +1 -1
  309. package/lib/simple-tree/api/index.d.ts +3 -3
  310. package/lib/simple-tree/api/index.d.ts.map +1 -1
  311. package/lib/simple-tree/api/index.js +1 -1
  312. package/lib/simple-tree/api/index.js.map +1 -1
  313. package/lib/simple-tree/api/schemaFactory.d.ts +12 -4
  314. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  315. package/lib/simple-tree/api/schemaFactory.js +3 -8
  316. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  317. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +64 -28
  318. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  319. package/lib/simple-tree/api/schemaFactoryAlpha.js +43 -12
  320. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  321. package/lib/simple-tree/api/schemaFactoryBeta.d.ts +13 -2
  322. package/lib/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  323. package/lib/simple-tree/api/schemaFactoryBeta.js +16 -2
  324. package/lib/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  325. package/lib/simple-tree/api/schemaStatics.d.ts +9 -14
  326. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -1
  327. package/lib/simple-tree/api/schemaStatics.js +12 -12
  328. package/lib/simple-tree/api/schemaStatics.js.map +1 -1
  329. package/lib/simple-tree/api/storedSchema.d.ts +2 -2
  330. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  331. package/lib/simple-tree/api/storedSchema.js +1 -1
  332. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  333. package/lib/simple-tree/api/tree.d.ts +3 -3
  334. package/lib/simple-tree/api/tree.js.map +1 -1
  335. package/lib/simple-tree/api/treeBeta.d.ts +52 -2
  336. package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
  337. package/lib/simple-tree/api/treeBeta.js +34 -2
  338. package/lib/simple-tree/api/treeBeta.js.map +1 -1
  339. package/lib/simple-tree/api/treeNodeApi.js +5 -5
  340. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  341. package/lib/simple-tree/api/typesUnsafe.d.ts +60 -1
  342. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  343. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  344. package/lib/simple-tree/core/allowedTypes.d.ts +120 -62
  345. package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
  346. package/lib/simple-tree/core/allowedTypes.js +158 -80
  347. package/lib/simple-tree/core/allowedTypes.js.map +1 -1
  348. package/lib/simple-tree/core/context.d.ts +2 -2
  349. package/lib/simple-tree/core/context.d.ts.map +1 -1
  350. package/lib/simple-tree/core/context.js.map +1 -1
  351. package/lib/simple-tree/core/index.d.ts +3 -3
  352. package/lib/simple-tree/core/index.d.ts.map +1 -1
  353. package/lib/simple-tree/core/index.js +2 -2
  354. package/lib/simple-tree/core/index.js.map +1 -1
  355. package/lib/simple-tree/core/toStored.d.ts +3 -3
  356. package/lib/simple-tree/core/toStored.d.ts.map +1 -1
  357. package/lib/simple-tree/core/toStored.js +3 -3
  358. package/lib/simple-tree/core/toStored.js.map +1 -1
  359. package/lib/simple-tree/core/treeNode.d.ts +1 -1
  360. package/lib/simple-tree/core/treeNode.js +1 -1
  361. package/lib/simple-tree/core/treeNode.js.map +1 -1
  362. package/lib/simple-tree/core/treeNodeKernel.d.ts +7 -11
  363. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  364. package/lib/simple-tree/core/treeNodeKernel.js +23 -46
  365. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  366. package/lib/simple-tree/core/treeNodeSchema.d.ts +3 -3
  367. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  368. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  369. package/lib/simple-tree/core/treeNodeValid.d.ts +2 -2
  370. package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
  371. package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
  372. package/lib/simple-tree/core/walkSchema.d.ts +3 -3
  373. package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
  374. package/lib/simple-tree/core/walkSchema.js +2 -2
  375. package/lib/simple-tree/core/walkSchema.js.map +1 -1
  376. package/lib/simple-tree/createContext.js +3 -3
  377. package/lib/simple-tree/createContext.js.map +1 -1
  378. package/lib/simple-tree/fieldSchema.d.ts +9 -32
  379. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  380. package/lib/simple-tree/fieldSchema.js +13 -21
  381. package/lib/simple-tree/fieldSchema.js.map +1 -1
  382. package/lib/simple-tree/getTreeNodeForField.js +1 -1
  383. package/lib/simple-tree/getTreeNodeForField.js.map +1 -1
  384. package/lib/simple-tree/index.d.ts +4 -4
  385. package/lib/simple-tree/index.d.ts.map +1 -1
  386. package/lib/simple-tree/index.js +2 -2
  387. package/lib/simple-tree/index.js.map +1 -1
  388. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +2 -2
  389. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  390. package/lib/simple-tree/node-kinds/array/arrayNode.js +8 -9
  391. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  392. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
  393. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
  394. package/lib/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
  395. package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
  396. package/lib/simple-tree/node-kinds/common.js +3 -3
  397. package/lib/simple-tree/node-kinds/common.js.map +1 -1
  398. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  399. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  400. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  401. package/lib/simple-tree/node-kinds/map/mapNode.d.ts +2 -2
  402. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  403. package/lib/simple-tree/node-kinds/map/mapNode.js +6 -6
  404. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  405. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
  406. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  407. package/lib/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  408. package/lib/simple-tree/node-kinds/object/index.d.ts +2 -2
  409. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  410. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  411. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +5 -18
  412. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  413. package/lib/simple-tree/node-kinds/object/objectNode.js +9 -18
  414. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  415. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +4 -11
  416. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  417. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  418. package/lib/simple-tree/node-kinds/record/recordNode.d.ts +3 -3
  419. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  420. package/lib/simple-tree/node-kinds/record/recordNode.js +10 -10
  421. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  422. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +5 -5
  423. package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
  424. package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
  425. package/lib/simple-tree/prepareForInsertion.d.ts +39 -7
  426. package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
  427. package/lib/simple-tree/prepareForInsertion.js +45 -17
  428. package/lib/simple-tree/prepareForInsertion.js.map +1 -1
  429. package/lib/simple-tree/toStoredSchema.d.ts +8 -8
  430. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  431. package/lib/simple-tree/toStoredSchema.js +5 -5
  432. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  433. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
  434. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
  435. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
  436. package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
  437. package/lib/simple-tree/unsafeUnknownSchema.d.ts.map +1 -1
  438. package/lib/simple-tree/unsafeUnknownSchema.js.map +1 -1
  439. package/lib/simple-tree/walkFieldSchema.js +1 -1
  440. package/lib/simple-tree/walkFieldSchema.js.map +1 -1
  441. package/lib/tableSchema.d.ts +19 -19
  442. package/lib/tableSchema.d.ts.map +1 -1
  443. package/lib/tableSchema.js +2 -2
  444. package/lib/tableSchema.js.map +1 -1
  445. package/package.json +23 -21
  446. package/src/feature-libraries/chunked-forest/chunkTree.ts +112 -45
  447. package/src/feature-libraries/chunked-forest/codec/codecs.ts +4 -9
  448. package/src/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.ts +33 -0
  449. package/src/feature-libraries/chunked-forest/codec/index.ts +4 -0
  450. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +4 -7
  451. package/src/feature-libraries/chunked-forest/index.ts +2 -0
  452. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +1 -1
  453. package/src/feature-libraries/forest-summary/forestSummarizer.ts +8 -12
  454. package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +3 -12
  455. package/src/feature-libraries/index.ts +2 -0
  456. package/src/feature-libraries/treeCursorUtils.ts +34 -19
  457. package/src/index.ts +14 -10
  458. package/src/jsonDomainSchema.ts +5 -5
  459. package/src/packageVersion.ts +1 -1
  460. package/src/serializableDomainSchema.ts +6 -6
  461. package/src/shared-tree/independentView.ts +3 -0
  462. package/src/shared-tree/schematizingTreeView.ts +58 -9
  463. package/src/shared-tree/sharedTree.ts +33 -20
  464. package/src/shared-tree/tree.ts +2 -2
  465. package/src/shared-tree/treeAlpha.ts +35 -84
  466. package/src/simple-tree/api/conciseTree.ts +1 -1
  467. package/src/simple-tree/api/configuration.ts +3 -7
  468. package/src/simple-tree/api/customTree.ts +7 -7
  469. package/src/simple-tree/api/discrepancies.ts +3 -3
  470. package/src/simple-tree/api/index.ts +17 -2
  471. package/src/simple-tree/api/schemaFactory.ts +18 -73
  472. package/src/simple-tree/api/schemaFactoryAlpha.ts +118 -25
  473. package/src/simple-tree/api/schemaFactoryBeta.ts +76 -1
  474. package/src/simple-tree/api/schemaStatics.ts +19 -61
  475. package/src/simple-tree/api/storedSchema.ts +2 -6
  476. package/src/simple-tree/api/tree.ts +3 -3
  477. package/src/simple-tree/api/treeBeta.ts +137 -4
  478. package/src/simple-tree/api/treeNodeApi.ts +5 -5
  479. package/src/simple-tree/api/typesUnsafe.ts +81 -0
  480. package/src/simple-tree/core/TreeNodeBinding.md +14 -70
  481. package/src/simple-tree/core/allowedTypes.ts +355 -159
  482. package/src/simple-tree/core/context.ts +2 -2
  483. package/src/simple-tree/core/index.ts +11 -9
  484. package/src/simple-tree/core/toStored.ts +7 -5
  485. package/src/simple-tree/core/treeNode.ts +1 -1
  486. package/src/simple-tree/core/treeNodeKernel.ts +25 -59
  487. package/src/simple-tree/core/treeNodeSchema.ts +3 -6
  488. package/src/simple-tree/core/treeNodeValid.ts +2 -2
  489. package/src/simple-tree/core/walkSchema.ts +9 -5
  490. package/src/simple-tree/createContext.ts +3 -3
  491. package/src/simple-tree/fieldSchema.ts +24 -98
  492. package/src/simple-tree/getTreeNodeForField.ts +1 -1
  493. package/src/simple-tree/index.ts +19 -11
  494. package/src/simple-tree/node-kinds/array/arrayNode.ts +12 -17
  495. package/src/simple-tree/node-kinds/array/arrayNodeTypes.ts +7 -8
  496. package/src/simple-tree/node-kinds/common.ts +5 -3
  497. package/src/simple-tree/node-kinds/index.ts +0 -2
  498. package/src/simple-tree/node-kinds/map/mapNode.ts +8 -16
  499. package/src/simple-tree/node-kinds/map/mapNodeTypes.ts +7 -8
  500. package/src/simple-tree/node-kinds/object/index.ts +0 -2
  501. package/src/simple-tree/node-kinds/object/objectNode.ts +17 -55
  502. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +5 -19
  503. package/src/simple-tree/node-kinds/record/recordNode.ts +16 -23
  504. package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +7 -11
  505. package/src/simple-tree/prepareForInsertion.ts +92 -30
  506. package/src/simple-tree/toStoredSchema.ts +8 -9
  507. package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +2 -6
  508. package/src/simple-tree/unsafeUnknownSchema.ts +2 -3
  509. package/src/simple-tree/walkFieldSchema.ts +1 -1
  510. package/src/tableSchema.ts +24 -37
@@ -12,10 +12,8 @@ import {
12
12
  type ITreeCursorSynchronous,
13
13
  LeafNodeStoredSchema,
14
14
  ObjectNodeStoredSchema,
15
- type StoredSchemaCollection,
16
15
  type TreeFieldStoredSchema,
17
16
  type TreeNodeSchemaIdentifier,
18
- type TreeStoredSchema,
19
17
  type TreeStoredSchemaSubscription,
20
18
  type TreeValue,
21
19
  type Value,
@@ -24,6 +22,7 @@ import {
24
22
  ValueSchema,
25
23
  type TreeChunk,
26
24
  tryGetChunk,
25
+ type SchemaAndPolicy,
27
26
  } from "../../core/index.js";
28
27
  import { getOrCreate } from "../../util/index.js";
29
28
  import type { FullSchemaPolicy } from "../modular-schema/index.js";
@@ -32,6 +31,7 @@ import { isStableNodeIdentifier } from "../node-identifier/index.js";
32
31
  import { BasicChunk } from "./basicChunk.js";
33
32
  import { SequenceChunk } from "./sequenceChunk.js";
34
33
  import { type FieldShape, TreeShape, UniformChunk } from "./uniformChunk.js";
34
+ import type { IncrementalEncodingPolicy } from "./codec/index.js";
35
35
 
36
36
  export interface Disposable {
37
37
  /**
@@ -39,13 +39,13 @@ export interface Disposable {
39
39
  */
40
40
  dispose(): void;
41
41
  }
42
-
43
42
  /**
44
43
  * Creates a ChunkPolicy which responds to schema changes.
45
44
  */
46
45
  export function makeTreeChunker(
47
46
  schema: TreeStoredSchemaSubscription,
48
47
  policy: FullSchemaPolicy,
48
+ shouldEncodeIncrementally: IncrementalEncodingPolicy,
49
49
  ): IChunker {
50
50
  return new Chunker(
51
51
  schema,
@@ -53,7 +53,16 @@ export function makeTreeChunker(
53
53
  defaultChunkPolicy.sequenceChunkInlineThreshold,
54
54
  defaultChunkPolicy.sequenceChunkInlineThreshold,
55
55
  defaultChunkPolicy.uniformChunkNodeCount,
56
- tryShapeFromSchema,
56
+ (type: TreeNodeSchemaIdentifier, shapes: Map<TreeNodeSchemaIdentifier, ShapeInfo>) =>
57
+ tryShapeFromNodeSchema(
58
+ {
59
+ schema,
60
+ policy,
61
+ shouldEncodeIncrementally,
62
+ shapes,
63
+ },
64
+ type,
65
+ ),
57
66
  );
58
67
  }
59
68
 
@@ -73,7 +82,7 @@ export interface IChunker extends ChunkPolicy, Disposable {
73
82
  *
74
83
  * @remarks
75
84
  * For example, a schema transitively containing a sequence field, optional field, or allowing multiple child types will be Polymorphic.
76
- * See `tryShapeFromSchema` for how to tell if a type is Polymorphic.
85
+ * See `tryShapeFromNodeSchema` for how to tell if a type is Polymorphic.
77
86
  *
78
87
  * TODO: cache some of the possible shapes here.
79
88
  */
@@ -109,9 +118,7 @@ export class Chunker implements IChunker {
109
118
  public readonly sequenceChunkInlineThreshold: number,
110
119
  public readonly uniformChunkNodeCount: number,
111
120
  // eslint-disable-next-line @typescript-eslint/no-shadow
112
- private readonly tryShapeFromSchema: (
113
- schema: TreeStoredSchema,
114
- policy: FullSchemaPolicy,
121
+ private readonly tryShapeFromNodeSchema: (
115
122
  type: TreeNodeSchemaIdentifier,
116
123
  shapes: Map<TreeNodeSchemaIdentifier, ShapeInfo>,
117
124
  ) => ShapeInfo,
@@ -126,7 +133,7 @@ export class Chunker implements IChunker {
126
133
  this.sequenceChunkSplitThreshold,
127
134
  this.sequenceChunkInlineThreshold,
128
135
  this.uniformChunkNodeCount,
129
- this.tryShapeFromSchema,
136
+ this.tryShapeFromNodeSchema,
130
137
  );
131
138
  }
132
139
 
@@ -138,7 +145,7 @@ export class Chunker implements IChunker {
138
145
  this.unregisterSchemaCallback = this.schema.events.on("afterSchemaChange", () =>
139
146
  this.schemaChanged(),
140
147
  );
141
- return this.tryShapeFromSchema(this.schema, this.policy, schema, this.typeShapes);
148
+ return this.tryShapeFromNodeSchema(schema, this.typeShapes);
142
149
  }
143
150
 
144
151
  public dispose(): void {
@@ -226,75 +233,126 @@ export function makePolicy(policy?: Partial<ChunkPolicy>): ChunkPolicy {
226
233
  return withDefaults;
227
234
  }
228
235
 
229
- export function shapesFromSchema(
230
- schema: StoredSchemaCollection,
231
- policy: FullSchemaPolicy,
232
- ): Map<TreeNodeSchemaIdentifier, ShapeInfo> {
233
- const shapes: Map<TreeNodeSchemaIdentifier, ShapeInfo> = new Map();
234
- for (const identifier of schema.nodeSchema.keys()) {
235
- tryShapeFromSchema(schema, policy, identifier, shapes);
236
- }
237
- return shapes;
236
+ export interface ShapeFromSchemaParameters extends SchemaAndPolicy {
237
+ /**
238
+ * Policy function to determine if a field should be encoded incrementally.
239
+ * Incrementally encoding requires the subtree to not start in the middle of a larger uniform chunk.
240
+ * Thus returning true from this callback indicates that shapes should not be produced which could
241
+ *contain the incremental portion as a part of a larger shape.
242
+ */
243
+ readonly shouldEncodeIncrementally: IncrementalEncodingPolicy;
244
+ /**
245
+ * A cache for shapes which may be read and/or updated.
246
+ * As the shape is a function of the other members of `ShapeFromSchemaParameters`,
247
+ * it must be replaced or cleared if any of the properties other than this cache are modified.
248
+ */
249
+ readonly shapes: Map<TreeNodeSchemaIdentifier, ShapeInfo>;
250
+ }
251
+
252
+ /**
253
+ * A TreeFieldStoredSchema with some additional context about where it is in the tree.
254
+ */
255
+ export interface FieldSchemaWithContext {
256
+ /**
257
+ * The identifier of the specific field schema to analyze for shape uniformity.
258
+ */
259
+ readonly fieldSchema: TreeFieldStoredSchema;
260
+ /**
261
+ * The identifier of the parent node schema containing this field.
262
+ * If undefined, this is a root field.
263
+ */
264
+ readonly parentNodeSchema?: TreeNodeSchemaIdentifier;
265
+ /**
266
+ * The field key/name used to identify this field within the parent node.
267
+ */
268
+ readonly key: FieldKey;
238
269
  }
239
270
 
240
271
  /**
241
- * If `schema` has only one shape, return it.
272
+ * Analyzes a tree node schema to determine if it has a single, uniform shape that can be optimized for chunking.
273
+ * If the schema defines a tree structure with a deterministic, fixed shape (no optional fields, no sequences,
274
+ * single child types), returns a TreeShape that can be used for efficient uniform chunking. Otherwise,
275
+ * returns Polymorphic to indicate the shape varies and should use basic chunking.
276
+ *
277
+ * @param context - {@link ShapeFromSchemaParameters}.
278
+ * @param nodeSchema - The identifier of the specific node schema to analyze for shape uniformity.
279
+ * @returns TreeShape if the schema has a uniform shape, or Polymorphic if shape varies.
242
280
  *
243
- * Note that this does not tolerate optional or sequence fields, nor does it optimize for patterns of specific values.
281
+ * @remarks
282
+ * The determination here is conservative. `shouldEncodeIncrementally` is used to split up shapes so incrementally
283
+ * encoded schema are not part of larger shapes. It also does not tolerate optional or sequence fields, nor does it
284
+ * optimize for patterns of specific values.
244
285
  */
245
- export function tryShapeFromSchema(
246
- schema: StoredSchemaCollection,
247
- policy: FullSchemaPolicy,
248
- type: TreeNodeSchemaIdentifier,
249
- shapes: Map<TreeNodeSchemaIdentifier, ShapeInfo>,
286
+ export function tryShapeFromNodeSchema(
287
+ context: ShapeFromSchemaParameters,
288
+ nodeSchema: TreeNodeSchemaIdentifier,
250
289
  ): ShapeInfo {
251
- return getOrCreate(shapes, type, () => {
252
- const treeSchema = schema.nodeSchema.get(type) ?? fail(0xaf9 /* missing schema */);
290
+ const { schema, shapes } = context;
291
+ return getOrCreate(shapes, nodeSchema, () => {
292
+ const treeSchema = schema.nodeSchema.get(nodeSchema) ?? fail(0xaf9 /* missing schema */);
253
293
  if (treeSchema instanceof LeafNodeStoredSchema) {
254
294
  // Allow all string values (but only string values) to be compressed by the id compressor.
255
295
  // This allows compressing all compressible identifiers without requiring additional context to know which values could be identifiers.
256
296
  // Attempting to compress other string shouldn't have significant overhead,
257
297
  // and if any of them do end up compressing, that's a benefit not a bug.
258
298
  return treeSchema.leafValue === ValueSchema.String
259
- ? new TreeShape(type, true, [], true)
260
- : new TreeShape(type, true, [], false);
299
+ ? new TreeShape(nodeSchema, true, [], true)
300
+ : new TreeShape(nodeSchema, true, [], false);
261
301
  }
262
302
  if (treeSchema instanceof ObjectNodeStoredSchema) {
263
303
  const fieldsArray: FieldShape[] = [];
264
- for (const [key, field] of treeSchema.objectNodeFields) {
265
- const fieldShape = tryShapeFromFieldSchema(schema, policy, field, key, shapes);
304
+ for (const [key, fieldSchema] of treeSchema.objectNodeFields) {
305
+ const fieldShape = tryShapeFromFieldSchema(context, {
306
+ fieldSchema,
307
+ parentNodeSchema: nodeSchema,
308
+ key,
309
+ });
266
310
  if (fieldShape === undefined) {
267
311
  return polymorphic;
268
312
  }
269
313
  fieldsArray.push(fieldShape);
270
314
  }
271
- return new TreeShape(type, false, fieldsArray);
315
+ return new TreeShape(nodeSchema, false, fieldsArray);
272
316
  }
273
317
  return polymorphic;
274
318
  });
275
319
  }
276
320
 
277
321
  /**
278
- * If `schema` has only one shape, return it.
322
+ * Same as {@link tryShapeFromNodeSchema} but for fields with {@link FieldSchemaWithContext} instead of a nodeSchema.
279
323
  *
280
- * Note that this does not tolerate optional or sequence fields, nor does it optimize for patterns of specific values.
324
+ * @param context - {@link ShapeFromFieldSchemaParameters}.
325
+ * @param fieldSchemaWithContext - {@link FieldSchemaWithContext}.
326
+ * @returns FieldShape if the field has a uniform shape, or undefined if the field is polymorphic.
281
327
  */
282
328
  export function tryShapeFromFieldSchema(
283
- schema: StoredSchemaCollection,
284
- policy: FullSchemaPolicy,
285
- type: TreeFieldStoredSchema,
286
- key: FieldKey,
287
- shapes: Map<TreeNodeSchemaIdentifier, ShapeInfo>,
329
+ context: ShapeFromSchemaParameters,
330
+ fieldSchemaWithContext: FieldSchemaWithContext,
288
331
  ): FieldShape | undefined {
289
- const kind = policy.fieldKinds.get(type.kind) ?? fail(0xafa /* missing FieldKind */);
332
+ const { schema, policy, shouldEncodeIncrementally, shapes } = context;
333
+ const { fieldSchema, parentNodeSchema, key } = fieldSchemaWithContext;
334
+ // If this field should be encoded incrementally, use polymorphic shape so that they
335
+ // are chunked separately and can be re-used across encodings if they do not change.
336
+ if (shouldEncodeIncrementally(parentNodeSchema, key)) {
337
+ return undefined;
338
+ }
339
+ const kind = policy.fieldKinds.get(fieldSchema.kind) ?? fail(0xafa /* missing FieldKind */);
290
340
  if (kind.multiplicity !== Multiplicity.Single) {
291
341
  return undefined;
292
342
  }
293
- if (type.types?.size !== 1) {
343
+ if (fieldSchema.types?.size !== 1) {
294
344
  return undefined;
295
345
  }
296
- const childType = [...type.types][0] ?? oob();
297
- const childShape = tryShapeFromSchema(schema, policy, childType, shapes);
346
+ const childType = [...fieldSchema.types][0] ?? oob();
347
+ const childShape = tryShapeFromNodeSchema(
348
+ {
349
+ schema,
350
+ policy,
351
+ shouldEncodeIncrementally,
352
+ shapes,
353
+ },
354
+ childType,
355
+ );
298
356
  if (childShape instanceof Polymorphic) {
299
357
  return undefined;
300
358
  }
@@ -490,7 +548,16 @@ export function chunkRange(
490
548
  return output;
491
549
  }
492
550
  /**
493
- * @param idCompressor - compressor used to encoded string values that are compressible by the idCompressor for in-memory representation.
551
+ * Extracts values from the current cursor position according to the provided tree shape.
552
+ *
553
+ * Walks through the tree structure defined by the shape, extracting values from leaf nodes
554
+ * and recursively processing child fields. If an ID compressor is provided, compressible
555
+ * string values (stable node identifiers) will be recompressed for optimal storage.
556
+ *
557
+ * @param cursor - Tree cursor positioned at the node to extract values from
558
+ * @param shape - The tree shape defining the structure to extract
559
+ * @param values - Array to append the extracted values to
560
+ * @param idCompressor - Optional compressor used to encode string values that are compressible by the idCompressor for in-memory representation.
494
561
  * If the idCompressor is not provided, the values will be the original uncompressed values.
495
562
  */
496
563
  export function insertValues(
@@ -15,11 +15,9 @@ import {
15
15
  } from "../../../codec/index.js";
16
16
  import {
17
17
  CursorLocationType,
18
- type FieldKey,
19
18
  type ITreeCursorSynchronous,
20
19
  type SchemaAndPolicy,
21
20
  type TreeChunk,
22
- type TreeNodeSchemaIdentifier,
23
21
  } from "../../../core/index.js";
24
22
  import {
25
23
  brandedNumberType,
@@ -37,6 +35,7 @@ import type { FieldBatch } from "./fieldBatch.js";
37
35
  import { EncodedFieldBatch, validVersions, type FieldBatchFormatVersion } from "./format.js";
38
36
  import { schemaCompressedEncode } from "./schemaBasedEncode.js";
39
37
  import { uncompressedEncode } from "./uncompressedEncode.js";
38
+ import type { IncrementalEncodingPolicy } from "./incrementalEncodingPolicy.js";
40
39
 
41
40
  /**
42
41
  * Reference ID for a chunk that is incrementally encoded.
@@ -55,14 +54,10 @@ const ChunkReferenceId = brandedNumberType<ChunkReferenceId>({ multipleOf: 1, mi
55
54
  */
56
55
  export interface IncrementalEncoder {
57
56
  /**
58
- * Returns whether a field should be incrementally encoded.
59
- * @param nodeIdentifier - The identifier of the node containing the field.
60
- * @param fieldKey - The key of the field to check.
57
+ * Returns whether a node / field should be incrementally encoded.
58
+ * @remarks See {@link IncrementalEncodingPolicy}.
61
59
  */
62
- shouldEncodeFieldIncrementally(
63
- nodeIdentifier: TreeNodeSchemaIdentifier,
64
- fieldKey: FieldKey,
65
- ): boolean;
60
+ shouldEncodeIncrementally: IncrementalEncodingPolicy;
66
61
  /**
67
62
  * Called to encode an incremental field at the cursor.
68
63
  * The chunks for this field are encoded separately from the main buffer.
@@ -0,0 +1,33 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { FieldKey, TreeNodeSchemaIdentifier } from "../../../core/index.js";
7
+
8
+ /**
9
+ * Policy to determine whether a node / field should be incrementally encoded.
10
+ * @param nodeIdentifier - The identifier of the node containing the field.
11
+ * If undefined, the field is a root field.
12
+ * @param fieldKey - The key of the field to check.
13
+ * @returns whether the node / field should be incrementally encoded.
14
+ * @remarks
15
+ * Incremental encoding has a significant size overhead,
16
+ * but allows reuse of previously encoded unchanged subtrees.
17
+ * Thus it should only be enabled for large subtrees which are modified infrequently.
18
+ * TODO: AB#9068: Measure the actual overhead.
19
+ */
20
+ export type IncrementalEncodingPolicy = (
21
+ nodeIdentifier: TreeNodeSchemaIdentifier | undefined,
22
+ fieldKey: FieldKey,
23
+ ) => boolean;
24
+
25
+ /**
26
+ * Default policy for incremental encoding is to not encode incrementally.
27
+ */
28
+ export const defaultIncrementalEncodingPolicy: IncrementalEncodingPolicy = (
29
+ nodeIdentifier: TreeNodeSchemaIdentifier | undefined,
30
+ fieldKey: FieldKey,
31
+ ): boolean => {
32
+ return false;
33
+ };
@@ -16,3 +16,7 @@ export {
16
16
  type ChunkReferenceId,
17
17
  getCodecTreeForFieldBatchFormat,
18
18
  } from "./codecs.js";
19
+ export {
20
+ type IncrementalEncodingPolicy,
21
+ defaultIncrementalEncodingPolicy,
22
+ } from "./incrementalEncodingPolicy.js";
@@ -16,7 +16,6 @@ import {
16
16
  ValueSchema,
17
17
  Multiplicity,
18
18
  identifierFieldKindIdentifier,
19
- type FieldKey,
20
19
  } from "../../../core/index.js";
21
20
  import type { FullSchemaPolicy } from "../../modular-schema/index.js";
22
21
 
@@ -35,6 +34,7 @@ import type { FieldBatch } from "./fieldBatch.js";
35
34
  import { type EncodedFieldBatch, type EncodedValueShape, SpecialField } from "./format.js";
36
35
  import type { IncrementalEncoder } from "./codecs.js";
37
36
  import { NodeShapeBasedEncoder } from "./nodeEncoder.js";
37
+ import { defaultIncrementalEncodingPolicy } from "./incrementalEncodingPolicy.js";
38
38
 
39
39
  /**
40
40
  * Encode data from `fieldBatch` in into an `EncodedChunk`.
@@ -134,14 +134,11 @@ export function getNodeEncoder(
134
134
  // consider moving some optional and sequence fields to extra fields if they are commonly empty
135
135
  // to reduce encoded size.
136
136
 
137
- const shouldEncodeFieldIncrementallyLocal = (
138
- nodeIdentifier: TreeNodeSchemaIdentifier,
139
- fieldKey: FieldKey,
140
- ): boolean =>
141
- incrementalEncoder?.shouldEncodeFieldIncrementally(nodeIdentifier, fieldKey) ?? false;
137
+ const shouldEncodeIncrementally =
138
+ incrementalEncoder?.shouldEncodeIncrementally ?? defaultIncrementalEncodingPolicy;
142
139
  const objectNodeFields: KeyedFieldEncoder[] = [];
143
140
  for (const [key, field] of schema.objectNodeFields ?? []) {
144
- const fieldEncoder = shouldEncodeFieldIncrementallyLocal(schemaName, key)
141
+ const fieldEncoder = shouldEncodeIncrementally(schemaName, key)
145
142
  ? incrementalFieldEncoder
146
143
  : fieldBuilder.fieldEncoderFromSchema(field);
147
144
  objectNodeFields.push({
@@ -25,5 +25,7 @@ export {
25
25
  fluidVersionToFieldBatchCodecWriteVersion,
26
26
  type IncrementalEncoderDecoder,
27
27
  type ChunkReferenceId,
28
+ type IncrementalEncodingPolicy,
29
+ defaultIncrementalEncodingPolicy,
28
30
  } from "./codec/index.js";
29
31
  export { emptyChunk } from "./emptyChunk.js";
@@ -398,7 +398,7 @@ export interface FlexTreeOptionalField extends FlexTreeField {
398
398
  export type FlexTreeTypedField<Kind extends FlexFieldKind> =
399
399
  Kind extends typeof FieldKinds.sequence
400
400
  ? FlexTreeSequenceField
401
- : Kind extends typeof FieldKinds.required
401
+ : Kind extends typeof FieldKinds.required | typeof FieldKinds.identifier
402
402
  ? FlexTreeRequiredField
403
403
  : Kind extends typeof FieldKinds.optional
404
404
  ? FlexTreeOptionalField
@@ -23,7 +23,6 @@ import {
23
23
  type ITreeSubscriptionCursor,
24
24
  type RevisionTagCodec,
25
25
  TreeNavigationResult,
26
- type TreeNodeSchemaIdentifier,
27
26
  applyDelta,
28
27
  forEachField,
29
28
  makeDetachedFieldIndex,
@@ -36,7 +35,12 @@ import type {
36
35
  import { idAllocatorFromMaxId, type JsonCompatible } from "../../util/index.js";
37
36
  // eslint-disable-next-line import/no-internal-modules
38
37
  import { chunkFieldSingle, defaultChunkPolicy } from "../chunked-forest/chunkTree.js";
39
- import type { FieldBatchCodec, FieldBatchEncodingContext } from "../chunked-forest/index.js";
38
+ import {
39
+ defaultIncrementalEncodingPolicy,
40
+ type FieldBatchCodec,
41
+ type FieldBatchEncodingContext,
42
+ type IncrementalEncodingPolicy,
43
+ } from "../chunked-forest/index.js";
40
44
 
41
45
  import { type ForestCodec, makeForestSummarizerCodec } from "./codec.js";
42
46
  import {
@@ -74,23 +78,15 @@ export class ForestSummarizer implements Summarizable {
74
78
  private readonly encoderContext: FieldBatchEncodingContext,
75
79
  options: CodecWriteOptions,
76
80
  private readonly idCompressor: IIdCompressor,
77
- shouldEncodeFieldIncrementally?: (
78
- nodeIdentifier: TreeNodeSchemaIdentifier,
79
- fieldKey: FieldKey,
80
- ) => boolean,
81
+ shouldEncodeIncrementally: IncrementalEncodingPolicy = defaultIncrementalEncodingPolicy,
81
82
  ) {
82
83
  // TODO: this should take in CodecWriteOptions, and use it to pick the write version.
83
84
  this.codec = makeForestSummarizerCodec(options, fieldBatchCodec);
84
-
85
- const shouldEncodeFieldIncrementallyLocal = (
86
- nodeIdentifier: TreeNodeSchemaIdentifier,
87
- fieldKey: FieldKey,
88
- ): boolean => shouldEncodeFieldIncrementally?.(nodeIdentifier, fieldKey) ?? false;
89
85
  this.incrementalSummaryBuilder = new ForestIncrementalSummaryBuilder(
90
86
  encoderContext.encodeType ===
91
87
  TreeCompressionStrategyExtended.CompressedIncremental /* enableIncrementalSummary */,
92
88
  (cursor: ITreeCursorSynchronous) => this.forest.chunkField(cursor),
93
- shouldEncodeFieldIncrementallyLocal,
89
+ shouldEncodeIncrementally,
94
90
  );
95
91
  }
96
92
 
@@ -20,13 +20,10 @@ import type {
20
20
  ChunkReferenceId,
21
21
  EncodedFieldBatch,
22
22
  IncrementalEncoderDecoder,
23
+ IncrementalEncodingPolicy,
23
24
  TreeChunk,
24
25
  } from "../chunked-forest/index.js";
25
- import type {
26
- FieldKey,
27
- ITreeCursorSynchronous,
28
- TreeNodeSchemaIdentifier,
29
- } from "../../core/index.js";
26
+ import type { ITreeCursorSynchronous } from "../../core/index.js";
30
27
  import { SummaryType } from "@fluidframework/driver-definitions";
31
28
  import type { IChannelStorageService } from "@fluidframework/datastore-definitions/internal";
32
29
  import type { ISnapshotTree } from "@fluidframework/driver-definitions/internal";
@@ -263,13 +260,7 @@ export class ForestIncrementalSummaryBuilder implements IncrementalEncoderDecode
263
260
  public constructor(
264
261
  private readonly enableIncrementalSummary: boolean,
265
262
  private readonly getChunkAtCursor: (cursor: ITreeCursorSynchronous) => TreeChunk,
266
- /**
267
- * {@link IncrementalEncoder.shouldEncodeFieldIncrementally}
268
- */
269
- public readonly shouldEncodeFieldIncrementally: (
270
- nodeIdentifier: TreeNodeSchemaIdentifier,
271
- fieldKey: FieldKey,
272
- ) => boolean,
263
+ public readonly shouldEncodeIncrementally: IncrementalEncodingPolicy,
273
264
  ) {}
274
265
 
275
266
  /**
@@ -110,6 +110,8 @@ export {
110
110
  fluidVersionToFieldBatchCodecWriteVersion,
111
111
  type FieldBatchEncodingContext,
112
112
  emptyChunk,
113
+ type IncrementalEncodingPolicy,
114
+ defaultIncrementalEncodingPolicy,
113
115
  } from "./chunked-forest/index.js";
114
116
 
115
117
  export {
@@ -151,16 +151,14 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
151
151
  }
152
152
 
153
153
  public getFieldKey(): FieldKey {
154
- debugAssert(() =>
155
- this.mode === CursorLocationType.Fields ? true : "must be in fields mode",
156
- );
154
+ debugAssert(() => this.mode === CursorLocationType.Fields || "must be in fields mode");
157
155
  // index is kept inbounds as an invariant of the class.
158
156
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
159
157
  return (this.siblings as readonly FieldKey[])[this.index]!;
160
158
  }
161
159
 
162
160
  private getStackedFieldKey(height: number): FieldKey {
163
- assert(height % 2 === 1, 0x3b8 /* must field height */);
161
+ debugAssert(() => height % 2 === 1 || "expected odd height when in field");
164
162
  const siblingStack = this.siblingStack[height] ?? oob();
165
163
  const indexStack = this.indexStack[height] ?? oob();
166
164
  // index is kept inbounds as an invariant of the class.
@@ -169,7 +167,7 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
169
167
  }
170
168
 
171
169
  private getStackedNodeIndex(height: number): number {
172
- // assert(height % 2 === 0, "must be node height");
170
+ debugAssert(() => height % 2 === 0 || "must be node height");
173
171
  return this.indexStack[height] ?? oob();
174
172
  }
175
173
 
@@ -182,12 +180,12 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
182
180
  }
183
181
 
184
182
  public getFieldLength(): number {
185
- // assert(this.mode === CursorLocationType.Fields, "must be in fields mode");
183
+ debugAssert(() => this.mode === CursorLocationType.Fields || "must be in fields mode");
186
184
  return this.getField().length;
187
185
  }
188
186
 
189
187
  public enterNode(index: number): void {
190
- // assert(this.mode === CursorLocationType.Fields, "must be in fields mode");
188
+ debugAssert(() => this.mode === CursorLocationType.Fields || "must be in fields mode");
191
189
  const siblings = this.getField();
192
190
  if (!(index in siblings)) {
193
191
  throw new UsageError(
@@ -274,7 +272,7 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
274
272
  }
275
273
 
276
274
  public enterField(key: FieldKey): void {
277
- // assert(this.mode === CursorLocationType.Nodes, "must be in nodes mode");
275
+ debugAssert(() => this.mode === CursorLocationType.Nodes || "must be in nodes mode");
278
276
  this.siblingStack.push(this.siblings);
279
277
  this.indexStack.push(this.index);
280
278
 
@@ -303,7 +301,7 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
303
301
  }
304
302
 
305
303
  public firstField(): boolean {
306
- // assert(this.mode === CursorLocationType.Nodes, "must be in nodes mode");
304
+ debugAssert(() => this.mode === CursorLocationType.Nodes || "must be in nodes mode");
307
305
  const fields = this.adapter.keysFromNode(this.getNode());
308
306
  if (fields.length === 0) {
309
307
  return false;
@@ -317,7 +315,9 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
317
315
  }
318
316
 
319
317
  public seekNodes(offset: number): boolean {
320
- // assert(this.mode === CursorLocationType.Nodes, "can only seekNodes when in Nodes");
318
+ debugAssert(
319
+ () => this.mode === CursorLocationType.Nodes || "can only seekNodes when in Nodes",
320
+ );
321
321
  this.index += offset;
322
322
  if (this.index in this.siblings) {
323
323
  return true;
@@ -327,7 +327,9 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
327
327
  }
328
328
 
329
329
  public firstNode(): boolean {
330
- // assert(this.mode === CursorLocationType.Fields, "firstNode only allowed in fields mode");
330
+ debugAssert(
331
+ () => this.mode === CursorLocationType.Fields || "firstNode only allowed in fields mode",
332
+ );
331
333
  const nodes = this.getField();
332
334
  if (nodes.length === 0) {
333
335
  return false;
@@ -340,9 +342,8 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
340
342
  }
341
343
 
342
344
  public nextNode(): boolean {
343
- assert(
344
- this.mode === CursorLocationType.Nodes,
345
- 0x406 /* can only nextNode when in Nodes */,
345
+ debugAssert(
346
+ () => this.mode === CursorLocationType.Nodes || "can only nextNode when in Nodes",
346
347
  );
347
348
  this.index++;
348
349
  if (this.index < (this.siblings as []).length) {
@@ -353,21 +354,31 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
353
354
  }
354
355
 
355
356
  public exitField(): void {
356
- // assert(this.mode === CursorLocationType.Fields, "can only navigate up from field when in field");
357
+ debugAssert(
358
+ () =>
359
+ this.mode === CursorLocationType.Fields ||
360
+ "can only navigate up from field when in field",
361
+ );
357
362
  this.siblings =
358
363
  this.siblingStack.pop() ?? fail(0xac3 /* Unexpected siblingStack.length */);
359
364
  this.index = this.indexStack.pop() ?? fail(0xac4 /* Unexpected indexStack.length */);
360
365
  }
361
366
 
362
367
  public exitNode(): void {
363
- // assert(this.mode === CursorLocationType.Nodes, "can only navigate up from node when in node");
368
+ debugAssert(
369
+ () =>
370
+ this.mode === CursorLocationType.Nodes ||
371
+ "can only navigate up from node when in node",
372
+ );
364
373
  this.siblings =
365
374
  this.siblingStack.pop() ?? fail(0xac5 /* Unexpected siblingStack.length */);
366
375
  this.index = this.indexStack.pop() ?? fail(0xac6 /* Unexpected indexStack.length */);
367
376
  }
368
377
 
369
378
  public getNode(): TNode {
370
- // assert(this.mode === CursorLocationType.Nodes, "can only get node when in node");
379
+ debugAssert(
380
+ () => this.mode === CursorLocationType.Nodes || "can only get node when in node",
381
+ );
371
382
  // Can not use `?? oob()` since null and undefined are valid values.
372
383
  // index is kept inbounds as an invariant of the class.
373
384
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -375,7 +386,9 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
375
386
  }
376
387
 
377
388
  private getField(): Field<TNode> {
378
- // assert(this.mode === CursorLocationType.Fields, "can only get field when in fields");
389
+ debugAssert(
390
+ () => this.mode === CursorLocationType.Fields || "can only get field when in fields",
391
+ );
379
392
  const parent = this.getStackedNode(this.indexStack.length - 1);
380
393
  const key: FieldKey = this.getFieldKey();
381
394
  const field = this.adapter.getFieldFromNode(parent, key);
@@ -397,7 +410,9 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
397
410
  }
398
411
 
399
412
  public get fieldIndex(): number {
400
- // assert(this.mode === CursorLocationType.Nodes, "can only node's index when in node");
413
+ debugAssert(
414
+ () => this.mode === CursorLocationType.Nodes || "can only node's index when in node",
415
+ );
401
416
  return this.index;
402
417
  }
403
418