@fluidframework/tree 2.102.0 → 2.103.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 (367) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/codec/versioned/format.d.ts +5 -4
  3. package/dist/codec/versioned/format.d.ts.map +1 -1
  4. package/dist/codec/versioned/format.js +26 -3
  5. package/dist/codec/versioned/format.js.map +1 -1
  6. package/dist/core/rebase/types.d.ts +4 -3
  7. package/dist/core/rebase/types.d.ts.map +1 -1
  8. package/dist/core/rebase/types.js +27 -4
  9. package/dist/core/rebase/types.js.map +1 -1
  10. package/dist/core/schema-stored/formatV1.d.ts +16 -15
  11. package/dist/core/schema-stored/formatV1.d.ts.map +1 -1
  12. package/dist/core/schema-stored/formatV1.js +31 -8
  13. package/dist/core/schema-stored/formatV1.js.map +1 -1
  14. package/dist/core/schema-stored/formatV2.d.ts +29 -28
  15. package/dist/core/schema-stored/formatV2.d.ts.map +1 -1
  16. package/dist/core/schema-stored/formatV2.js +33 -10
  17. package/dist/core/schema-stored/formatV2.js.map +1 -1
  18. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +11 -10
  19. package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -1
  20. package/dist/core/tree/detachedFieldIndexFormatCommon.js +33 -10
  21. package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -1
  22. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +7 -6
  23. package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -1
  24. package/dist/core/tree/detachedFieldIndexFormatV2.js +25 -2
  25. package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -1
  26. package/dist/core/tree/persistedTreeTextFormat.d.ts +19 -18
  27. package/dist/core/tree/persistedTreeTextFormat.d.ts.map +1 -1
  28. package/dist/core/tree/persistedTreeTextFormat.js +33 -10
  29. package/dist/core/tree/persistedTreeTextFormat.js.map +1 -1
  30. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  31. package/dist/feature-libraries/chunked-forest/chunkTree.js +1 -1
  32. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  33. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +13 -12
  34. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  35. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js +36 -13
  36. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  37. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.d.ts +36 -35
  38. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.d.ts.map +1 -1
  39. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.js +41 -18
  40. package/dist/feature-libraries/chunked-forest/codec/format/formatV1.js.map +1 -1
  41. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.d.ts +26 -25
  42. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.d.ts.map +1 -1
  43. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.js +27 -4
  44. package/dist/feature-libraries/chunked-forest/codec/format/formatV2.js.map +1 -1
  45. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.d.ts +24 -23
  46. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.d.ts.map +1 -1
  47. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.js +30 -7
  48. package/dist/feature-libraries/chunked-forest/codec/format/formatVText.js.map +1 -1
  49. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts +66 -14
  50. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  51. package/dist/feature-libraries/chunked-forest/uniformChunk.js +101 -36
  52. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  53. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  54. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +36 -14
  55. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  56. package/dist/feature-libraries/forest-summary/formatCommon.d.ts +6 -5
  57. package/dist/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -1
  58. package/dist/feature-libraries/forest-summary/formatCommon.js +26 -3
  59. package/dist/feature-libraries/forest-summary/formatCommon.js.map +1 -1
  60. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +4 -3
  61. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  62. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js +26 -3
  63. package/dist/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  64. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts +45 -44
  65. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  66. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js +48 -25
  67. package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  68. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +23 -22
  69. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  70. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +29 -6
  71. package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  72. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +9 -8
  73. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  74. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.js +31 -8
  75. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV1.js.map +1 -1
  76. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +14 -13
  77. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  78. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.js +34 -11
  79. package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV2.js.map +1 -1
  80. package/dist/feature-libraries/schema-edits/schemaChangeFormat.d.ts +5 -4
  81. package/dist/feature-libraries/schema-edits/schemaChangeFormat.d.ts.map +1 -1
  82. package/dist/feature-libraries/schema-edits/schemaChangeFormat.js +25 -2
  83. package/dist/feature-libraries/schema-edits/schemaChangeFormat.js.map +1 -1
  84. package/dist/feature-libraries/schema-index/formatV1.d.ts +15 -14
  85. package/dist/feature-libraries/schema-index/formatV1.d.ts.map +1 -1
  86. package/dist/feature-libraries/schema-index/formatV1.js +27 -4
  87. package/dist/feature-libraries/schema-index/formatV1.js.map +1 -1
  88. package/dist/feature-libraries/schema-index/formatV2.d.ts +20 -19
  89. package/dist/feature-libraries/schema-index/formatV2.d.ts.map +1 -1
  90. package/dist/feature-libraries/schema-index/formatV2.js +27 -4
  91. package/dist/feature-libraries/schema-index/formatV2.js.map +1 -1
  92. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  93. package/dist/feature-libraries/sequence-field/compose.js +1 -3
  94. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  95. package/dist/feature-libraries/sequence-field/formatV1.d.ts +283 -282
  96. package/dist/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  97. package/dist/feature-libraries/sequence-field/formatV1.js +63 -40
  98. package/dist/feature-libraries/sequence-field/formatV1.js.map +1 -1
  99. package/dist/feature-libraries/sequence-field/formatV2.d.ts +180 -179
  100. package/dist/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  101. package/dist/feature-libraries/sequence-field/formatV2.js +55 -32
  102. package/dist/feature-libraries/sequence-field/formatV2.js.map +1 -1
  103. package/dist/feature-libraries/sequence-field/formatV3.d.ts +126 -125
  104. package/dist/feature-libraries/sequence-field/formatV3.d.ts.map +1 -1
  105. package/dist/feature-libraries/sequence-field/formatV3.js +27 -4
  106. package/dist/feature-libraries/sequence-field/formatV3.js.map +1 -1
  107. package/dist/packageVersion.d.ts +1 -1
  108. package/dist/packageVersion.js +1 -1
  109. package/dist/packageVersion.js.map +1 -1
  110. package/dist/shared-tree/sharedTree.d.ts +2 -2
  111. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  112. package/dist/shared-tree/sharedTree.js.map +1 -1
  113. package/dist/shared-tree/sharedTreeChangeFormat.d.ts +8 -7
  114. package/dist/shared-tree/sharedTreeChangeFormat.d.ts.map +1 -1
  115. package/dist/shared-tree/sharedTreeChangeFormat.js +28 -5
  116. package/dist/shared-tree/sharedTreeChangeFormat.js.map +1 -1
  117. package/dist/shared-tree/treeCheckout.d.ts +3 -3
  118. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  119. package/dist/shared-tree/treeCheckout.js.map +1 -1
  120. package/dist/shared-tree-core/editManager.d.ts +2 -2
  121. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  122. package/dist/shared-tree-core/editManager.js.map +1 -1
  123. package/dist/shared-tree-core/editManagerFormatCommons.d.ts +35 -34
  124. package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  125. package/dist/shared-tree-core/editManagerFormatCommons.js +39 -16
  126. package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  127. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +15 -15
  128. package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  129. package/dist/shared-tree-core/editManagerFormatV1toV4.js +33 -10
  130. package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  131. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts +40 -40
  132. package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -1
  133. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js +27 -4
  134. package/dist/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -1
  135. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  136. package/dist/shared-tree-core/messageCodecVSharedBranches.js +25 -2
  137. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  138. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +5 -5
  139. package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  140. package/dist/shared-tree-core/messageFormatV1ToV4.js +31 -8
  141. package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  142. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts +7 -7
  143. package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  144. package/dist/shared-tree-core/messageFormatVSharedBranches.js +29 -6
  145. package/dist/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  146. package/dist/simple-tree/core/treeNodeKernel.d.ts +5 -0
  147. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  148. package/dist/simple-tree/core/treeNodeKernel.js +37 -13
  149. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  150. package/dist/simple-tree/simpleSchemaFormatV1.d.ts +121 -120
  151. package/dist/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
  152. package/dist/simple-tree/simpleSchemaFormatV1.js +54 -31
  153. package/dist/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  154. package/dist/util/typeboxBrand.d.ts +1 -1
  155. package/dist/util/typeboxBrand.d.ts.map +1 -1
  156. package/dist/util/typeboxBrand.js +26 -3
  157. package/dist/util/typeboxBrand.js.map +1 -1
  158. package/dist/util/utils.d.ts +2 -2
  159. package/dist/util/utils.d.ts.map +1 -1
  160. package/dist/util/utils.js +25 -2
  161. package/dist/util/utils.js.map +1 -1
  162. package/eslint.config.mts +44 -0
  163. package/lib/codec/versioned/format.d.ts +5 -4
  164. package/lib/codec/versioned/format.d.ts.map +1 -1
  165. package/lib/codec/versioned/format.js +1 -1
  166. package/lib/codec/versioned/format.js.map +1 -1
  167. package/lib/core/rebase/types.d.ts +4 -3
  168. package/lib/core/rebase/types.d.ts.map +1 -1
  169. package/lib/core/rebase/types.js +1 -1
  170. package/lib/core/rebase/types.js.map +1 -1
  171. package/lib/core/schema-stored/formatV1.d.ts +16 -15
  172. package/lib/core/schema-stored/formatV1.d.ts.map +1 -1
  173. package/lib/core/schema-stored/formatV1.js +1 -1
  174. package/lib/core/schema-stored/formatV1.js.map +1 -1
  175. package/lib/core/schema-stored/formatV2.d.ts +29 -28
  176. package/lib/core/schema-stored/formatV2.d.ts.map +1 -1
  177. package/lib/core/schema-stored/formatV2.js +1 -1
  178. package/lib/core/schema-stored/formatV2.js.map +1 -1
  179. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +11 -10
  180. package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -1
  181. package/lib/core/tree/detachedFieldIndexFormatCommon.js +1 -1
  182. package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -1
  183. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +7 -6
  184. package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -1
  185. package/lib/core/tree/detachedFieldIndexFormatV2.js +1 -1
  186. package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -1
  187. package/lib/core/tree/persistedTreeTextFormat.d.ts +19 -18
  188. package/lib/core/tree/persistedTreeTextFormat.d.ts.map +1 -1
  189. package/lib/core/tree/persistedTreeTextFormat.js +1 -1
  190. package/lib/core/tree/persistedTreeTextFormat.js.map +1 -1
  191. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  192. package/lib/feature-libraries/chunked-forest/chunkTree.js +1 -1
  193. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  194. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +13 -12
  195. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  196. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js +1 -1
  197. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  198. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.d.ts +36 -35
  199. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.d.ts.map +1 -1
  200. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.js +1 -1
  201. package/lib/feature-libraries/chunked-forest/codec/format/formatV1.js.map +1 -1
  202. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.d.ts +26 -25
  203. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.d.ts.map +1 -1
  204. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.js +1 -1
  205. package/lib/feature-libraries/chunked-forest/codec/format/formatV2.js.map +1 -1
  206. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.d.ts +24 -23
  207. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.d.ts.map +1 -1
  208. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.js +1 -1
  209. package/lib/feature-libraries/chunked-forest/codec/format/formatVText.js.map +1 -1
  210. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts +66 -14
  211. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  212. package/lib/feature-libraries/chunked-forest/uniformChunk.js +101 -36
  213. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  214. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  215. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +36 -14
  216. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  217. package/lib/feature-libraries/forest-summary/formatCommon.d.ts +6 -5
  218. package/lib/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -1
  219. package/lib/feature-libraries/forest-summary/formatCommon.js +1 -1
  220. package/lib/feature-libraries/forest-summary/formatCommon.js.map +1 -1
  221. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts +4 -3
  222. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.d.ts.map +1 -1
  223. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js +1 -1
  224. package/lib/feature-libraries/modular-schema/genericFieldKindFormat.js.map +1 -1
  225. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts +45 -44
  226. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
  227. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js +1 -1
  228. package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
  229. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +23 -22
  230. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
  231. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +1 -1
  232. package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
  233. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts +9 -8
  234. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.d.ts.map +1 -1
  235. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.js +1 -1
  236. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV1.js.map +1 -1
  237. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts +14 -13
  238. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.d.ts.map +1 -1
  239. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.js +1 -1
  240. package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV2.js.map +1 -1
  241. package/lib/feature-libraries/schema-edits/schemaChangeFormat.d.ts +5 -4
  242. package/lib/feature-libraries/schema-edits/schemaChangeFormat.d.ts.map +1 -1
  243. package/lib/feature-libraries/schema-edits/schemaChangeFormat.js +1 -1
  244. package/lib/feature-libraries/schema-edits/schemaChangeFormat.js.map +1 -1
  245. package/lib/feature-libraries/schema-index/formatV1.d.ts +15 -14
  246. package/lib/feature-libraries/schema-index/formatV1.d.ts.map +1 -1
  247. package/lib/feature-libraries/schema-index/formatV1.js +1 -1
  248. package/lib/feature-libraries/schema-index/formatV1.js.map +1 -1
  249. package/lib/feature-libraries/schema-index/formatV2.d.ts +20 -19
  250. package/lib/feature-libraries/schema-index/formatV2.d.ts.map +1 -1
  251. package/lib/feature-libraries/schema-index/formatV2.js +1 -1
  252. package/lib/feature-libraries/schema-index/formatV2.js.map +1 -1
  253. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  254. package/lib/feature-libraries/sequence-field/compose.js +1 -3
  255. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  256. package/lib/feature-libraries/sequence-field/formatV1.d.ts +283 -282
  257. package/lib/feature-libraries/sequence-field/formatV1.d.ts.map +1 -1
  258. package/lib/feature-libraries/sequence-field/formatV1.js +1 -1
  259. package/lib/feature-libraries/sequence-field/formatV1.js.map +1 -1
  260. package/lib/feature-libraries/sequence-field/formatV2.d.ts +180 -179
  261. package/lib/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
  262. package/lib/feature-libraries/sequence-field/formatV2.js +1 -1
  263. package/lib/feature-libraries/sequence-field/formatV2.js.map +1 -1
  264. package/lib/feature-libraries/sequence-field/formatV3.d.ts +126 -125
  265. package/lib/feature-libraries/sequence-field/formatV3.d.ts.map +1 -1
  266. package/lib/feature-libraries/sequence-field/formatV3.js +1 -1
  267. package/lib/feature-libraries/sequence-field/formatV3.js.map +1 -1
  268. package/lib/packageVersion.d.ts +1 -1
  269. package/lib/packageVersion.js +1 -1
  270. package/lib/packageVersion.js.map +1 -1
  271. package/lib/shared-tree/sharedTree.d.ts +2 -2
  272. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  273. package/lib/shared-tree/sharedTree.js +1 -1
  274. package/lib/shared-tree/sharedTree.js.map +1 -1
  275. package/lib/shared-tree/sharedTreeChangeFormat.d.ts +8 -7
  276. package/lib/shared-tree/sharedTreeChangeFormat.d.ts.map +1 -1
  277. package/lib/shared-tree/sharedTreeChangeFormat.js +1 -1
  278. package/lib/shared-tree/sharedTreeChangeFormat.js.map +1 -1
  279. package/lib/shared-tree/treeCheckout.d.ts +3 -3
  280. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  281. package/lib/shared-tree/treeCheckout.js +1 -1
  282. package/lib/shared-tree/treeCheckout.js.map +1 -1
  283. package/lib/shared-tree-core/editManager.d.ts +2 -2
  284. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  285. package/lib/shared-tree-core/editManager.js.map +1 -1
  286. package/lib/shared-tree-core/editManagerFormatCommons.d.ts +35 -34
  287. package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
  288. package/lib/shared-tree-core/editManagerFormatCommons.js +1 -1
  289. package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
  290. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +15 -15
  291. package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
  292. package/lib/shared-tree-core/editManagerFormatV1toV4.js +1 -1
  293. package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
  294. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts +40 -40
  295. package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -1
  296. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js +1 -1
  297. package/lib/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -1
  298. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  299. package/lib/shared-tree-core/messageCodecVSharedBranches.js +1 -1
  300. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  301. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +5 -5
  302. package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
  303. package/lib/shared-tree-core/messageFormatV1ToV4.js +1 -1
  304. package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
  305. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts +7 -7
  306. package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -1
  307. package/lib/shared-tree-core/messageFormatVSharedBranches.js +1 -1
  308. package/lib/shared-tree-core/messageFormatVSharedBranches.js.map +1 -1
  309. package/lib/simple-tree/core/treeNodeKernel.d.ts +5 -0
  310. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  311. package/lib/simple-tree/core/treeNodeKernel.js +35 -12
  312. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  313. package/lib/simple-tree/simpleSchemaFormatV1.d.ts +121 -120
  314. package/lib/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
  315. package/lib/simple-tree/simpleSchemaFormatV1.js +1 -1
  316. package/lib/simple-tree/simpleSchemaFormatV1.js.map +1 -1
  317. package/lib/util/typeboxBrand.d.ts +1 -1
  318. package/lib/util/typeboxBrand.d.ts.map +1 -1
  319. package/lib/util/typeboxBrand.js +1 -1
  320. package/lib/util/typeboxBrand.js.map +1 -1
  321. package/lib/util/utils.d.ts +2 -2
  322. package/lib/util/utils.d.ts.map +1 -1
  323. package/lib/util/utils.js +1 -1
  324. package/lib/util/utils.js.map +1 -1
  325. package/package.json +21 -21
  326. package/src/codec/versioned/format.ts +2 -1
  327. package/src/core/rebase/types.ts +1 -1
  328. package/src/core/schema-stored/formatV1.ts +2 -1
  329. package/src/core/schema-stored/formatV2.ts +2 -1
  330. package/src/core/tree/detachedFieldIndexFormatCommon.ts +2 -1
  331. package/src/core/tree/detachedFieldIndexFormatV2.ts +2 -1
  332. package/src/core/tree/persistedTreeTextFormat.ts +2 -1
  333. package/src/feature-libraries/chunked-forest/chunkTree.ts +3 -2
  334. package/src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts +2 -1
  335. package/src/feature-libraries/chunked-forest/codec/format/formatV1.ts +2 -1
  336. package/src/feature-libraries/chunked-forest/codec/format/formatV2.ts +2 -1
  337. package/src/feature-libraries/chunked-forest/codec/format/formatVText.ts +2 -1
  338. package/src/feature-libraries/chunked-forest/uniformChunk.ts +131 -44
  339. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +36 -14
  340. package/src/feature-libraries/forest-summary/formatCommon.ts +2 -1
  341. package/src/feature-libraries/modular-schema/genericFieldKindFormat.ts +2 -1
  342. package/src/feature-libraries/modular-schema/modularChangeFormatV1.ts +2 -1
  343. package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +2 -1
  344. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV1.ts +2 -1
  345. package/src/feature-libraries/optional-field/optionalFieldChangeFormatV2.ts +2 -1
  346. package/src/feature-libraries/schema-edits/schemaChangeFormat.ts +2 -1
  347. package/src/feature-libraries/schema-index/formatV1.ts +2 -1
  348. package/src/feature-libraries/schema-index/formatV2.ts +2 -1
  349. package/src/feature-libraries/sequence-field/compose.ts +1 -4
  350. package/src/feature-libraries/sequence-field/formatV1.ts +2 -1
  351. package/src/feature-libraries/sequence-field/formatV2.ts +2 -1
  352. package/src/feature-libraries/sequence-field/formatV3.ts +2 -1
  353. package/src/packageVersion.ts +1 -1
  354. package/src/shared-tree/sharedTree.ts +2 -5
  355. package/src/shared-tree/sharedTreeChangeFormat.ts +2 -1
  356. package/src/shared-tree/treeCheckout.ts +3 -6
  357. package/src/shared-tree-core/editManager.ts +2 -2
  358. package/src/shared-tree-core/editManagerFormatCommons.ts +2 -1
  359. package/src/shared-tree-core/editManagerFormatV1toV4.ts +2 -1
  360. package/src/shared-tree-core/editManagerFormatVSharedBranches.ts +2 -1
  361. package/src/shared-tree-core/messageCodecVSharedBranches.ts +2 -1
  362. package/src/shared-tree-core/messageFormatV1ToV4.ts +2 -1
  363. package/src/shared-tree-core/messageFormatVSharedBranches.ts +2 -1
  364. package/src/simple-tree/core/treeNodeKernel.ts +39 -15
  365. package/src/simple-tree/simpleSchemaFormatV1.ts +2 -1
  366. package/src/util/typeboxBrand.ts +2 -1
  367. package/src/util/utils.ts +2 -1
@@ -147,9 +147,10 @@ function clonePositions(indexOfParentInOutput, [key, shape, copies], indexOfPare
147
147
  /**
148
148
  * The shape (see `TreeShape`) of a sequence of trees, all with the same shape (like `FieldShape`, but without a field key).
149
149
  *
150
- * This shape is optimized (by caching derived data like the positions array),
151
- * so that when paired with a value array it can be efficiently traversed like a tree by an {@link ITreeCursorSynchronous}.
152
- * See {@link uniformChunk} for how to do this.
150
+ * @remarks
151
+ * Paired with a value array, this lets a {@link UniformChunk} be traversed like a tree by an
152
+ * {@link ITreeCursorSynchronous}. The {@link Cursor} derives each node's position info from the
153
+ * shared {@link TreeShape.positions} plus the node's top-level index.
153
154
  *
154
155
  * TODO: consider storing shape information in WASM
155
156
  */
@@ -158,10 +159,6 @@ export class ChunkShape {
158
159
  this.treeShape = treeShape;
159
160
  this.topLevelLength = topLevelLength;
160
161
  assert(topLevelLength > 0, 0x4c6 /* topLevelLength must be greater than 0 */);
161
- // TODO: avoid duplication from inner loop
162
- const positions = [undefined];
163
- clonePositions(0, [dummyRoot, treeShape, topLevelLength], 0, 0, positions);
164
- this.positions = positions;
165
162
  }
166
163
  equals(other) {
167
164
  // TODO: either dedup instances and/or store a collision resistant hash for fast compare.
@@ -189,17 +186,19 @@ class OffsetShape {
189
186
  }
190
187
  }
191
188
  /**
192
- * Information about a node at a specific position within a uniform chunk.
189
+ * Information about a node at a specific position within one top-level tree of a {@link TreeShape}.
193
190
  */
194
191
  class NodePositionInfo {
195
192
  /**
196
- * @param parent - TODO
197
- * @param parentField - TODO
193
+ * @param parent - The parent node's {@link NodePositionInfo} or `undefined` for a root.
194
+ * @param parentField - The {@link FieldKey} of the field this node occupies within its parent.
198
195
  * @param parentIndex - indexWithinParentField
199
- * @param indexOfParentField - which field of the parent `parentIndex` is indexing into to locate this.
200
- * @param indexOfParentPosition - Index of parent NodePositionInfo in positions array. TODO: use offsets to avoid copying at top level?
196
+ * @param indexOfParentField - Which field of the parent `parentIndex` is indexing into to locate this.
197
+ * @param indexOfParentPosition - Index of this node's parent in {@link TreeShape.positions}
201
198
  * @param shape - Shape of the top level sequence this node is part of
202
- * @param valueOffset - TODO
199
+ * @param topLevelLength - Number of siblings in this node's field. For a root this is unused
200
+ * @param valueOffset - Offset of this node's value within one top-level tree's slice of the chunk's flat `values` array;
201
+ * only valid when `shape.hasValue` (otherwise it's where the value would have gone, and should not be used to read a value).
203
202
  */
204
203
  constructor(parent, // TODO; general UpPath to allow prefixing here?
205
204
  parentField, parentIndex, indexOfParentField, indexOfParentPosition, shape, // Shape of sequence that contains this node (top level is parent of this node)
@@ -217,20 +216,26 @@ class NodePositionInfo {
217
216
  /**
218
217
  * The cursor implementation for `UniformChunk`.
219
218
  *
220
- * Works by tracking its location in the chunk's `positions` array.
219
+ * @remarks
220
+ * Tracks a flat `positionIndex` and derives each node's position info from the shape's shared
221
+ * {@link TreeShape.positions} plus the node's top-level index.
221
222
  */
222
223
  class Cursor extends SynchronousCursor {
223
224
  // TODO: support prefix (path above root, including index offset of chunk in its containing field)
224
225
  constructor(chunk) {
225
226
  super();
226
227
  this.chunk = chunk;
228
+ /** Which top-level node of the chunk the current position is within. Valid when nodePositionInfo !== undefined. */
229
+ this.topLevelIndex = 0;
227
230
  this.mode = 1 /* CursorLocationType.Fields */;
228
231
  // Valid only in fields mode. Can be past end for empty fields.
229
232
  // This is redundant with fieldKey above (but might be worth keeping for perf), and could be removed.
230
233
  this.indexOfField = 0;
231
234
  this.chunkStart = 0;
232
235
  this.shape = this.chunk.shape;
233
- this.positions = this.shape.positions;
236
+ this.treeShape = this.shape.treeShape;
237
+ this.nodeLength = this.treeShape.positions.length;
238
+ this.stride = this.treeShape.valuesPerTopLevelNode;
234
239
  this.fieldKey = dummyRoot;
235
240
  this.moveToPosition(0);
236
241
  }
@@ -252,18 +257,62 @@ class Cursor extends SynchronousCursor {
252
257
  }
253
258
  /**
254
259
  * Change the current node within the chunk.
260
+ *
261
+ * @param positionIndex - flat position index of the newly selected node. This is NOT an index
262
+ * within a field, and is not bounds checked.
263
+ *
264
+ * @remarks
265
+ * Decomposes the index into {@link Cursor.topLevelIndex} and {@link Cursor.nodePositionInfo}.
255
266
  * See `nodeInfo` for getting data about the current node.
256
267
  *
257
- * @param positionIndex - index of the position of the newly selected node in `positions`.
258
- * This is NOT an index within a field, and is not bounds checked.
259
268
  */
260
269
  moveToPosition(positionIndex) {
261
- this.nodePositionInfo = this.positions[positionIndex];
262
270
  this.positionIndex = positionIndex;
263
- if (this.nodePositionInfo === undefined) {
264
- assert(positionIndex === 0, 0x561 /* expected root at start */);
271
+ if (positionIndex === 0) {
272
+ this.nodePositionInfo = undefined;
265
273
  assert(this.mode === 1 /* CursorLocationType.Fields */, 0x562 /* expected root to be a field */);
274
+ return;
266
275
  }
276
+ const decoded = this.decodePosition(positionIndex);
277
+ this.topLevelIndex = decoded.topLevelIndex;
278
+ this.nodePositionInfo = decoded.info;
279
+ }
280
+ /**
281
+ * Decode a flat `positionIndex` into its components.
282
+ *
283
+ * @param positionIndex - flat position index of the node to decode. Must be greater than 0;
284
+ * @returns the node's index within {@link TreeShape.positions} (`withinTree`), which top-level
285
+ * tree holds it (`topLevelIndex`), and the corresponding shared {@link NodePositionInfo} (`info`).
286
+ */
287
+ decodePosition(positionIndex) {
288
+ const offset = positionIndex - 1;
289
+ // Find the node's index within treeShape.positions, then which top-level tree holds it.
290
+ const withinTree = offset % this.nodeLength; // remainder
291
+ const topLevelIndex = (offset - withinTree) / this.nodeLength; // quotient
292
+ const info = this.treeShape.positions[withinTree] ?? oob();
293
+ return { withinTree, topLevelIndex, info };
294
+ }
295
+ /**
296
+ * Build a standalone {@link UpPath} for the node at `positionIndex`. O(depth) allocation.
297
+ *
298
+ * @remarks
299
+ * walks the shared per-tree {@link TreeShape.positions} and applies the top-level index
300
+ * at each level. Mirrors how the `BasicChunk` cursor allocates paths.
301
+ */
302
+ materializePath(positionIndex) {
303
+ if (positionIndex === 0) {
304
+ return undefined;
305
+ }
306
+ const { withinTree, topLevelIndex, info } = this.decodePosition(positionIndex);
307
+ if (info.parent === undefined) {
308
+ // Top-level node: its parent is the (prefixed) chunk root.
309
+ return { parent: undefined, parentField: info.parentField, parentIndex: topLevelIndex };
310
+ }
311
+ return {
312
+ parent: this.materializePath(positionIndex - withinTree + (info.indexOfParentPosition ?? oob())),
313
+ parentField: info.parentField,
314
+ parentIndex: info.parentIndex,
315
+ };
267
316
  }
268
317
  /**
269
318
  * Gets information about the current node.
@@ -357,29 +406,43 @@ class Cursor extends SynchronousCursor {
357
406
  enterRootNodeInner(childIndex) {
358
407
  this.mode = 0 /* CursorLocationType.Nodes */;
359
408
  this.fieldKey = undefined;
360
- // 1 for the "undefined" at the beginning of the positions array, then stride by top level tree shape.
361
- this.moveToPosition(1 + childIndex * this.shape.treeShape.positions.length);
409
+ // 1 for the "undefined" root-field marker at position 0, then stride by one top-level tree (nodeLength).
410
+ this.moveToPosition(1 + childIndex * this.nodeLength);
362
411
  assert(this.fieldIndex === childIndex, 0x543 /* should be at selected child */);
363
412
  }
364
413
  getFieldPath(prefix) {
365
414
  return prefixFieldPath(prefix, {
366
415
  field: this.getFieldKey(),
367
- parent: this.nodePositionInfo,
416
+ parent: this.materializePath(this.positionIndex),
368
417
  });
369
418
  }
370
419
  getPath(prefix) {
371
- return prefixPath(prefix, this.nodeInfo(0 /* CursorLocationType.Nodes */));
420
+ this.nodeInfo(0 /* CursorLocationType.Nodes */); // assert: in nodes mode at a node
421
+ return prefixPath(prefix, this.materializePath(this.positionIndex));
372
422
  }
373
423
  get fieldIndex() {
374
- return this.nodeInfo(0 /* CursorLocationType.Nodes */).parentIndex;
424
+ const info = this.nodeInfo(0 /* CursorLocationType.Nodes */);
425
+ return info.parent === undefined ? this.topLevelIndex : info.parentIndex;
426
+ }
427
+ /**
428
+ * Number of nodes in `info`'s field including `info` itself.
429
+ *
430
+ * @remarks
431
+ * For top-level nodes this is the chunk's `topLevelLength`, read from the chunk
432
+ * rather than the node, so the shared per-tree {@link TreeShape.positions} stays independent of
433
+ * chunk length; the root entry's own `topLevelLength` field is unused. Nested nodes use the
434
+ * field length stored on the node.
435
+ */
436
+ siblingCount(info) {
437
+ return info.parent === undefined ? this.shape.topLevelLength : info.topLevelLength;
375
438
  }
376
439
  get chunkLength() {
377
- return this.nodeInfo(0 /* CursorLocationType.Nodes */).topLevelLength;
440
+ return this.siblingCount(this.nodeInfo(0 /* CursorLocationType.Nodes */));
378
441
  }
379
442
  seekNodes(offset) {
380
443
  const info = this.nodeInfo(0 /* CursorLocationType.Nodes */);
381
- const index = offset + info.parentIndex;
382
- if (index >= 0 && index < info.topLevelLength) {
444
+ const index = offset + this.fieldIndex;
445
+ if (index >= 0 && index < this.siblingCount(info)) {
383
446
  this.moveToPosition(this.positionIndex + offset * info.shape.positions.length);
384
447
  return true;
385
448
  }
@@ -389,8 +452,8 @@ class Cursor extends SynchronousCursor {
389
452
  nextNode() {
390
453
  // This is the same as `return this.seekNodes(1);` but slightly faster.
391
454
  const info = this.nodeInfo(0 /* CursorLocationType.Nodes */);
392
- const index = info.parentIndex + 1;
393
- if (index === info.topLevelLength) {
455
+ const index = this.fieldIndex + 1;
456
+ if (index === this.siblingCount(info)) {
394
457
  this.exitNode();
395
458
  return false;
396
459
  }
@@ -399,13 +462,15 @@ class Cursor extends SynchronousCursor {
399
462
  }
400
463
  exitNode() {
401
464
  const info = this.nodeInfo(0 /* CursorLocationType.Nodes */);
402
- this.indexOfField =
403
- info.indexOfParentField ??
404
- fail(0xb0a /* navigation up to root field not yet supported */); // TODO;
465
+ const withinTree = this.positionIndex - 1 - this.topLevelIndex * this.nodeLength;
466
+ // Top-level nodes (no parent) exit to the root field at position 0;
467
+ // nested nodes' parent is `indexOfParentPosition` within the same top-level instance.
468
+ this.indexOfField = info.indexOfParentField ?? 0;
405
469
  this.fieldKey = info.parentField;
406
470
  this.mode = 1 /* CursorLocationType.Fields */;
407
- this.moveToPosition(info.indexOfParentPosition ??
408
- fail(0xb0b /* navigation up to root field not yet supported */)); // TODO
471
+ this.moveToPosition(info.indexOfParentPosition === undefined
472
+ ? 0
473
+ : this.positionIndex - withinTree + info.indexOfParentPosition);
409
474
  }
410
475
  firstField() {
411
476
  const fieldsArray = this.nodeInfo(0 /* CursorLocationType.Nodes */).shape.fieldsArray;
@@ -434,7 +499,7 @@ class Cursor extends SynchronousCursor {
434
499
  get value() {
435
500
  const info = this.nodeInfo(0 /* CursorLocationType.Nodes */);
436
501
  if (info.shape.hasValue) {
437
- const value = this.chunk.values[info.valueOffset];
502
+ const value = this.chunk.values[info.valueOffset + this.topLevelIndex * this.stride];
438
503
  // If mayContainCompressedIds is set, check if the value is a number (i.e. a compressed ID that needs decompression).
439
504
  if (info.shape.mayContainCompressedIds && typeof value === "number") {
440
505
  const idCompressor = this.chunk.idCompressor;
@@ -1 +1 @@
1
- {"version":3,"file":"uniformChunk.js","sourceRoot":"","sources":["../../../src/feature-libraries/chunked-forest/uniformChunk.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, compareArrays, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport type { SessionSpaceCompressedId, IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tCursorLocationType,\n\ttype FieldKey,\n\ttype FieldUpPath,\n\ttype PathRootPrefix,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeValue,\n\ttype UpPath,\n\ttype Value,\n\ttype ChunkedCursor,\n\ttype TreeChunk,\n\tcursorChunk,\n\tdummyRoot,\n} from \"../../core/index.js\";\nimport { ReferenceCountedBase, getOrCreate, hasSome } from \"../../util/index.js\";\nimport { SynchronousCursor, prefixFieldPath, prefixPath } from \"../treeCursorUtils.js\";\n\n/**\n * Create a tree chunk with ref count 1.\n *\n * @param shape - describes the semantics and layout of `values`.\n * @param values - provides exclusive ownership of this array to this object (which might mutate it in the future).\n */\nexport function uniformChunk(shape: ChunkShape, values: TreeValue[]): TreeChunk {\n\treturn new UniformChunk(shape, values);\n}\n\n/**\n * Chunk which handles a sequence of trees with identical \"shape\" (see `TreeShape`).\n *\n * Separates shape from content,\n * allowing deduplication of shape information and storing of content as a flat sequence of values.\n */\nexport class UniformChunk extends ReferenceCountedBase implements TreeChunk {\n\tpublic idCompressor: undefined | IIdCompressor;\n\t/**\n\t * Create a tree chunk with ref count 1.\n\t *\n\t * @param shape - describes the semantics and layout of `values`.\n\t * @param values - provides exclusive ownership of this array to this object (which might mutate it in the future).\n\t */\n\tpublic constructor(\n\t\tpublic shape: ChunkShape,\n\t\tpublic values: TreeValue[],\n\t\tidCompressor?: IIdCompressor,\n\t) {\n\t\tsuper();\n\t\tthis.idCompressor = shape.treeShape.mayContainCompressedIds ? idCompressor : undefined;\n\t\tassert(\n\t\t\tshape.treeShape.valuesPerTopLevelNode * shape.topLevelLength === values.length,\n\t\t\t0x4c3 /* invalid number of values for shape */,\n\t\t);\n\t}\n\n\tpublic get topLevelLength(): number {\n\t\treturn this.shape.topLevelLength;\n\t}\n\n\tpublic clone(): UniformChunk {\n\t\treturn new UniformChunk(this.shape, [...this.values]);\n\t}\n\n\tpublic cursor(): Cursor {\n\t\treturn new Cursor(this);\n\t}\n\n\tprotected onUnreferenced(): void {}\n}\n\n/**\n * The \"shape\" of a field.\n *\n * Requires that all trees in the field have the same shape, which is described by `TreeShape`.\n * Note that this requirement means that not all fields can be described using this type.\n */\nexport type FieldShape = readonly [FieldKey, TreeShape, number];\n\n/**\n * Maximum topLevelLength value (exclusive) for which {@link TreeShape.withTopLevelLength}\n * caches the resulting {@link ChunkShape}. Values at or above this threshold always\n * create a new instance to prevent unbounded cache growth.\n *\n * @remarks\n * This value is an estimation of the general size needed to cover current workflows,\n * not a researched constant, and is safe to tune as workloads change.\n *\n * Raising this value captures more chunk sizes in the cache, at the cost of\n * each `TreeShape` retaining up to `chunkShapeCacheLimit - 1` cached entries for the\n * lifetime of the shape. Lowering it reduces memory held per `TreeShape` but forces\n * small chunks, where the relative cost of rebuilding `positions` is highest, to pay\n * the construction cost on every call.\n */\nconst chunkShapeCacheLimit = 8;\n\n/**\n * The \"shape\" of a tree.\n * Does not contain the actual values from the tree, but describes everything else,\n * including where the values would be found in a flat values array.\n *\n * Note that since this requires fields to have uniform shapes (see `FieldShape`),\n * not all trees can have their shape described using this type.\n */\nexport class TreeShape {\n\tpublic readonly fields: ReadonlyMap<FieldKey, OffsetShape>;\n\tpublic readonly fieldsOffsetArray: readonly OffsetShape[];\n\tpublic readonly valuesPerTopLevelNode: number;\n\n\t// TODO: this is only needed at chunk roots. Optimize it base on that.\n\tpublic readonly positions: readonly NodePositionInfo[];\n\n\t/**\n\t * Whether chunks using this shape (including any descendant leaf within it) may contain values compressed by the {@link UniformChunk.idCompressor}.\n\t *\n\t * @remarks\n\t * For string leaf nodes, this can be explicitly set to `true` to indicate that the value may be a compressed id\n\t * stored as a number that needs to be decompressed back to a string.\n\t * For non-leaf nodes, this is automatically derived from whether any child shapes have it set.\n\t */\n\tpublic readonly mayContainCompressedIds: boolean;\n\n\t/**\n\t * Cache for ChunkShape instances created by {@link withTopLevelLength}.\n\t * `topLevelLength` is always a positive integer (enforced by the {@link ChunkShape} constructor),\n\t * so the cache only ever holds entries for values in `1..chunkShapeCacheLimit - 1` to prevent unbounded growth.\n\t */\n\tprivate readonly chunkShapeCache: Map<number, ChunkShape> = new Map();\n\n\t/**\n\t * @param type - {@link TreeNodeSchemaIdentifier} used to compare shapes.\n\t * @param hasValue - whether or not the TreeShape has a value.\n\t * @param fieldsArray - an array of {@link FieldShape} values, which contains a TreeShape for each FieldKey.\n\t *\n\t * @param maybeCompressedIdLeaf - whether the value may have been compressed by the {@link UniformChunk.idCompressor}.\n\t * Can only be explicitly set to `true` on string leaf nodes; otherwise this constructor asserts.\n\t * For non-leaf nodes, {@link TreeShape.mayContainCompressedIds} is automatically derived from child shapes.\n\t */\n\tpublic constructor(\n\t\tpublic readonly type: TreeNodeSchemaIdentifier,\n\t\tpublic readonly hasValue: boolean,\n\t\tpublic readonly fieldsArray: readonly FieldShape[],\n\t\tmaybeCompressedIdLeaf: boolean = false,\n\t) {\n\t\tassert(\n\t\t\thasValue === false || fieldsArray.length === 0,\n\t\t\t0xcef /* only non-leaf can have fields */,\n\t\t);\n\t\tif (maybeCompressedIdLeaf) {\n\t\t\tassert(\n\t\t\t\thasValue && type === \"com.fluidframework.leaf.string\",\n\t\t\t\t0xcf0 /* only strings can opt into maybeCompressedIdLeaf */,\n\t\t\t);\n\t\t}\n\t\t// For non-leaf nodes, derive from whether any child shapes contain compressed ids.\n\t\tthis.mayContainCompressedIds =\n\t\t\tmaybeCompressedIdLeaf || fieldsArray.some(([, shape]) => shape.mayContainCompressedIds);\n\t\tconst fields: Map<FieldKey, OffsetShape> = new Map();\n\t\tlet numberOfValues = hasValue ? 1 : 0;\n\t\tconst infos: NodePositionInfo[] = [\n\t\t\tnew NodePositionInfo(undefined, dummyRoot, 0, undefined, undefined, this, 1, 0),\n\t\t];\n\t\tlet fieldIndex = 0;\n\t\tfor (const [k, f, length] of fieldsArray) {\n\t\t\tassert(!fields.has(k), 0x4c5 /* no duplicate keys */);\n\t\t\tconst offset = new OffsetShape(f, length, infos.length, k, fieldIndex);\n\t\t\tfields.set(k, offset);\n\t\t\tclonePositions(0, [k, f, length], fieldIndex, numberOfValues, infos);\n\t\t\tnumberOfValues += f.valuesPerTopLevelNode * length;\n\t\t\tfieldIndex++;\n\t\t}\n\t\tthis.fields = fields;\n\t\tthis.valuesPerTopLevelNode = numberOfValues;\n\t\tthis.positions = infos;\n\n\t\tthis.fieldsOffsetArray = [...fields.values()];\n\t}\n\n\tpublic equals(other: TreeShape): boolean {\n\t\t// TODO: either dedupe instances and/or store a collision resistant hash for fast compare.\n\n\t\tif (\n\t\t\t!compareArrays(\n\t\t\t\tthis.fieldsArray,\n\t\t\t\tother.fieldsArray,\n\t\t\t\t([k, f, l], [k2, f2, l2]) => k === k2 && l === l2 && f.equals(f2),\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tthis.type === other.type &&\n\t\t\tthis.hasValue === other.hasValue &&\n\t\t\tthis.mayContainCompressedIds === other.mayContainCompressedIds\n\t\t);\n\t}\n\n\tpublic withTopLevelLength(topLevelLength: number): ChunkShape {\n\t\tif (topLevelLength < chunkShapeCacheLimit) {\n\t\t\treturn getOrCreate(\n\t\t\t\tthis.chunkShapeCache,\n\t\t\t\ttopLevelLength,\n\t\t\t\t() => new ChunkShape(this, topLevelLength),\n\t\t\t);\n\t\t}\n\t\treturn new ChunkShape(this, topLevelLength);\n\t}\n}\n\nfunction clonePositions(\n\tindexOfParentInOutput: number | undefined,\n\t[key, shape, copies]: FieldShape,\n\tindexOfParentField: number,\n\tvalueOffset: number,\n\toutputInto: NodePositionInfo[] | (NodePositionInfo | undefined)[],\n): void {\n\tconst offset = outputInto.length;\n\tfor (let index = 0; index < copies; index++) {\n\t\tfor (const inner of shape.positions) {\n\t\t\tconst wasRoot = inner.indexOfParentPosition === undefined;\n\t\t\tconst parentPositionIndex = wasRoot\n\t\t\t\t? indexOfParentInOutput\n\t\t\t\t: inner.indexOfParentPosition + index * shape.positions.length + offset;\n\t\t\toutputInto.push(\n\t\t\t\tnew NodePositionInfo(\n\t\t\t\t\tparentPositionIndex === undefined ? undefined : outputInto[parentPositionIndex],\n\t\t\t\t\tinner.parentField === dummyRoot ? key : inner.parentField,\n\t\t\t\t\twasRoot ? index : inner.parentIndex,\n\t\t\t\t\tinner.indexOfParentField ?? indexOfParentField,\n\t\t\t\t\tparentPositionIndex,\n\t\t\t\t\tinner.shape,\n\t\t\t\t\twasRoot ? copies : inner.topLevelLength,\n\t\t\t\t\tinner.valueOffset + valueOffset + shape.valuesPerTopLevelNode * index,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * The shape (see `TreeShape`) of a sequence of trees, all with the same shape (like `FieldShape`, but without a field key).\n *\n * This shape is optimized (by caching derived data like the positions array),\n * so that when paired with a value array it can be efficiently traversed like a tree by an {@link ITreeCursorSynchronous}.\n * See {@link uniformChunk} for how to do this.\n *\n * TODO: consider storing shape information in WASM\n */\nexport class ChunkShape {\n\tpublic readonly positions: readonly (NodePositionInfo | undefined)[];\n\n\tpublic constructor(\n\t\tpublic readonly treeShape: TreeShape,\n\t\tpublic readonly topLevelLength: number,\n\t) {\n\t\tassert(topLevelLength > 0, 0x4c6 /* topLevelLength must be greater than 0 */);\n\n\t\t// TODO: avoid duplication from inner loop\n\t\tconst positions: (NodePositionInfo | undefined)[] = [undefined];\n\t\tclonePositions(0, [dummyRoot, treeShape, topLevelLength], 0, 0, positions);\n\t\tthis.positions = positions;\n\t}\n\n\tpublic equals(other: ChunkShape): boolean {\n\t\t// TODO: either dedup instances and/or store a collision resistant hash for fast compare.\n\t\treturn this.topLevelLength === other.topLevelLength && this.treeShape === other.treeShape;\n\t}\n}\n\n/**\n * Shape of a field (like `FieldShape`) but with information about how it would be offset within a chunk because of its parents.\n */\nclass OffsetShape {\n\t/**\n\t * @param shape - the shape of each child in this field\n\t * @param topLevelLength - number of top level nodes in this sequence chunk (either field within a chunk, or top level chunk)\n\t * @param offset - number of nodes before this in the parent's subtree. The nodes are considered in depth first pre order\n\t * traversal, so a parent is the first node in its subtree (before its children) with offset 0\n\t * @param key - field key\n\t * @param indexOfParentField - index to this shape in the parent's array of fields\n\t */\n\tpublic constructor(\n\t\tpublic readonly shape: TreeShape,\n\t\tpublic readonly topLevelLength: number,\n\t\tpublic readonly offset: number,\n\t\tpublic readonly key: FieldKey,\n\t\tpublic readonly indexOfParentField: number | undefined,\n\t) {}\n}\n\n/**\n * Information about a node at a specific position within a uniform chunk.\n */\nclass NodePositionInfo implements UpPath {\n\t/**\n\t * @param parent - TODO\n\t * @param parentField - TODO\n\t * @param parentIndex - indexWithinParentField\n\t * @param indexOfParentField - which field of the parent `parentIndex` is indexing into to locate this.\n\t * @param indexOfParentPosition - Index of parent NodePositionInfo in positions array. TODO: use offsets to avoid copying at top level?\n\t * @param shape - Shape of the top level sequence this node is part of\n\t * @param valueOffset - TODO\n\t */\n\tpublic constructor(\n\t\tpublic readonly parent: NodePositionInfo | undefined, // TODO; general UpPath to allow prefixing here?\n\t\tpublic readonly parentField: FieldKey,\n\t\tpublic readonly parentIndex: number,\n\t\tpublic readonly indexOfParentField: number | undefined,\n\t\tpublic readonly indexOfParentPosition: number | undefined,\n\t\tpublic readonly shape: TreeShape, // Shape of sequence that contains this node (top level is parent of this node)\n\t\tpublic readonly topLevelLength: number,\n\t\tpublic readonly valueOffset: number,\n\t) {}\n}\n\n/**\n * The cursor implementation for `UniformChunk`.\n *\n * Works by tracking its location in the chunk's `positions` array.\n */\nclass Cursor extends SynchronousCursor implements ChunkedCursor {\n\tprivate positionIndex!: number; // When in fields mode, this points to the parent node.\n\t// Undefined when in root field\n\tprivate nodePositionInfo: NodePositionInfo | undefined;\n\n\t// Cached constants for faster access\n\tprivate readonly shape: ChunkShape;\n\tprivate readonly positions: readonly (NodePositionInfo | undefined)[];\n\n\tpublic mode: CursorLocationType = CursorLocationType.Fields;\n\n\t// Undefined when not in fields mode.\n\tprivate fieldKey?: FieldKey;\n\n\t// Valid only in fields mode. Can be past end for empty fields.\n\t// This is redundant with fieldKey above (but might be worth keeping for perf), and could be removed.\n\tprivate indexOfField: number = 0;\n\n\t// TODO: support prefix (path above root, including index offset of chunk in its containing field)\n\tpublic constructor(private readonly chunk: UniformChunk) {\n\t\tsuper();\n\t\tthis.shape = this.chunk.shape;\n\t\tthis.positions = this.shape.positions;\n\t\tthis.fieldKey = dummyRoot;\n\t\tthis.moveToPosition(0);\n\t}\n\n\tpublic get [cursorChunk](): UniformChunk | undefined {\n\t\treturn this.atChunkRoot() ? this.chunk : undefined;\n\t}\n\n\tpublic atChunkRoot(): boolean {\n\t\tassert(\n\t\t\t(this.fieldKey === undefined) === (this.mode === CursorLocationType.Nodes),\n\t\t\t0x560 /* expect valid field key */,\n\t\t);\n\t\treturn (\n\t\t\tthis.nodePositionInfo === undefined ||\n\t\t\t(this.nodePositionInfo.parent === undefined && this.fieldKey === undefined)\n\t\t);\n\t}\n\n\tpublic fork(): Cursor {\n\t\tconst cursor = new Cursor(this.chunk);\n\t\tcursor.mode = this.mode;\n\t\tcursor.fieldKey = this.fieldKey;\n\t\tcursor.indexOfField = this.indexOfField;\n\t\tcursor.moveToPosition(this.positionIndex);\n\t\treturn cursor;\n\t}\n\n\t/**\n\t * Change the current node within the chunk.\n\t * See `nodeInfo` for getting data about the current node.\n\t *\n\t * @param positionIndex - index of the position of the newly selected node in `positions`.\n\t * This is NOT an index within a field, and is not bounds checked.\n\t */\n\tprivate moveToPosition(positionIndex: number): void {\n\t\tthis.nodePositionInfo = this.positions[positionIndex];\n\t\tthis.positionIndex = positionIndex;\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\tassert(positionIndex === 0, 0x561 /* expected root at start */);\n\t\t\tassert(this.mode === CursorLocationType.Fields, 0x562 /* expected root to be a field */);\n\t\t}\n\t}\n\n\t/**\n\t * Gets information about the current node.\n\t *\n\t * When in Nodes mode, this means the node this cursor is current at.\n\t * When if fields mode, this means the node which is the parent of the current field.\n\t * This cursor is in Nodes mode at the root, so there is no case where a fields mode does not have a parent.\n\t *\n\t * @param requiredMode - asserts that the mode matches this. Since the semantics of this function are somewhat mode dependent,\n\t * providing this ensures that the caller knows what the results will mean.\n\t */\n\tprivate nodeInfo(requiredMode: CursorLocationType): NodePositionInfo {\n\t\tassert(this.mode === requiredMode, 0x4c8 /* tried to access cursor when in wrong mode */);\n\t\tassert(\n\t\t\tthis.nodePositionInfo !== undefined,\n\t\t\t0x53e /* can not access nodeInfo in root field */,\n\t\t);\n\t\treturn this.nodePositionInfo;\n\t}\n\n\tpublic nextField(): boolean {\n\t\tthis.indexOfField++;\n\t\tconst fields = this.nodeInfo(CursorLocationType.Fields).shape.fieldsArray;\n\t\tif (this.indexOfField < fields.length) {\n\t\t\tconst fieldArr = fields[this.indexOfField] ?? oob();\n\t\t\tthis.fieldKey = fieldArr[0];\n\t\t\treturn true;\n\t\t}\n\t\tthis.exitField();\n\t\treturn false;\n\t}\n\n\tpublic exitField(): void {\n\t\tassert(this.mode === CursorLocationType.Fields, 0x4c9 /* exitField when in wrong mode */);\n\t\tassert(this.nodePositionInfo !== undefined, 0x563 /* can not exit root field */);\n\t\tthis.fieldKey = undefined;\n\t\tthis.mode = CursorLocationType.Nodes;\n\t}\n\n\tpublic getFieldKey(): FieldKey {\n\t\treturn this.fieldKey ?? fail(0xb09 /* not in a field */);\n\t}\n\n\tpublic getFieldLength(): number {\n\t\tassert(\n\t\t\tthis.mode === CursorLocationType.Fields,\n\t\t\t0x53f /* tried to access cursor when in wrong mode */,\n\t\t);\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\treturn this.shape.topLevelLength;\n\t\t}\n\t\tconst fieldInfo = this.nodePositionInfo.shape.fieldsArray[this.indexOfField];\n\t\tif (fieldInfo === undefined) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn fieldInfo[2];\n\t}\n\n\tpublic firstNode(): boolean {\n\t\tassert(\n\t\t\tthis.mode === CursorLocationType.Fields,\n\t\t\t0x540 /* tried to access cursor when in wrong mode */,\n\t\t);\n\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\t// Root field is not allowed to be empty, so we can skip handling that case.\n\t\t\tthis.enterRootNodeInner(0);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn this.enterNodeInner(this.nodePositionInfo, 0);\n\t\t}\n\t}\n\n\tpublic enterNode(childIndex: number): void {\n\t\tassert(\n\t\t\tthis.mode === CursorLocationType.Fields,\n\t\t\t0x541 /* tried to access cursor when in wrong mode */,\n\t\t);\n\t\tassert(childIndex >= 0, 0x4ca /* index must be positive */);\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\tassert(\n\t\t\t\tchildIndex < this.shape.topLevelLength,\n\t\t\t\t0x542 /* index must not be past the end of the field */,\n\t\t\t);\n\t\t\tthis.enterRootNodeInner(childIndex);\n\t\t} else {\n\t\t\tconst moved = this.enterNodeInner(this.nodePositionInfo, childIndex);\n\t\t\tassert(moved, 0x4cb /* index must not be past the end of the field */);\n\t\t}\n\t}\n\n\t/**\n\t * Enter the current field, at `childIndex`.\n\t * @param childIndex - index into current field to navigate to. Must be non-negative integer.\n\t */\n\tprivate enterNodeInner(currentPosition: NodePositionInfo, childIndex: number): boolean {\n\t\tconst shape = currentPosition.shape;\n\t\tconst fields = shape.fieldsOffsetArray;\n\t\tif (this.indexOfField >= fields.length) {\n\t\t\treturn false; // Handle empty field (indexed by key into empty field)\n\t\t}\n\t\tconst f = shape.fieldsOffsetArray[this.indexOfField] ?? oob();\n\t\tif (childIndex >= f.topLevelLength) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.mode = CursorLocationType.Nodes;\n\t\tthis.fieldKey = undefined;\n\t\tthis.moveToPosition(this.positionIndex + f.offset + childIndex * f.shape.positions.length);\n\t\tassert(this.fieldIndex === childIndex, 0x4cc /* should be at selected child */);\n\t\treturn true;\n\t}\n\n\tprivate enterRootNodeInner(childIndex: number): void {\n\t\tthis.mode = CursorLocationType.Nodes;\n\t\tthis.fieldKey = undefined;\n\t\t// 1 for the \"undefined\" at the beginning of the positions array, then stride by top level tree shape.\n\t\tthis.moveToPosition(1 + childIndex * this.shape.treeShape.positions.length);\n\t\tassert(this.fieldIndex === childIndex, 0x543 /* should be at selected child */);\n\t}\n\n\tpublic getFieldPath(prefix?: PathRootPrefix): FieldUpPath {\n\t\treturn prefixFieldPath(prefix, {\n\t\t\tfield: this.getFieldKey(),\n\t\t\tparent: this.nodePositionInfo,\n\t\t});\n\t}\n\n\tpublic getPath(prefix?: PathRootPrefix): UpPath | undefined {\n\t\treturn prefixPath(prefix, this.nodeInfo(CursorLocationType.Nodes));\n\t}\n\n\tpublic get fieldIndex(): number {\n\t\treturn this.nodeInfo(CursorLocationType.Nodes).parentIndex;\n\t}\n\n\tpublic readonly chunkStart: number = 0;\n\n\tpublic get chunkLength(): number {\n\t\treturn this.nodeInfo(CursorLocationType.Nodes).topLevelLength;\n\t}\n\n\tpublic seekNodes(offset: number): boolean {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tconst index = offset + info.parentIndex;\n\t\tif (index >= 0 && index < info.topLevelLength) {\n\t\t\tthis.moveToPosition(this.positionIndex + offset * info.shape.positions.length);\n\t\t\treturn true;\n\t\t}\n\t\tthis.exitNode();\n\t\treturn false;\n\t}\n\n\tpublic nextNode(): boolean {\n\t\t// This is the same as `return this.seekNodes(1);` but slightly faster.\n\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tconst index = info.parentIndex + 1;\n\t\tif (index === info.topLevelLength) {\n\t\t\tthis.exitNode();\n\t\t\treturn false;\n\t\t}\n\t\tthis.moveToPosition(this.positionIndex + info.shape.positions.length);\n\t\treturn true;\n\t}\n\n\tpublic exitNode(): void {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tthis.indexOfField =\n\t\t\tinfo.indexOfParentField ??\n\t\t\tfail(0xb0a /* navigation up to root field not yet supported */); // TODO;\n\t\tthis.fieldKey = info.parentField;\n\t\tthis.mode = CursorLocationType.Fields;\n\t\tthis.moveToPosition(\n\t\t\tinfo.indexOfParentPosition ??\n\t\t\t\tfail(0xb0b /* navigation up to root field not yet supported */),\n\t\t); // TODO\n\t}\n\n\tpublic firstField(): boolean {\n\t\tconst fieldsArray = this.nodeInfo(CursorLocationType.Nodes).shape.fieldsArray;\n\t\tif (!hasSome(fieldsArray)) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.indexOfField = 0;\n\t\tthis.mode = CursorLocationType.Fields;\n\t\tconst fields = fieldsArray[0];\n\t\tthis.fieldKey = fields[0];\n\t\treturn true;\n\t}\n\n\tpublic enterField(key: FieldKey): void {\n\t\tconst fieldMap = this.nodeInfo(CursorLocationType.Nodes).shape.fields;\n\t\tconst fieldInfo = fieldMap.get(key);\n\t\tthis.indexOfField =\n\t\t\tfieldInfo === undefined\n\t\t\t\t? fieldMap.size\n\t\t\t\t: (fieldInfo.indexOfParentField ?? fail(0xb0c /* children should have parents */));\n\t\tthis.fieldKey = key;\n\t\tthis.mode = CursorLocationType.Fields;\n\t}\n\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\treturn this.nodeInfo(CursorLocationType.Nodes).shape.type;\n\t}\n\n\tpublic get value(): Value {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tif (info.shape.hasValue) {\n\t\t\tconst value = this.chunk.values[info.valueOffset];\n\t\t\t// If mayContainCompressedIds is set, check if the value is a number (i.e. a compressed ID that needs decompression).\n\t\t\tif (info.shape.mayContainCompressedIds && typeof value === \"number\") {\n\t\t\t\tconst idCompressor = this.chunk.idCompressor;\n\t\t\t\tassert(\n\t\t\t\t\tidCompressor !== undefined,\n\t\t\t\t\t0xcf1 /* chunk required idCompressor but did not provide it */,\n\t\t\t\t);\n\t\t\t\treturn idCompressor.decompress(value as SessionSpaceCompressedId);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\treturn undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"uniformChunk.js","sourceRoot":"","sources":["../../../src/feature-libraries/chunked-forest/uniformChunk.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, compareArrays, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport type { SessionSpaceCompressedId, IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tCursorLocationType,\n\ttype FieldKey,\n\ttype FieldUpPath,\n\ttype PathRootPrefix,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeValue,\n\ttype UpPath,\n\ttype Value,\n\ttype ChunkedCursor,\n\ttype TreeChunk,\n\tcursorChunk,\n\tdummyRoot,\n} from \"../../core/index.js\";\nimport { ReferenceCountedBase, getOrCreate, hasSome } from \"../../util/index.js\";\nimport { SynchronousCursor, prefixFieldPath, prefixPath } from \"../treeCursorUtils.js\";\n\n/**\n * Create a tree chunk with ref count 1.\n *\n * @param shape - describes the semantics and layout of `values`.\n * @param values - provides exclusive ownership of this array to this object (which might mutate it in the future).\n */\nexport function uniformChunk(shape: ChunkShape, values: TreeValue[]): TreeChunk {\n\treturn new UniformChunk(shape, values);\n}\n\n/**\n * Chunk which handles a sequence of trees with identical \"shape\" (see `TreeShape`).\n *\n * Separates shape from content,\n * allowing deduplication of shape information and storing of content as a flat sequence of values.\n */\nexport class UniformChunk extends ReferenceCountedBase implements TreeChunk {\n\tpublic idCompressor: undefined | IIdCompressor;\n\t/**\n\t * Create a tree chunk with ref count 1.\n\t *\n\t * @param shape - describes the semantics and layout of `values`.\n\t * @param values - provides exclusive ownership of this array to this object (which might mutate it in the future).\n\t */\n\tpublic constructor(\n\t\tpublic shape: ChunkShape,\n\t\tpublic values: TreeValue[],\n\t\tidCompressor?: IIdCompressor,\n\t) {\n\t\tsuper();\n\t\tthis.idCompressor = shape.treeShape.mayContainCompressedIds ? idCompressor : undefined;\n\t\tassert(\n\t\t\tshape.treeShape.valuesPerTopLevelNode * shape.topLevelLength === values.length,\n\t\t\t0x4c3 /* invalid number of values for shape */,\n\t\t);\n\t}\n\n\tpublic get topLevelLength(): number {\n\t\treturn this.shape.topLevelLength;\n\t}\n\n\tpublic clone(): UniformChunk {\n\t\treturn new UniformChunk(this.shape, [...this.values]);\n\t}\n\n\tpublic cursor(): Cursor {\n\t\treturn new Cursor(this);\n\t}\n\n\tprotected onUnreferenced(): void {}\n}\n\n/**\n * The \"shape\" of a field.\n *\n * Requires that all trees in the field have the same shape, which is described by `TreeShape`.\n * Note that this requirement means that not all fields can be described using this type.\n */\nexport type FieldShape = readonly [FieldKey, TreeShape, number];\n\n/**\n * Maximum topLevelLength value (exclusive) for which {@link TreeShape.withTopLevelLength}\n * caches the resulting {@link ChunkShape}. Values at or above this threshold always\n * create a new instance to prevent unbounded cache growth.\n *\n * @remarks\n * This value is an estimation of the general size needed to cover current workflows,\n * not a researched constant, and is safe to tune as workloads change.\n *\n * Raising this value captures more chunk sizes in the cache, at the cost of\n * each `TreeShape` retaining up to `chunkShapeCacheLimit - 1` cached entries for the\n * lifetime of the shape. Lowering it reduces memory held per `TreeShape` but forces\n * small chunks, where the relative cost of rebuilding `positions` is highest, to pay\n * the construction cost on every call.\n */\nconst chunkShapeCacheLimit = 8;\n\n/**\n * The \"shape\" of a tree.\n * Does not contain the actual values from the tree, but describes everything else,\n * including where the values would be found in a flat values array.\n *\n * Note that since this requires fields to have uniform shapes (see `FieldShape`),\n * not all trees can have their shape described using this type.\n */\nexport class TreeShape {\n\tpublic readonly fields: ReadonlyMap<FieldKey, OffsetShape>;\n\tpublic readonly fieldsOffsetArray: readonly OffsetShape[];\n\tpublic readonly valuesPerTopLevelNode: number;\n\n\t/**\n\t * Information about every node in this shape.\n\t * The root is first, and all indexes it uses to refer to other nodes are indexes into this array.\n\t * Beyond that the ordering is an implementation detail of this shape.\n\t * @remarks\n\t * Use of this in contexts where there might be multiple top-level nodes requires some additional care.\n\t * For example {@link Cursor} derives each node's actual position info from this shared\n\t * array plus the node's top-level index within the chunk.\n\t */\n\tpublic readonly positions: readonly NodePositionInfo[];\n\n\t/**\n\t * Whether chunks using this shape (including any descendant leaf within it) may contain values compressed by the {@link UniformChunk.idCompressor}.\n\t *\n\t * @remarks\n\t * For string leaf nodes, this can be explicitly set to `true` to indicate that the value may be a compressed id\n\t * stored as a number that needs to be decompressed back to a string.\n\t * For non-leaf nodes, this is automatically derived from whether any child shapes have it set.\n\t */\n\tpublic readonly mayContainCompressedIds: boolean;\n\n\t/**\n\t * Cache for ChunkShape instances created by {@link withTopLevelLength}.\n\t * `topLevelLength` is always a positive integer (enforced by the {@link ChunkShape} constructor),\n\t * so the cache only ever holds entries for values in `1..chunkShapeCacheLimit - 1` to prevent unbounded growth.\n\t */\n\tprivate readonly chunkShapeCache: Map<number, ChunkShape> = new Map();\n\n\t/**\n\t * @param type - {@link TreeNodeSchemaIdentifier} used to compare shapes.\n\t * @param hasValue - whether or not the TreeShape has a value.\n\t * @param fieldsArray - an array of {@link FieldShape} values, which contains a TreeShape for each FieldKey.\n\t *\n\t * @param maybeCompressedIdLeaf - whether the value may have been compressed by the {@link UniformChunk.idCompressor}.\n\t * Can only be explicitly set to `true` on string leaf nodes; otherwise this constructor asserts.\n\t * For non-leaf nodes, {@link TreeShape.mayContainCompressedIds} is automatically derived from child shapes.\n\t */\n\tpublic constructor(\n\t\tpublic readonly type: TreeNodeSchemaIdentifier,\n\t\tpublic readonly hasValue: boolean,\n\t\tpublic readonly fieldsArray: readonly FieldShape[],\n\t\tmaybeCompressedIdLeaf: boolean = false,\n\t) {\n\t\tassert(\n\t\t\thasValue === false || fieldsArray.length === 0,\n\t\t\t0xcef /* only non-leaf can have fields */,\n\t\t);\n\t\tif (maybeCompressedIdLeaf) {\n\t\t\tassert(\n\t\t\t\thasValue && type === \"com.fluidframework.leaf.string\",\n\t\t\t\t0xcf0 /* only strings can opt into maybeCompressedIdLeaf */,\n\t\t\t);\n\t\t}\n\t\t// For non-leaf nodes, derive from whether any child shapes contain compressed ids.\n\t\tthis.mayContainCompressedIds =\n\t\t\tmaybeCompressedIdLeaf || fieldsArray.some(([, shape]) => shape.mayContainCompressedIds);\n\t\tconst fields: Map<FieldKey, OffsetShape> = new Map();\n\t\tlet numberOfValues = hasValue ? 1 : 0;\n\t\tconst infos: NodePositionInfo[] = [\n\t\t\tnew NodePositionInfo(undefined, dummyRoot, 0, undefined, undefined, this, 1, 0),\n\t\t];\n\t\tlet fieldIndex = 0;\n\t\tfor (const [k, f, length] of fieldsArray) {\n\t\t\tassert(!fields.has(k), 0x4c5 /* no duplicate keys */);\n\t\t\tconst offset = new OffsetShape(f, length, infos.length, k, fieldIndex);\n\t\t\tfields.set(k, offset);\n\t\t\tclonePositions(0, [k, f, length], fieldIndex, numberOfValues, infos);\n\t\t\tnumberOfValues += f.valuesPerTopLevelNode * length;\n\t\t\tfieldIndex++;\n\t\t}\n\t\tthis.fields = fields;\n\t\tthis.valuesPerTopLevelNode = numberOfValues;\n\t\tthis.positions = infos;\n\n\t\tthis.fieldsOffsetArray = [...fields.values()];\n\t}\n\n\tpublic equals(other: TreeShape): boolean {\n\t\t// TODO: either dedupe instances and/or store a collision resistant hash for fast compare.\n\n\t\tif (\n\t\t\t!compareArrays(\n\t\t\t\tthis.fieldsArray,\n\t\t\t\tother.fieldsArray,\n\t\t\t\t([k, f, l], [k2, f2, l2]) => k === k2 && l === l2 && f.equals(f2),\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tthis.type === other.type &&\n\t\t\tthis.hasValue === other.hasValue &&\n\t\t\tthis.mayContainCompressedIds === other.mayContainCompressedIds\n\t\t);\n\t}\n\n\tpublic withTopLevelLength(topLevelLength: number): ChunkShape {\n\t\tif (topLevelLength < chunkShapeCacheLimit) {\n\t\t\treturn getOrCreate(\n\t\t\t\tthis.chunkShapeCache,\n\t\t\t\ttopLevelLength,\n\t\t\t\t() => new ChunkShape(this, topLevelLength),\n\t\t\t);\n\t\t}\n\t\treturn new ChunkShape(this, topLevelLength);\n\t}\n}\n\nfunction clonePositions(\n\tindexOfParentInOutput: number | undefined,\n\t[key, shape, copies]: FieldShape,\n\tindexOfParentField: number,\n\tvalueOffset: number,\n\toutputInto: NodePositionInfo[] | (NodePositionInfo | undefined)[],\n): void {\n\tconst offset = outputInto.length;\n\tfor (let index = 0; index < copies; index++) {\n\t\tfor (const inner of shape.positions) {\n\t\t\tconst wasRoot = inner.indexOfParentPosition === undefined;\n\t\t\tconst parentPositionIndex = wasRoot\n\t\t\t\t? indexOfParentInOutput\n\t\t\t\t: inner.indexOfParentPosition + index * shape.positions.length + offset;\n\t\t\toutputInto.push(\n\t\t\t\tnew NodePositionInfo(\n\t\t\t\t\tparentPositionIndex === undefined ? undefined : outputInto[parentPositionIndex],\n\t\t\t\t\tinner.parentField === dummyRoot ? key : inner.parentField,\n\t\t\t\t\twasRoot ? index : inner.parentIndex,\n\t\t\t\t\tinner.indexOfParentField ?? indexOfParentField,\n\t\t\t\t\tparentPositionIndex,\n\t\t\t\t\tinner.shape,\n\t\t\t\t\twasRoot ? copies : inner.topLevelLength,\n\t\t\t\t\tinner.valueOffset + valueOffset + shape.valuesPerTopLevelNode * index,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * The shape (see `TreeShape`) of a sequence of trees, all with the same shape (like `FieldShape`, but without a field key).\n *\n * @remarks\n * Paired with a value array, this lets a {@link UniformChunk} be traversed like a tree by an\n * {@link ITreeCursorSynchronous}. The {@link Cursor} derives each node's position info from the\n * shared {@link TreeShape.positions} plus the node's top-level index.\n *\n * TODO: consider storing shape information in WASM\n */\nexport class ChunkShape {\n\tpublic constructor(\n\t\tpublic readonly treeShape: TreeShape,\n\t\tpublic readonly topLevelLength: number,\n\t) {\n\t\tassert(topLevelLength > 0, 0x4c6 /* topLevelLength must be greater than 0 */);\n\t}\n\n\tpublic equals(other: ChunkShape): boolean {\n\t\t// TODO: either dedup instances and/or store a collision resistant hash for fast compare.\n\t\treturn this.topLevelLength === other.topLevelLength && this.treeShape === other.treeShape;\n\t}\n}\n\n/**\n * Shape of a field (like `FieldShape`) but with information about how it would be offset within a chunk because of its parents.\n */\nclass OffsetShape {\n\t/**\n\t * @param shape - the shape of each child in this field\n\t * @param topLevelLength - number of top level nodes in this sequence chunk (either field within a chunk, or top level chunk)\n\t * @param offset - number of nodes before this in the parent's subtree. The nodes are considered in depth first pre order\n\t * traversal, so a parent is the first node in its subtree (before its children) with offset 0\n\t * @param key - field key\n\t * @param indexOfParentField - index to this shape in the parent's array of fields\n\t */\n\tpublic constructor(\n\t\tpublic readonly shape: TreeShape,\n\t\tpublic readonly topLevelLength: number,\n\t\tpublic readonly offset: number,\n\t\tpublic readonly key: FieldKey,\n\t\tpublic readonly indexOfParentField: number | undefined,\n\t) {}\n}\n\n/**\n * Information about a node at a specific position within one top-level tree of a {@link TreeShape}.\n */\nclass NodePositionInfo implements UpPath {\n\t/**\n\t * @param parent - The parent node's {@link NodePositionInfo} or `undefined` for a root.\n\t * @param parentField - The {@link FieldKey} of the field this node occupies within its parent.\n\t * @param parentIndex - indexWithinParentField\n\t * @param indexOfParentField - Which field of the parent `parentIndex` is indexing into to locate this.\n\t * @param indexOfParentPosition - Index of this node's parent in {@link TreeShape.positions}\n\t * @param shape - Shape of the top level sequence this node is part of\n\t * @param topLevelLength - Number of siblings in this node's field. For a root this is unused\n\t * @param valueOffset - Offset of this node's value within one top-level tree's slice of the chunk's flat `values` array;\n\t * only valid when `shape.hasValue` (otherwise it's where the value would have gone, and should not be used to read a value).\n\t */\n\tpublic constructor(\n\t\tpublic readonly parent: NodePositionInfo | undefined, // TODO; general UpPath to allow prefixing here?\n\t\tpublic readonly parentField: FieldKey,\n\t\tpublic readonly parentIndex: number,\n\t\tpublic readonly indexOfParentField: number | undefined,\n\t\tpublic readonly indexOfParentPosition: number | undefined,\n\t\tpublic readonly shape: TreeShape, // Shape of sequence that contains this node (top level is parent of this node)\n\t\tpublic readonly topLevelLength: number,\n\t\tpublic readonly valueOffset: number,\n\t) {}\n}\n\n/**\n * The cursor implementation for `UniformChunk`.\n *\n * @remarks\n * Tracks a flat `positionIndex` and derives each node's position info from the shape's shared\n * {@link TreeShape.positions} plus the node's top-level index.\n */\nclass Cursor extends SynchronousCursor implements ChunkedCursor {\n\tprivate positionIndex!: number; // When in fields mode, this points to the parent node.\n\n\t/** Position info for the current node, or `undefined` when in root field. */\n\tprivate nodePositionInfo: NodePositionInfo | undefined;\n\n\t/** Which top-level node of the chunk the current position is within. Valid when nodePositionInfo !== undefined. */\n\tprivate topLevelIndex: number = 0;\n\n\t// Cached constants for faster access.\n\t/** The chunk's shape. */\n\tprivate readonly shape: ChunkShape;\n\t/** The chunk's per-tree shape (shape of each top-level tree). */\n\tprivate readonly treeShape: TreeShape;\n\t/** Number of positions in one top-level tree (treeShape.positions.length). */\n\tprivate readonly nodeLength: number;\n\t/** Number of values per top-level node (treeShape.valuesPerTopLevelNode). */\n\tprivate readonly stride: number;\n\n\tpublic mode: CursorLocationType = CursorLocationType.Fields;\n\n\t// Undefined when not in fields mode.\n\tprivate fieldKey?: FieldKey;\n\n\t// Valid only in fields mode. Can be past end for empty fields.\n\t// This is redundant with fieldKey above (but might be worth keeping for perf), and could be removed.\n\tprivate indexOfField: number = 0;\n\n\t// TODO: support prefix (path above root, including index offset of chunk in its containing field)\n\tpublic constructor(private readonly chunk: UniformChunk) {\n\t\tsuper();\n\t\tthis.shape = this.chunk.shape;\n\t\tthis.treeShape = this.shape.treeShape;\n\t\tthis.nodeLength = this.treeShape.positions.length;\n\t\tthis.stride = this.treeShape.valuesPerTopLevelNode;\n\t\tthis.fieldKey = dummyRoot;\n\t\tthis.moveToPosition(0);\n\t}\n\n\tpublic get [cursorChunk](): UniformChunk | undefined {\n\t\treturn this.atChunkRoot() ? this.chunk : undefined;\n\t}\n\n\tpublic atChunkRoot(): boolean {\n\t\tassert(\n\t\t\t(this.fieldKey === undefined) === (this.mode === CursorLocationType.Nodes),\n\t\t\t0x560 /* expect valid field key */,\n\t\t);\n\t\treturn (\n\t\t\tthis.nodePositionInfo === undefined ||\n\t\t\t(this.nodePositionInfo.parent === undefined && this.fieldKey === undefined)\n\t\t);\n\t}\n\n\tpublic fork(): Cursor {\n\t\tconst cursor = new Cursor(this.chunk);\n\t\tcursor.mode = this.mode;\n\t\tcursor.fieldKey = this.fieldKey;\n\t\tcursor.indexOfField = this.indexOfField;\n\t\tcursor.moveToPosition(this.positionIndex);\n\t\treturn cursor;\n\t}\n\n\t/**\n\t * Change the current node within the chunk.\n\t *\n\t * @param positionIndex - flat position index of the newly selected node. This is NOT an index\n\t * within a field, and is not bounds checked.\n\t *\n\t * @remarks\n\t * Decomposes the index into {@link Cursor.topLevelIndex} and {@link Cursor.nodePositionInfo}.\n\t * See `nodeInfo` for getting data about the current node.\n\t *\n\t */\n\tprivate moveToPosition(positionIndex: number): void {\n\t\tthis.positionIndex = positionIndex;\n\t\tif (positionIndex === 0) {\n\t\t\tthis.nodePositionInfo = undefined;\n\t\t\tassert(this.mode === CursorLocationType.Fields, 0x562 /* expected root to be a field */);\n\t\t\treturn;\n\t\t}\n\t\tconst decoded = this.decodePosition(positionIndex);\n\t\tthis.topLevelIndex = decoded.topLevelIndex;\n\t\tthis.nodePositionInfo = decoded.info;\n\t}\n\n\t/**\n\t * Decode a flat `positionIndex` into its components.\n\t *\n\t * @param positionIndex - flat position index of the node to decode. Must be greater than 0;\n\t * @returns the node's index within {@link TreeShape.positions} (`withinTree`), which top-level\n\t * tree holds it (`topLevelIndex`), and the corresponding shared {@link NodePositionInfo} (`info`).\n\t */\n\tprivate decodePosition(positionIndex: number): {\n\t\twithinTree: number;\n\t\ttopLevelIndex: number;\n\t\tinfo: NodePositionInfo;\n\t} {\n\t\tconst offset = positionIndex - 1;\n\t\t// Find the node's index within treeShape.positions, then which top-level tree holds it.\n\t\tconst withinTree = offset % this.nodeLength; // remainder\n\t\tconst topLevelIndex = (offset - withinTree) / this.nodeLength; // quotient\n\t\tconst info = this.treeShape.positions[withinTree] ?? oob();\n\t\treturn { withinTree, topLevelIndex, info };\n\t}\n\n\t/**\n\t * Build a standalone {@link UpPath} for the node at `positionIndex`. O(depth) allocation.\n\t *\n\t * @remarks\n\t * walks the shared per-tree {@link TreeShape.positions} and applies the top-level index\n\t * at each level. Mirrors how the `BasicChunk` cursor allocates paths.\n\t */\n\tprivate materializePath(positionIndex: number): UpPath | undefined {\n\t\tif (positionIndex === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst { withinTree, topLevelIndex, info } = this.decodePosition(positionIndex);\n\t\tif (info.parent === undefined) {\n\t\t\t// Top-level node: its parent is the (prefixed) chunk root.\n\t\t\treturn { parent: undefined, parentField: info.parentField, parentIndex: topLevelIndex };\n\t\t}\n\t\treturn {\n\t\t\tparent: this.materializePath(\n\t\t\t\tpositionIndex - withinTree + (info.indexOfParentPosition ?? oob()),\n\t\t\t),\n\t\t\tparentField: info.parentField,\n\t\t\tparentIndex: info.parentIndex,\n\t\t};\n\t}\n\n\t/**\n\t * Gets information about the current node.\n\t *\n\t * When in Nodes mode, this means the node this cursor is current at.\n\t * When if fields mode, this means the node which is the parent of the current field.\n\t * This cursor is in Nodes mode at the root, so there is no case where a fields mode does not have a parent.\n\t *\n\t * @param requiredMode - asserts that the mode matches this. Since the semantics of this function are somewhat mode dependent,\n\t * providing this ensures that the caller knows what the results will mean.\n\t */\n\tprivate nodeInfo(requiredMode: CursorLocationType): NodePositionInfo {\n\t\tassert(this.mode === requiredMode, 0x4c8 /* tried to access cursor when in wrong mode */);\n\t\tassert(\n\t\t\tthis.nodePositionInfo !== undefined,\n\t\t\t0x53e /* can not access nodeInfo in root field */,\n\t\t);\n\t\treturn this.nodePositionInfo;\n\t}\n\n\tpublic nextField(): boolean {\n\t\tthis.indexOfField++;\n\t\tconst fields = this.nodeInfo(CursorLocationType.Fields).shape.fieldsArray;\n\t\tif (this.indexOfField < fields.length) {\n\t\t\tconst fieldArr = fields[this.indexOfField] ?? oob();\n\t\t\tthis.fieldKey = fieldArr[0];\n\t\t\treturn true;\n\t\t}\n\t\tthis.exitField();\n\t\treturn false;\n\t}\n\n\tpublic exitField(): void {\n\t\tassert(this.mode === CursorLocationType.Fields, 0x4c9 /* exitField when in wrong mode */);\n\t\tassert(this.nodePositionInfo !== undefined, 0x563 /* can not exit root field */);\n\t\tthis.fieldKey = undefined;\n\t\tthis.mode = CursorLocationType.Nodes;\n\t}\n\n\tpublic getFieldKey(): FieldKey {\n\t\treturn this.fieldKey ?? fail(0xb09 /* not in a field */);\n\t}\n\n\tpublic getFieldLength(): number {\n\t\tassert(\n\t\t\tthis.mode === CursorLocationType.Fields,\n\t\t\t0x53f /* tried to access cursor when in wrong mode */,\n\t\t);\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\treturn this.shape.topLevelLength;\n\t\t}\n\t\tconst fieldInfo = this.nodePositionInfo.shape.fieldsArray[this.indexOfField];\n\t\tif (fieldInfo === undefined) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn fieldInfo[2];\n\t}\n\n\tpublic firstNode(): boolean {\n\t\tassert(\n\t\t\tthis.mode === CursorLocationType.Fields,\n\t\t\t0x540 /* tried to access cursor when in wrong mode */,\n\t\t);\n\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\t// Root field is not allowed to be empty, so we can skip handling that case.\n\t\t\tthis.enterRootNodeInner(0);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn this.enterNodeInner(this.nodePositionInfo, 0);\n\t\t}\n\t}\n\n\tpublic enterNode(childIndex: number): void {\n\t\tassert(\n\t\t\tthis.mode === CursorLocationType.Fields,\n\t\t\t0x541 /* tried to access cursor when in wrong mode */,\n\t\t);\n\t\tassert(childIndex >= 0, 0x4ca /* index must be positive */);\n\t\tif (this.nodePositionInfo === undefined) {\n\t\t\tassert(\n\t\t\t\tchildIndex < this.shape.topLevelLength,\n\t\t\t\t0x542 /* index must not be past the end of the field */,\n\t\t\t);\n\t\t\tthis.enterRootNodeInner(childIndex);\n\t\t} else {\n\t\t\tconst moved = this.enterNodeInner(this.nodePositionInfo, childIndex);\n\t\t\tassert(moved, 0x4cb /* index must not be past the end of the field */);\n\t\t}\n\t}\n\n\t/**\n\t * Enter the current field, at `childIndex`.\n\t * @param childIndex - index into current field to navigate to. Must be non-negative integer.\n\t */\n\tprivate enterNodeInner(currentPosition: NodePositionInfo, childIndex: number): boolean {\n\t\tconst shape = currentPosition.shape;\n\t\tconst fields = shape.fieldsOffsetArray;\n\t\tif (this.indexOfField >= fields.length) {\n\t\t\treturn false; // Handle empty field (indexed by key into empty field)\n\t\t}\n\t\tconst f = shape.fieldsOffsetArray[this.indexOfField] ?? oob();\n\t\tif (childIndex >= f.topLevelLength) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.mode = CursorLocationType.Nodes;\n\t\tthis.fieldKey = undefined;\n\t\tthis.moveToPosition(this.positionIndex + f.offset + childIndex * f.shape.positions.length);\n\t\tassert(this.fieldIndex === childIndex, 0x4cc /* should be at selected child */);\n\t\treturn true;\n\t}\n\n\tprivate enterRootNodeInner(childIndex: number): void {\n\t\tthis.mode = CursorLocationType.Nodes;\n\t\tthis.fieldKey = undefined;\n\t\t// 1 for the \"undefined\" root-field marker at position 0, then stride by one top-level tree (nodeLength).\n\t\tthis.moveToPosition(1 + childIndex * this.nodeLength);\n\t\tassert(this.fieldIndex === childIndex, 0x543 /* should be at selected child */);\n\t}\n\n\tpublic getFieldPath(prefix?: PathRootPrefix): FieldUpPath {\n\t\treturn prefixFieldPath(prefix, {\n\t\t\tfield: this.getFieldKey(),\n\t\t\tparent: this.materializePath(this.positionIndex),\n\t\t});\n\t}\n\n\tpublic getPath(prefix?: PathRootPrefix): UpPath | undefined {\n\t\tthis.nodeInfo(CursorLocationType.Nodes); // assert: in nodes mode at a node\n\t\treturn prefixPath(prefix, this.materializePath(this.positionIndex));\n\t}\n\n\tpublic get fieldIndex(): number {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\treturn info.parent === undefined ? this.topLevelIndex : info.parentIndex;\n\t}\n\n\tpublic readonly chunkStart: number = 0;\n\n\t/**\n\t * Number of nodes in `info`'s field including `info` itself.\n\t *\n\t * @remarks\n\t * For top-level nodes this is the chunk's `topLevelLength`, read from the chunk\n\t * rather than the node, so the shared per-tree {@link TreeShape.positions} stays independent of\n\t * chunk length; the root entry's own `topLevelLength` field is unused. Nested nodes use the\n\t * field length stored on the node.\n\t */\n\tprivate siblingCount(info: NodePositionInfo): number {\n\t\treturn info.parent === undefined ? this.shape.topLevelLength : info.topLevelLength;\n\t}\n\n\tpublic get chunkLength(): number {\n\t\treturn this.siblingCount(this.nodeInfo(CursorLocationType.Nodes));\n\t}\n\n\tpublic seekNodes(offset: number): boolean {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tconst index = offset + this.fieldIndex;\n\t\tif (index >= 0 && index < this.siblingCount(info)) {\n\t\t\tthis.moveToPosition(this.positionIndex + offset * info.shape.positions.length);\n\t\t\treturn true;\n\t\t}\n\t\tthis.exitNode();\n\t\treturn false;\n\t}\n\n\tpublic nextNode(): boolean {\n\t\t// This is the same as `return this.seekNodes(1);` but slightly faster.\n\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tconst index = this.fieldIndex + 1;\n\t\tif (index === this.siblingCount(info)) {\n\t\t\tthis.exitNode();\n\t\t\treturn false;\n\t\t}\n\t\tthis.moveToPosition(this.positionIndex + info.shape.positions.length);\n\t\treturn true;\n\t}\n\n\tpublic exitNode(): void {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tconst withinTree = this.positionIndex - 1 - this.topLevelIndex * this.nodeLength;\n\t\t// Top-level nodes (no parent) exit to the root field at position 0;\n\t\t// nested nodes' parent is `indexOfParentPosition` within the same top-level instance.\n\t\tthis.indexOfField = info.indexOfParentField ?? 0;\n\t\tthis.fieldKey = info.parentField;\n\t\tthis.mode = CursorLocationType.Fields;\n\t\tthis.moveToPosition(\n\t\t\tinfo.indexOfParentPosition === undefined\n\t\t\t\t? 0\n\t\t\t\t: this.positionIndex - withinTree + info.indexOfParentPosition,\n\t\t);\n\t}\n\n\tpublic firstField(): boolean {\n\t\tconst fieldsArray = this.nodeInfo(CursorLocationType.Nodes).shape.fieldsArray;\n\t\tif (!hasSome(fieldsArray)) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.indexOfField = 0;\n\t\tthis.mode = CursorLocationType.Fields;\n\t\tconst fields = fieldsArray[0];\n\t\tthis.fieldKey = fields[0];\n\t\treturn true;\n\t}\n\n\tpublic enterField(key: FieldKey): void {\n\t\tconst fieldMap = this.nodeInfo(CursorLocationType.Nodes).shape.fields;\n\t\tconst fieldInfo = fieldMap.get(key);\n\t\tthis.indexOfField =\n\t\t\tfieldInfo === undefined\n\t\t\t\t? fieldMap.size\n\t\t\t\t: (fieldInfo.indexOfParentField ?? fail(0xb0c /* children should have parents */));\n\t\tthis.fieldKey = key;\n\t\tthis.mode = CursorLocationType.Fields;\n\t}\n\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\treturn this.nodeInfo(CursorLocationType.Nodes).shape.type;\n\t}\n\n\tpublic get value(): Value {\n\t\tconst info = this.nodeInfo(CursorLocationType.Nodes);\n\t\tif (info.shape.hasValue) {\n\t\t\tconst value = this.chunk.values[info.valueOffset + this.topLevelIndex * this.stride];\n\t\t\t// If mayContainCompressedIds is set, check if the value is a number (i.e. a compressed ID that needs decompression).\n\t\t\tif (info.shape.mayContainCompressedIds && typeof value === \"number\") {\n\t\t\t\tconst idCompressor = this.chunk.idCompressor;\n\t\t\t\tassert(\n\t\t\t\t\tidCompressor !== undefined,\n\t\t\t\t\t0xcf1 /* chunk required idCompressor but did not provide it */,\n\t\t\t\t);\n\t\t\t\treturn idCompressor.decompress(value as SessionSpaceCompressedId);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"defaultEditBuilder.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/default-schema/defaultEditBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAEN,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,MAAM,EAGX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAKN,KAAK,gBAAgB,EAIrB,MAAM,4BAA4B,CAAC;AAMpC,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,qBAAa,mBACZ,YAAW,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAE7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAGnD,MAAM,EAAE,YAAY,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,EAC7D,YAAY,EAAE,iBAAiB;IAKhC,IAAW,OAAO,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAEpD;IAED,IAAW,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAEzE;IAEM,WAAW,CACjB,eAAe,EAAE,MAAM,WAAW,EAClC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAC9D,kBAAkB;CAQrB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAEjF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAE5F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,GAAG,SAAS;IACxD;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAE1E;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEhF;;;;;;OAMG;IACH,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEhF;;;;;OAKG;IACH,IAAI,CACH,WAAW,EAAE,qBAAqB,EAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,qBAAqB,EACvC,gBAAgB,EAAE,MAAM,GACtB,IAAI,CAAC;IAER;;;OAGG;IACH,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAEtD;;;OAGG;IACH,+BAA+B,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE9D;;OAEG;IACH,qBAAqB,IAAI,IAAI,CAAC;IAE9B;;OAEG;IACH,6BAA6B,IAAI,IAAI,CAAC;CACtC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,kBAAkB,EAAE,mBAAmB;IAKhF,OAAO,CAAC,QAAQ,CAAC,eAAe;IAJjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;gBAGnD,MAAM,EAAE,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,EACzC,eAAe,EAAE,MAAM,WAAW,EACnD,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAChE,YAAY,EAAE,iBAAiB;IAUzB,gBAAgB,IAAI,IAAI;IAGxB,eAAe,IAAI,IAAI;IAIvB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3C,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInD,qBAAqB,IAAI,IAAI;IAI7B,6BAA6B,IAAI,IAAI;IAIrC,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,qBAAqB,CAAC,SAAS,CAAC;IA8BhE,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,wBAAwB,CAAC,SAAS,CAAC;IAwCtE,IAAI,CACV,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,WAAW,EAC7B,SAAS,EAAE,MAAM,GACf,IAAI;IAoGA,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,wBAAwB,CAAC,SAAS,CAAC;CAsC7E;AAED,MAAM,WAAW,qBAAqB,CAAC,QAAQ;IAC9C;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB,CAAC,QAAQ;IACjD;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAClE;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAC;IAElD;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/C"}
1
+ {"version":3,"file":"defaultEditBuilder.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/default-schema/defaultEditBuilder.ts"],"names":[],"mappings":"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"}
@@ -147,37 +147,59 @@ export class DefaultEditBuilder {
147
147
  const detachCellId = this.modularBuilder.generateId(count);
148
148
  const attachCellId = { localId: this.modularBuilder.generateId(count), revision };
149
149
  if (compareFieldUpPaths(sourceField, destinationField)) {
150
+ // The source and destination fields are the same.
150
151
  const change = sequence.changeHandler.editor.move(sourceIndex, count, destIndex, detachCellId, attachCellId, revision);
151
152
  this.modularBuilder.submitChange(sourceField, sequence.identifier, brand(change), revision);
152
153
  }
153
154
  else {
155
+ // The source and destination fields are different.
154
156
  const detachPath = topDownPath(sourceField.parent);
155
157
  const attachPath = topDownPath(destinationField.parent);
158
+ /**
159
+ * The number of elements, starting from the root, that both paths have in common.
160
+ * This defines the lowest common ancestor node (LCA) of the source and destination fields.
161
+ */
156
162
  const sharedDepth = getSharedPrefixLength(detachPath, attachPath);
157
163
  let adjustedAttachField = destinationField;
158
- // After the above loop, `sharedDepth` is the number of elements, starting from the root,
159
- // that both paths have in common.
164
+ // Check if the detach parent
165
+ // (the node directly above the location of detach)
166
+ // is along the attach path,
167
+ // in which case the attach path might need to be adjusted.
168
+ // This is synonymous with checking if the attach parent
169
+ // (the node directly above the location of attach)
170
+ // is either below or the same as the detach parent.
171
+ // If not, then the move does not need to be adjusted
172
+ // as the attach path will not be affected by the detach.
160
173
  if (sharedDepth === detachPath.length) {
161
- const attachField = attachPath[sharedDepth]?.parentField ?? destinationField.field;
162
- if (attachField === sourceField.field) {
163
- // The detach occurs in an ancestor field of the field where the attach occurs.
164
- let attachAncestorIndex = attachPath[sharedDepth]?.parentIndex ?? sourceIndex;
165
- if (attachAncestorIndex < sourceIndex) {
174
+ const fieldOnDetachPathUnderLCA = sourceField.field;
175
+ const firstDifferentAttachAncestor = attachPath[sharedDepth];
176
+ // Check if the detach location uses the same field as in
177
+ // the attach path.
178
+ // Note that when `firstDifferentAttachAncestor` is undefined,
179
+ // that means the parents are the same. Since earlier call
180
+ // to `compareFieldUpPaths` returned false, we know that the
181
+ // fields must be different AND thus no adjustment is needed.
182
+ if (fieldOnDetachPathUnderLCA === firstDifferentAttachAncestor?.parentField) {
183
+ // Now working at the level where detach happens along the
184
+ // attach path.
185
+ if (firstDifferentAttachAncestor.parentIndex < sourceIndex) {
166
186
  // The attach path runs through a node located before the detached nodes.
167
187
  // No need to adjust the attach path.
168
188
  }
169
- else if (sourceIndex + count <= attachAncestorIndex) {
189
+ else if (sourceIndex + count <= firstDifferentAttachAncestor.parentIndex) {
170
190
  // The attach path runs through a node located after the detached nodes.
171
- // adjust the index for the node at that depth of the path, so that it is interpreted correctly
191
+ // Adjust the index for the node at that depth of the path, so that it is interpreted correctly
172
192
  // in the composition performed by `submitChanges`.
173
- attachAncestorIndex -= count;
174
- let parent = attachPath[sharedDepth - 1];
175
- const parentField = attachPath[sharedDepth] ?? oob();
193
+ // Start with path to root that remains intact.
194
+ let parent = firstDifferentAttachAncestor.parent;
195
+ // Extend with index-adjusted parent.
176
196
  parent = {
177
197
  parent,
178
- parentIndex: attachAncestorIndex,
179
- parentField: parentField.parentField,
198
+ parentIndex: firstDifferentAttachAncestor.parentIndex - count,
199
+ parentField: firstDifferentAttachAncestor.parentField,
180
200
  };
201
+ // Extend with the rest of the attach path, which is unaffected
202
+ // apart from parentage replacements.
181
203
  for (let i = sharedDepth + 1; i < attachPath.length; i += 1) {
182
204
  parent = {
183
205
  ...(attachPath[i] ?? oob()),