@fluidframework/tree 2.53.0 → 2.60.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 (424) hide show
  1. package/.eslintrc.cjs +0 -19
  2. package/.mocharc.customBenchmarks.cjs +1 -9
  3. package/CHANGELOG.md +56 -0
  4. package/api-report/tree.alpha.api.md +50 -36
  5. package/api-report/tree.beta.api.md +15 -1
  6. package/api-report/{tree.legacy.alpha.api.md → tree.legacy.beta.api.md} +5 -5
  7. package/api-report/tree.legacy.public.api.md +1 -1
  8. package/api-report/tree.public.api.md +1 -1
  9. package/dist/alpha.d.ts +8 -2
  10. package/dist/beta.d.ts +3 -0
  11. package/dist/codec/codec.d.ts +43 -6
  12. package/dist/codec/codec.d.ts.map +1 -1
  13. package/dist/codec/codec.js +22 -2
  14. package/dist/codec/codec.js.map +1 -1
  15. package/dist/codec/index.d.ts +1 -1
  16. package/dist/codec/index.d.ts.map +1 -1
  17. package/dist/codec/index.js +4 -1
  18. package/dist/codec/index.js.map +1 -1
  19. package/dist/external-utilities/index.d.ts +1 -1
  20. package/dist/external-utilities/index.d.ts.map +1 -1
  21. package/dist/external-utilities/index.js +2 -1
  22. package/dist/external-utilities/index.js.map +1 -1
  23. package/dist/external-utilities/typeboxValidator.d.ts +6 -1
  24. package/dist/external-utilities/typeboxValidator.d.ts.map +1 -1
  25. package/dist/external-utilities/typeboxValidator.js +7 -1
  26. package/dist/external-utilities/typeboxValidator.js.map +1 -1
  27. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +10 -1
  28. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  29. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +28 -5
  30. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  31. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +19 -2
  32. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  33. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +10 -2
  34. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  35. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +59 -4
  36. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  37. package/dist/feature-libraries/chunked-forest/codec/codecs.js +9 -2
  38. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  39. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +46 -8
  40. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  41. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +91 -16
  42. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  43. package/dist/feature-libraries/chunked-forest/codec/format.d.ts +14 -0
  44. package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  45. package/dist/feature-libraries/chunked-forest/codec/format.js +10 -1
  46. package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  47. package/dist/feature-libraries/chunked-forest/codec/index.d.ts +1 -1
  48. package/dist/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
  49. package/dist/feature-libraries/chunked-forest/codec/index.js.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +8 -3
  51. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +17 -6
  53. package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/index.d.ts +1 -1
  55. package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
  57. package/dist/feature-libraries/forest-summary/codec.d.ts.map +1 -1
  58. package/dist/feature-libraries/forest-summary/codec.js +3 -0
  59. package/dist/feature-libraries/forest-summary/codec.js.map +1 -1
  60. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +13 -8
  61. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  62. package/dist/feature-libraries/forest-summary/forestSummarizer.js +76 -38
  63. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  64. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +178 -0
  65. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -0
  66. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +322 -0
  67. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -0
  68. package/dist/feature-libraries/forest-summary/index.d.ts +1 -1
  69. package/dist/feature-libraries/forest-summary/index.d.ts.map +1 -1
  70. package/dist/feature-libraries/forest-summary/index.js +2 -1
  71. package/dist/feature-libraries/forest-summary/index.js.map +1 -1
  72. package/dist/feature-libraries/index.d.ts +1 -1
  73. package/dist/feature-libraries/index.d.ts.map +1 -1
  74. package/dist/feature-libraries/index.js +2 -1
  75. package/dist/feature-libraries/index.js.map +1 -1
  76. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +2 -2
  77. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  78. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
  79. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  80. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts +6 -9
  81. package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  82. package/dist/feature-libraries/treeCompressionUtils.d.ts +15 -0
  83. package/dist/feature-libraries/treeCompressionUtils.d.ts.map +1 -1
  84. package/dist/feature-libraries/treeCompressionUtils.js +16 -1
  85. package/dist/feature-libraries/treeCompressionUtils.js.map +1 -1
  86. package/dist/index.d.ts +3 -3
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +6 -2
  89. package/dist/index.js.map +1 -1
  90. package/dist/jsonDomainSchema.d.ts +1 -1
  91. package/dist/jsonDomainSchema.d.ts.map +1 -1
  92. package/dist/packageVersion.d.ts +1 -1
  93. package/dist/packageVersion.js +1 -1
  94. package/dist/packageVersion.js.map +1 -1
  95. package/dist/shared-tree/schematizingTreeView.d.ts +1 -1
  96. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  97. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  98. package/dist/shared-tree/sharedTree.d.ts +23 -6
  99. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  100. package/dist/shared-tree/sharedTree.js +4 -1
  101. package/dist/shared-tree/sharedTree.js.map +1 -1
  102. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +2 -2
  103. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  104. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  105. package/dist/shared-tree/tree.d.ts.map +1 -1
  106. package/dist/shared-tree/tree.js +3 -0
  107. package/dist/shared-tree/tree.js.map +1 -1
  108. package/dist/shared-tree/treeAlpha.d.ts +9 -11
  109. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  110. package/dist/shared-tree/treeAlpha.js.map +1 -1
  111. package/dist/shared-tree/treeCheckout.d.ts +2 -2
  112. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  113. package/dist/shared-tree/treeCheckout.js.map +1 -1
  114. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  115. package/dist/shared-tree-core/sharedTreeCore.js +13 -0
  116. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  117. package/dist/sharedTreeAttributes.d.ts +2 -2
  118. package/dist/sharedTreeAttributes.js +2 -2
  119. package/dist/sharedTreeAttributes.js.map +1 -1
  120. package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
  121. package/dist/simple-tree/api/conciseTree.js +1 -1
  122. package/dist/simple-tree/api/conciseTree.js.map +1 -1
  123. package/dist/simple-tree/api/customTree.d.ts +39 -11
  124. package/dist/simple-tree/api/customTree.d.ts.map +1 -1
  125. package/dist/simple-tree/api/customTree.js +79 -19
  126. package/dist/simple-tree/api/customTree.js.map +1 -1
  127. package/dist/simple-tree/api/getJsonSchema.d.ts +7 -2
  128. package/dist/simple-tree/api/getJsonSchema.d.ts.map +1 -1
  129. package/dist/simple-tree/api/getJsonSchema.js +1 -0
  130. package/dist/simple-tree/api/getJsonSchema.js.map +1 -1
  131. package/dist/simple-tree/api/index.d.ts +2 -1
  132. package/dist/simple-tree/api/index.d.ts.map +1 -1
  133. package/dist/simple-tree/api/index.js +4 -1
  134. package/dist/simple-tree/api/index.js.map +1 -1
  135. package/dist/simple-tree/api/schemaCreationUtilities.d.ts +1 -1
  136. package/dist/simple-tree/api/schemaCreationUtilities.js +1 -1
  137. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  138. package/dist/simple-tree/api/schemaFactory.d.ts +9 -6
  139. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  140. package/dist/simple-tree/api/schemaFactory.js +8 -7
  141. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  142. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +13 -17
  143. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  144. package/dist/simple-tree/api/schemaFactoryAlpha.js +21 -25
  145. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  146. package/dist/simple-tree/api/schemaFactoryBeta.d.ts +20 -0
  147. package/dist/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -0
  148. package/dist/simple-tree/api/schemaFactoryBeta.js +26 -0
  149. package/dist/simple-tree/api/schemaFactoryBeta.js.map +1 -0
  150. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts +0 -2
  151. package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  152. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +6 -3
  153. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  154. package/dist/simple-tree/api/transactionTypes.d.ts +1 -0
  155. package/dist/simple-tree/api/transactionTypes.d.ts.map +1 -1
  156. package/dist/simple-tree/api/transactionTypes.js.map +1 -1
  157. package/dist/simple-tree/api/tree.d.ts +68 -74
  158. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  159. package/dist/simple-tree/api/tree.js.map +1 -1
  160. package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
  161. package/dist/simple-tree/api/verboseTree.js +3 -3
  162. package/dist/simple-tree/api/verboseTree.js.map +1 -1
  163. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts +6 -0
  164. package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -1
  165. package/dist/simple-tree/core/simpleNodeSchemaBase.js.map +1 -1
  166. package/dist/simple-tree/fieldSchema.d.ts +3 -4
  167. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  168. package/dist/simple-tree/fieldSchema.js +0 -3
  169. package/dist/simple-tree/fieldSchema.js.map +1 -1
  170. package/dist/simple-tree/index.d.ts +1 -1
  171. package/dist/simple-tree/index.d.ts.map +1 -1
  172. package/dist/simple-tree/index.js +4 -2
  173. package/dist/simple-tree/index.js.map +1 -1
  174. package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  175. package/dist/simple-tree/node-kinds/record/recordNode.js +2 -3
  176. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  177. package/dist/simple-tree/simpleSchema.d.ts +12 -0
  178. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  179. package/dist/simple-tree/simpleSchema.js.map +1 -1
  180. package/dist/simple-tree/toStoredSchema.d.ts +0 -3
  181. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  182. package/dist/simple-tree/toStoredSchema.js +0 -3
  183. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  184. package/dist/tableSchema.d.ts +11 -80
  185. package/dist/tableSchema.d.ts.map +1 -1
  186. package/dist/tableSchema.js +200 -117
  187. package/dist/tableSchema.js.map +1 -1
  188. package/dist/treeFactory.d.ts +1 -2
  189. package/dist/treeFactory.d.ts.map +1 -1
  190. package/dist/treeFactory.js +1 -2
  191. package/dist/treeFactory.js.map +1 -1
  192. package/lib/alpha.d.ts +8 -2
  193. package/lib/beta.d.ts +3 -0
  194. package/lib/codec/codec.d.ts +43 -6
  195. package/lib/codec/codec.d.ts.map +1 -1
  196. package/lib/codec/codec.js +19 -1
  197. package/lib/codec/codec.js.map +1 -1
  198. package/lib/codec/index.d.ts +1 -1
  199. package/lib/codec/index.d.ts.map +1 -1
  200. package/lib/codec/index.js +1 -1
  201. package/lib/codec/index.js.map +1 -1
  202. package/lib/external-utilities/index.d.ts +1 -1
  203. package/lib/external-utilities/index.d.ts.map +1 -1
  204. package/lib/external-utilities/index.js +1 -1
  205. package/lib/external-utilities/index.js.map +1 -1
  206. package/lib/external-utilities/typeboxValidator.d.ts +6 -1
  207. package/lib/external-utilities/typeboxValidator.d.ts.map +1 -1
  208. package/lib/external-utilities/typeboxValidator.js +6 -0
  209. package/lib/external-utilities/typeboxValidator.js.map +1 -1
  210. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +10 -1
  211. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  212. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +27 -5
  213. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  214. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +19 -2
  215. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  216. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +10 -2
  217. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  218. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +59 -4
  219. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  220. package/lib/feature-libraries/chunked-forest/codec/codecs.js +10 -3
  221. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  222. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +46 -8
  223. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  224. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +87 -14
  225. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  226. package/lib/feature-libraries/chunked-forest/codec/format.d.ts +14 -0
  227. package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
  228. package/lib/feature-libraries/chunked-forest/codec/format.js +9 -0
  229. package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
  230. package/lib/feature-libraries/chunked-forest/codec/index.d.ts +1 -1
  231. package/lib/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
  232. package/lib/feature-libraries/chunked-forest/codec/index.js.map +1 -1
  233. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +8 -3
  234. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
  235. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +18 -7
  236. package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
  237. package/lib/feature-libraries/chunked-forest/index.d.ts +1 -1
  238. package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
  239. package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
  240. package/lib/feature-libraries/forest-summary/codec.d.ts.map +1 -1
  241. package/lib/feature-libraries/forest-summary/codec.js +3 -0
  242. package/lib/feature-libraries/forest-summary/codec.js.map +1 -1
  243. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +13 -8
  244. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  245. package/lib/feature-libraries/forest-summary/forestSummarizer.js +75 -37
  246. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  247. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +178 -0
  248. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -0
  249. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +318 -0
  250. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -0
  251. package/lib/feature-libraries/forest-summary/index.d.ts +1 -1
  252. package/lib/feature-libraries/forest-summary/index.d.ts.map +1 -1
  253. package/lib/feature-libraries/forest-summary/index.js +1 -1
  254. package/lib/feature-libraries/forest-summary/index.js.map +1 -1
  255. package/lib/feature-libraries/index.d.ts +1 -1
  256. package/lib/feature-libraries/index.d.ts.map +1 -1
  257. package/lib/feature-libraries/index.js +1 -1
  258. package/lib/feature-libraries/index.js.map +1 -1
  259. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +2 -2
  260. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  261. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +3 -3
  262. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  263. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts +6 -9
  264. package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
  265. package/lib/feature-libraries/treeCompressionUtils.d.ts +15 -0
  266. package/lib/feature-libraries/treeCompressionUtils.d.ts.map +1 -1
  267. package/lib/feature-libraries/treeCompressionUtils.js +15 -0
  268. package/lib/feature-libraries/treeCompressionUtils.js.map +1 -1
  269. package/lib/index.d.ts +3 -3
  270. package/lib/index.d.ts.map +1 -1
  271. package/lib/index.js +4 -4
  272. package/lib/index.js.map +1 -1
  273. package/lib/jsonDomainSchema.d.ts +1 -1
  274. package/lib/jsonDomainSchema.d.ts.map +1 -1
  275. package/lib/packageVersion.d.ts +1 -1
  276. package/lib/packageVersion.js +1 -1
  277. package/lib/packageVersion.js.map +1 -1
  278. package/lib/shared-tree/schematizingTreeView.d.ts +1 -1
  279. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  280. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  281. package/lib/shared-tree/sharedTree.d.ts +23 -6
  282. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  283. package/lib/shared-tree/sharedTree.js +4 -1
  284. package/lib/shared-tree/sharedTree.js.map +1 -1
  285. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +2 -2
  286. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  287. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  288. package/lib/shared-tree/tree.d.ts.map +1 -1
  289. package/lib/shared-tree/tree.js +3 -0
  290. package/lib/shared-tree/tree.js.map +1 -1
  291. package/lib/shared-tree/treeAlpha.d.ts +9 -11
  292. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  293. package/lib/shared-tree/treeAlpha.js.map +1 -1
  294. package/lib/shared-tree/treeCheckout.d.ts +2 -2
  295. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  296. package/lib/shared-tree/treeCheckout.js.map +1 -1
  297. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  298. package/lib/shared-tree-core/sharedTreeCore.js +13 -0
  299. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  300. package/lib/sharedTreeAttributes.d.ts +2 -2
  301. package/lib/sharedTreeAttributes.js +2 -2
  302. package/lib/sharedTreeAttributes.js.map +1 -1
  303. package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
  304. package/lib/simple-tree/api/conciseTree.js +2 -2
  305. package/lib/simple-tree/api/conciseTree.js.map +1 -1
  306. package/lib/simple-tree/api/customTree.d.ts +39 -11
  307. package/lib/simple-tree/api/customTree.d.ts.map +1 -1
  308. package/lib/simple-tree/api/customTree.js +79 -19
  309. package/lib/simple-tree/api/customTree.js.map +1 -1
  310. package/lib/simple-tree/api/getJsonSchema.d.ts +7 -2
  311. package/lib/simple-tree/api/getJsonSchema.d.ts.map +1 -1
  312. package/lib/simple-tree/api/getJsonSchema.js +1 -0
  313. package/lib/simple-tree/api/getJsonSchema.js.map +1 -1
  314. package/lib/simple-tree/api/index.d.ts +2 -1
  315. package/lib/simple-tree/api/index.d.ts.map +1 -1
  316. package/lib/simple-tree/api/index.js +2 -1
  317. package/lib/simple-tree/api/index.js.map +1 -1
  318. package/lib/simple-tree/api/schemaCreationUtilities.d.ts +1 -1
  319. package/lib/simple-tree/api/schemaCreationUtilities.js +1 -1
  320. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  321. package/lib/simple-tree/api/schemaFactory.d.ts +9 -6
  322. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  323. package/lib/simple-tree/api/schemaFactory.js +6 -6
  324. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  325. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +13 -17
  326. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  327. package/lib/simple-tree/api/schemaFactoryAlpha.js +22 -26
  328. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  329. package/lib/simple-tree/api/schemaFactoryBeta.d.ts +20 -0
  330. package/lib/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -0
  331. package/lib/simple-tree/api/schemaFactoryBeta.js +22 -0
  332. package/lib/simple-tree/api/schemaFactoryBeta.js.map +1 -0
  333. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts +0 -2
  334. package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
  335. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +6 -3
  336. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  337. package/lib/simple-tree/api/transactionTypes.d.ts +1 -0
  338. package/lib/simple-tree/api/transactionTypes.d.ts.map +1 -1
  339. package/lib/simple-tree/api/transactionTypes.js.map +1 -1
  340. package/lib/simple-tree/api/tree.d.ts +68 -74
  341. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  342. package/lib/simple-tree/api/tree.js.map +1 -1
  343. package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
  344. package/lib/simple-tree/api/verboseTree.js +4 -4
  345. package/lib/simple-tree/api/verboseTree.js.map +1 -1
  346. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts +6 -0
  347. package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -1
  348. package/lib/simple-tree/core/simpleNodeSchemaBase.js.map +1 -1
  349. package/lib/simple-tree/fieldSchema.d.ts +3 -4
  350. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  351. package/lib/simple-tree/fieldSchema.js +0 -3
  352. package/lib/simple-tree/fieldSchema.js.map +1 -1
  353. package/lib/simple-tree/index.d.ts +1 -1
  354. package/lib/simple-tree/index.d.ts.map +1 -1
  355. package/lib/simple-tree/index.js +1 -1
  356. package/lib/simple-tree/index.js.map +1 -1
  357. package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
  358. package/lib/simple-tree/node-kinds/record/recordNode.js +2 -3
  359. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  360. package/lib/simple-tree/simpleSchema.d.ts +12 -0
  361. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  362. package/lib/simple-tree/simpleSchema.js.map +1 -1
  363. package/lib/simple-tree/toStoredSchema.d.ts +0 -3
  364. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  365. package/lib/simple-tree/toStoredSchema.js +0 -3
  366. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  367. package/lib/tableSchema.d.ts +11 -80
  368. package/lib/tableSchema.d.ts.map +1 -1
  369. package/lib/tableSchema.js +201 -118
  370. package/lib/tableSchema.js.map +1 -1
  371. package/lib/treeFactory.d.ts +1 -2
  372. package/lib/treeFactory.d.ts.map +1 -1
  373. package/lib/treeFactory.js +1 -2
  374. package/lib/treeFactory.js.map +1 -1
  375. package/package.json +22 -22
  376. package/src/codec/codec.ts +52 -7
  377. package/src/codec/index.ts +4 -0
  378. package/src/external-utilities/index.ts +1 -1
  379. package/src/external-utilities/typeboxValidator.ts +7 -1
  380. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +38 -4
  381. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -3
  382. package/src/feature-libraries/chunked-forest/codec/codecs.ts +96 -8
  383. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +123 -19
  384. package/src/feature-libraries/chunked-forest/codec/format.ts +11 -0
  385. package/src/feature-libraries/chunked-forest/codec/index.ts +4 -0
  386. package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +28 -3
  387. package/src/feature-libraries/chunked-forest/index.ts +2 -0
  388. package/src/feature-libraries/forest-summary/codec.ts +3 -0
  389. package/src/feature-libraries/forest-summary/forestSummarizer.ts +118 -50
  390. package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +511 -0
  391. package/src/feature-libraries/forest-summary/index.ts +1 -1
  392. package/src/feature-libraries/index.ts +5 -1
  393. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +8 -4
  394. package/src/feature-libraries/treeCompressionUtils.ts +19 -0
  395. package/src/index.ts +6 -1
  396. package/src/packageVersion.ts +1 -1
  397. package/src/shared-tree/schematizingTreeView.ts +1 -1
  398. package/src/shared-tree/sharedTree.ts +37 -4
  399. package/src/shared-tree/sharedTreeChangeFamily.ts +2 -2
  400. package/src/shared-tree/tree.ts +3 -0
  401. package/src/shared-tree/treeAlpha.ts +10 -11
  402. package/src/shared-tree/treeCheckout.ts +2 -2
  403. package/src/shared-tree-core/sharedTreeCore.ts +17 -0
  404. package/src/sharedTreeAttributes.ts +2 -2
  405. package/src/simple-tree/api/conciseTree.ts +2 -1
  406. package/src/simple-tree/api/customTree.ts +102 -32
  407. package/src/simple-tree/api/getJsonSchema.ts +7 -2
  408. package/src/simple-tree/api/index.ts +3 -0
  409. package/src/simple-tree/api/schemaCreationUtilities.ts +1 -1
  410. package/src/simple-tree/api/schemaFactory.ts +21 -14
  411. package/src/simple-tree/api/schemaFactoryAlpha.ts +29 -30
  412. package/src/simple-tree/api/schemaFactoryBeta.ts +28 -0
  413. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +7 -3
  414. package/src/simple-tree/api/transactionTypes.ts +1 -0
  415. package/src/simple-tree/api/tree.ts +75 -81
  416. package/src/simple-tree/api/verboseTree.ts +42 -39
  417. package/src/simple-tree/core/simpleNodeSchemaBase.ts +6 -0
  418. package/src/simple-tree/fieldSchema.ts +3 -4
  419. package/src/simple-tree/index.ts +3 -0
  420. package/src/simple-tree/node-kinds/record/recordNode.ts +2 -3
  421. package/src/simple-tree/simpleSchema.ts +12 -0
  422. package/src/simple-tree/toStoredSchema.ts +0 -3
  423. package/src/tableSchema.ts +261 -243
  424. package/src/treeFactory.ts +1 -2
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, oob } from "@fluidframework/core-utils/internal";
6
+ import { fail } from "@fluidframework/core-utils/internal";
7
7
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
8
 
9
9
  import { Tree, TreeAlpha } from "./shared-tree/index.js";
@@ -166,7 +166,7 @@ export namespace System_TableSchema {
166
166
  cellSchema: TCellSchema,
167
167
  propsSchema: TPropsSchema,
168
168
  ) {
169
- const schemaFactory = inputSchemaFactory.scopedFactory(tableSchemaFactorySubScope);
169
+ const schemaFactory = inputSchemaFactory.scopedFactoryAlpha(tableSchemaFactorySubScope);
170
170
  type Scope = ScopedSchemaName<TInputScope, typeof tableSchemaFactorySubScope>;
171
171
 
172
172
  type CellValueType = TreeNodeFromImplicitAllowedTypes<TCellSchema>;
@@ -342,7 +342,7 @@ export namespace System_TableSchema {
342
342
  cellSchema: TCellSchema,
343
343
  propsSchema: TPropsSchema,
344
344
  ) {
345
- const schemaFactory = inputSchemaFactory.scopedFactory(tableSchemaFactorySubScope);
345
+ const schemaFactory = inputSchemaFactory.scopedFactoryAlpha(tableSchemaFactorySubScope);
346
346
  type Scope = ScopedSchemaName<TInputScope, typeof tableSchemaFactorySubScope>;
347
347
 
348
348
  type CellValueType = TreeNodeFromImplicitAllowedTypes<TCellSchema>;
@@ -566,7 +566,7 @@ export namespace System_TableSchema {
566
566
  columnSchema: TColumnSchema,
567
567
  rowSchema: TRowSchema,
568
568
  ) {
569
- const schemaFactory = inputSchemaFactory.scopedFactory(tableSchemaFactorySubScope);
569
+ const schemaFactory = inputSchemaFactory.scopedFactoryAlpha(tableSchemaFactorySubScope);
570
570
  type Scope = ScopedSchemaName<TInputScope, typeof tableSchemaFactorySubScope>;
571
571
 
572
572
  type CellValueType = TreeNodeFromImplicitAllowedTypes<TCellSchema>;
@@ -619,12 +619,12 @@ export namespace System_TableSchema {
619
619
  key: TableSchema.CellKey<TColumnSchema, TRowSchema>,
620
620
  ): CellValueType | undefined {
621
621
  const { column: columnOrId, row: rowOrId } = key;
622
- const row = this._getRow(rowOrId);
622
+ const row = this._tryGetRow(rowOrId);
623
623
  if (row === undefined) {
624
624
  return undefined;
625
625
  }
626
626
 
627
- const column = this._getColumn(columnOrId);
627
+ const column = this._tryGetColumn(columnOrId);
628
628
  if (column === undefined) {
629
629
  return undefined;
630
630
  }
@@ -632,17 +632,6 @@ export namespace System_TableSchema {
632
632
  return row.getCell(column);
633
633
  }
634
634
 
635
- public insertColumn({
636
- column,
637
- index,
638
- }: TableSchema.InsertColumnParameters<TColumnSchema>): ColumnValueType {
639
- const inserted = this.insertColumns({
640
- columns: [column],
641
- index,
642
- });
643
- return inserted[0] ?? oob();
644
- }
645
-
646
635
  public insertColumns({
647
636
  columns,
648
637
  index,
@@ -666,17 +655,6 @@ export namespace System_TableSchema {
666
655
  return columns as unknown as ColumnValueType[];
667
656
  }
668
657
 
669
- public insertRow({
670
- row,
671
- index,
672
- }: TableSchema.InsertRowParameters<TRowSchema>): RowValueType {
673
- const inserted = this.insertRows({
674
- rows: [row],
675
- index,
676
- });
677
- return inserted[0] ?? oob();
678
- }
679
-
680
658
  public insertRows({
681
659
  index,
682
660
  rows,
@@ -698,7 +676,7 @@ export namespace System_TableSchema {
698
676
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
699
677
  const keys: string[] = Object.keys((newRow as any).cells);
700
678
  for (const key of keys) {
701
- if (!this.containsColumnWithId(key)) {
679
+ if (!this._containsColumnWithId(key)) {
702
680
  throw new UsageError(
703
681
  `Attempted to insert row a cell under column ID "${key}", but the table does not contain a column with that ID.`,
704
682
  );
@@ -730,187 +708,306 @@ export namespace System_TableSchema {
730
708
  const { column: columnOrId, row: rowOrId } = key;
731
709
 
732
710
  const row = this._getRow(rowOrId);
733
- if (row === undefined) {
734
- const rowId = this._getRowId(rowOrId);
735
- throw new UsageError(`No row with ID "${rowId}" exists in the table.`);
736
- }
737
-
738
711
  const column = this._getColumn(columnOrId);
739
- if (column === undefined) {
740
- const columnId = this._getColumnId(columnOrId);
741
- throw new UsageError(`No column with ID "${columnId}" exists in the table.`);
742
- }
743
712
 
744
713
  row.setCell(column, cell);
745
714
  }
746
715
 
747
716
  public removeColumns(
748
- columns: readonly string[] | readonly ColumnValueType[],
717
+ indexOrColumns: number | undefined | readonly string[] | readonly ColumnValueType[],
718
+ count: number | undefined = undefined,
749
719
  ): ColumnValueType[] {
750
- // If there are no columns to remove, do nothing
751
- if (columns.length === 0) {
752
- return [];
753
- }
720
+ if (typeof indexOrColumns === "number" || indexOrColumns === undefined) {
721
+ let removedColumns: ColumnValueType[] | undefined;
722
+ const startIndex = indexOrColumns ?? 0;
723
+ const _count = count ?? this.columns.length - startIndex;
724
+
725
+ // If there are no columns to remove, do nothing
726
+ if (_count === 0) {
727
+ return [];
728
+ }
754
729
 
755
- // If there is only one column to remove, remove it (and don't incur cost of transaction)
756
- if (columns.length === 1) {
757
- const removedColumn = this.removeColumn(columns[0] ?? oob());
758
- return [removedColumn];
759
- }
730
+ Table._assertValidRange({ index: startIndex, count: _count }, this.columns);
760
731
 
761
- // If there are multiple columns to remove, remove them in a transaction.
762
- const removedColumns: ColumnValueType[] = [];
763
- Tree.runTransaction(this, () => {
764
- // Note, throwing an error within a transaction will abort the entire transaction.
765
- // So if we throw an error here for any row, no columns will be removed.
766
- for (const columnToRemove of columns) {
767
- const removedRow = this.removeColumn(columnToRemove);
768
- removedColumns.push(removedRow);
732
+ this._applyEditsInBatch(() => {
733
+ const columnsToRemove = this.columns.slice(
734
+ startIndex,
735
+ startIndex + _count,
736
+ ) as ColumnValueType[];
737
+
738
+ // First, remove all cells that correspond to each column from each row:
739
+ for (const column of columnsToRemove) {
740
+ this._removeCells(column);
741
+ }
742
+
743
+ // Second, remove the column nodes:
744
+ Table._removeRange(
745
+ {
746
+ index: startIndex,
747
+ count: _count,
748
+ },
749
+ this.columns,
750
+ );
751
+ removedColumns = columnsToRemove;
752
+ });
753
+ return removedColumns ?? fail(0xc1f /* Transaction did not complete. */);
754
+ } else {
755
+ // If there are no columns to remove, do nothing
756
+ if (indexOrColumns.length === 0) {
757
+ return [];
769
758
  }
770
- });
771
- return removedColumns;
772
- }
773
759
 
774
- public removeColumn(columnOrId: string | ColumnValueType): ColumnValueType {
775
- const column = this._getColumn(columnOrId);
776
- const index = column === undefined ? -1 : this.columns.indexOf(column);
777
- if (index === -1) {
778
- const columnId = this._getColumnId(columnOrId);
779
- throw new UsageError(
780
- `Specified column with ID "${columnId}" does not exist in the table.`,
781
- );
782
- }
783
- assert(column !== undefined, 0xc10 /* column should not be undefined */);
784
-
785
- Tree.runTransaction(this, () => {
786
- // Remove the corresponding cell from all rows.
787
- for (const row of this.rows) {
788
- // TypeScript is unable to narrow the row type correctly here, hence the cast.
789
- // See: https://github.com/microsoft/TypeScript/issues/52144
790
- (row as RowValueType).removeCell(column);
760
+ // Resolve any IDs to actual nodes.
761
+ // This validates that all of the rows exist before starting transaction.
762
+ // This improves user-facing error experience.
763
+ const columnsToRemove: ColumnValueType[] = [];
764
+ for (const columnOrIdToRemove of indexOrColumns) {
765
+ columnsToRemove.push(this._getColumn(columnOrIdToRemove));
791
766
  }
792
767
 
793
- this.columns.removeAt(index);
794
- });
768
+ this._applyEditsInBatch(() => {
769
+ // Note, throwing an error within a transaction will abort the entire transaction.
770
+ // So if we throw an error here for any column, no columns will be removed.
771
+ for (const columnToRemove of columnsToRemove) {
772
+ // Remove the corresponding cell from all rows.
773
+ for (const row of this.rows) {
774
+ // TypeScript is unable to narrow the row type correctly here, hence the cast.
775
+ // See: https://github.com/microsoft/TypeScript/issues/52144
776
+ (row as RowValueType).removeCell(columnToRemove);
777
+ }
795
778
 
796
- return column;
779
+ // We have already validated that all of the columns exist above, so this is safe.
780
+ this.columns.removeAt(this.columns.indexOf(columnToRemove));
781
+ }
782
+ });
783
+ return columnsToRemove;
784
+ }
797
785
  }
798
786
 
799
- public removeAllColumns(): ColumnValueType[] {
800
- // TypeScript is unable to narrow the row type correctly here, hence the cast.
801
- // See: https://github.com/microsoft/TypeScript/issues/52144
802
- return this.removeColumns(this.columns as unknown as ColumnValueType[]);
803
- }
787
+ public removeRows(
788
+ indexOrRows: number | undefined | readonly string[] | readonly RowValueType[],
789
+ count?: number | undefined,
790
+ ): RowValueType[] {
791
+ if (typeof indexOrRows === "number" || indexOrRows === undefined) {
792
+ const startIndex = indexOrRows ?? 0;
793
+ const _count = count ?? this.columns.length - startIndex;
794
+
795
+ // If there are no rows to remove, do nothing
796
+ if (_count === 0) {
797
+ return [];
798
+ }
799
+
800
+ return Table._removeRange(
801
+ {
802
+ index: startIndex,
803
+ count: _count,
804
+ },
805
+ this.rows,
806
+ );
807
+ }
804
808
 
805
- public removeRows(rows: readonly string[] | readonly RowValueType[]): RowValueType[] {
806
809
  // If there are no rows to remove, do nothing
807
- if (rows.length === 0) {
810
+ if (indexOrRows.length === 0) {
808
811
  return [];
809
812
  }
810
813
 
811
- // If there is only one row to remove, remove it (and don't incur cost of transaction)
812
- if (rows.length === 1) {
813
- const removedRow = this.removeRow(rows[0] ?? oob());
814
- return [removedRow];
814
+ // Resolve any IDs to actual nodes.
815
+ // This validates that all of the rows exist before starting transaction.
816
+ // This improves user-facing error experience.
817
+ const rowsToRemove: RowValueType[] = [];
818
+ for (const rowToRemove of indexOrRows) {
819
+ rowsToRemove.push(this._getRow(rowToRemove));
815
820
  }
816
821
 
817
- // If there are multiple rows to remove, remove them in a transaction.
818
- const removedRows: RowValueType[] = [];
819
- Tree.runTransaction(this, () => {
822
+ this._applyEditsInBatch(() => {
820
823
  // Note, throwing an error within a transaction will abort the entire transaction.
821
824
  // So if we throw an error here for any row, no rows will be removed.
822
- for (const rowToRemove of rows) {
823
- const removedRow = this.removeRow(rowToRemove);
824
- removedRows.push(removedRow);
825
+ for (const rowToRemove of rowsToRemove) {
826
+ // We have already validated that all of the rows exist above, so this is safe.
827
+ this.rows.removeAt(this.rows.indexOf(rowToRemove));
825
828
  }
826
829
  });
827
- return removedRows;
830
+ return rowsToRemove;
828
831
  }
829
832
 
830
- public removeRow(rowOrId: string | RowValueType): RowValueType {
831
- const rowToRemove = this._getRow(rowOrId);
832
- const index = rowToRemove === undefined ? -1 : this.rows.indexOf(rowToRemove);
833
+ public removeCell(
834
+ key: TableSchema.CellKey<TColumnSchema, TRowSchema>,
835
+ ): CellValueType | undefined {
836
+ const { column: columnOrId, row: rowOrId } = key;
837
+ const row = this._getRow(rowOrId);
838
+ const column = this._getColumn(columnOrId);
833
839
 
834
- // If the row does not exist in the table, throw an error.
835
- if (index === -1) {
836
- const rowId = this._getRowId(rowOrId);
837
- throw new UsageError(
838
- `Specified row with ID "${rowId}" does not exist in the table.`,
839
- );
840
+ const cell: CellValueType | undefined = row.getCell(column.id);
841
+ if (cell === undefined) {
842
+ return undefined;
840
843
  }
841
844
 
842
- this.rows.removeAt(index);
843
- return rowToRemove as RowValueType;
845
+ row.removeCell(column.id);
846
+ return cell;
844
847
  }
845
848
 
846
- public removeAllRows(): RowValueType[] {
847
- // TypeScript is unable to narrow the row type correctly here, hence the cast.
848
- // See: https://github.com/microsoft/TypeScript/issues/52144
849
- return this.removeRows(this.rows as unknown as RowValueType[]);
849
+ /**
850
+ * Removes the cell corresponding with the specified column from each row in the table.
851
+ */
852
+ private _removeCells(column: ColumnValueType): void {
853
+ for (const row of this.rows) {
854
+ // TypeScript is unable to narrow the row type correctly here, hence the cast.
855
+ // See: https://github.com/microsoft/TypeScript/issues/52144
856
+ (row as RowValueType).removeCell(column);
857
+ }
850
858
  }
851
859
 
852
- public removeCell(
853
- key: TableSchema.CellKey<TColumnSchema, TRowSchema>,
854
- ): CellValueType | undefined {
855
- const { column: columnOrId, row: rowOrId } = key;
856
- const row = this._getRow(rowOrId);
857
- if (row === undefined) {
858
- const rowId = this._getRowId(rowOrId);
860
+ private static _assertValidRange<T>(
861
+ range: { index: number; count: number },
862
+ array: readonly T[],
863
+ ): void {
864
+ const { index, count } = range;
865
+ if (index < 0 || index >= array.length) {
859
866
  throw new UsageError(
860
- `Specified row with ID "${rowId}" does not exist in the table.`,
867
+ `Start index out of bounds. Expected index to be on [0, ${array.length - 1}], but got ${index}.`,
861
868
  );
862
869
  }
870
+ if (count < 0) {
871
+ throw new UsageError(`Expected non-negative count. Got ${count}.`);
872
+ }
863
873
 
864
- const column = this._getColumn(columnOrId);
865
- if (column === undefined) {
866
- const columnId = this._getColumnId(columnOrId);
874
+ const end = index + count; // exclusive
875
+ if (end > array.length) {
867
876
  throw new UsageError(
868
- `Specified column with ID "${columnId}" does not exist in the table.`,
877
+ `End index out of bounds. Expected end to be on [${index}, ${array.length}], but got ${end}.`,
869
878
  );
870
879
  }
880
+ }
871
881
 
872
- const cell: CellValueType | undefined = row.getCell(column.id);
873
- if (cell === undefined) {
874
- return undefined;
882
+ /**
883
+ * Applies the provided edits in a "batch".
884
+ *
885
+ * @remarks
886
+ * For hydrated trees, this will be done in a transaction to ensure atomicity.
887
+ *
888
+ * Transactions are not supported for unhydrated trees, so we cannot run a transaction in that case.
889
+ * But since there are no collaborators, this is not an issue.
890
+ */
891
+ private _applyEditsInBatch(applyEdits: () => void): void {
892
+ const branch = TreeAlpha.branch(this);
893
+
894
+ if (branch === undefined) {
895
+ // If this node does not have a corresponding branch, then it is unhydrated.
896
+ // I.e., it is not part of a collaborative session yet.
897
+ // Therefore, we don't need to run the edits as a transaction.
898
+ applyEdits();
899
+ } else {
900
+ branch.runTransaction(() => {
901
+ applyEdits();
902
+ });
875
903
  }
904
+ }
876
905
 
877
- row.removeCell(column.id);
878
- return cell;
906
+ /**
907
+ * Attempts to resolve the provided Column node or ID to a Column node in the table.
908
+ * Returns `undefined` if there is no match.
909
+ * @remarks Searches for a match based strictly on the ID and returns that result.
910
+ */
911
+ private _tryGetColumn(
912
+ columnOrId: string | ColumnValueType,
913
+ ): ColumnValueType | undefined {
914
+ const columnId = this._getColumnId(columnOrId);
915
+ return this.getColumn(columnId);
879
916
  }
880
917
 
881
- private _getColumn(columnOrId: string | ColumnValueType): ColumnValueType | undefined {
882
- return typeof columnOrId === "string" ? this.getColumn(columnOrId) : columnOrId;
918
+ /**
919
+ * Attempts to resolve the provided Column node or ID to a Column node in the table.
920
+ * @throws Throws a `UsageError` if there is no match.
921
+ * @remarks Searches for a match based strictly on the ID and returns that result.
922
+ */
923
+ private _getColumn(columnOrId: string | ColumnValueType): ColumnValueType {
924
+ const column = this._tryGetColumn(columnOrId);
925
+ if (column === undefined) {
926
+ this._throwMissingColumnError(this._getColumnId(columnOrId));
927
+ }
928
+ return column;
883
929
  }
884
930
 
931
+ /**
932
+ * Resolves a Column node or ID to its ID.
933
+ * If an ID is provided, it is returned as-is.
934
+ * If a node is provided, its ID is returned.
935
+ */
885
936
  private _getColumnId(columnOrId: string | ColumnValueType): string {
886
937
  return typeof columnOrId === "string" ? columnOrId : columnOrId.id;
887
938
  }
888
939
 
889
- private _getRow(rowOrId: string | RowValueType): RowValueType | undefined {
890
- return typeof rowOrId === "string" ? this.getRow(rowOrId) : rowOrId;
940
+ /**
941
+ * Checks if a Column with the specified ID exists in the table.
942
+ */
943
+ private _containsColumnWithId(columnId: string): boolean {
944
+ return this._tryGetColumn(columnId) !== undefined;
945
+ }
946
+
947
+ /**
948
+ * Throw a `UsageError` for a missing Column by its ID.
949
+ */
950
+ private _throwMissingColumnError(columnId: string): never {
951
+ throw new UsageError(`No column with ID "${columnId}" exists in the table.`);
891
952
  }
892
953
 
954
+ /**
955
+ * Attempts to resolve the provided Row node or ID to a Row node in the table.
956
+ * Returns `undefined` if there is no match.
957
+ * @remarks Searches for a match based strictly on the ID and returns that result.
958
+ */
959
+ private _tryGetRow(rowOrId: string | RowValueType): RowValueType | undefined {
960
+ const rowId = this._getRowId(rowOrId);
961
+ return this.getRow(rowId);
962
+ }
963
+
964
+ /**
965
+ * Attempts to resolve the provided Row node or ID to a Row node in the table.
966
+ * @throws Throws a `UsageError` if there is no match.
967
+ * @remarks Searches for a match based strictly on the ID and returns that result.
968
+ */
969
+ private _getRow(rowOrId: string | RowValueType): RowValueType {
970
+ const row = this._tryGetRow(rowOrId);
971
+ if (row === undefined) {
972
+ this._throwMissingRowError(this._getRowId(rowOrId));
973
+ }
974
+ return row;
975
+ }
976
+
977
+ /**
978
+ * Resolves a Row node or ID to its ID.
979
+ * If an ID is provided, it is returned as-is.
980
+ * If a node is provided, its ID is returned.
981
+ */
893
982
  private _getRowId(rowOrId: string | RowValueType): string {
894
983
  return typeof rowOrId === "string" ? rowOrId : rowOrId.id;
895
984
  }
896
985
 
897
- private containsColumnWithId(columnId: string): boolean {
898
- // TypeScript is unable to narrow the types correctly here, hence the cast.
899
- // See: https://github.com/microsoft/TypeScript/issues/52144
900
- return (
901
- this.columns.find(
902
- (column) => (column as TableSchema.Column<TCellSchema>).id === columnId,
903
- ) !== undefined
904
- );
986
+ /**
987
+ * Throw a `UsageError` for a missing Row by its ID.
988
+ */
989
+ private _throwMissingRowError(rowId: string): never {
990
+ throw new UsageError(`No row with ID "${rowId}" exists in the table.`);
905
991
  }
906
992
 
907
- private containsRowWithId(rowId: string): boolean {
908
- // TypeScript is unable to narrow the types correctly here, hence the cast.
993
+ private static _removeRange<TNodeSchema extends ImplicitAllowedTypes>(
994
+ range: { index: number; count: number },
995
+ array: TreeArrayNode<TNodeSchema>,
996
+ ): TreeNodeFromImplicitAllowedTypes<TNodeSchema>[] {
997
+ Table._assertValidRange(range, array);
998
+
999
+ const { index, count } = range;
1000
+ const end = index + count; // exclusive
1001
+
1002
+ // TypeScript is unable to narrow the array element type correctly here, hence the cast.
909
1003
  // See: https://github.com/microsoft/TypeScript/issues/52144
910
- return (
911
- this.rows.find((row) => (row as TableSchema.Row<TCellSchema>).id === rowId) !==
912
- undefined
913
- );
1004
+ const removedRows = array.slice(
1005
+ index,
1006
+ end,
1007
+ ) as TreeNodeFromImplicitAllowedTypes<TNodeSchema>[];
1008
+ array.removeRange(index, end);
1009
+
1010
+ return removedRows;
914
1011
  }
915
1012
 
916
1013
  /**
@@ -1333,23 +1430,6 @@ export namespace TableSchema {
1333
1430
  readonly row: string | TreeNodeFromImplicitAllowedTypes<TRow>;
1334
1431
  }
1335
1432
 
1336
- /**
1337
- * {@link TableSchema.Table.insertColumn} parameters.
1338
- * @alpha
1339
- */
1340
- export interface InsertColumnParameters<TColumn extends ImplicitAllowedTypes> {
1341
- /**
1342
- * The index at which to insert the new column.
1343
- * @remarks If not provided, the column will be appended to the end of the table.
1344
- */
1345
- readonly index?: number | undefined;
1346
-
1347
- /**
1348
- * The column to insert.
1349
- */
1350
- readonly column: InsertableTreeNodeFromImplicitAllowedTypes<TColumn>;
1351
- }
1352
-
1353
1433
  /**
1354
1434
  * {@link TableSchema.Table.insertColumns} parameters.
1355
1435
  * @alpha
@@ -1367,23 +1447,6 @@ export namespace TableSchema {
1367
1447
  readonly columns: InsertableTreeNodeFromImplicitAllowedTypes<TColumn>[];
1368
1448
  }
1369
1449
 
1370
- /**
1371
- * {@link TableSchema.Table.insertRow} parameters.
1372
- * @alpha
1373
- */
1374
- export interface InsertRowParameters<TRow extends ImplicitAllowedTypes> {
1375
- /**
1376
- * The index at which to insert the new row.
1377
- * @remarks If not provided, the row will be appended to the end of the table.
1378
- */
1379
- readonly index?: number | undefined;
1380
-
1381
- /**
1382
- * The row to insert.
1383
- */
1384
- readonly row: InsertableTreeNodeFromImplicitAllowedTypes<TRow>;
1385
- }
1386
-
1387
1450
  /**
1388
1451
  * {@link TableSchema.Table.insertRows} parameters.
1389
1452
  * @alpha
@@ -1461,17 +1524,6 @@ export namespace TableSchema {
1461
1524
  */
1462
1525
  getCell(key: CellKey<TColumn, TRow>): TreeNodeFromImplicitAllowedTypes<TCell> | undefined;
1463
1526
 
1464
- /**
1465
- * Inserts a column into the table.
1466
- *
1467
- * @throws Throws an error if the specified index is out of range.
1468
- *
1469
- * No column is inserted in this case.
1470
- */
1471
- insertColumn(
1472
- params: InsertColumnParameters<TColumn>,
1473
- ): TreeNodeFromImplicitAllowedTypes<TColumn>;
1474
-
1475
1527
  /**
1476
1528
  * Inserts 0 or more columns into the table.
1477
1529
  *
@@ -1483,20 +1535,6 @@ export namespace TableSchema {
1483
1535
  params: InsertColumnsParameters<TColumn>,
1484
1536
  ): TreeNodeFromImplicitAllowedTypes<TColumn>[];
1485
1537
 
1486
- /**
1487
- * Inserts a row into the table.
1488
- *
1489
- * @throws
1490
- * Throws an error in the following cases:
1491
- *
1492
- * - The row contains cells, but the table does not contain matching columns for one or more of those cells.
1493
- *
1494
- * - The specified index is out of range.
1495
- *
1496
- * No row is inserted in these cases.
1497
- */
1498
- insertRow(params: InsertRowParameters<TRow>): TreeNodeFromImplicitAllowedTypes<TRow>;
1499
-
1500
1538
  /**
1501
1539
  * Inserts 0 or more rows into the table.
1502
1540
  *
@@ -1518,22 +1556,22 @@ export namespace TableSchema {
1518
1556
  setCell(params: SetCellParameters<TCell, TColumn, TRow>): void;
1519
1557
 
1520
1558
  /**
1521
- * Removes the specified column from the table.
1559
+ * Removes a range of columns from the table.
1560
+ *
1522
1561
  * @remarks
1523
1562
  * Also removes any corresponding cells from the table's rows.
1524
1563
  *
1525
1564
  * Note: this operation can be slow for tables with many rows.
1526
1565
  * We are actively working on improving the performance of this operation, but for now it may have a negative
1527
1566
  * impact on performance.
1528
- *
1529
- * @param column - The {@link TableSchema.Column | column} or {@link TableSchema.Column.id | column ID} to remove.
1530
- * @throws Throws an error if the column is not in the table.
1531
- * In this case, no columns are removed.
1567
+ * @param index - The starting index of the range to remove. Default: `0`.
1568
+ * @param count - The number of columns to remove. Default: all remaining columns starting from `index`.
1569
+ * @throws Throws an error if the specified range is invalid. In this case, no columns are removed.
1532
1570
  */
1533
- removeColumn(
1534
- column: string | TreeNodeFromImplicitAllowedTypes<TColumn>,
1535
- ): TreeNodeFromImplicitAllowedTypes<TColumn>;
1536
-
1571
+ removeColumns(
1572
+ index?: number | undefined,
1573
+ count?: number | undefined,
1574
+ ): TreeNodeFromImplicitAllowedTypes<TColumn>[];
1537
1575
  /**
1538
1576
  * Removes 0 or more columns from the table.
1539
1577
  * @remarks
@@ -1567,29 +1605,15 @@ export namespace TableSchema {
1567
1605
  removeColumns(columns: readonly string[]): TreeNodeFromImplicitAllowedTypes<TColumn>[];
1568
1606
 
1569
1607
  /**
1570
- * Removes all columns from the table.
1571
- *
1572
- * @remarks
1573
- * Also removes any corresponding cells from the table's rows.
1574
- *
1575
- * Note: this operation can be slow for tables with many rows.
1576
- * We are actively working on improving the performance of this operation, but for now it may have a negative
1577
- * impact on performance.
1578
- *
1579
- * @returns The removed columns.
1580
- */
1581
- removeAllColumns(): TreeNodeFromImplicitAllowedTypes<TColumn>[];
1582
-
1583
- /**
1584
- * Removes the specified row from the table.
1585
- * @param row - The {@link TableSchema.Row | row} or {@link TableSchema.Row.id | row ID} to remove.
1586
- * @throws Throws an error if the row is not in the table.
1587
- * In this case, no rows are removed.
1608
+ * Removes a range of rows from the table.
1609
+ * @param index - The starting index of the range to remove. Default: `0`.
1610
+ * @param count - The number of rows to remove. Default: all remaining rows starting from `index`.
1611
+ * @throws Throws an error if the specified range is invalid. In this case, no rows are removed.
1588
1612
  */
1589
- removeRow(
1590
- row: string | TreeNodeFromImplicitAllowedTypes<TRow>,
1591
- ): TreeNodeFromImplicitAllowedTypes<TRow>;
1592
-
1613
+ removeRows(
1614
+ index?: number | undefined,
1615
+ count?: number | undefined,
1616
+ ): TreeNodeFromImplicitAllowedTypes<TRow>[];
1593
1617
  /**
1594
1618
  * Removes 0 or more rows from the table.
1595
1619
  * @param rows - The rows to remove.
@@ -1607,12 +1631,6 @@ export namespace TableSchema {
1607
1631
  */
1608
1632
  removeRows(rows: readonly string[]): TreeNodeFromImplicitAllowedTypes<TRow>[];
1609
1633
 
1610
- /**
1611
- * Removes all rows from the table.
1612
- * @returns The removed rows.
1613
- */
1614
- removeAllRows(): TreeNodeFromImplicitAllowedTypes<TRow>[];
1615
-
1616
1634
  /**
1617
1635
  * Removes the cell at the specified location in the table.
1618
1636
  * @returns The cell if it exists, otherwise undefined.