@fluidframework/tree 2.13.0 → 2.21.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 (360) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/api-report/tree.alpha.api.md +22 -12
  3. package/api-report/tree.beta.api.md +9 -5
  4. package/api-report/tree.legacy.alpha.api.md +15 -5
  5. package/api-report/tree.legacy.public.api.md +9 -5
  6. package/api-report/tree.public.api.md +9 -5
  7. package/assertTagging.config.mjs +14 -0
  8. package/dist/alpha.d.ts +3 -0
  9. package/dist/core/index.d.ts +2 -2
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +6 -4
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/index.d.ts +2 -2
  14. package/dist/core/rebase/index.d.ts.map +1 -1
  15. package/dist/core/rebase/index.js +5 -1
  16. package/dist/core/rebase/index.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +5 -4
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js +29 -1
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/rebase/utils.d.ts +10 -0
  22. package/dist/core/rebase/utils.d.ts.map +1 -1
  23. package/dist/core/rebase/utils.js +22 -1
  24. package/dist/core/rebase/utils.js.map +1 -1
  25. package/dist/core/tree/delta.d.ts +21 -26
  26. package/dist/core/tree/delta.d.ts.map +1 -1
  27. package/dist/core/tree/delta.js.map +1 -1
  28. package/dist/core/tree/deltaUtil.d.ts +1 -3
  29. package/dist/core/tree/deltaUtil.d.ts.map +1 -1
  30. package/dist/core/tree/deltaUtil.js +2 -14
  31. package/dist/core/tree/deltaUtil.js.map +1 -1
  32. package/dist/core/tree/index.d.ts +1 -1
  33. package/dist/core/tree/index.d.ts.map +1 -1
  34. package/dist/core/tree/index.js +1 -3
  35. package/dist/core/tree/index.js.map +1 -1
  36. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  37. package/dist/core/tree/visitDelta.js +82 -80
  38. package/dist/core/tree/visitDelta.js.map +1 -1
  39. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  40. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  41. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  42. package/dist/feature-libraries/deltaUtils.js +13 -0
  43. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  44. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  45. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  46. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  47. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  48. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  49. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  50. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  51. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  52. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  53. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  54. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  55. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  56. package/dist/feature-libraries/modular-schema/index.d.ts +2 -2
  57. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  58. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  60. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  61. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -8
  62. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  63. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  64. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  65. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +105 -199
  66. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  67. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  68. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  69. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +20 -0
  70. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  71. package/dist/feature-libraries/optional-field/optionalField.d.ts +3 -3
  72. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  73. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  74. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  75. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  76. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  77. package/dist/feature-libraries/sequence-field/rebase.js +4 -4
  78. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  79. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  80. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  81. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  82. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  83. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  84. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  85. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  86. package/dist/feature-libraries/sequence-field/utils.js +36 -4
  87. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  88. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  89. package/dist/feature-libraries/treeCursorUtils.js +5 -2
  90. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  91. package/dist/index.d.ts +26 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +6 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/legacy.d.ts +3 -1
  96. package/dist/package.json +2 -1
  97. package/dist/packageVersion.d.ts +1 -1
  98. package/dist/packageVersion.js +1 -1
  99. package/dist/packageVersion.js.map +1 -1
  100. package/dist/shared-tree/index.d.ts +2 -1
  101. package/dist/shared-tree/index.d.ts.map +1 -1
  102. package/dist/shared-tree/index.js +7 -2
  103. package/dist/shared-tree/index.js.map +1 -1
  104. package/dist/shared-tree/publicContracts.d.ts +18 -0
  105. package/dist/shared-tree/publicContracts.d.ts.map +1 -0
  106. package/dist/shared-tree/publicContracts.js +24 -0
  107. package/dist/shared-tree/publicContracts.js.map +1 -0
  108. package/dist/shared-tree/sharedTree.d.ts +38 -18
  109. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  110. package/dist/shared-tree/sharedTree.js +41 -40
  111. package/dist/shared-tree/sharedTree.js.map +1 -1
  112. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  113. package/dist/shared-tree/treeCheckout.js +12 -8
  114. package/dist/shared-tree/treeCheckout.js.map +1 -1
  115. package/dist/simple-tree/api/schemaFactory.d.ts +2 -0
  116. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  117. package/dist/simple-tree/api/schemaFactory.js +2 -0
  118. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  119. package/dist/simple-tree/api/tree.d.ts +4 -0
  120. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  121. package/dist/simple-tree/api/tree.js.map +1 -1
  122. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  123. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  124. package/dist/simple-tree/arrayNode.js +1 -1
  125. package/dist/simple-tree/arrayNode.js.map +1 -1
  126. package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  127. package/dist/simple-tree/core/getOrCreateNode.js +1 -1
  128. package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
  129. package/dist/simple-tree/core/index.d.ts +1 -1
  130. package/dist/simple-tree/core/index.d.ts.map +1 -1
  131. package/dist/simple-tree/core/index.js +2 -2
  132. package/dist/simple-tree/core/index.js.map +1 -1
  133. package/dist/simple-tree/core/treeNodeKernel.d.ts +2 -6
  134. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  135. package/dist/simple-tree/core/treeNodeKernel.js +10 -13
  136. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  137. package/dist/simple-tree/proxies.js +1 -1
  138. package/dist/simple-tree/proxies.js.map +1 -1
  139. package/dist/simple-tree/toMapTree.js +1 -1
  140. package/dist/simple-tree/toMapTree.js.map +1 -1
  141. package/dist/util/bTreeUtils.d.ts +10 -0
  142. package/dist/util/bTreeUtils.d.ts.map +1 -0
  143. package/dist/util/bTreeUtils.js +52 -0
  144. package/dist/util/bTreeUtils.js.map +1 -0
  145. package/dist/util/idAllocator.d.ts +0 -2
  146. package/dist/util/idAllocator.d.ts.map +1 -1
  147. package/dist/util/idAllocator.js +0 -2
  148. package/dist/util/idAllocator.js.map +1 -1
  149. package/dist/util/index.d.ts +2 -1
  150. package/dist/util/index.d.ts.map +1 -1
  151. package/dist/util/index.js +5 -1
  152. package/dist/util/index.js.map +1 -1
  153. package/dist/util/rangeMap.d.ts +61 -30
  154. package/dist/util/rangeMap.d.ts.map +1 -1
  155. package/dist/util/rangeMap.js +189 -117
  156. package/dist/util/rangeMap.js.map +1 -1
  157. package/dist/util/utils.d.ts +4 -1
  158. package/dist/util/utils.d.ts.map +1 -1
  159. package/dist/util/utils.js +7 -1
  160. package/dist/util/utils.js.map +1 -1
  161. package/lib/alpha.d.ts +3 -0
  162. package/lib/core/index.d.ts +2 -2
  163. package/lib/core/index.d.ts.map +1 -1
  164. package/lib/core/index.js +2 -2
  165. package/lib/core/index.js.map +1 -1
  166. package/lib/core/rebase/index.d.ts +2 -2
  167. package/lib/core/rebase/index.d.ts.map +1 -1
  168. package/lib/core/rebase/index.js +2 -2
  169. package/lib/core/rebase/index.js.map +1 -1
  170. package/lib/core/rebase/types.d.ts +5 -4
  171. package/lib/core/rebase/types.d.ts.map +1 -1
  172. package/lib/core/rebase/types.js +26 -1
  173. package/lib/core/rebase/types.js.map +1 -1
  174. package/lib/core/rebase/utils.d.ts +10 -0
  175. package/lib/core/rebase/utils.d.ts.map +1 -1
  176. package/lib/core/rebase/utils.js +20 -0
  177. package/lib/core/rebase/utils.js.map +1 -1
  178. package/lib/core/tree/delta.d.ts +21 -26
  179. package/lib/core/tree/delta.d.ts.map +1 -1
  180. package/lib/core/tree/delta.js.map +1 -1
  181. package/lib/core/tree/deltaUtil.d.ts +1 -3
  182. package/lib/core/tree/deltaUtil.d.ts.map +1 -1
  183. package/lib/core/tree/deltaUtil.js +1 -12
  184. package/lib/core/tree/deltaUtil.js.map +1 -1
  185. package/lib/core/tree/index.d.ts +1 -1
  186. package/lib/core/tree/index.d.ts.map +1 -1
  187. package/lib/core/tree/index.js +1 -1
  188. package/lib/core/tree/index.js.map +1 -1
  189. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  190. package/lib/core/tree/visitDelta.js +82 -80
  191. package/lib/core/tree/visitDelta.js.map +1 -1
  192. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  193. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  194. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  195. package/lib/feature-libraries/deltaUtils.js +13 -0
  196. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  197. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  198. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  199. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  200. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  201. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  202. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  203. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  204. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  205. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  206. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  207. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  208. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  209. package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
  210. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  211. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  212. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  213. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  214. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  215. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  216. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  217. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  218. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +74 -166
  219. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  220. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  221. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  222. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +18 -1
  223. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  224. package/lib/feature-libraries/optional-field/optionalField.d.ts +3 -3
  225. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  226. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  227. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  228. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  229. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  230. package/lib/feature-libraries/sequence-field/rebase.js +4 -4
  231. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  232. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  233. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  234. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  235. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  236. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  237. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  238. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  239. package/lib/feature-libraries/sequence-field/utils.js +36 -4
  240. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  241. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  242. package/lib/feature-libraries/treeCursorUtils.js +6 -3
  243. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  244. package/lib/index.d.ts +26 -2
  245. package/lib/index.d.ts.map +1 -1
  246. package/lib/index.js +1 -1
  247. package/lib/index.js.map +1 -1
  248. package/lib/legacy.d.ts +3 -1
  249. package/lib/packageVersion.d.ts +1 -1
  250. package/lib/packageVersion.js +1 -1
  251. package/lib/packageVersion.js.map +1 -1
  252. package/lib/shared-tree/index.d.ts +2 -1
  253. package/lib/shared-tree/index.d.ts.map +1 -1
  254. package/lib/shared-tree/index.js +2 -1
  255. package/lib/shared-tree/index.js.map +1 -1
  256. package/lib/shared-tree/publicContracts.d.ts +18 -0
  257. package/lib/shared-tree/publicContracts.d.ts.map +1 -0
  258. package/lib/shared-tree/publicContracts.js +21 -0
  259. package/lib/shared-tree/publicContracts.js.map +1 -0
  260. package/lib/shared-tree/sharedTree.d.ts +38 -18
  261. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  262. package/lib/shared-tree/sharedTree.js +40 -39
  263. package/lib/shared-tree/sharedTree.js.map +1 -1
  264. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  265. package/lib/shared-tree/treeCheckout.js +13 -9
  266. package/lib/shared-tree/treeCheckout.js.map +1 -1
  267. package/lib/simple-tree/api/schemaFactory.d.ts +2 -0
  268. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  269. package/lib/simple-tree/api/schemaFactory.js +2 -0
  270. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  271. package/lib/simple-tree/api/tree.d.ts +4 -0
  272. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  273. package/lib/simple-tree/api/tree.js.map +1 -1
  274. package/lib/simple-tree/api/treeNodeApi.js +1 -1
  275. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  276. package/lib/simple-tree/arrayNode.js +1 -1
  277. package/lib/simple-tree/arrayNode.js.map +1 -1
  278. package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  279. package/lib/simple-tree/core/getOrCreateNode.js +2 -2
  280. package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
  281. package/lib/simple-tree/core/index.d.ts +1 -1
  282. package/lib/simple-tree/core/index.d.ts.map +1 -1
  283. package/lib/simple-tree/core/index.js +1 -1
  284. package/lib/simple-tree/core/index.js.map +1 -1
  285. package/lib/simple-tree/core/treeNodeKernel.d.ts +2 -6
  286. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  287. package/lib/simple-tree/core/treeNodeKernel.js +9 -11
  288. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  289. package/lib/simple-tree/proxies.js +2 -2
  290. package/lib/simple-tree/proxies.js.map +1 -1
  291. package/lib/simple-tree/toMapTree.js +1 -1
  292. package/lib/simple-tree/toMapTree.js.map +1 -1
  293. package/lib/util/bTreeUtils.d.ts +10 -0
  294. package/lib/util/bTreeUtils.d.ts.map +1 -0
  295. package/lib/util/bTreeUtils.js +47 -0
  296. package/lib/util/bTreeUtils.js.map +1 -0
  297. package/lib/util/idAllocator.d.ts +0 -2
  298. package/lib/util/idAllocator.d.ts.map +1 -1
  299. package/lib/util/idAllocator.js +0 -2
  300. package/lib/util/idAllocator.js.map +1 -1
  301. package/lib/util/index.d.ts +2 -1
  302. package/lib/util/index.d.ts.map +1 -1
  303. package/lib/util/index.js +2 -1
  304. package/lib/util/index.js.map +1 -1
  305. package/lib/util/rangeMap.d.ts +61 -30
  306. package/lib/util/rangeMap.d.ts.map +1 -1
  307. package/lib/util/rangeMap.js +188 -117
  308. package/lib/util/rangeMap.js.map +1 -1
  309. package/lib/util/utils.d.ts +4 -1
  310. package/lib/util/utils.d.ts.map +1 -1
  311. package/lib/util/utils.js +7 -1
  312. package/lib/util/utils.js.map +1 -1
  313. package/package.json +25 -25
  314. package/src/core/index.ts +5 -2
  315. package/src/core/rebase/index.ts +5 -0
  316. package/src/core/rebase/types.ts +33 -5
  317. package/src/core/rebase/utils.ts +27 -0
  318. package/src/core/tree/delta.ts +21 -26
  319. package/src/core/tree/deltaUtil.ts +1 -16
  320. package/src/core/tree/index.ts +0 -2
  321. package/src/core/tree/visitDelta.ts +108 -97
  322. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +2 -2
  323. package/src/feature-libraries/deltaUtils.ts +13 -0
  324. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -6
  325. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +12 -13
  326. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +21 -1
  327. package/src/feature-libraries/modular-schema/genericFieldKind.ts +2 -2
  328. package/src/feature-libraries/modular-schema/index.ts +2 -0
  329. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +12 -11
  330. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +138 -225
  331. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +40 -27
  332. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  333. package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
  334. package/src/feature-libraries/sequence-field/rebase.ts +9 -3
  335. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
  336. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
  337. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +3 -4
  338. package/src/feature-libraries/sequence-field/utils.ts +36 -4
  339. package/src/feature-libraries/treeCursorUtils.ts +10 -3
  340. package/src/index.ts +36 -6
  341. package/src/packageVersion.ts +1 -1
  342. package/src/shared-tree/index.ts +9 -1
  343. package/src/shared-tree/publicContracts.ts +24 -0
  344. package/src/shared-tree/sharedTree.ts +63 -46
  345. package/src/shared-tree/treeCheckout.ts +19 -12
  346. package/src/simple-tree/api/schemaFactory.ts +2 -0
  347. package/src/simple-tree/api/tree.ts +4 -0
  348. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  349. package/src/simple-tree/arrayNode.ts +1 -1
  350. package/src/simple-tree/core/getOrCreateNode.ts +6 -2
  351. package/src/simple-tree/core/index.ts +1 -1
  352. package/src/simple-tree/core/treeNodeKernel.ts +16 -14
  353. package/src/simple-tree/proxies.ts +2 -2
  354. package/src/simple-tree/toMapTree.ts +1 -1
  355. package/src/util/bTreeUtils.ts +60 -0
  356. package/src/util/idAllocator.ts +0 -2
  357. package/src/util/index.ts +3 -0
  358. package/src/util/rangeMap.ts +237 -143
  359. package/src/util/utils.ts +10 -3
  360. package/lib/package.json +0 -3
@@ -24,9 +24,9 @@ import { type Mutable, fail, isReadonlyArray } from "../util/index.js";
24
24
  import {
25
25
  getKernel,
26
26
  type TreeNode,
27
- tryGetTreeNodeFromMapNode,
28
27
  getOrCreateNodeFromInnerNode,
29
28
  tryUnhydratedFlexTreeNode,
29
+ unhydratedFlexTreeNodeToTreeNode,
30
30
  } from "./core/index.js";
31
31
 
32
32
  /**
@@ -146,7 +146,7 @@ function walkMapTree(
146
146
  const [p, m] = next;
147
147
  const mapTreeNode = tryUnhydratedFlexTreeNode(m);
148
148
  if (mapTreeNode !== undefined) {
149
- const treeNode = tryGetTreeNodeFromMapNode(mapTreeNode);
149
+ const treeNode = unhydratedFlexTreeNodeToTreeNode.get(mapTreeNode);
150
150
  if (treeNode !== undefined) {
151
151
  onVisitTreeNode(p, treeNode);
152
152
  }
@@ -196,7 +196,7 @@ function nodeDataToMapTree(
196
196
  result = objectToMapTree(data, schema);
197
197
  break;
198
198
  default:
199
- fail(`Unrecognized schema kind: ${schema.kind}.`);
199
+ fail("Unrecognized schema kind");
200
200
  }
201
201
 
202
202
  return result;
@@ -0,0 +1,60 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { BTree } from "@tylerbu/sorted-btree-es6";
7
+ import { brand, type Brand } from "./brand.js";
8
+
9
+ export type TupleBTree<K, V> = Brand<BTree<K, V>, "TupleBTree">;
10
+
11
+ export function newTupleBTree<K extends readonly unknown[], V>(
12
+ entries?: [K, V][],
13
+ ): TupleBTree<K, V> {
14
+ return brand(new BTree<K, V>(entries, compareTuples));
15
+ }
16
+
17
+ // This assumes that the arrays are the same length.
18
+ function compareTuples(arrayA: readonly unknown[], arrayB: readonly unknown[]): number {
19
+ for (let i = 0; i < arrayA.length; i++) {
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const a = arrayA[i] as any;
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ const b = arrayB[i] as any;
24
+
25
+ // Less-than and greater-than always return false if either value is undefined,
26
+ // so we handle undefined separately, treating it as less than all other values.
27
+ if (a === undefined && b !== undefined) {
28
+ return -1;
29
+ } else if (b === undefined && a !== undefined) {
30
+ return 1;
31
+ } else if (a < b) {
32
+ return -1;
33
+ } else if (a > b) {
34
+ return 1;
35
+ }
36
+ }
37
+
38
+ return 0;
39
+ }
40
+
41
+ export function mergeTupleBTrees<K extends readonly unknown[], V>(
42
+ tree1: TupleBTree<K, V> | undefined,
43
+ tree2: TupleBTree<K, V> | undefined,
44
+ preferLeft = true,
45
+ ): TupleBTree<K, V> {
46
+ if (tree1 === undefined) {
47
+ return tree2 !== undefined ? brand(tree2.clone()) : newTupleBTree<K, V>();
48
+ }
49
+
50
+ const result: TupleBTree<K, V> = brand(tree1.clone());
51
+ if (tree2 === undefined) {
52
+ return result;
53
+ }
54
+
55
+ for (const [key, value] of tree2.entries()) {
56
+ result.set(key, value, !preferLeft);
57
+ }
58
+
59
+ return result;
60
+ }
@@ -26,8 +26,6 @@ export interface IdAllocationState {
26
26
  maxId: number;
27
27
  }
28
28
 
29
- /**
30
- */
31
29
  export function idAllocatorFromMaxId(maxId: number | undefined = undefined): IdAllocator {
32
30
  return idAllocatorFromState({ maxId: maxId ?? -1 });
33
31
  }
package/src/util/index.ts CHANGED
@@ -123,6 +123,7 @@ export {
123
123
  export {
124
124
  RangeMap,
125
125
  type RangeQueryResult,
126
+ newIntegerRangeMap,
126
127
  } from "./rangeMap.js";
127
128
 
128
129
  export {
@@ -140,3 +141,5 @@ export {
140
141
  throwIfBroken,
141
142
  breakingClass,
142
143
  } from "./breakable.js";
144
+
145
+ export { type TupleBTree, newTupleBTree, mergeTupleBTrees } from "./bTreeUtils.js";
@@ -3,25 +3,93 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { oob } from "@fluidframework/core-utils/internal";
6
+ import { assert, oob } from "@fluidframework/core-utils/internal";
7
+ import { BTree } from "@tylerbu/sorted-btree-es6";
7
8
 
8
9
  /**
9
- * RangeMap represents a mapping from integers to values of type T or undefined.
10
+ * RangeMap represents a mapping from keys of type K to values of type V or undefined.
11
+ * The set of all possible keys is assumed to be fully ordered,
12
+ * and for each key there should be a single next higher key.
10
13
  * The values for a range of consecutive keys can be changed or queried in a single operation.
14
+ * The structure of the keys is described by the `offsetKey` and `subtractKeys` functions provided in the constructor.
11
15
  */
12
- export class RangeMap<T> {
13
- private readonly entries: RangeEntry<T>[];
16
+ export class RangeMap<K, V> {
17
+ private tree: BTree<K, RangeEntry<V>>;
14
18
 
15
- public constructor(initialEntries?: RangeEntry<T>[]) {
16
- this.entries = initialEntries ? [...initialEntries] : [];
19
+ /**
20
+ * @param offsetKey - Function which returns a new key which is `offset` keys after `key`.
21
+ * When `offset` is negative, the returned key should come before `key`.
22
+ *
23
+ * @param subtractKeys - Function which returns the difference between `b` and `a`.
24
+ * Offsetting `b` by this difference should return `a`.
25
+ * The difference can be infinite if `a` cannot be reached from `b` by offsetting,
26
+ * but the difference should still be positive if `a` is larger than `b` and negative if smaller.
27
+ *
28
+ * @param offsetValue - Function used to associate a range of values with a range of keys.
29
+ * When writing to a range of keys starting with `start`, the value of the nth key is interpreted to be
30
+ * `offsetValue(firstValue, n - 1)`.
31
+ * The same logic should be used when interpreting the values for keys after the first in a
32
+ * `RangeQueryResult` or `RangeQueryEntry`.
33
+ *
34
+ * If `offsetValue` is left unspecified, all keys in a block will be given the same value.
35
+ */
36
+ public constructor(
37
+ private readonly offsetKey: (key: K, offset: number) => K,
38
+ private readonly subtractKeys: (a: K, b: K) => number,
39
+ public readonly offsetValue: (value: V, offset: number) => V = defaultValueOffsetFn,
40
+ ) {
41
+ this.tree = new BTree(undefined, subtractKeys);
17
42
  }
18
43
 
19
44
  /**
20
- * Retrieves all entries from the rangeMap.
21
- * @returns An array of RangeEntryResult objects, each containing the start index, length, and value of a contiguous range.
45
+ * Retrieves all entries from the RangeMap.
22
46
  */
23
- public getAllEntries(): readonly RangeQueryResult<T>[] {
24
- return this.entries;
47
+ public entries(): RangeQueryEntry<K, V>[] {
48
+ const entries: RangeQueryEntry<K, V>[] = [];
49
+ for (const [start, entry] of this.tree.entries()) {
50
+ entries.push({ start, length: entry.length, value: entry.value });
51
+ }
52
+
53
+ return entries;
54
+ }
55
+
56
+ public clear(): void {
57
+ this.tree.clear();
58
+ }
59
+
60
+ /**
61
+ * Retrieves the values for all keys in the query range.
62
+ *
63
+ * @param start - The first key in the range being queried
64
+ * @param length - The length of the query range
65
+ * @returns A list of entries, each describing the value for some subrange of the query.
66
+ * The entries are in the same order as the keys, and there is an entry for every key with a non `undefined` value.
67
+ */
68
+ public getAll(start: K, length: number): RangeQueryEntry<K, V>[] {
69
+ const entries = this.getIntersectingEntries(start, length);
70
+ if (entries.length === 0) {
71
+ return entries;
72
+ }
73
+
74
+ const firstEntry = entries[0] ?? oob();
75
+ const lengthBefore = this.subtractKeys(start, firstEntry.start);
76
+ if (lengthBefore > 0) {
77
+ entries[0] = {
78
+ start,
79
+ length: firstEntry.length - lengthBefore,
80
+ value: this.offsetValue(firstEntry.value, lengthBefore),
81
+ };
82
+ }
83
+
84
+ const lastEntry = entries[entries.length - 1] ?? oob();
85
+ const lastEntryKey = this.offsetKey(lastEntry.start, lastEntry.length - 1);
86
+ const lastQueryKey = this.offsetKey(start, length - 1);
87
+ const lengthAfter = this.subtractKeys(lastEntryKey, lastQueryKey);
88
+ if (lengthAfter > 0) {
89
+ entries[entries.length - 1] = { ...lastEntry, length: lastEntry.length - lengthAfter };
90
+ }
91
+
92
+ return entries;
25
93
  }
26
94
 
27
95
  /**
@@ -30,23 +98,44 @@ export class RangeMap<T> {
30
98
  * @param start - The first key in the query range.
31
99
  * @param length - The length of the query range.
32
100
  * @returns A RangeQueryResult containing the value associated with `start`,
33
- * and the number of consecutive keys with that same value.
101
+ * and the number of consecutive keys with that same value (at least 1, at most `length`).
34
102
  */
35
- public get(start: number, length: number): RangeQueryResult<T> {
36
- for (const entry of this.entries) {
37
- if (entry.start > start) {
38
- return { value: undefined, length: Math.min(entry.start - start, length) };
39
- }
103
+ public getFirst(start: K, length: number): RangeQueryResult<K, V> {
104
+ {
105
+ // We first check for an entry with a key less than or equal to `start`.
106
+ const entry = this.tree.getPairOrNextLower(start);
107
+ if (entry !== undefined) {
108
+ const entryKey = entry[0];
109
+ const { value, length: entryLength } = entry[1];
40
110
 
41
- const lastRangeKey = entry.start + entry.length - 1;
42
- if (lastRangeKey >= start) {
43
- const overlapLength = lastRangeKey - start + 1;
44
- return { value: entry.value, length: Math.min(overlapLength, length) };
111
+ const entryLastKey = this.offsetKey(entryKey, entryLength - 1);
112
+ const lengthBeforeQuery = this.subtractKeys(start, entryKey);
113
+ const overlappingLength = Math.min(this.subtractKeys(entryLastKey, start) + 1, length);
114
+ if (overlappingLength > 0) {
115
+ return {
116
+ value: this.offsetValue(value, lengthBeforeQuery),
117
+ start,
118
+ length: overlappingLength,
119
+ };
120
+ }
45
121
  }
46
122
  }
47
123
 
48
- // There were no entries intersecting the query range, so the entire query range has undefined value.
49
- return { value: undefined, length };
124
+ {
125
+ // There is no value associated with `start`.
126
+ // Now we need to determine how many of the following keys are also undefined.
127
+ const key = this.tree.nextHigherKey(start);
128
+ if (key !== undefined) {
129
+ const entryKey = key;
130
+
131
+ const lastQueryKey = this.offsetKey(start, length - 1);
132
+ if (this.le(entryKey, lastQueryKey)) {
133
+ return { value: undefined, start, length: this.subtractKeys(entryKey, start) };
134
+ }
135
+ }
136
+
137
+ return { value: undefined, start, length };
138
+ }
50
139
  }
51
140
 
52
141
  /**
@@ -56,74 +145,11 @@ export class RangeMap<T> {
56
145
  * @param length - The length of the range.
57
146
  * @param value - The value to associate with the range.
58
147
  */
59
- public set(start: number, length: number, value: T | undefined): void {
60
- if (value === undefined) {
61
- this.delete(start, length);
62
- return;
63
- }
64
-
65
- const end = start + length - 1;
66
- const newEntry: RangeEntry<T> = { start, length, value };
67
-
68
- let iBefore = -1;
69
- let iAfter = this.entries.length;
70
- for (const [i, entry] of this.entries.entries()) {
71
- const entryLastKey = entry.start + entry.length - 1;
72
- if (entryLastKey < start) {
73
- iBefore = i;
74
- } else if (entry.start > end) {
75
- iAfter = i;
76
- break;
77
- }
78
- }
79
-
80
- const numOverlappingEntries = iAfter - iBefore - 1;
81
- if (numOverlappingEntries === 0) {
82
- this.entries.splice(iAfter, 0, newEntry);
83
- return;
84
- }
85
-
86
- const iFirst = iBefore + 1;
87
- const firstEntry = this.entries[iFirst] ?? oob();
88
- const iLast = iAfter - 1;
89
- const lastEntry = this.entries[iLast] ?? oob();
90
- const lengthBeforeFirst = start - firstEntry.start;
91
- const lastEntryKey = lastEntry.start + lastEntry.length - 1;
92
- const lengthAfterLast = lastEntryKey - end;
93
-
94
- if (lengthBeforeFirst > 0 && lengthAfterLast > 0 && iFirst === iLast) {
95
- // The new entry fits in the middle of an existing entry.
96
- // We replace the existing entry with:
97
- // 1) the portion which comes before `newEntry`
98
- // 2) `newEntry`
99
- // 3) the portion which comes after `newEntry`
100
- this.entries.splice(iFirst, 1, { ...firstEntry, length: lengthBeforeFirst }, newEntry, {
101
- ...lastEntry,
102
- start: end + 1,
103
- length: lengthAfterLast,
104
- });
105
- return;
106
- }
107
-
108
- if (lengthBeforeFirst > 0) {
109
- this.entries[iFirst] = { ...firstEntry, length: lengthBeforeFirst };
110
- // The entry at `iFirst` is no longer overlapping with `newEntry`.
111
- iBefore = iFirst;
112
- }
113
-
114
- if (lengthAfterLast > 0) {
115
- this.entries[iLast] = {
116
- ...lastEntry,
117
- start: end + 1,
118
- length: lengthAfterLast,
119
- };
120
-
121
- // The entry at `iLast` is no longer overlapping with `newEntry`.
122
- iAfter = iLast;
148
+ public set(start: K, length: number, value: V | undefined): void {
149
+ this.delete(start, length);
150
+ if (value !== undefined) {
151
+ this.tree.set(start, { value, length });
123
152
  }
124
-
125
- const numContainedEntries = iAfter - iBefore - 1;
126
- this.entries.splice(iBefore + 1, numContainedEntries, newEntry);
127
153
  }
128
154
 
129
155
  /**
@@ -146,74 +172,117 @@ export class RangeMap<T> {
146
172
  * @param start - The start of the range to delete (inclusive).
147
173
  * @param length - The length of the range to delete.
148
174
  */
149
- public delete(start: number, length: number): void {
150
- const end = start + length - 1;
151
-
152
- let iBefore = -1;
153
- let iAfter = this.entries.length;
154
-
155
- for (const [i, entry] of this.entries.entries()) {
156
- const entryLastKey = entry.start + entry.length - 1;
157
- if (entryLastKey < start) {
158
- iBefore = i;
159
- } else if (entry.start > end) {
160
- iAfter = i;
161
- break;
175
+ public delete(start: K, length: number): void {
176
+ const lastDeleteKey = this.offsetKey(start, length - 1);
177
+ for (const { start: key, length: entryLength, value } of this.getIntersectingEntries(
178
+ start,
179
+ length,
180
+ )) {
181
+ this.tree.delete(key);
182
+ const lengthBefore = this.subtractKeys(start, key);
183
+ if (lengthBefore > 0) {
184
+ // A portion of this entry comes before the deletion range, so we reinsert that portion.
185
+ this.tree.set(key, { length: lengthBefore, value });
186
+ }
187
+
188
+ const lastEntryKey = this.offsetKey(key, entryLength - 1);
189
+ const lengthAfter = this.subtractKeys(lastEntryKey, lastDeleteKey);
190
+ if (lengthAfter > 0) {
191
+ // A portion of this entry comes after the deletion range, so we reinsert that portion.
192
+ const newKey = this.offsetKey(lastDeleteKey, 1);
193
+ const difference = this.subtractKeys(newKey, key);
194
+ this.tree.set(newKey, {
195
+ length: lengthAfter,
196
+ value: this.offsetValue(value, difference),
197
+ });
162
198
  }
163
199
  }
200
+ }
201
+
202
+ public clone(): RangeMap<K, V> {
203
+ const cloned = new RangeMap<K, V>(this.offsetKey, this.subtractKeys, this.offsetValue);
204
+ cloned.tree = this.tree.clone();
205
+ return cloned;
206
+ }
164
207
 
165
- const numOverlappingEntries = iAfter - iBefore - 1;
208
+ /**
209
+ * Returns a new map which contains the entries from both input maps.
210
+ */
211
+ public static union<K, V>(a: RangeMap<K, V>, b: RangeMap<K, V>): RangeMap<K, V> {
212
+ assert(
213
+ a.offsetKey === b.offsetKey &&
214
+ a.subtractKeys === b.subtractKeys &&
215
+ a.offsetValue === b.offsetValue,
216
+ 0xaae /* Maps should have the same behavior */,
217
+ );
166
218
 
167
- if (numOverlappingEntries === 0) {
168
- // No entry will be removed
169
- return;
219
+ const merged = new RangeMap<K, V>(a.offsetKey, a.subtractKeys, a.offsetValue);
220
+
221
+ // TODO: Is there a good pattern that lets us make `tree` readonly?
222
+ merged.tree = a.tree.clone();
223
+ for (const [key, value] of b.tree.entries()) {
224
+ // TODO: Handle key collisions
225
+ merged.tree.set(key, value);
170
226
  }
171
227
 
172
- const iFirst = iBefore + 1;
173
- const iLast = iAfter - 1;
174
-
175
- for (let i = iFirst; i <= iLast; ++i) {
176
- const entry = this.entries[i] ?? oob();
177
- const entryLastKey = entry.start + entry.length - 1;
178
- let isDirty = false;
179
-
180
- if (entry.start >= start && entryLastKey <= end) {
181
- // If the entry lies within the range to be deleted, remove it
182
- this.entries.splice(i, 1);
183
- } else {
184
- // If the entry partially or completely overlaps with the range to be deleted
185
- if (entry.start < start) {
186
- // Update the endpoint and length of the portion before the range to be deleted
187
- const lengthBefore = start - entry.start;
188
- this.entries[i] = { ...entry, length: lengthBefore };
189
- isDirty = true;
228
+ return merged;
229
+ }
230
+
231
+ private getIntersectingEntries(start: K, length: number): RangeQueryEntry<K, V>[] {
232
+ const entries: RangeQueryEntry<K, V>[] = [];
233
+ const lastQueryKey = this.offsetKey(start, length - 1);
234
+ {
235
+ const entry = this.tree.getPairOrNextLower(start);
236
+ if (entry !== undefined) {
237
+ const key = entry[0];
238
+ const { length: entryLength, value } = entry[1];
239
+ const lastEntryKey = this.offsetKey(key, entryLength - 1);
240
+ if (this.ge(lastEntryKey, start)) {
241
+ entries.push({ start: key, length: entryLength, value });
190
242
  }
243
+ }
244
+ }
191
245
 
192
- if (entryLastKey > end) {
193
- // Update the startpoint and length of the portion after the range to be deleted
194
- const newStart = end + 1;
195
- const newLength = entryLastKey - end;
196
- this.entries.splice(isDirty ? i + 1 : i, isDirty ? 0 : 1, {
197
- start: newStart,
198
- length: newLength,
199
- value: entry.value,
200
- });
246
+ {
247
+ let entry = this.tree.nextHigherPair(start);
248
+ while (entry !== undefined) {
249
+ const key = entry[0];
250
+ if (this.gt(key, lastQueryKey)) {
251
+ break;
201
252
  }
253
+
254
+ const { length: entryLength, value } = entry[1];
255
+ const lastEntryKey = this.offsetKey(key, entryLength - 1);
256
+
257
+ entries.push({ start: key, length: entryLength, value });
258
+ entry = this.tree.nextHigherPair(lastEntryKey);
202
259
  }
203
260
  }
261
+
262
+ return entries;
263
+ }
264
+
265
+ private gt(a: K, b: K): boolean {
266
+ return this.subtractKeys(a, b) > 0;
267
+ }
268
+
269
+ private ge(a: K, b: K): boolean {
270
+ return this.subtractKeys(a, b) >= 0;
271
+ }
272
+
273
+ private lt(a: K, b: K): boolean {
274
+ return this.subtractKeys(a, b) < 0;
275
+ }
276
+
277
+ private le(a: K, b: K): boolean {
278
+ return this.subtractKeys(a, b) <= 0;
204
279
  }
205
280
  }
206
281
 
207
282
  /**
208
283
  * Represents a contiguous range of values in the RangeMap.
209
- * This interface is used internally and should not be exposed to consumers.
210
284
  */
211
- interface RangeEntry<T> {
212
- /**
213
- * The starting index of the range (inclusive).
214
- */
215
- readonly start: number;
216
-
285
+ interface RangeEntry<V> {
217
286
  /**
218
287
  * The length of the range.
219
288
  */
@@ -222,18 +291,23 @@ interface RangeEntry<T> {
222
291
  /**
223
292
  * The value associated with this range.
224
293
  */
225
- readonly value: T;
294
+ readonly value: V;
226
295
  }
227
296
 
228
297
  /**
229
298
  * Describes the result of a range query, including the value and length of the matching prefix.
230
299
  */
231
- export interface RangeQueryResult<T> {
300
+ export interface RangeQueryResult<K, V> {
301
+ /**
302
+ * The key for the first element in the range.
303
+ */
304
+ readonly start: K;
305
+
232
306
  /**
233
307
  * The value of the first key in the query range.
234
308
  * If no matching range is found, this will be undefined.
235
309
  */
236
- readonly value: T | undefined;
310
+ readonly value: V | undefined;
237
311
 
238
312
  /**
239
313
  * The length of the prefix of the query range which has the same value.
@@ -242,3 +316,23 @@ export interface RangeQueryResult<T> {
242
316
  */
243
317
  readonly length: number;
244
318
  }
319
+
320
+ export interface RangeQueryEntry<K, V> extends RangeQueryResult<K, V> {
321
+ readonly value: V;
322
+ }
323
+
324
+ export function newIntegerRangeMap<V>(): RangeMap<number, V> {
325
+ return new RangeMap(offsetInteger, subtractIntegers);
326
+ }
327
+
328
+ function offsetInteger(key: number, offset: number): number {
329
+ return key + offset;
330
+ }
331
+
332
+ function subtractIntegers(a: number, b: number): number {
333
+ return a - b;
334
+ }
335
+
336
+ function defaultValueOffsetFn<T>(value: T, offset: number): T {
337
+ return value;
338
+ }
package/src/util/utils.ts CHANGED
@@ -48,9 +48,16 @@ export function asMutable<T>(readonly: T): Mutable<T> {
48
48
  export const clone = structuredClone;
49
49
 
50
50
  /**
51
- */
52
- export function fail(message: string): never {
53
- throw new Error(message);
51
+ * Throw an error with a constant message.
52
+ * @remarks
53
+ * Works like {@link @fluidframework/core-utils/internal#assert}.
54
+ */
55
+ export function fail(message: string | number): never {
56
+ // Declaring this here aliased to a different name avoids the assert tagging objecting to the usages of `assert` below.
57
+ // Since users of `fail` do the assert message tagging instead, suppressing tagging errors here makes sense.
58
+ const assertNoTag: (condition: boolean, message: string | number) => asserts condition =
59
+ assert;
60
+ assertNoTag(false, message);
54
61
  }
55
62
 
56
63
  /**
package/lib/package.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "type": "module"
3
- }