@fluidframework/tree 2.0.0-dev-rc.5.0.0.271262 → 2.0.0-dev-rc.5.0.0.272251

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 (458) hide show
  1. package/api-extractor/api-extractor-lint-beta.cjs.json +5 -0
  2. package/api-extractor/api-extractor-lint-beta.esm.json +5 -0
  3. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  4. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  5. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  6. package/api-report/tree.alpha.api.md +2 -13
  7. package/api-report/tree.beta.api.md +2 -13
  8. package/api-report/tree.public.api.md +2 -13
  9. package/dist/beta.d.ts +0 -1
  10. package/dist/codec/codec.js +0 -1
  11. package/dist/codec/codec.js.map +1 -1
  12. package/dist/codec/discriminatedUnions.js +0 -1
  13. package/dist/codec/discriminatedUnions.js.map +1 -1
  14. package/dist/core/change-family/editBuilder.js +0 -2
  15. package/dist/core/change-family/editBuilder.js.map +1 -1
  16. package/dist/core/rebase/revisionTagCodec.js +0 -2
  17. package/dist/core/rebase/revisionTagCodec.js.map +1 -1
  18. package/dist/core/schema-stored/schema.js +0 -4
  19. package/dist/core/schema-stored/schema.js.map +1 -1
  20. package/dist/core/schema-stored/storedSchemaRepository.js +1 -3
  21. package/dist/core/schema-stored/storedSchemaRepository.js.map +1 -1
  22. package/dist/core/schema-view/view.js +0 -2
  23. package/dist/core/schema-view/view.js.map +1 -1
  24. package/dist/core/tree/anchorSet.js +46 -51
  25. package/dist/core/tree/anchorSet.js.map +1 -1
  26. package/dist/core/tree/detachedFieldIndex.js +2 -8
  27. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  28. package/dist/core/tree/detachedFieldIndexCodec.js +0 -3
  29. package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
  30. package/dist/core/tree/sparseTree.js +11 -15
  31. package/dist/core/tree/sparseTree.js.map +1 -1
  32. package/dist/domains/schemaBuilder.js +70 -70
  33. package/dist/domains/schemaBuilder.js.map +1 -1
  34. package/dist/events/events.js +1 -2
  35. package/dist/events/events.js.map +1 -1
  36. package/dist/feature-libraries/chunked-forest/basicChunk.js +1 -14
  37. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  38. package/dist/feature-libraries/chunked-forest/chunkTree.js +6 -13
  39. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  40. package/dist/feature-libraries/chunked-forest/chunkedForest.js +2 -9
  41. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  42. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js +3 -1
  43. package/dist/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -3
  45. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +6 -11
  47. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +3 -3
  49. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +2 -5
  51. package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +0 -1
  53. package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -1
  55. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/codec/codecs.js +4 -1
  57. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  58. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +13 -25
  59. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  60. package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +1 -1
  61. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js +5 -8
  62. package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  63. package/dist/feature-libraries/chunked-forest/sequenceChunk.js +0 -1
  64. package/dist/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  65. package/dist/feature-libraries/chunked-forest/uniformChunk.js +5 -40
  66. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  67. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +0 -2
  68. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  69. package/dist/feature-libraries/detachedFieldIndexSummarizer.js +1 -2
  70. package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  71. package/dist/feature-libraries/editableTreeBinder.js +12 -13
  72. package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
  73. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +11 -12
  74. package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  75. package/dist/feature-libraries/flex-tree/context.js +3 -7
  76. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  77. package/dist/feature-libraries/flex-tree/lazyEntity.js +22 -13
  78. package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  79. package/dist/feature-libraries/flex-tree/lazyField.js +0 -6
  80. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  81. package/dist/feature-libraries/flex-tree/lazyNode.js +17 -10
  82. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  83. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  84. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  85. package/dist/feature-libraries/index.d.ts +1 -1
  86. package/dist/feature-libraries/index.d.ts.map +1 -1
  87. package/dist/feature-libraries/index.js +2 -3
  88. package/dist/feature-libraries/index.js.map +1 -1
  89. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -7
  90. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  91. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +6 -6
  92. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  93. package/dist/feature-libraries/modular-schema/fieldKind.js +0 -2
  94. package/dist/feature-libraries/modular-schema/fieldKind.js.map +1 -1
  95. package/dist/feature-libraries/modular-schema/fieldKindWithEditor.js +0 -3
  96. package/dist/feature-libraries/modular-schema/fieldKindWithEditor.js.map +1 -1
  97. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  98. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  99. package/dist/feature-libraries/modular-schema/index.js +2 -2
  100. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  101. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +2 -0
  102. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  103. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +2 -0
  104. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  105. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +39 -24
  106. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  107. package/dist/feature-libraries/node-key/mockNodeKeyManager.js +4 -2
  108. package/dist/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
  109. package/dist/feature-libraries/node-key/nodeKeyIndex.js +0 -3
  110. package/dist/feature-libraries/node-key/nodeKeyIndex.js.map +1 -1
  111. package/dist/feature-libraries/object-forest/objectForest.js +28 -23
  112. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  113. package/dist/feature-libraries/optional-field/optionalField.js +5 -3
  114. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  115. package/dist/feature-libraries/schema-index/schemaSummarizer.js +1 -5
  116. package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  117. package/dist/feature-libraries/schemaBuilderBase.js +3 -14
  118. package/dist/feature-libraries/schemaBuilderBase.js.map +1 -1
  119. package/dist/feature-libraries/sequence-field/compose.js +0 -6
  120. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  121. package/dist/feature-libraries/sequence-field/markListFactory.js +4 -3
  122. package/dist/feature-libraries/sequence-field/markListFactory.js.map +1 -1
  123. package/dist/feature-libraries/sequence-field/markQueue.js +2 -4
  124. package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
  125. package/dist/feature-libraries/sequence-field/rebase.d.ts +2 -2
  126. package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  127. package/dist/feature-libraries/sequence-field/rebase.js +20 -20
  128. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  129. package/dist/feature-libraries/treeCursorUtils.js +9 -13
  130. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  131. package/dist/feature-libraries/typed-schema/typedTreeSchema.js +4 -23
  132. package/dist/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
  133. package/dist/feature-libraries/typed-schema/view.js +0 -7
  134. package/dist/feature-libraries/typed-schema/view.js.map +1 -1
  135. package/dist/index.d.ts +1 -1
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +1 -2
  138. package/dist/index.js.map +1 -1
  139. package/dist/packageVersion.d.ts +1 -1
  140. package/dist/packageVersion.js +1 -1
  141. package/dist/packageVersion.js.map +1 -1
  142. package/dist/public.d.ts +0 -1
  143. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  144. package/dist/shared-tree/schematizingTreeView.js +10 -27
  145. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  146. package/dist/shared-tree/sharedTree.d.ts +4 -0
  147. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  148. package/dist/shared-tree/sharedTree.js +13 -10
  149. package/dist/shared-tree/sharedTree.js.map +1 -1
  150. package/dist/shared-tree/sharedTreeChangeEnricher.js +11 -14
  151. package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  152. package/dist/shared-tree/sharedTreeChangeFamily.js +3 -5
  153. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  154. package/dist/shared-tree/sharedTreeEditBuilder.js +0 -2
  155. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  156. package/dist/shared-tree/treeCheckout.js +11 -22
  157. package/dist/shared-tree/treeCheckout.js.map +1 -1
  158. package/dist/shared-tree/treeView.js +0 -6
  159. package/dist/shared-tree/treeView.js.map +1 -1
  160. package/dist/shared-tree-core/branch.d.ts +18 -0
  161. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  162. package/dist/shared-tree-core/branch.js +28 -31
  163. package/dist/shared-tree-core/branch.js.map +1 -1
  164. package/dist/shared-tree-core/branchCommitEnricher.d.ts +4 -2
  165. package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  166. package/dist/shared-tree-core/branchCommitEnricher.js +19 -15
  167. package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
  168. package/dist/shared-tree-core/defaultResubmitMachine.js +19 -21
  169. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  170. package/dist/shared-tree-core/editManager.js +37 -53
  171. package/dist/shared-tree-core/editManager.js.map +1 -1
  172. package/dist/shared-tree-core/editManagerSummarizer.js +1 -5
  173. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  174. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  175. package/dist/shared-tree-core/sharedTreeCore.js +16 -24
  176. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  177. package/dist/shared-tree-core/transactionEnricher.d.ts +11 -1
  178. package/dist/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  179. package/dist/shared-tree-core/transactionEnricher.js +25 -4
  180. package/dist/shared-tree-core/transactionEnricher.js.map +1 -1
  181. package/dist/shared-tree-core/transactionStack.js +3 -1
  182. package/dist/shared-tree-core/transactionStack.js.map +1 -1
  183. package/dist/simple-tree/arrayNode.js +34 -26
  184. package/dist/simple-tree/arrayNode.js.map +1 -1
  185. package/dist/simple-tree/leafNodeSchema.js +2 -4
  186. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  187. package/dist/simple-tree/mapNode.js +5 -5
  188. package/dist/simple-tree/mapNode.js.map +1 -1
  189. package/dist/simple-tree/objectNode.js +6 -6
  190. package/dist/simple-tree/objectNode.js.map +1 -1
  191. package/dist/simple-tree/schemaFactory.d.ts +18 -5
  192. package/dist/simple-tree/schemaFactory.d.ts.map +1 -1
  193. package/dist/simple-tree/schemaFactory.js +65 -53
  194. package/dist/simple-tree/schemaFactory.js.map +1 -1
  195. package/dist/simple-tree/schemaTypes.js +3 -12
  196. package/dist/simple-tree/schemaTypes.js.map +1 -1
  197. package/dist/simple-tree/tree.d.ts +1 -22
  198. package/dist/simple-tree/tree.d.ts.map +1 -1
  199. package/dist/simple-tree/tree.js +0 -21
  200. package/dist/simple-tree/tree.js.map +1 -1
  201. package/dist/simple-tree/treeNodeApi.d.ts +13 -4
  202. package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
  203. package/dist/simple-tree/treeNodeApi.js +8 -3
  204. package/dist/simple-tree/treeNodeApi.js.map +1 -1
  205. package/dist/simple-tree/types.d.ts +26 -6
  206. package/dist/simple-tree/types.d.ts.map +1 -1
  207. package/dist/simple-tree/types.js +79 -54
  208. package/dist/simple-tree/types.js.map +1 -1
  209. package/dist/treeFactory.js +10 -9
  210. package/dist/treeFactory.js.map +1 -1
  211. package/dist/util/brand.js +0 -1
  212. package/dist/util/brand.js.map +1 -1
  213. package/dist/util/nestedMap.js +4 -2
  214. package/dist/util/nestedMap.js.map +1 -1
  215. package/dist/util/offsetList.js +4 -2
  216. package/dist/util/offsetList.js.map +1 -1
  217. package/dist/util/referenceCounting.js +0 -1
  218. package/dist/util/referenceCounting.js.map +1 -1
  219. package/dist/util/stackyIterator.js +2 -3
  220. package/dist/util/stackyIterator.js.map +1 -1
  221. package/lib/beta.d.ts +0 -1
  222. package/lib/codec/codec.js +0 -1
  223. package/lib/codec/codec.js.map +1 -1
  224. package/lib/codec/discriminatedUnions.js +0 -1
  225. package/lib/codec/discriminatedUnions.js.map +1 -1
  226. package/lib/core/change-family/editBuilder.js +0 -2
  227. package/lib/core/change-family/editBuilder.js.map +1 -1
  228. package/lib/core/rebase/revisionTagCodec.js +0 -2
  229. package/lib/core/rebase/revisionTagCodec.js.map +1 -1
  230. package/lib/core/schema-stored/schema.js +0 -4
  231. package/lib/core/schema-stored/schema.js.map +1 -1
  232. package/lib/core/schema-stored/storedSchemaRepository.js +1 -3
  233. package/lib/core/schema-stored/storedSchemaRepository.js.map +1 -1
  234. package/lib/core/schema-view/view.js +0 -2
  235. package/lib/core/schema-view/view.js.map +1 -1
  236. package/lib/core/tree/anchorSet.js +46 -51
  237. package/lib/core/tree/anchorSet.js.map +1 -1
  238. package/lib/core/tree/detachedFieldIndex.js +2 -8
  239. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  240. package/lib/core/tree/detachedFieldIndexCodec.js +0 -3
  241. package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
  242. package/lib/core/tree/sparseTree.js +11 -15
  243. package/lib/core/tree/sparseTree.js.map +1 -1
  244. package/lib/domains/schemaBuilder.js +70 -70
  245. package/lib/domains/schemaBuilder.js.map +1 -1
  246. package/lib/events/events.js +1 -2
  247. package/lib/events/events.js.map +1 -1
  248. package/lib/feature-libraries/chunked-forest/basicChunk.js +1 -14
  249. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  250. package/lib/feature-libraries/chunked-forest/chunkTree.js +6 -13
  251. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  252. package/lib/feature-libraries/chunked-forest/chunkedForest.js +2 -9
  253. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  254. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js +3 -1
  255. package/lib/feature-libraries/chunked-forest/codec/chunkCodecUtilities.js.map +1 -1
  256. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +13 -3
  257. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
  258. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +6 -11
  259. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  260. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +3 -3
  261. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
  262. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +2 -5
  263. package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
  264. package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +0 -1
  265. package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
  266. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -1
  267. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  268. package/lib/feature-libraries/chunked-forest/codec/codecs.js +4 -1
  269. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  270. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +13 -25
  271. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  272. package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +1 -1
  273. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js +5 -8
  274. package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
  275. package/lib/feature-libraries/chunked-forest/sequenceChunk.js +0 -1
  276. package/lib/feature-libraries/chunked-forest/sequenceChunk.js.map +1 -1
  277. package/lib/feature-libraries/chunked-forest/uniformChunk.js +5 -40
  278. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  279. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +0 -2
  280. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  281. package/lib/feature-libraries/detachedFieldIndexSummarizer.js +1 -2
  282. package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  283. package/lib/feature-libraries/editableTreeBinder.js +12 -13
  284. package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
  285. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +11 -12
  286. package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
  287. package/lib/feature-libraries/flex-tree/context.js +3 -7
  288. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  289. package/lib/feature-libraries/flex-tree/lazyEntity.js +22 -13
  290. package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
  291. package/lib/feature-libraries/flex-tree/lazyField.js +0 -6
  292. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  293. package/lib/feature-libraries/flex-tree/lazyNode.js +17 -10
  294. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  295. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  296. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  297. package/lib/feature-libraries/index.d.ts +1 -1
  298. package/lib/feature-libraries/index.d.ts.map +1 -1
  299. package/lib/feature-libraries/index.js +1 -1
  300. package/lib/feature-libraries/index.js.map +1 -1
  301. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -7
  302. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  303. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +5 -5
  304. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  305. package/lib/feature-libraries/modular-schema/fieldKind.js +0 -2
  306. package/lib/feature-libraries/modular-schema/fieldKind.js.map +1 -1
  307. package/lib/feature-libraries/modular-schema/fieldKindWithEditor.js +0 -3
  308. package/lib/feature-libraries/modular-schema/fieldKindWithEditor.js.map +1 -1
  309. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  310. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  311. package/lib/feature-libraries/modular-schema/index.js +1 -1
  312. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  313. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +2 -0
  314. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  315. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +2 -0
  316. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  317. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +40 -25
  318. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  319. package/lib/feature-libraries/node-key/mockNodeKeyManager.js +4 -2
  320. package/lib/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
  321. package/lib/feature-libraries/node-key/nodeKeyIndex.js +0 -3
  322. package/lib/feature-libraries/node-key/nodeKeyIndex.js.map +1 -1
  323. package/lib/feature-libraries/object-forest/objectForest.js +28 -23
  324. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  325. package/lib/feature-libraries/optional-field/optionalField.js +6 -4
  326. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  327. package/lib/feature-libraries/schema-index/schemaSummarizer.js +1 -5
  328. package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  329. package/lib/feature-libraries/schemaBuilderBase.js +3 -14
  330. package/lib/feature-libraries/schemaBuilderBase.js.map +1 -1
  331. package/lib/feature-libraries/sequence-field/compose.js +0 -6
  332. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  333. package/lib/feature-libraries/sequence-field/markListFactory.js +4 -3
  334. package/lib/feature-libraries/sequence-field/markListFactory.js.map +1 -1
  335. package/lib/feature-libraries/sequence-field/markQueue.js +2 -4
  336. package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
  337. package/lib/feature-libraries/sequence-field/rebase.d.ts +2 -2
  338. package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
  339. package/lib/feature-libraries/sequence-field/rebase.js +21 -21
  340. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  341. package/lib/feature-libraries/treeCursorUtils.js +9 -13
  342. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  343. package/lib/feature-libraries/typed-schema/typedTreeSchema.js +4 -23
  344. package/lib/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
  345. package/lib/feature-libraries/typed-schema/view.js +0 -7
  346. package/lib/feature-libraries/typed-schema/view.js.map +1 -1
  347. package/lib/index.d.ts +1 -1
  348. package/lib/index.d.ts.map +1 -1
  349. package/lib/index.js +1 -1
  350. package/lib/index.js.map +1 -1
  351. package/lib/packageVersion.d.ts +1 -1
  352. package/lib/packageVersion.js +1 -1
  353. package/lib/packageVersion.js.map +1 -1
  354. package/lib/public.d.ts +0 -1
  355. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  356. package/lib/shared-tree/schematizingTreeView.js +10 -27
  357. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  358. package/lib/shared-tree/sharedTree.d.ts +4 -0
  359. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  360. package/lib/shared-tree/sharedTree.js +13 -10
  361. package/lib/shared-tree/sharedTree.js.map +1 -1
  362. package/lib/shared-tree/sharedTreeChangeEnricher.js +11 -14
  363. package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
  364. package/lib/shared-tree/sharedTreeChangeFamily.js +3 -5
  365. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  366. package/lib/shared-tree/sharedTreeEditBuilder.js +0 -2
  367. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  368. package/lib/shared-tree/treeCheckout.js +11 -22
  369. package/lib/shared-tree/treeCheckout.js.map +1 -1
  370. package/lib/shared-tree/treeView.js +0 -6
  371. package/lib/shared-tree/treeView.js.map +1 -1
  372. package/lib/shared-tree-core/branch.d.ts +18 -0
  373. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  374. package/lib/shared-tree-core/branch.js +28 -31
  375. package/lib/shared-tree-core/branch.js.map +1 -1
  376. package/lib/shared-tree-core/branchCommitEnricher.d.ts +4 -2
  377. package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  378. package/lib/shared-tree-core/branchCommitEnricher.js +19 -15
  379. package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
  380. package/lib/shared-tree-core/defaultResubmitMachine.js +19 -21
  381. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  382. package/lib/shared-tree-core/editManager.js +37 -53
  383. package/lib/shared-tree-core/editManager.js.map +1 -1
  384. package/lib/shared-tree-core/editManagerSummarizer.js +1 -5
  385. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  386. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  387. package/lib/shared-tree-core/sharedTreeCore.js +16 -24
  388. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  389. package/lib/shared-tree-core/transactionEnricher.d.ts +11 -1
  390. package/lib/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  391. package/lib/shared-tree-core/transactionEnricher.js +25 -4
  392. package/lib/shared-tree-core/transactionEnricher.js.map +1 -1
  393. package/lib/shared-tree-core/transactionStack.js +3 -1
  394. package/lib/shared-tree-core/transactionStack.js.map +1 -1
  395. package/lib/simple-tree/arrayNode.js +34 -26
  396. package/lib/simple-tree/arrayNode.js.map +1 -1
  397. package/lib/simple-tree/leafNodeSchema.js +2 -4
  398. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  399. package/lib/simple-tree/mapNode.js +5 -5
  400. package/lib/simple-tree/mapNode.js.map +1 -1
  401. package/lib/simple-tree/objectNode.js +6 -6
  402. package/lib/simple-tree/objectNode.js.map +1 -1
  403. package/lib/simple-tree/schemaFactory.d.ts +18 -5
  404. package/lib/simple-tree/schemaFactory.d.ts.map +1 -1
  405. package/lib/simple-tree/schemaFactory.js +65 -53
  406. package/lib/simple-tree/schemaFactory.js.map +1 -1
  407. package/lib/simple-tree/schemaTypes.js +3 -12
  408. package/lib/simple-tree/schemaTypes.js.map +1 -1
  409. package/lib/simple-tree/tree.d.ts +1 -22
  410. package/lib/simple-tree/tree.d.ts.map +1 -1
  411. package/lib/simple-tree/tree.js +0 -21
  412. package/lib/simple-tree/tree.js.map +1 -1
  413. package/lib/simple-tree/treeNodeApi.d.ts +13 -4
  414. package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
  415. package/lib/simple-tree/treeNodeApi.js +8 -3
  416. package/lib/simple-tree/treeNodeApi.js.map +1 -1
  417. package/lib/simple-tree/types.d.ts +26 -6
  418. package/lib/simple-tree/types.d.ts.map +1 -1
  419. package/lib/simple-tree/types.js +78 -54
  420. package/lib/simple-tree/types.js.map +1 -1
  421. package/lib/treeFactory.js +10 -9
  422. package/lib/treeFactory.js.map +1 -1
  423. package/lib/util/brand.js +0 -1
  424. package/lib/util/brand.js.map +1 -1
  425. package/lib/util/nestedMap.js +4 -2
  426. package/lib/util/nestedMap.js.map +1 -1
  427. package/lib/util/offsetList.js +4 -2
  428. package/lib/util/offsetList.js.map +1 -1
  429. package/lib/util/referenceCounting.js +0 -1
  430. package/lib/util/referenceCounting.js.map +1 -1
  431. package/lib/util/stackyIterator.js +2 -3
  432. package/lib/util/stackyIterator.js.map +1 -1
  433. package/package.json +27 -24
  434. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +22 -6
  435. package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +2 -2
  436. package/src/feature-libraries/chunked-forest/codec/codecs.ts +6 -2
  437. package/src/feature-libraries/chunked-forest/codec/nodeShape.ts +8 -3
  438. package/src/feature-libraries/index.ts +0 -1
  439. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +6 -7
  440. package/src/feature-libraries/modular-schema/index.ts +1 -1
  441. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +2 -0
  442. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +55 -23
  443. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  444. package/src/feature-libraries/sequence-field/rebase.ts +15 -33
  445. package/src/index.ts +0 -1
  446. package/src/packageVersion.ts +1 -1
  447. package/src/shared-tree/schematizingTreeView.ts +0 -2
  448. package/src/shared-tree/sharedTree.ts +8 -1
  449. package/src/shared-tree-core/branch.ts +24 -0
  450. package/src/shared-tree-core/branchCommitEnricher.ts +15 -6
  451. package/src/shared-tree-core/sharedTreeCore.ts +9 -0
  452. package/src/shared-tree-core/transactionEnricher.ts +27 -1
  453. package/src/simple-tree/arrayNode.ts +17 -17
  454. package/src/simple-tree/schemaFactory.ts +18 -5
  455. package/src/simple-tree/tree.ts +1 -26
  456. package/src/simple-tree/treeNodeApi.ts +25 -7
  457. package/src/simple-tree/types.ts +57 -9
  458. package/tsdoc.json +4 -0
@@ -2,6 +2,18 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
6
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
7
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
8
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
9
+ };
10
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
11
+ if (kind === "m") throw new TypeError("Private method is not writable");
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
14
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
15
+ };
16
+ var _ObjectForest_roots;
5
17
  import { assert } from "@fluidframework/core-utils/internal";
6
18
  import { AnchorSet, ITreeSubscriptionCursorState, aboveRootPlaceholder, } from "../../core/index.js";
7
19
  import { createEmitter } from "../../events/index.js";
@@ -34,24 +46,22 @@ function deepCopyMapTree(mapTree) {
34
46
  * It does not use compressed chunks: instead nodes are implemented using objects.
35
47
  */
36
48
  export class ObjectForest {
37
- anchors;
38
- activeVisitor;
39
- // All cursors that are in the "Current" state. Must be empty when editing.
40
- currentCursors = new Set();
41
- events = createEmitter();
42
- #roots;
43
49
  get roots() {
44
- return this.#roots;
50
+ return __classPrivateFieldGet(this, _ObjectForest_roots, "f");
45
51
  }
46
52
  constructor(anchors = new AnchorSet(), roots) {
47
53
  this.anchors = anchors;
48
- this.#roots =
49
- roots !== undefined
50
- ? deepCopyMapTree(roots)
51
- : {
52
- type: aboveRootPlaceholder,
53
- fields: new Map(),
54
- };
54
+ // All cursors that are in the "Current" state. Must be empty when editing.
55
+ this.currentCursors = new Set();
56
+ this.events = createEmitter();
57
+ _ObjectForest_roots.set(this, void 0);
58
+ this.nextRange = 0;
59
+ __classPrivateFieldSet(this, _ObjectForest_roots, roots !== undefined
60
+ ? deepCopyMapTree(roots)
61
+ : {
62
+ type: aboveRootPlaceholder,
63
+ fields: new Map(),
64
+ }, "f");
55
65
  }
56
66
  get isEmpty() {
57
67
  return this.roots.fields.size === 0;
@@ -87,7 +97,6 @@ export class ObjectForest {
87
97
  }
88
98
  };
89
99
  class Visitor {
90
- forest;
91
100
  constructor(forest) {
92
101
  this.forest = forest;
93
102
  }
@@ -130,7 +139,7 @@ export class ObjectForest {
130
139
  assert(parent !== this.forest.roots || key !== source, 0x7b6 /* Attach source field must be different from current field */);
131
140
  const currentField = getOrCreateField(parent, key);
132
141
  assertValidIndex(destination, currentField, true);
133
- const sourceField = this.forest.#roots.fields.get(source) ?? [];
142
+ const sourceField = __classPrivateFieldGet(this.forest, _ObjectForest_roots, "f").fields.get(source) ?? [];
134
143
  assert(sourceField !== undefined, 0x7b7 /* Attach source field must exist */);
135
144
  assert(sourceField.length === count, 0x7b8 /* Attach must consume all nodes in source field */);
136
145
  // TODO: this will fail for very large insertions due to argument limits.
@@ -184,7 +193,6 @@ export class ObjectForest {
184
193
  this.activeVisitor = visitor;
185
194
  return visitor;
186
195
  }
187
- nextRange = 0;
188
196
  newDetachedField() {
189
197
  const range = brand(String(this.nextRange));
190
198
  this.nextRange += 1;
@@ -197,11 +205,11 @@ export class ObjectForest {
197
205
  addFieldAsDetached(field, key) {
198
206
  assert(!this.roots.fields.has(key), 0x370 /* new range must not already exist */);
199
207
  if (field.length > 0) {
200
- this.#roots.fields.set(key, field);
208
+ __classPrivateFieldGet(this, _ObjectForest_roots, "f").fields.set(key, field);
201
209
  }
202
210
  }
203
211
  delete(field) {
204
- this.#roots.fields.delete(field);
212
+ __classPrivateFieldGet(this, _ObjectForest_roots, "f").fields.delete(field);
205
213
  }
206
214
  allocateCursor(source) {
207
215
  return new Cursor(this, source);
@@ -251,14 +259,11 @@ export class ObjectForest {
251
259
  return cursorForMapTreeNode(this.roots);
252
260
  }
253
261
  }
262
+ _ObjectForest_roots = new WeakMap();
254
263
  /**
255
264
  * Cursor implementation for ObjectForest.
256
265
  */
257
266
  class Cursor extends SynchronousCursor {
258
- forest;
259
- source;
260
- innerCursor;
261
- state;
262
267
  /**
263
268
  * @param forest - forest this cursor navigates
264
269
  * @param innerCursor - underlying cursor implementation this wraps. `undefined` when state is not `Current`
@@ -1 +1 @@
1
- {"version":3,"file":"objectForest.js","sourceRoot":"","sources":["../../../src/feature-libraries/object-forest/objectForest.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 } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype Anchor,\n\tAnchorSet,\n\ttype CursorLocationType,\n\ttype DeltaVisitor,\n\ttype DetachedField,\n\ttype FieldAnchor,\n\ttype FieldKey,\n\ttype FieldUpPath,\n\ttype ForestEvents,\n\ttype IEditableForest,\n\ttype ITreeCursor,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\tITreeSubscriptionCursorState,\n\ttype MapTree,\n\ttype PathRootPrefix,\n\ttype PlaceIndex,\n\ttype ProtoNodes,\n\ttype Range,\n\tTreeNavigationResult,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeStoredSchemaSubscription,\n\ttype UpPath,\n\ttype Value,\n\taboveRootPlaceholder,\n} from \"../../core/index.js\";\nimport { createEmitter } from \"../../events/index.js\";\nimport {\n\tassertNonNegativeSafeInteger,\n\tassertValidIndex,\n\tassertValidRange,\n\tbrand,\n\tfail,\n\tmapIterable,\n} from \"../../util/index.js\";\nimport { cursorForMapTreeNode, mapTreeFromCursor } from \"../mapTreeCursor.js\";\nimport { type CursorWithNode, SynchronousCursor } from \"../treeCursorUtils.js\";\n\n/** A `MapTree` with mutable fields */\ninterface MutableMapTree extends MapTree {\n\treadonly fields: Map<FieldKey, MutableMapTree[]>;\n}\n\n/** Get a field from a `MutableMapTree`, optionally modifying the tree to create it if missing. */\nfunction getOrCreateField(mapTree: MutableMapTree, key: FieldKey): MutableMapTree[] {\n\tconst field = mapTree.fields.get(key);\n\tif (field !== undefined) {\n\t\treturn field;\n\t}\n\n\tconst newField: MutableMapTree[] = [];\n\tmapTree.fields.set(key, newField);\n\treturn newField;\n}\n\nfunction deepCopyMapTree(mapTree: MapTree): MutableMapTree {\n\treturn {\n\t\t...mapTree,\n\t\tfields: new Map(\n\t\t\tmapIterable(mapTree.fields.entries(), ([key, field]) => [\n\t\t\t\tkey,\n\t\t\t\tfield.map(deepCopyMapTree),\n\t\t\t]),\n\t\t),\n\t};\n}\n\n/**\n * Reference implementation of IEditableForest.\n *\n * This implementation focuses on correctness and simplicity, not performance.\n * It does not use compressed chunks: instead nodes are implemented using objects.\n */\nexport class ObjectForest implements IEditableForest {\n\tprivate activeVisitor?: DeltaVisitor;\n\n\t// All cursors that are in the \"Current\" state. Must be empty when editing.\n\tpublic readonly currentCursors: Set<Cursor> = new Set();\n\n\tprivate readonly events = createEmitter<ForestEvents>();\n\n\treadonly #roots: MutableMapTree;\n\tpublic get roots(): MapTree {\n\t\treturn this.#roots;\n\t}\n\n\tpublic constructor(\n\t\tpublic readonly anchors: AnchorSet = new AnchorSet(),\n\t\troots?: MapTree,\n\t) {\n\t\tthis.#roots =\n\t\t\troots !== undefined\n\t\t\t\t? deepCopyMapTree(roots)\n\t\t\t\t: {\n\t\t\t\t\t\ttype: aboveRootPlaceholder,\n\t\t\t\t\t\tfields: new Map(),\n\t\t\t\t };\n\t}\n\n\tpublic get isEmpty(): boolean {\n\t\treturn this.roots.fields.size === 0;\n\t}\n\n\tpublic on<K extends keyof ForestEvents>(eventName: K, listener: ForestEvents[K]): () => void {\n\t\treturn this.events.on(eventName, listener);\n\t}\n\n\tpublic clone(_: TreeStoredSchemaSubscription, anchors: AnchorSet): ObjectForest {\n\t\treturn new ObjectForest(anchors, this.roots);\n\t}\n\n\tpublic forgetAnchor(anchor: Anchor): void {\n\t\tthis.anchors.forget(anchor);\n\t}\n\n\tpublic acquireVisitor(): DeltaVisitor {\n\t\tassert(\n\t\t\tthis.activeVisitor === undefined,\n\t\t\t0x76c /* Must release existing visitor before acquiring another */,\n\t\t);\n\n\t\t// Note: This code uses cursors, however it also modifies the tree.\n\t\t// In general this is not safe, but this code happens to only modify the tree below the current cursor location,\n\t\t// which happens to work.\n\t\t// This pattern could be generalized/formalized with a concept of an exclusive cursor,\n\t\t// which can edit, but is the only cursor allowed at the time.\n\n\t\tconst cursor: Cursor = this.allocateCursor(\"acquireVisitor\");\n\t\tcursor.setToAboveDetachedSequences();\n\n\t\t/**\n\t\t * Called before each edit to allow cursor cleanup to happen and ensure that there are no unexpected cursors.\n\t\t * This is required for each change since there may be app facing change event handlers which create cursors.\n\t\t */\n\t\tconst preEdit = (): void => {\n\t\t\tthis.events.emit(\"beforeChange\");\n\t\t\tassert(this.currentCursors.has(cursor), \"missing visitor cursor while editing\");\n\t\t\tif (this.currentCursors.size > 1) {\n\t\t\t\tconst unexpectedSources = [...this.currentCursors].flatMap((c) =>\n\t\t\t\t\tc === cursor ? [] : c.source ?? null,\n\t\t\t\t);\n\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Found unexpected cursors when editing with the following annotations: ${JSON.stringify(\n\t\t\t\t\t\tunexpectedSources,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tclass Visitor implements DeltaVisitor {\n\t\t\tpublic constructor(private readonly forest: ObjectForest) {}\n\t\t\tpublic free(): void {\n\t\t\t\tcursor.free();\n\t\t\t\tassert(\n\t\t\t\t\tthis.forest.activeVisitor !== undefined,\n\t\t\t\t\t0x76d /* Multiple free calls for same visitor */,\n\t\t\t\t);\n\t\t\t\tthis.forest.activeVisitor = undefined;\n\t\t\t}\n\t\t\tpublic destroy(detachedField: FieldKey, count: number): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.forest.delete(detachedField);\n\t\t\t}\n\t\t\tpublic create(content: ProtoNodes, destination: FieldKey): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.forest.add(content, destination);\n\t\t\t\tthis.forest.events.emit(\"afterRootFieldCreated\", destination);\n\t\t\t}\n\t\t\tpublic attach(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.attachEdit(source, count, destination);\n\t\t\t}\n\t\t\tpublic detach(source: Range, destination: FieldKey): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.detachEdit(source, destination);\n\t\t\t}\n\t\t\t/**\n\t\t\t * Attaches the nodes from the given source field into the current field.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The the range to be attached.\n\t\t\t * @param count - The number of nodes being attached.\n\t\t\t * Expected to match the number of nodes in the source detached field.\n\t\t\t * @param destination - The index in the current field at which to attach the content.\n\t\t\t */\n\t\t\tprivate attachEdit(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tassertNonNegativeSafeInteger(count);\n\t\t\t\tif (count === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst [parent, key] = cursor.getParent();\n\t\t\t\tassert(\n\t\t\t\t\tparent !== this.forest.roots || key !== source,\n\t\t\t\t\t0x7b6 /* Attach source field must be different from current field */,\n\t\t\t\t);\n\t\t\t\tconst currentField = getOrCreateField(parent, key);\n\t\t\t\tassertValidIndex(destination, currentField, true);\n\t\t\t\tconst sourceField = this.forest.#roots.fields.get(source) ?? [];\n\t\t\t\tassert(sourceField !== undefined, 0x7b7 /* Attach source field must exist */);\n\t\t\t\tassert(\n\t\t\t\t\tsourceField.length === count,\n\t\t\t\t\t0x7b8 /* Attach must consume all nodes in source field */,\n\t\t\t\t);\n\t\t\t\t// TODO: this will fail for very large insertions due to argument limits.\n\t\t\t\tcurrentField.splice(destination, 0, ...sourceField);\n\t\t\t\tthis.forest.delete(source);\n\t\t\t}\n\t\t\t/**\n\t\t\t * Detaches the range from the current field and transfers it to the given destination if any.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The bounds of the range to be detached from the current field.\n\t\t\t * @param destination - If specified, the destination to transfer the detached range to.\n\t\t\t * If not specified, the detached range is destroyed.\n\t\t\t */\n\t\t\tprivate detachEdit(source: Range, destination: FieldKey | undefined): void {\n\t\t\t\tconst [parent, key] = cursor.getParent();\n\t\t\t\tassert(\n\t\t\t\t\tdestination === undefined ||\n\t\t\t\t\t\tparent !== this.forest.roots ||\n\t\t\t\t\t\tkey !== destination,\n\t\t\t\t\t0x7b9 /* Detach destination field must be different from current field */,\n\t\t\t\t);\n\t\t\t\tconst currentField = getOrCreateField(parent, key);\n\t\t\t\tassertValidRange(source, currentField);\n\t\t\t\tconst content = currentField.splice(source.start, source.end - source.start);\n\t\t\t\tif (destination !== undefined) {\n\t\t\t\t\tthis.forest.addFieldAsDetached(content, destination);\n\t\t\t\t}\n\t\t\t\t// This check is performed after the transfer to ensure that the field is not removed in scenarios\n\t\t\t\t// where the source and destination are the same.\n\t\t\t\tif (currentField.length === 0) {\n\t\t\t\t\tparent.fields.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpublic replace(\n\t\t\t\tnewContentSource: FieldKey,\n\t\t\t\trange: Range,\n\t\t\t\toldContentDestination: FieldKey,\n\t\t\t): void {\n\t\t\t\tpreEdit();\n\t\t\t\tassert(\n\t\t\t\t\tnewContentSource !== oldContentDestination,\n\t\t\t\t\t0x7ba /* Replace detached source field and detached destination field must be different */,\n\t\t\t\t);\n\t\t\t\tthis.detachEdit(range, oldContentDestination);\n\t\t\t\tthis.attachEdit(newContentSource, range.end - range.start, range.start);\n\t\t\t}\n\t\t\tpublic enterNode(index: number): void {\n\t\t\t\tcursor.enterNode(index);\n\t\t\t}\n\t\t\tpublic exitNode(index: number): void {\n\t\t\t\tcursor.exitNode();\n\t\t\t}\n\t\t\tpublic enterField(key: FieldKey): void {\n\t\t\t\tcursor.enterField(key);\n\t\t\t}\n\t\t\tpublic exitField(key: FieldKey): void {\n\t\t\t\tcursor.exitField();\n\t\t\t}\n\t\t}\n\n\t\tconst visitor = new Visitor(this);\n\t\tthis.activeVisitor = visitor;\n\t\treturn visitor;\n\t}\n\n\tprivate nextRange = 0;\n\tpublic newDetachedField(): DetachedField {\n\t\tconst range: DetachedField = brand(String(this.nextRange));\n\t\tthis.nextRange += 1;\n\t\treturn range;\n\t}\n\n\tprivate add(nodes: Iterable<ITreeCursor>, key: FieldKey): void {\n\t\tconst field = Array.from(nodes, mapTreeFromCursor) as MutableMapTree[];\n\t\tthis.addFieldAsDetached(field, key);\n\t}\n\n\tprivate addFieldAsDetached(field: MutableMapTree[], key: FieldKey): void {\n\t\tassert(!this.roots.fields.has(key), 0x370 /* new range must not already exist */);\n\t\tif (field.length > 0) {\n\t\t\tthis.#roots.fields.set(key, field);\n\t\t}\n\t}\n\n\tprivate delete(field: FieldKey): void {\n\t\tthis.#roots.fields.delete(field);\n\t}\n\n\tpublic allocateCursor(source?: string): Cursor {\n\t\treturn new Cursor(this, source);\n\t}\n\n\tpublic tryMoveCursorToNode(\n\t\tdestination: Anchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tconst path = this.anchors.locate(destination);\n\t\tif (path === undefined) {\n\t\t\treturn TreeNavigationResult.NotFound;\n\t\t}\n\t\tthis.moveCursorToPath(path, cursorToMove);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic tryMoveCursorToField(\n\t\tdestination: FieldAnchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tif (destination.parent === undefined) {\n\t\t\tthis.moveCursorToPath(undefined, cursorToMove);\n\t\t} else {\n\t\t\tconst result = this.tryMoveCursorToNode(destination.parent, cursorToMove);\n\t\t\tif (result !== TreeNavigationResult.Ok) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tcursorToMove.enterField(destination.fieldKey);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic moveCursorToPath(\n\t\tdestination: UpPath | undefined,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): void {\n\t\tassert(\n\t\t\tcursorToMove instanceof Cursor,\n\t\t\t0x337 /* ObjectForest must only be given its own Cursor type */,\n\t\t);\n\t\tassert(\n\t\t\tcursorToMove.forest === this,\n\t\t\t0x338 /* ObjectForest must only be given its own Cursor */,\n\t\t);\n\n\t\tconst indexStack: number[] = [];\n\t\tconst keyStack: FieldKey[] = [];\n\n\t\tlet path: UpPath | undefined = destination;\n\t\twhile (path !== undefined) {\n\t\t\tindexStack.push(path.parentIndex);\n\t\t\tkeyStack.push(path.parentField);\n\t\t\tpath = path.parent;\n\t\t}\n\t\tcursorToMove.setToAboveDetachedSequences();\n\t\twhile (keyStack.length > 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tcursorToMove.enterField(keyStack.pop()!);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tcursorToMove.enterNode(indexStack.pop()!);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tpublic getCursorAboveDetachedFields(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeNode(this.roots);\n\t}\n}\n\n/**\n * Cursor implementation for ObjectForest.\n */\nclass Cursor extends SynchronousCursor implements ITreeSubscriptionCursor {\n\tpublic state: ITreeSubscriptionCursorState;\n\n\t/**\n\t * @param forest - forest this cursor navigates\n\t * @param innerCursor - underlying cursor implementation this wraps. `undefined` when state is not `Current`\n\t */\n\tpublic constructor(\n\t\tpublic readonly forest: ObjectForest,\n\t\tpublic readonly source: string | undefined,\n\t\tprivate innerCursor?: CursorWithNode<MutableMapTree>,\n\t) {\n\t\tsuper();\n\t\tif (innerCursor === undefined) {\n\t\t\tthis.state = ITreeSubscriptionCursorState.Cleared;\n\t\t} else {\n\t\t\tthis.state = ITreeSubscriptionCursorState.Current;\n\t\t\tthis.forest.currentCursors.add(this);\n\t\t}\n\t}\n\n\tpublic buildFieldAnchor(): FieldAnchor {\n\t\tconst path = this.getFieldPath();\n\t\tconst anchor =\n\t\t\tpath.parent === undefined ? undefined : this.forest.anchors.track(path.parent);\n\t\treturn { parent: anchor, fieldKey: path.field };\n\t}\n\tpublic getFieldPath(prefix?: PathRootPrefix): FieldUpPath {\n\t\tassert(this.innerCursor !== undefined, 0x45f /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getFieldPath(prefix);\n\t}\n\tpublic get mode(): CursorLocationType {\n\t\tassert(this.innerCursor !== undefined, 0x42e /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.mode;\n\t}\n\n\tpublic nextField(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x42f /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.nextField();\n\t}\n\tpublic exitField(): void {\n\t\tassert(this.innerCursor !== undefined, 0x430 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.exitField();\n\t}\n\tpublic override skipPendingFields(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x431 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.skipPendingFields();\n\t}\n\tpublic getFieldKey(): FieldKey {\n\t\tassert(this.innerCursor !== undefined, 0x432 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getFieldKey();\n\t}\n\tpublic getFieldLength(): number {\n\t\tassert(this.innerCursor !== undefined, 0x433 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getFieldLength();\n\t}\n\tpublic firstNode(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x434 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.firstNode();\n\t}\n\tpublic enterNode(childIndex: number): void {\n\t\tassert(this.innerCursor !== undefined, 0x435 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.enterNode(childIndex);\n\t}\n\tpublic getPath(prefix?: PathRootPrefix): UpPath {\n\t\tassert(this.innerCursor !== undefined, 0x436 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getPath(prefix) ?? fail(\"no path when at root\");\n\t}\n\tpublic get fieldIndex(): number {\n\t\tassert(this.innerCursor !== undefined, 0x437 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.fieldIndex;\n\t}\n\tpublic get chunkStart(): number {\n\t\tassert(this.innerCursor !== undefined, 0x438 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.chunkStart;\n\t}\n\tpublic get chunkLength(): number {\n\t\tassert(this.innerCursor !== undefined, 0x439 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.chunkLength;\n\t}\n\tpublic seekNodes(offset: number): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x43a /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.seekNodes(offset);\n\t}\n\tpublic nextNode(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x43b /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.nextNode();\n\t}\n\tpublic exitNode(): void {\n\t\tassert(this.innerCursor !== undefined, 0x43c /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.exitNode();\n\t}\n\tpublic firstField(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x43d /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.firstField();\n\t}\n\tpublic enterField(key: FieldKey): void {\n\t\tassert(this.innerCursor !== undefined, 0x43e /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.enterField(key);\n\t}\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\tassert(this.innerCursor !== undefined, 0x43f /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.type;\n\t}\n\tpublic get value(): Value {\n\t\tassert(this.innerCursor !== undefined, 0x440 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.value;\n\t}\n\n\t// TODO: tests for clear when not at root.\n\tpublic clear(): void {\n\t\tassert(\n\t\t\tthis.state !== ITreeSubscriptionCursorState.Freed,\n\t\t\t0x33b /* Cursor must not be freed */,\n\t\t);\n\t\tthis.state = ITreeSubscriptionCursorState.Cleared;\n\t\tthis.innerCursor = undefined;\n\t\tthis.forest.currentCursors.delete(this);\n\t}\n\n\t/**\n\t * Move this cursor to the special dummy node above the detached sequences.\n\t * Can be used when cleared (but not freed).\n\t */\n\tpublic setToAboveDetachedSequences(): void {\n\t\tassert(\n\t\t\tthis.state !== ITreeSubscriptionCursorState.Freed,\n\t\t\t0x33c /* Cursor must not be freed */,\n\t\t);\n\t\tthis.clear();\n\t\tthis.state = ITreeSubscriptionCursorState.Current;\n\t\t// Cast to a cursor of _mutable_ trees to allow direct manipulation of the tree data which is more efficient than doing immutable copies.\n\t\tthis.innerCursor = cursorForMapTreeNode(\n\t\t\tthis.forest.roots,\n\t\t) as CursorWithNode<MutableMapTree>;\n\t\tthis.forest.currentCursors.add(this);\n\t}\n\n\tpublic getNode(): MutableMapTree {\n\t\tassert(this.innerCursor !== undefined, 0x33e /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getNode();\n\t}\n\n\tpublic getParent(): [MutableMapTree, FieldKey] {\n\t\tassert(this.innerCursor !== undefined, 0x441 /* Cursor must be current to be used */);\n\t\t// This could be optimized to skip moving it accessing internals of cursor.\n\t\tconst key = this.innerCursor.getFieldKey();\n\t\tthis.innerCursor.exitField();\n\t\tconst node = this.innerCursor.getNode();\n\t\tthis.innerCursor.enterField(key);\n\t\treturn [node, key];\n\t}\n\n\tpublic fork(source?: string): ITreeSubscriptionCursor {\n\t\tassert(this.innerCursor !== undefined, 0x460 /* Cursor must be current to be used */);\n\t\treturn new Cursor(this.forest, source ?? `fork: ${this.source}`, this.innerCursor.fork());\n\t}\n\n\tpublic free(): void {\n\t\tassert(\n\t\t\tthis.state !== ITreeSubscriptionCursorState.Freed,\n\t\t\t0x33f /* Cursor must not be double freed */,\n\t\t);\n\t\tthis.forest.currentCursors.delete(this);\n\t\tthis.state = ITreeSubscriptionCursorState.Freed;\n\t}\n\n\tpublic buildAnchor(): Anchor {\n\t\tassert(\n\t\t\tthis.state === ITreeSubscriptionCursorState.Current,\n\t\t\t0x37a /* Cursor must be current to be used */,\n\t\t);\n\t\treturn this.forest.anchors.track(this.getPath());\n\t}\n}\n\n// This function is the folder level export for objectForest, and hides all the implementation types.\n// When other forest implementations are created (ex: optimized ones),\n// this function should likely be moved and updated to (at least conditionally) use them.\n/**\n * @returns an implementation of {@link IEditableForest} with no data or schema.\n */\nexport function buildForest(anchors?: AnchorSet): ObjectForest {\n\treturn new ObjectForest(anchors);\n}\n"]}
1
+ {"version":3,"file":"objectForest.js","sourceRoot":"","sources":["../../../src/feature-libraries/object-forest/objectForest.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 } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype Anchor,\n\tAnchorSet,\n\ttype CursorLocationType,\n\ttype DeltaVisitor,\n\ttype DetachedField,\n\ttype FieldAnchor,\n\ttype FieldKey,\n\ttype FieldUpPath,\n\ttype ForestEvents,\n\ttype IEditableForest,\n\ttype ITreeCursor,\n\ttype ITreeCursorSynchronous,\n\ttype ITreeSubscriptionCursor,\n\tITreeSubscriptionCursorState,\n\ttype MapTree,\n\ttype PathRootPrefix,\n\ttype PlaceIndex,\n\ttype ProtoNodes,\n\ttype Range,\n\tTreeNavigationResult,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeStoredSchemaSubscription,\n\ttype UpPath,\n\ttype Value,\n\taboveRootPlaceholder,\n} from \"../../core/index.js\";\nimport { createEmitter } from \"../../events/index.js\";\nimport {\n\tassertNonNegativeSafeInteger,\n\tassertValidIndex,\n\tassertValidRange,\n\tbrand,\n\tfail,\n\tmapIterable,\n} from \"../../util/index.js\";\nimport { cursorForMapTreeNode, mapTreeFromCursor } from \"../mapTreeCursor.js\";\nimport { type CursorWithNode, SynchronousCursor } from \"../treeCursorUtils.js\";\n\n/** A `MapTree` with mutable fields */\ninterface MutableMapTree extends MapTree {\n\treadonly fields: Map<FieldKey, MutableMapTree[]>;\n}\n\n/** Get a field from a `MutableMapTree`, optionally modifying the tree to create it if missing. */\nfunction getOrCreateField(mapTree: MutableMapTree, key: FieldKey): MutableMapTree[] {\n\tconst field = mapTree.fields.get(key);\n\tif (field !== undefined) {\n\t\treturn field;\n\t}\n\n\tconst newField: MutableMapTree[] = [];\n\tmapTree.fields.set(key, newField);\n\treturn newField;\n}\n\nfunction deepCopyMapTree(mapTree: MapTree): MutableMapTree {\n\treturn {\n\t\t...mapTree,\n\t\tfields: new Map(\n\t\t\tmapIterable(mapTree.fields.entries(), ([key, field]) => [\n\t\t\t\tkey,\n\t\t\t\tfield.map(deepCopyMapTree),\n\t\t\t]),\n\t\t),\n\t};\n}\n\n/**\n * Reference implementation of IEditableForest.\n *\n * This implementation focuses on correctness and simplicity, not performance.\n * It does not use compressed chunks: instead nodes are implemented using objects.\n */\nexport class ObjectForest implements IEditableForest {\n\tprivate activeVisitor?: DeltaVisitor;\n\n\t// All cursors that are in the \"Current\" state. Must be empty when editing.\n\tpublic readonly currentCursors: Set<Cursor> = new Set();\n\n\tprivate readonly events = createEmitter<ForestEvents>();\n\n\treadonly #roots: MutableMapTree;\n\tpublic get roots(): MapTree {\n\t\treturn this.#roots;\n\t}\n\n\tpublic constructor(\n\t\tpublic readonly anchors: AnchorSet = new AnchorSet(),\n\t\troots?: MapTree,\n\t) {\n\t\tthis.#roots =\n\t\t\troots !== undefined\n\t\t\t\t? deepCopyMapTree(roots)\n\t\t\t\t: {\n\t\t\t\t\t\ttype: aboveRootPlaceholder,\n\t\t\t\t\t\tfields: new Map(),\n\t\t\t\t };\n\t}\n\n\tpublic get isEmpty(): boolean {\n\t\treturn this.roots.fields.size === 0;\n\t}\n\n\tpublic on<K extends keyof ForestEvents>(eventName: K, listener: ForestEvents[K]): () => void {\n\t\treturn this.events.on(eventName, listener);\n\t}\n\n\tpublic clone(_: TreeStoredSchemaSubscription, anchors: AnchorSet): ObjectForest {\n\t\treturn new ObjectForest(anchors, this.roots);\n\t}\n\n\tpublic forgetAnchor(anchor: Anchor): void {\n\t\tthis.anchors.forget(anchor);\n\t}\n\n\tpublic acquireVisitor(): DeltaVisitor {\n\t\tassert(\n\t\t\tthis.activeVisitor === undefined,\n\t\t\t0x76c /* Must release existing visitor before acquiring another */,\n\t\t);\n\n\t\t// Note: This code uses cursors, however it also modifies the tree.\n\t\t// In general this is not safe, but this code happens to only modify the tree below the current cursor location,\n\t\t// which happens to work.\n\t\t// This pattern could be generalized/formalized with a concept of an exclusive cursor,\n\t\t// which can edit, but is the only cursor allowed at the time.\n\n\t\tconst cursor: Cursor = this.allocateCursor(\"acquireVisitor\");\n\t\tcursor.setToAboveDetachedSequences();\n\n\t\t/**\n\t\t * Called before each edit to allow cursor cleanup to happen and ensure that there are no unexpected cursors.\n\t\t * This is required for each change since there may be app facing change event handlers which create cursors.\n\t\t */\n\t\tconst preEdit = (): void => {\n\t\t\tthis.events.emit(\"beforeChange\");\n\t\t\tassert(this.currentCursors.has(cursor), \"missing visitor cursor while editing\");\n\t\t\tif (this.currentCursors.size > 1) {\n\t\t\t\tconst unexpectedSources = [...this.currentCursors].flatMap((c) =>\n\t\t\t\t\tc === cursor ? [] : c.source ?? null,\n\t\t\t\t);\n\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Found unexpected cursors when editing with the following annotations: ${JSON.stringify(\n\t\t\t\t\t\tunexpectedSources,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\n\t\tclass Visitor implements DeltaVisitor {\n\t\t\tpublic constructor(private readonly forest: ObjectForest) {}\n\t\t\tpublic free(): void {\n\t\t\t\tcursor.free();\n\t\t\t\tassert(\n\t\t\t\t\tthis.forest.activeVisitor !== undefined,\n\t\t\t\t\t0x76d /* Multiple free calls for same visitor */,\n\t\t\t\t);\n\t\t\t\tthis.forest.activeVisitor = undefined;\n\t\t\t}\n\t\t\tpublic destroy(detachedField: FieldKey, count: number): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.forest.delete(detachedField);\n\t\t\t}\n\t\t\tpublic create(content: ProtoNodes, destination: FieldKey): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.forest.add(content, destination);\n\t\t\t\tthis.forest.events.emit(\"afterRootFieldCreated\", destination);\n\t\t\t}\n\t\t\tpublic attach(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.attachEdit(source, count, destination);\n\t\t\t}\n\t\t\tpublic detach(source: Range, destination: FieldKey): void {\n\t\t\t\tpreEdit();\n\t\t\t\tthis.detachEdit(source, destination);\n\t\t\t}\n\t\t\t/**\n\t\t\t * Attaches the nodes from the given source field into the current field.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The the range to be attached.\n\t\t\t * @param count - The number of nodes being attached.\n\t\t\t * Expected to match the number of nodes in the source detached field.\n\t\t\t * @param destination - The index in the current field at which to attach the content.\n\t\t\t */\n\t\t\tprivate attachEdit(source: FieldKey, count: number, destination: PlaceIndex): void {\n\t\t\t\tassertNonNegativeSafeInteger(count);\n\t\t\t\tif (count === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst [parent, key] = cursor.getParent();\n\t\t\t\tassert(\n\t\t\t\t\tparent !== this.forest.roots || key !== source,\n\t\t\t\t\t0x7b6 /* Attach source field must be different from current field */,\n\t\t\t\t);\n\t\t\t\tconst currentField = getOrCreateField(parent, key);\n\t\t\t\tassertValidIndex(destination, currentField, true);\n\t\t\t\tconst sourceField = this.forest.#roots.fields.get(source) ?? [];\n\t\t\t\tassert(sourceField !== undefined, 0x7b7 /* Attach source field must exist */);\n\t\t\t\tassert(\n\t\t\t\t\tsourceField.length === count,\n\t\t\t\t\t0x7b8 /* Attach must consume all nodes in source field */,\n\t\t\t\t);\n\t\t\t\t// TODO: this will fail for very large insertions due to argument limits.\n\t\t\t\tcurrentField.splice(destination, 0, ...sourceField);\n\t\t\t\tthis.forest.delete(source);\n\t\t\t}\n\t\t\t/**\n\t\t\t * Detaches the range from the current field and transfers it to the given destination if any.\n\t\t\t * Does not invalidate dependents.\n\t\t\t * @param source - The bounds of the range to be detached from the current field.\n\t\t\t * @param destination - If specified, the destination to transfer the detached range to.\n\t\t\t * If not specified, the detached range is destroyed.\n\t\t\t */\n\t\t\tprivate detachEdit(source: Range, destination: FieldKey | undefined): void {\n\t\t\t\tconst [parent, key] = cursor.getParent();\n\t\t\t\tassert(\n\t\t\t\t\tdestination === undefined ||\n\t\t\t\t\t\tparent !== this.forest.roots ||\n\t\t\t\t\t\tkey !== destination,\n\t\t\t\t\t0x7b9 /* Detach destination field must be different from current field */,\n\t\t\t\t);\n\t\t\t\tconst currentField = getOrCreateField(parent, key);\n\t\t\t\tassertValidRange(source, currentField);\n\t\t\t\tconst content = currentField.splice(source.start, source.end - source.start);\n\t\t\t\tif (destination !== undefined) {\n\t\t\t\t\tthis.forest.addFieldAsDetached(content, destination);\n\t\t\t\t}\n\t\t\t\t// This check is performed after the transfer to ensure that the field is not removed in scenarios\n\t\t\t\t// where the source and destination are the same.\n\t\t\t\tif (currentField.length === 0) {\n\t\t\t\t\tparent.fields.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpublic replace(\n\t\t\t\tnewContentSource: FieldKey,\n\t\t\t\trange: Range,\n\t\t\t\toldContentDestination: FieldKey,\n\t\t\t): void {\n\t\t\t\tpreEdit();\n\t\t\t\tassert(\n\t\t\t\t\tnewContentSource !== oldContentDestination,\n\t\t\t\t\t0x7ba /* Replace detached source field and detached destination field must be different */,\n\t\t\t\t);\n\t\t\t\tthis.detachEdit(range, oldContentDestination);\n\t\t\t\tthis.attachEdit(newContentSource, range.end - range.start, range.start);\n\t\t\t}\n\t\t\tpublic enterNode(index: number): void {\n\t\t\t\tcursor.enterNode(index);\n\t\t\t}\n\t\t\tpublic exitNode(index: number): void {\n\t\t\t\tcursor.exitNode();\n\t\t\t}\n\t\t\tpublic enterField(key: FieldKey): void {\n\t\t\t\tcursor.enterField(key);\n\t\t\t}\n\t\t\tpublic exitField(key: FieldKey): void {\n\t\t\t\tcursor.exitField();\n\t\t\t}\n\t\t}\n\n\t\tconst visitor = new Visitor(this);\n\t\tthis.activeVisitor = visitor;\n\t\treturn visitor;\n\t}\n\n\tprivate nextRange = 0;\n\tpublic newDetachedField(): DetachedField {\n\t\tconst range: DetachedField = brand(String(this.nextRange));\n\t\tthis.nextRange += 1;\n\t\treturn range;\n\t}\n\n\tprivate add(nodes: Iterable<ITreeCursor>, key: FieldKey): void {\n\t\tconst field = Array.from(nodes, mapTreeFromCursor) as MutableMapTree[];\n\t\tthis.addFieldAsDetached(field, key);\n\t}\n\n\tprivate addFieldAsDetached(field: MutableMapTree[], key: FieldKey): void {\n\t\tassert(!this.roots.fields.has(key), 0x370 /* new range must not already exist */);\n\t\tif (field.length > 0) {\n\t\t\tthis.#roots.fields.set(key, field);\n\t\t}\n\t}\n\n\tprivate delete(field: FieldKey): void {\n\t\tthis.#roots.fields.delete(field);\n\t}\n\n\tpublic allocateCursor(source?: string): Cursor {\n\t\treturn new Cursor(this, source);\n\t}\n\n\tpublic tryMoveCursorToNode(\n\t\tdestination: Anchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tconst path = this.anchors.locate(destination);\n\t\tif (path === undefined) {\n\t\t\treturn TreeNavigationResult.NotFound;\n\t\t}\n\t\tthis.moveCursorToPath(path, cursorToMove);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic tryMoveCursorToField(\n\t\tdestination: FieldAnchor,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): TreeNavigationResult {\n\t\tif (destination.parent === undefined) {\n\t\t\tthis.moveCursorToPath(undefined, cursorToMove);\n\t\t} else {\n\t\t\tconst result = this.tryMoveCursorToNode(destination.parent, cursorToMove);\n\t\t\tif (result !== TreeNavigationResult.Ok) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\tcursorToMove.enterField(destination.fieldKey);\n\t\treturn TreeNavigationResult.Ok;\n\t}\n\n\tpublic moveCursorToPath(\n\t\tdestination: UpPath | undefined,\n\t\tcursorToMove: ITreeSubscriptionCursor,\n\t): void {\n\t\tassert(\n\t\t\tcursorToMove instanceof Cursor,\n\t\t\t0x337 /* ObjectForest must only be given its own Cursor type */,\n\t\t);\n\t\tassert(\n\t\t\tcursorToMove.forest === this,\n\t\t\t0x338 /* ObjectForest must only be given its own Cursor */,\n\t\t);\n\n\t\tconst indexStack: number[] = [];\n\t\tconst keyStack: FieldKey[] = [];\n\n\t\tlet path: UpPath | undefined = destination;\n\t\twhile (path !== undefined) {\n\t\t\tindexStack.push(path.parentIndex);\n\t\t\tkeyStack.push(path.parentField);\n\t\t\tpath = path.parent;\n\t\t}\n\t\tcursorToMove.setToAboveDetachedSequences();\n\t\twhile (keyStack.length > 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tcursorToMove.enterField(keyStack.pop()!);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tcursorToMove.enterNode(indexStack.pop()!);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tpublic getCursorAboveDetachedFields(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeNode(this.roots);\n\t}\n}\n\n/**\n * Cursor implementation for ObjectForest.\n */\nclass Cursor extends SynchronousCursor implements ITreeSubscriptionCursor {\n\tpublic state: ITreeSubscriptionCursorState;\n\n\t/**\n\t * @param forest - forest this cursor navigates\n\t * @param innerCursor - underlying cursor implementation this wraps. `undefined` when state is not `Current`\n\t */\n\tpublic constructor(\n\t\tpublic readonly forest: ObjectForest,\n\t\tpublic readonly source: string | undefined,\n\t\tprivate innerCursor?: CursorWithNode<MutableMapTree>,\n\t) {\n\t\tsuper();\n\t\tif (innerCursor === undefined) {\n\t\t\tthis.state = ITreeSubscriptionCursorState.Cleared;\n\t\t} else {\n\t\t\tthis.state = ITreeSubscriptionCursorState.Current;\n\t\t\tthis.forest.currentCursors.add(this);\n\t\t}\n\t}\n\n\tpublic buildFieldAnchor(): FieldAnchor {\n\t\tconst path = this.getFieldPath();\n\t\tconst anchor =\n\t\t\tpath.parent === undefined ? undefined : this.forest.anchors.track(path.parent);\n\t\treturn { parent: anchor, fieldKey: path.field };\n\t}\n\tpublic getFieldPath(prefix?: PathRootPrefix): FieldUpPath {\n\t\tassert(this.innerCursor !== undefined, 0x45f /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getFieldPath(prefix);\n\t}\n\tpublic get mode(): CursorLocationType {\n\t\tassert(this.innerCursor !== undefined, 0x42e /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.mode;\n\t}\n\n\tpublic nextField(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x42f /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.nextField();\n\t}\n\tpublic exitField(): void {\n\t\tassert(this.innerCursor !== undefined, 0x430 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.exitField();\n\t}\n\tpublic override skipPendingFields(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x431 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.skipPendingFields();\n\t}\n\tpublic getFieldKey(): FieldKey {\n\t\tassert(this.innerCursor !== undefined, 0x432 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getFieldKey();\n\t}\n\tpublic getFieldLength(): number {\n\t\tassert(this.innerCursor !== undefined, 0x433 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getFieldLength();\n\t}\n\tpublic firstNode(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x434 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.firstNode();\n\t}\n\tpublic enterNode(childIndex: number): void {\n\t\tassert(this.innerCursor !== undefined, 0x435 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.enterNode(childIndex);\n\t}\n\tpublic getPath(prefix?: PathRootPrefix): UpPath {\n\t\tassert(this.innerCursor !== undefined, 0x436 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getPath(prefix) ?? fail(\"no path when at root\");\n\t}\n\tpublic get fieldIndex(): number {\n\t\tassert(this.innerCursor !== undefined, 0x437 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.fieldIndex;\n\t}\n\tpublic get chunkStart(): number {\n\t\tassert(this.innerCursor !== undefined, 0x438 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.chunkStart;\n\t}\n\tpublic get chunkLength(): number {\n\t\tassert(this.innerCursor !== undefined, 0x439 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.chunkLength;\n\t}\n\tpublic seekNodes(offset: number): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x43a /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.seekNodes(offset);\n\t}\n\tpublic nextNode(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x43b /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.nextNode();\n\t}\n\tpublic exitNode(): void {\n\t\tassert(this.innerCursor !== undefined, 0x43c /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.exitNode();\n\t}\n\tpublic firstField(): boolean {\n\t\tassert(this.innerCursor !== undefined, 0x43d /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.firstField();\n\t}\n\tpublic enterField(key: FieldKey): void {\n\t\tassert(this.innerCursor !== undefined, 0x43e /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.enterField(key);\n\t}\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\tassert(this.innerCursor !== undefined, 0x43f /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.type;\n\t}\n\tpublic get value(): Value {\n\t\tassert(this.innerCursor !== undefined, 0x440 /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.value;\n\t}\n\n\t// TODO: tests for clear when not at root.\n\tpublic clear(): void {\n\t\tassert(\n\t\t\tthis.state !== ITreeSubscriptionCursorState.Freed,\n\t\t\t0x33b /* Cursor must not be freed */,\n\t\t);\n\t\tthis.state = ITreeSubscriptionCursorState.Cleared;\n\t\tthis.innerCursor = undefined;\n\t\tthis.forest.currentCursors.delete(this);\n\t}\n\n\t/**\n\t * Move this cursor to the special dummy node above the detached sequences.\n\t * Can be used when cleared (but not freed).\n\t */\n\tpublic setToAboveDetachedSequences(): void {\n\t\tassert(\n\t\t\tthis.state !== ITreeSubscriptionCursorState.Freed,\n\t\t\t0x33c /* Cursor must not be freed */,\n\t\t);\n\t\tthis.clear();\n\t\tthis.state = ITreeSubscriptionCursorState.Current;\n\t\t// Cast to a cursor of _mutable_ trees to allow direct manipulation of the tree data which is more efficient than doing immutable copies.\n\t\tthis.innerCursor = cursorForMapTreeNode(\n\t\t\tthis.forest.roots,\n\t\t) as CursorWithNode<MutableMapTree>;\n\t\tthis.forest.currentCursors.add(this);\n\t}\n\n\tpublic getNode(): MutableMapTree {\n\t\tassert(this.innerCursor !== undefined, 0x33e /* Cursor must be current to be used */);\n\t\treturn this.innerCursor.getNode();\n\t}\n\n\tpublic getParent(): [MutableMapTree, FieldKey] {\n\t\tassert(this.innerCursor !== undefined, 0x441 /* Cursor must be current to be used */);\n\t\t// This could be optimized to skip moving it accessing internals of cursor.\n\t\tconst key = this.innerCursor.getFieldKey();\n\t\tthis.innerCursor.exitField();\n\t\tconst node = this.innerCursor.getNode();\n\t\tthis.innerCursor.enterField(key);\n\t\treturn [node, key];\n\t}\n\n\tpublic fork(source?: string): ITreeSubscriptionCursor {\n\t\tassert(this.innerCursor !== undefined, 0x460 /* Cursor must be current to be used */);\n\t\treturn new Cursor(this.forest, source ?? `fork: ${this.source}`, this.innerCursor.fork());\n\t}\n\n\tpublic free(): void {\n\t\tassert(\n\t\t\tthis.state !== ITreeSubscriptionCursorState.Freed,\n\t\t\t0x33f /* Cursor must not be double freed */,\n\t\t);\n\t\tthis.forest.currentCursors.delete(this);\n\t\tthis.state = ITreeSubscriptionCursorState.Freed;\n\t}\n\n\tpublic buildAnchor(): Anchor {\n\t\tassert(\n\t\t\tthis.state === ITreeSubscriptionCursorState.Current,\n\t\t\t0x37a /* Cursor must be current to be used */,\n\t\t);\n\t\treturn this.forest.anchors.track(this.getPath());\n\t}\n}\n\n// This function is the folder level export for objectForest, and hides all the implementation types.\n// When other forest implementations are created (ex: optimized ones),\n// this function should likely be moved and updated to (at least conditionally) use them.\n/**\n * @returns an implementation of {@link IEditableForest} with no data or schema.\n */\nexport function buildForest(anchors?: AnchorSet): ObjectForest {\n\treturn new ObjectForest(anchors);\n}\n"]}
@@ -6,10 +6,12 @@ import { assert } from "@fluidframework/core-utils/internal";
6
6
  import { areEqualChangeAtomIds, makeChangeAtomId, replaceAtomRevisions, taggedAtomId, } from "../../core/index.js";
7
7
  import { SizedNestedMap, deleteFromNestedMap, setInNestedMap, tryGetFromNestedMap, } from "../../util/index.js";
8
8
  import { nodeIdFromChangeAtom } from "../deltaUtils.js";
9
- import { NodeExistenceState, } from "../modular-schema/index.js";
9
+ import { NodeAttachState, } from "../modular-schema/index.js";
10
10
  import { makeOptionalFieldCodecFamily } from "./optionalFieldCodecs.js";
11
11
  export class RegisterMap {
12
- nestedMapData = new SizedNestedMap();
12
+ constructor() {
13
+ this.nestedMapData = new SizedNestedMap();
14
+ }
13
15
  clone() {
14
16
  const clone = new RegisterMap();
15
17
  for (const [id, t] of this.entries()) {
@@ -262,14 +264,14 @@ export const optionalChangeRebaser = {
262
264
  overChildChangesBySrc.delete(id);
263
265
  }
264
266
  const rebasedId = forwardMap.get(id) ?? id;
265
- const rebasedChildChange = rebaseChild(childChange, overChildChange, rebasedId === "self" ? NodeExistenceState.Alive : NodeExistenceState.Dead);
267
+ const rebasedChildChange = rebaseChild(childChange, overChildChange, rebasedId === "self" ? NodeAttachState.Attached : NodeAttachState.Detached);
266
268
  if (rebasedChildChange !== undefined) {
267
269
  rebasedChildChanges.push([rebasedId, rebasedChildChange]);
268
270
  }
269
271
  }
270
272
  for (const [id, overChildChange] of overChildChangesBySrc.entries()) {
271
273
  const rebasedId = forwardMap.get(id) ?? id;
272
- const rebasedChildChange = rebaseChild(undefined, overChildChange, rebasedId === "self" ? NodeExistenceState.Alive : NodeExistenceState.Dead);
274
+ const rebasedChildChange = rebaseChild(undefined, overChildChange, rebasedId === "self" ? NodeAttachState.Attached : NodeAttachState.Detached);
273
275
  if (rebasedChildChange !== undefined) {
274
276
  rebasedChildChanges.push([rebasedId, rebasedChildChange]);
275
277
  }
@@ -1 +1 @@
1
- {"version":3,"file":"optionalField.js","sourceRoot":"","sources":["../../../src/feature-libraries/optional-field/optionalField.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 } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype ChangeAtomId,\n\ttype ChangeAtomIdMap,\n\ttype ChangesetLocalId,\n\ttype DeltaDetachedNodeChanges,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaFieldChanges,\n\ttype DeltaMark,\n\ttype RevisionTag,\n\tareEqualChangeAtomIds,\n\tmakeChangeAtomId,\n\treplaceAtomRevisions,\n\ttaggedAtomId,\n} from \"../../core/index.js\";\nimport {\n\ttype IdAllocator,\n\ttype Mutable,\n\tSizedNestedMap,\n\tdeleteFromNestedMap,\n\tsetInNestedMap,\n\ttryGetFromNestedMap,\n} from \"../../util/index.js\";\nimport { nodeIdFromChangeAtom } from \"../deltaUtils.js\";\nimport {\n\ttype FieldChangeHandler,\n\ttype FieldChangeRebaser,\n\ttype FieldEditor,\n\ttype NodeChangeComposer,\n\ttype NodeChangePruner,\n\ttype NodeChangeRebaser,\n\tNodeExistenceState,\n\ttype NodeId,\n\ttype RelevantRemovedRootsFromChild,\n\ttype ToDelta,\n} from \"../modular-schema/index.js\";\n\nimport type {\n\tChildChange,\n\tMove,\n\tOptionalChangeset,\n\tRegisterId,\n\tReplace,\n} from \"./optionalFieldChangeTypes.js\";\nimport { makeOptionalFieldCodecFamily } from \"./optionalFieldCodecs.js\";\n\nexport interface IRegisterMap<T> {\n\tset(id: RegisterId, childChange: T): void;\n\tget(id: RegisterId): T | undefined;\n\tdelete(id: RegisterId): boolean;\n\tkeys(): Iterable<RegisterId>;\n\tvalues(): Iterable<T>;\n\tentries(): Iterable<[RegisterId, T]>;\n\treadonly size: number;\n}\n\nexport class RegisterMap<T> implements IRegisterMap<T> {\n\tprivate readonly nestedMapData = new SizedNestedMap<\n\t\tChangesetLocalId | \"self\",\n\t\tRevisionTag | undefined,\n\t\tT\n\t>();\n\n\tpublic clone(): RegisterMap<T> {\n\t\tconst clone = new RegisterMap<T>();\n\t\tfor (const [id, t] of this.entries()) {\n\t\t\tclone.set(id, t);\n\t\t}\n\t\treturn clone;\n\t}\n\n\tpublic set(id: RegisterId, childChange: T): void {\n\t\tif (id === \"self\") {\n\t\t\tthis.nestedMapData.set(\"self\", undefined, childChange);\n\t\t} else {\n\t\t\tthis.nestedMapData.set(id.localId, id.revision, childChange);\n\t\t}\n\t}\n\n\tpublic get(id: RegisterId): T | undefined {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.tryGet(id, undefined)\n\t\t\t: this.nestedMapData.tryGet(id.localId, id.revision);\n\t}\n\n\tpublic has(id: RegisterId): boolean {\n\t\treturn this.get(id) !== undefined;\n\t}\n\n\tpublic delete(id: RegisterId): boolean {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.delete(\"self\", undefined)\n\t\t\t: this.nestedMapData.delete(id.localId, id.revision);\n\t}\n\n\tpublic keys(): Iterable<RegisterId> {\n\t\tconst changeIds: RegisterId[] = [];\n\t\tfor (const [localId, nestedMap] of this.nestedMapData) {\n\t\t\tif (localId === \"self\") {\n\t\t\t\tchangeIds.push(\"self\");\n\t\t\t} else {\n\t\t\t\tfor (const [revisionTag, _] of nestedMap) {\n\t\t\t\t\tchangeIds.push(\n\t\t\t\t\t\trevisionTag === undefined\n\t\t\t\t\t\t\t? { localId }\n\t\t\t\t\t\t\t: { localId, revision: revisionTag },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changeIds;\n\t}\n\tpublic values(): Iterable<T> {\n\t\treturn this.nestedMapData.values();\n\t}\n\tpublic entries(): Iterable<[RegisterId, T]> {\n\t\tconst entries: [RegisterId, T][] = [];\n\t\tfor (const changeId of this.keys()) {\n\t\t\tif (changeId === \"self\") {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(\"self\", undefined);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x770 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([\"self\", entry]);\n\t\t\t} else {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(changeId.localId, changeId.revision);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x771 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([changeId, entry]);\n\t\t\t}\n\t\t}\n\n\t\treturn entries;\n\t}\n\tpublic get size(): number {\n\t\treturn this.nestedMapData.size;\n\t}\n}\n\nexport const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {\n\tcompose: (\n\t\tchange1: OptionalChangeset,\n\t\tchange2: OptionalChangeset,\n\t\tcomposeChild: NodeChangeComposer,\n\t): OptionalChangeset => {\n\t\tconst { srcToDst, dstToSrc } = getBidirectionalMaps(change1.moves);\n\t\tconst change1FieldSrc = change1.valueReplace?.src;\n\t\tconst change1FieldDst = getEffectfulDst(change1.valueReplace);\n\n\t\tconst change2FieldSrc = change2.valueReplace?.src;\n\t\tlet composedFieldSrc: RegisterId | undefined;\n\t\tif (change2FieldSrc !== undefined) {\n\t\t\tif (change2FieldSrc === \"self\") {\n\t\t\t\tcomposedFieldSrc = change1FieldSrc ?? change2FieldSrc;\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst !== undefined &&\n\t\t\t\tareEqualRegisterIds(change1FieldDst, change2FieldSrc)\n\t\t\t) {\n\t\t\t\tcomposedFieldSrc = \"self\";\n\t\t\t} else {\n\t\t\t\tcomposedFieldSrc =\n\t\t\t\t\ttryGetFromNestedMap(\n\t\t\t\t\t\tdstToSrc,\n\t\t\t\t\t\tchange2FieldSrc.revision,\n\t\t\t\t\t\tchange2FieldSrc.localId,\n\t\t\t\t\t) ?? change2FieldSrc;\n\t\t\t}\n\t\t} else if (change1FieldSrc !== undefined && change2.valueReplace === undefined) {\n\t\t\tcomposedFieldSrc = change1FieldSrc;\n\t\t}\n\n\t\tconst childChanges2ByOriginalId = new RegisterMap<NodeId>();\n\t\tfor (const [id, change] of change2.childChanges) {\n\t\t\tif (id === \"self\") {\n\t\t\t\tif (change1FieldSrc !== undefined) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(change1FieldSrc, change);\n\t\t\t\t} else {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (change1FieldDst !== undefined && areEqualChangeAtomIds(change1FieldDst, id)) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t} else {\n\t\t\t\t\tconst originalId = tryGetFromNestedMap(dstToSrc, id.revision, id.localId);\n\t\t\t\t\tchildChanges2ByOriginalId.set(originalId ?? id, change);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst composedMoves: Move[] = [];\n\t\tconst composedChildChanges: ChildChange[] = [];\n\t\tconst composed: Mutable<OptionalChangeset> = {\n\t\t\tmoves: composedMoves,\n\t\t\tchildChanges: composedChildChanges,\n\t\t};\n\n\t\tfor (const [id, childChange1] of change1.childChanges) {\n\t\t\tconst childChange2 = childChanges2ByOriginalId.get(id);\n\t\t\tcomposedChildChanges.push([id, composeChild(childChange1, childChange2)]);\n\t\t\tchildChanges2ByOriginalId.delete(id);\n\t\t}\n\n\t\tfor (const [id, childChange2] of childChanges2ByOriginalId.entries()) {\n\t\t\tcomposedChildChanges.push([id, composeChild(undefined, childChange2)]);\n\t\t}\n\n\t\tfor (const [leg2Src, leg2Dst] of change2.moves) {\n\t\t\tconst leg1Src = tryGetFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\tif (leg1Src !== undefined) {\n\t\t\t\tcomposedMoves.push([leg1Src, leg2Dst]);\n\t\t\t\tdeleteFromNestedMap(srcToDst, leg1Src.revision, leg1Src.localId);\n\t\t\t\tdeleteFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst === undefined ||\n\t\t\t\t!areEqualChangeAtomIds(change1FieldDst, leg2Src)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([leg2Src, leg2Dst]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [revision, innerMap] of srcToDst.entries()) {\n\t\t\tfor (const [localId, dst] of innerMap.entries()) {\n\t\t\t\tconst src = makeChangeAtomId(localId, revision);\n\t\t\t\tif (composedFieldSrc === undefined || !areEqualRegisterIds(src, composedFieldSrc)) {\n\t\t\t\t\tcomposedMoves.push([src, dst]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tchange1FieldSrc !== undefined &&\n\t\t\tchange1FieldSrc !== \"self\" &&\n\t\t\tchange2.valueReplace !== undefined\n\t\t) {\n\t\t\tconst change2FieldDst = change2.valueReplace.dst;\n\t\t\tif (\n\t\t\t\tisReplaceEffectful(change2.valueReplace) &&\n\t\t\t\t!areEqualChangeAtomIds(change1FieldSrc, change2FieldDst)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([change1FieldSrc, change2FieldDst]);\n\t\t\t}\n\t\t}\n\n\t\tconst firstChange = change1.valueReplace ?? change2.valueReplace;\n\t\tif (firstChange === undefined) {\n\t\t\treturn composed;\n\t\t}\n\n\t\tconst replace: Mutable<Replace> = {\n\t\t\tisEmpty: firstChange.isEmpty,\n\t\t\tdst: getComposedReplaceDst(change1.valueReplace, change2),\n\t\t};\n\t\tif (composedFieldSrc !== undefined) {\n\t\t\treplace.src = composedFieldSrc;\n\t\t}\n\t\tcomposed.valueReplace = replace;\n\t\treturn composed;\n\t},\n\n\tinvert: (\n\t\tchange: OptionalChangeset,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator<ChangesetLocalId>,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges } = change;\n\n\t\tconst invertIdMap = new RegisterMap<RegisterId>();\n\t\tconst invertedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tinvertIdMap.set(src, dst);\n\t\t\tinvertedMoves.push([dst, src]);\n\t\t}\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(change.valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tinvertIdMap.set(\"self\", change.valueReplace.dst);\n\t\t\t}\n\t\t\tif (change.valueReplace.src !== undefined) {\n\t\t\t\tinvertIdMap.set(change.valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst inverted: Mutable<OptionalChangeset> = {\n\t\t\tmoves: invertedMoves,\n\t\t\tchildChanges: childChanges.map(([id, childChange]) => {\n\t\t\t\treturn [invertIdMap.get(id) ?? id, childChange];\n\t\t\t}),\n\t\t};\n\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tif (isReplaceEffectful(change.valueReplace)) {\n\t\t\t\tconst replace: Mutable<Replace> =\n\t\t\t\t\tchange.valueReplace.src === undefined\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tisEmpty: true,\n\t\t\t\t\t\t\t\tdst: makeChangeAtomId(genId.allocate()),\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tisEmpty: false,\n\t\t\t\t\t\t\t\tdst: isRollback\n\t\t\t\t\t\t\t\t\t? change.valueReplace.src\n\t\t\t\t\t\t\t\t\t: makeChangeAtomId(genId.allocate()),\n\t\t\t\t\t\t };\n\t\t\t\tif (change.valueReplace.isEmpty === false) {\n\t\t\t\t\treplace.src = change.valueReplace.dst;\n\t\t\t\t}\n\t\t\t\tinverted.valueReplace = replace;\n\t\t\t} else if (!isRollback && change.valueReplace.src === \"self\") {\n\t\t\t\tinverted.valueReplace = {\n\t\t\t\t\tisEmpty: false,\n\t\t\t\t\tsrc: \"self\",\n\t\t\t\t\tdst: makeChangeAtomId(genId.allocate()),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn inverted;\n\t},\n\n\trebase: (\n\t\tchange: OptionalChangeset,\n\t\toverChange: OptionalChangeset,\n\t\trebaseChild: NodeChangeRebaser,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges, valueReplace: field } = change;\n\n\t\t// TODO: avoid computing the dstToSrc map if it's not needed.\n\t\t// TODO: de-dupe overSrcToDst and forwardMap\n\t\tconst { srcToDst: overSrcToDst } = getBidirectionalMaps(overChange.moves);\n\n\t\tconst forwardMap = new RegisterMap<RegisterId>();\n\t\tfor (const [src, dst] of overChange.moves) {\n\t\t\tforwardMap.set(src, dst);\n\t\t}\n\t\tif (overChange.valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(overChange.valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tforwardMap.set(\"self\", overChange.valueReplace.dst);\n\t\t\t}\n\t\t\tif (overChange.valueReplace.src !== undefined) {\n\t\t\t\tforwardMap.set(overChange.valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst rebasedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tconst newDst = tryGetFromNestedMap(overSrcToDst, src.revision, src.localId);\n\t\t\trebasedMoves.push([src, newDst ?? dst]);\n\t\t}\n\n\t\tconst overChildChangesBySrc = new RegisterMap<NodeId>();\n\t\tfor (const [id, childChange] of overChange.childChanges) {\n\t\t\toverChildChangesBySrc.set(id, childChange);\n\t\t}\n\n\t\tconst rebasedChildChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of childChanges) {\n\t\t\tconst overChildChange = overChildChangesBySrc.get(id);\n\t\t\tif (overChildChange !== undefined) {\n\t\t\t\toverChildChangesBySrc.delete(id);\n\t\t\t}\n\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tchildChange,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeExistenceState.Alive : NodeExistenceState.Dead,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, overChildChange] of overChildChangesBySrc.entries()) {\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tundefined,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeExistenceState.Alive : NodeExistenceState.Dead,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tconst rebased: Mutable<OptionalChangeset> = {\n\t\t\tmoves: rebasedMoves,\n\t\t\tchildChanges: rebasedChildChanges,\n\t\t};\n\n\t\tif (field !== undefined) {\n\t\t\tconst replace: Mutable<Replace> = {\n\t\t\t\tisEmpty:\n\t\t\t\t\toverChange.valueReplace === undefined\n\t\t\t\t\t\t? field.isEmpty\n\t\t\t\t\t\t: overChange.valueReplace.src === undefined,\n\t\t\t\tdst: field.dst,\n\t\t\t};\n\t\t\tif (field.src !== undefined) {\n\t\t\t\treplace.src = forwardMap.get(field.src) ?? field.src;\n\t\t\t}\n\t\t\trebased.valueReplace = replace;\n\t\t}\n\n\t\treturn rebased;\n\t},\n\n\tprune: (change: OptionalChangeset, pruneChild: NodeChangePruner): OptionalChangeset => {\n\t\tconst childChanges: ChildChange[] = [];\n\t\tconst prunedChange: Mutable<OptionalChangeset> = {\n\t\t\tmoves: change.moves,\n\t\t\tchildChanges,\n\t\t};\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tprunedChange.valueReplace = change.valueReplace;\n\t\t}\n\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst prunedChildChange = pruneChild(childChange);\n\t\t\tif (prunedChildChange !== undefined) {\n\t\t\t\tchildChanges.push([id, prunedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\treturn prunedChange;\n\t},\n\n\treplaceRevisions: (\n\t\tchange: OptionalChangeset,\n\t\toldRevisions: Set<RevisionTag | undefined>,\n\t\tnewRevision: RevisionTag | undefined,\n\t): OptionalChangeset => {\n\t\tconst valueReplace = replaceReplaceRevisions(\n\t\t\tchange.valueReplace,\n\t\t\toldRevisions,\n\t\t\tnewRevision,\n\t\t);\n\n\t\tconst childChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tchildChanges.push([\n\t\t\t\treplaceRegisterRevisions(id, oldRevisions, newRevision),\n\t\t\t\treplaceAtomRevisions(childChange, oldRevisions, newRevision),\n\t\t\t]);\n\t\t}\n\n\t\tconst moves: Move[] = [];\n\t\tfor (const [src, dst] of change.moves) {\n\t\t\tmoves.push([\n\t\t\t\treplaceAtomRevisions(src, oldRevisions, newRevision),\n\t\t\t\treplaceAtomRevisions(dst, oldRevisions, newRevision),\n\t\t\t]);\n\t\t}\n\n\t\tconst updated: Mutable<OptionalChangeset> = { childChanges, moves };\n\t\tif (valueReplace !== undefined) {\n\t\t\tupdated.valueReplace = valueReplace;\n\t\t}\n\n\t\treturn updated;\n\t},\n};\n\nfunction replaceReplaceRevisions(\n\treplace: Replace | undefined,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): Replace | undefined {\n\tif (replace === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst updated: Mutable<Replace> = {\n\t\t...replace,\n\t\tdst: replaceAtomRevisions(replace.dst, oldRevisions, newRevision),\n\t};\n\n\tif (replace.src !== undefined) {\n\t\tupdated.src = replaceRegisterRevisions(replace.src, oldRevisions, newRevision);\n\t}\n\n\treturn updated;\n}\n\nfunction replaceRegisterRevisions(\n\tregister: RegisterId,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): RegisterId {\n\treturn register === \"self\"\n\t\t? register\n\t\t: replaceAtomRevisions(register, oldRevisions, newRevision);\n}\n\nfunction getComposedReplaceDst(\n\tchange1: Replace | undefined,\n\tchange2: OptionalChangeset,\n): ChangeAtomId {\n\tconst dst1 = change1?.dst;\n\tif (change2.valueReplace === undefined) {\n\t\tassert(dst1 !== undefined, 0x8ce /* Both replace replaces should not be undefined */);\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n\n\tif (\n\t\tdst1 === undefined ||\n\t\tchange1?.src === \"self\" ||\n\t\t(change2.valueReplace.src !== undefined &&\n\t\t\tareEqualRegisterIds(change2.valueReplace.src, dst1))\n\t) {\n\t\tassert(\n\t\t\tchange2.valueReplace !== undefined,\n\t\t\t0x8cf /* Both replace replaces should not be undefined */,\n\t\t);\n\t\treturn change2.valueReplace.dst;\n\t} else {\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n}\n\nfunction getIdAfterMoves(id: ChangeAtomId, moves: readonly Move[]): ChangeAtomId {\n\tfor (const [src, dst] of moves) {\n\t\tif (areEqualChangeAtomIds(id, src)) {\n\t\t\treturn dst;\n\t\t}\n\t}\n\treturn id;\n}\n\nfunction areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {\n\treturn id1 === \"self\" || id2 === \"self\" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);\n}\n\nfunction getBidirectionalMaps(moves: OptionalChangeset[\"moves\"]): {\n\tsrcToDst: ChangeAtomIdMap<ChangeAtomId>;\n\tdstToSrc: ChangeAtomIdMap<ChangeAtomId>;\n} {\n\tconst srcToDst: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tconst dstToSrc: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tfor (const [src, dst] of moves) {\n\t\tsetInNestedMap(srcToDst, src.revision, src.localId, dst);\n\t\tsetInNestedMap(dstToSrc, dst.revision, dst.localId, src);\n\t}\n\treturn { srcToDst, dstToSrc };\n}\n\ntype EffectfulReplace =\n\t| {\n\t\t\tisEmpty: true;\n\t\t\tsrc?: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t }\n\t| {\n\t\t\tisEmpty: boolean;\n\t\t\tsrc: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t };\n\nfunction isReplaceEffectful(replace: Replace): replace is EffectfulReplace {\n\tif (replace.src === \"self\") {\n\t\treturn false;\n\t}\n\treturn !replace.isEmpty || replace.src !== undefined;\n}\n\nfunction getEffectfulDst(replace: Replace | undefined): ChangeAtomId | undefined {\n\treturn replace === undefined || replace.isEmpty || replace.src === \"self\"\n\t\t? undefined\n\t\t: replace.dst;\n}\n\nexport function taggedRegister(id: RegisterId, revision: RevisionTag | undefined): RegisterId {\n\tif (id === \"self\") {\n\t\treturn id;\n\t}\n\n\treturn taggedAtomId(id, revision);\n}\n\nexport interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {\n\t/**\n\t * Creates a change which replaces the field with `newContent`\n\t * @param newContent - the new content for the field\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param changeId - the ID associated with the replacement of the current content.\n\t * @param buildId - the ID associated with the creation of the `newContent`.\n\t */\n\tset(\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangesetLocalId;\n\t\t\tdetach: ChangesetLocalId;\n\t\t},\n\t): OptionalChangeset;\n\n\t/**\n\t * Creates a change which clears the field's contents (if any).\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param changeId - the ID associated with the detach.\n\t */\n\tclear(wasEmpty: boolean, id: ChangesetLocalId): OptionalChangeset;\n}\n\nexport const optionalFieldEditor: OptionalFieldEditor = {\n\tset: (\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangesetLocalId;\n\t\t\t// Should be interpreted as a set of an empty field if undefined.\n\t\t\tdetach: ChangesetLocalId;\n\t\t},\n\t): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tsrc: { localId: ids.fill },\n\t\t\tdst: { localId: ids.detach },\n\t\t},\n\t}),\n\n\tclear: (wasEmpty: boolean, detachId: ChangesetLocalId): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tdst: { localId: detachId },\n\t\t},\n\t}),\n\n\tbuildChildChange: (index: number, childChange: NodeId): OptionalChangeset => {\n\t\tassert(index === 0, 0x404 /* Optional fields only support a single child node */);\n\t\treturn {\n\t\t\tmoves: [],\n\t\t\tchildChanges: [[\"self\", childChange]],\n\t\t};\n\t},\n};\n\nexport function optionalFieldIntoDelta(\n\tchange: OptionalChangeset,\n\tdeltaFromChild: ToDelta,\n): DeltaFieldChanges {\n\tconst delta: Mutable<DeltaFieldChanges> = {};\n\n\tlet markIsANoop = true;\n\tconst mark: Mutable<DeltaMark> = { count: 1 };\n\n\tif (change.valueReplace !== undefined && isReplaceEffectful(change.valueReplace)) {\n\t\tif (!change.valueReplace.isEmpty) {\n\t\t\tmark.detach = nodeIdFromChangeAtom(change.valueReplace.dst);\n\t\t}\n\t\tif (change.valueReplace.src !== undefined) {\n\t\t\tmark.attach = nodeIdFromChangeAtom(change.valueReplace.src);\n\t\t}\n\t\tmarkIsANoop = false;\n\t}\n\n\tif (change.moves.length > 0) {\n\t\tdelta.rename = change.moves.map(([src, dst]) => ({\n\t\t\tcount: 1,\n\t\t\toldId: nodeIdFromChangeAtom(src),\n\t\t\tnewId: nodeIdFromChangeAtom(dst),\n\t\t}));\n\t}\n\n\tif (change.childChanges.length > 0) {\n\t\tconst globals: DeltaDetachedNodeChanges[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst childDelta = deltaFromChild(childChange);\n\t\t\tif (id !== \"self\") {\n\t\t\t\tconst fields = childDelta;\n\t\t\t\tglobals.push({\n\t\t\t\t\tid: { major: id.revision, minor: id.localId },\n\t\t\t\t\tfields,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmark.fields = childDelta;\n\t\t\t\tmarkIsANoop = false;\n\t\t\t}\n\t\t}\n\n\t\tif (globals.length > 0) {\n\t\t\tdelta.global = globals;\n\t\t}\n\t}\n\n\tif (!markIsANoop) {\n\t\tdelta.local = [mark];\n\t}\n\n\treturn delta;\n}\n\nexport const optionalChangeHandler: FieldChangeHandler<OptionalChangeset, OptionalFieldEditor> = {\n\trebaser: optionalChangeRebaser,\n\tcodecsFactory: makeOptionalFieldCodecFamily,\n\teditor: optionalFieldEditor,\n\n\tintoDelta: optionalFieldIntoDelta,\n\trelevantRemovedRoots,\n\n\tisEmpty: (change: OptionalChangeset) =>\n\t\tchange.childChanges.length === 0 &&\n\t\tchange.moves.length === 0 &&\n\t\tchange.valueReplace === undefined,\n\n\tgetNestedChanges,\n\n\tcreateEmpty: () => ({ moves: [], childChanges: [] }),\n};\n\nfunction getNestedChanges(change: OptionalChangeset): [NodeId, number | undefined][] {\n\treturn change.childChanges.map(([register, nodeId]) => [\n\t\tnodeId,\n\t\tregister === \"self\" ? 0 : undefined,\n\t]);\n}\n\nfunction* relevantRemovedRoots(\n\tchange: OptionalChangeset,\n\trelevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,\n): Iterable<DeltaDetachedNodeId> {\n\tconst alreadyYielded = new RegisterMap<boolean>();\n\n\tfor (const [src] of change.moves) {\n\t\tif (!alreadyYielded.has(src)) {\n\t\t\talreadyYielded.set(src, true);\n\t\t\tyield nodeIdFromChangeAtom(src);\n\t\t}\n\t}\n\n\tfor (const [id, childChange] of change.childChanges) {\n\t\t// Child changes make the tree they apply to relevant unless that tree existed in the starting context of\n\t\t// of this change.\n\t\tif (id !== \"self\" && !alreadyYielded.has(id)) {\n\t\t\talreadyYielded.set(id, true);\n\t\t\tyield nodeIdFromChangeAtom(id);\n\t\t}\n\t\tyield* relevantRemovedRootsFromChild(childChange);\n\t}\n\n\tconst selfSrc = change.valueReplace?.src;\n\tif (selfSrc !== undefined && selfSrc !== \"self\" && !alreadyYielded.has(selfSrc)) {\n\t\tyield nodeIdFromChangeAtom(selfSrc);\n\t}\n}\n"]}
1
+ {"version":3,"file":"optionalField.js","sourceRoot":"","sources":["../../../src/feature-libraries/optional-field/optionalField.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 } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype ChangeAtomId,\n\ttype ChangeAtomIdMap,\n\ttype ChangesetLocalId,\n\ttype DeltaDetachedNodeChanges,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaFieldChanges,\n\ttype DeltaMark,\n\ttype RevisionTag,\n\tareEqualChangeAtomIds,\n\tmakeChangeAtomId,\n\treplaceAtomRevisions,\n\ttaggedAtomId,\n} from \"../../core/index.js\";\nimport {\n\ttype IdAllocator,\n\ttype Mutable,\n\tSizedNestedMap,\n\tdeleteFromNestedMap,\n\tsetInNestedMap,\n\ttryGetFromNestedMap,\n} from \"../../util/index.js\";\nimport { nodeIdFromChangeAtom } from \"../deltaUtils.js\";\nimport {\n\ttype FieldChangeHandler,\n\ttype FieldChangeRebaser,\n\ttype FieldEditor,\n\ttype NodeChangeComposer,\n\ttype NodeChangePruner,\n\ttype NodeChangeRebaser,\n\tNodeAttachState,\n\ttype NodeId,\n\ttype RelevantRemovedRootsFromChild,\n\ttype ToDelta,\n} from \"../modular-schema/index.js\";\n\nimport type {\n\tChildChange,\n\tMove,\n\tOptionalChangeset,\n\tRegisterId,\n\tReplace,\n} from \"./optionalFieldChangeTypes.js\";\nimport { makeOptionalFieldCodecFamily } from \"./optionalFieldCodecs.js\";\n\nexport interface IRegisterMap<T> {\n\tset(id: RegisterId, childChange: T): void;\n\tget(id: RegisterId): T | undefined;\n\tdelete(id: RegisterId): boolean;\n\tkeys(): Iterable<RegisterId>;\n\tvalues(): Iterable<T>;\n\tentries(): Iterable<[RegisterId, T]>;\n\treadonly size: number;\n}\n\nexport class RegisterMap<T> implements IRegisterMap<T> {\n\tprivate readonly nestedMapData = new SizedNestedMap<\n\t\tChangesetLocalId | \"self\",\n\t\tRevisionTag | undefined,\n\t\tT\n\t>();\n\n\tpublic clone(): RegisterMap<T> {\n\t\tconst clone = new RegisterMap<T>();\n\t\tfor (const [id, t] of this.entries()) {\n\t\t\tclone.set(id, t);\n\t\t}\n\t\treturn clone;\n\t}\n\n\tpublic set(id: RegisterId, childChange: T): void {\n\t\tif (id === \"self\") {\n\t\t\tthis.nestedMapData.set(\"self\", undefined, childChange);\n\t\t} else {\n\t\t\tthis.nestedMapData.set(id.localId, id.revision, childChange);\n\t\t}\n\t}\n\n\tpublic get(id: RegisterId): T | undefined {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.tryGet(id, undefined)\n\t\t\t: this.nestedMapData.tryGet(id.localId, id.revision);\n\t}\n\n\tpublic has(id: RegisterId): boolean {\n\t\treturn this.get(id) !== undefined;\n\t}\n\n\tpublic delete(id: RegisterId): boolean {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.delete(\"self\", undefined)\n\t\t\t: this.nestedMapData.delete(id.localId, id.revision);\n\t}\n\n\tpublic keys(): Iterable<RegisterId> {\n\t\tconst changeIds: RegisterId[] = [];\n\t\tfor (const [localId, nestedMap] of this.nestedMapData) {\n\t\t\tif (localId === \"self\") {\n\t\t\t\tchangeIds.push(\"self\");\n\t\t\t} else {\n\t\t\t\tfor (const [revisionTag, _] of nestedMap) {\n\t\t\t\t\tchangeIds.push(\n\t\t\t\t\t\trevisionTag === undefined\n\t\t\t\t\t\t\t? { localId }\n\t\t\t\t\t\t\t: { localId, revision: revisionTag },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changeIds;\n\t}\n\tpublic values(): Iterable<T> {\n\t\treturn this.nestedMapData.values();\n\t}\n\tpublic entries(): Iterable<[RegisterId, T]> {\n\t\tconst entries: [RegisterId, T][] = [];\n\t\tfor (const changeId of this.keys()) {\n\t\t\tif (changeId === \"self\") {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(\"self\", undefined);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x770 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([\"self\", entry]);\n\t\t\t} else {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(changeId.localId, changeId.revision);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x771 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([changeId, entry]);\n\t\t\t}\n\t\t}\n\n\t\treturn entries;\n\t}\n\tpublic get size(): number {\n\t\treturn this.nestedMapData.size;\n\t}\n}\n\nexport const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {\n\tcompose: (\n\t\tchange1: OptionalChangeset,\n\t\tchange2: OptionalChangeset,\n\t\tcomposeChild: NodeChangeComposer,\n\t): OptionalChangeset => {\n\t\tconst { srcToDst, dstToSrc } = getBidirectionalMaps(change1.moves);\n\t\tconst change1FieldSrc = change1.valueReplace?.src;\n\t\tconst change1FieldDst = getEffectfulDst(change1.valueReplace);\n\n\t\tconst change2FieldSrc = change2.valueReplace?.src;\n\t\tlet composedFieldSrc: RegisterId | undefined;\n\t\tif (change2FieldSrc !== undefined) {\n\t\t\tif (change2FieldSrc === \"self\") {\n\t\t\t\tcomposedFieldSrc = change1FieldSrc ?? change2FieldSrc;\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst !== undefined &&\n\t\t\t\tareEqualRegisterIds(change1FieldDst, change2FieldSrc)\n\t\t\t) {\n\t\t\t\tcomposedFieldSrc = \"self\";\n\t\t\t} else {\n\t\t\t\tcomposedFieldSrc =\n\t\t\t\t\ttryGetFromNestedMap(\n\t\t\t\t\t\tdstToSrc,\n\t\t\t\t\t\tchange2FieldSrc.revision,\n\t\t\t\t\t\tchange2FieldSrc.localId,\n\t\t\t\t\t) ?? change2FieldSrc;\n\t\t\t}\n\t\t} else if (change1FieldSrc !== undefined && change2.valueReplace === undefined) {\n\t\t\tcomposedFieldSrc = change1FieldSrc;\n\t\t}\n\n\t\tconst childChanges2ByOriginalId = new RegisterMap<NodeId>();\n\t\tfor (const [id, change] of change2.childChanges) {\n\t\t\tif (id === \"self\") {\n\t\t\t\tif (change1FieldSrc !== undefined) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(change1FieldSrc, change);\n\t\t\t\t} else {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (change1FieldDst !== undefined && areEqualChangeAtomIds(change1FieldDst, id)) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t} else {\n\t\t\t\t\tconst originalId = tryGetFromNestedMap(dstToSrc, id.revision, id.localId);\n\t\t\t\t\tchildChanges2ByOriginalId.set(originalId ?? id, change);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst composedMoves: Move[] = [];\n\t\tconst composedChildChanges: ChildChange[] = [];\n\t\tconst composed: Mutable<OptionalChangeset> = {\n\t\t\tmoves: composedMoves,\n\t\t\tchildChanges: composedChildChanges,\n\t\t};\n\n\t\tfor (const [id, childChange1] of change1.childChanges) {\n\t\t\tconst childChange2 = childChanges2ByOriginalId.get(id);\n\t\t\tcomposedChildChanges.push([id, composeChild(childChange1, childChange2)]);\n\t\t\tchildChanges2ByOriginalId.delete(id);\n\t\t}\n\n\t\tfor (const [id, childChange2] of childChanges2ByOriginalId.entries()) {\n\t\t\tcomposedChildChanges.push([id, composeChild(undefined, childChange2)]);\n\t\t}\n\n\t\tfor (const [leg2Src, leg2Dst] of change2.moves) {\n\t\t\tconst leg1Src = tryGetFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\tif (leg1Src !== undefined) {\n\t\t\t\tcomposedMoves.push([leg1Src, leg2Dst]);\n\t\t\t\tdeleteFromNestedMap(srcToDst, leg1Src.revision, leg1Src.localId);\n\t\t\t\tdeleteFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst === undefined ||\n\t\t\t\t!areEqualChangeAtomIds(change1FieldDst, leg2Src)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([leg2Src, leg2Dst]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [revision, innerMap] of srcToDst.entries()) {\n\t\t\tfor (const [localId, dst] of innerMap.entries()) {\n\t\t\t\tconst src = makeChangeAtomId(localId, revision);\n\t\t\t\tif (composedFieldSrc === undefined || !areEqualRegisterIds(src, composedFieldSrc)) {\n\t\t\t\t\tcomposedMoves.push([src, dst]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tchange1FieldSrc !== undefined &&\n\t\t\tchange1FieldSrc !== \"self\" &&\n\t\t\tchange2.valueReplace !== undefined\n\t\t) {\n\t\t\tconst change2FieldDst = change2.valueReplace.dst;\n\t\t\tif (\n\t\t\t\tisReplaceEffectful(change2.valueReplace) &&\n\t\t\t\t!areEqualChangeAtomIds(change1FieldSrc, change2FieldDst)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([change1FieldSrc, change2FieldDst]);\n\t\t\t}\n\t\t}\n\n\t\tconst firstChange = change1.valueReplace ?? change2.valueReplace;\n\t\tif (firstChange === undefined) {\n\t\t\treturn composed;\n\t\t}\n\n\t\tconst replace: Mutable<Replace> = {\n\t\t\tisEmpty: firstChange.isEmpty,\n\t\t\tdst: getComposedReplaceDst(change1.valueReplace, change2),\n\t\t};\n\t\tif (composedFieldSrc !== undefined) {\n\t\t\treplace.src = composedFieldSrc;\n\t\t}\n\t\tcomposed.valueReplace = replace;\n\t\treturn composed;\n\t},\n\n\tinvert: (\n\t\tchange: OptionalChangeset,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator<ChangesetLocalId>,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges } = change;\n\n\t\tconst invertIdMap = new RegisterMap<RegisterId>();\n\t\tconst invertedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tinvertIdMap.set(src, dst);\n\t\t\tinvertedMoves.push([dst, src]);\n\t\t}\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(change.valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tinvertIdMap.set(\"self\", change.valueReplace.dst);\n\t\t\t}\n\t\t\tif (change.valueReplace.src !== undefined) {\n\t\t\t\tinvertIdMap.set(change.valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst inverted: Mutable<OptionalChangeset> = {\n\t\t\tmoves: invertedMoves,\n\t\t\tchildChanges: childChanges.map(([id, childChange]) => {\n\t\t\t\treturn [invertIdMap.get(id) ?? id, childChange];\n\t\t\t}),\n\t\t};\n\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tif (isReplaceEffectful(change.valueReplace)) {\n\t\t\t\tconst replace: Mutable<Replace> =\n\t\t\t\t\tchange.valueReplace.src === undefined\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tisEmpty: true,\n\t\t\t\t\t\t\t\tdst: makeChangeAtomId(genId.allocate()),\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tisEmpty: false,\n\t\t\t\t\t\t\t\tdst: isRollback\n\t\t\t\t\t\t\t\t\t? change.valueReplace.src\n\t\t\t\t\t\t\t\t\t: makeChangeAtomId(genId.allocate()),\n\t\t\t\t\t\t };\n\t\t\t\tif (change.valueReplace.isEmpty === false) {\n\t\t\t\t\treplace.src = change.valueReplace.dst;\n\t\t\t\t}\n\t\t\t\tinverted.valueReplace = replace;\n\t\t\t} else if (!isRollback && change.valueReplace.src === \"self\") {\n\t\t\t\tinverted.valueReplace = {\n\t\t\t\t\tisEmpty: false,\n\t\t\t\t\tsrc: \"self\",\n\t\t\t\t\tdst: makeChangeAtomId(genId.allocate()),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn inverted;\n\t},\n\n\trebase: (\n\t\tchange: OptionalChangeset,\n\t\toverChange: OptionalChangeset,\n\t\trebaseChild: NodeChangeRebaser,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges, valueReplace: field } = change;\n\n\t\t// TODO: avoid computing the dstToSrc map if it's not needed.\n\t\t// TODO: de-dupe overSrcToDst and forwardMap\n\t\tconst { srcToDst: overSrcToDst } = getBidirectionalMaps(overChange.moves);\n\n\t\tconst forwardMap = new RegisterMap<RegisterId>();\n\t\tfor (const [src, dst] of overChange.moves) {\n\t\t\tforwardMap.set(src, dst);\n\t\t}\n\t\tif (overChange.valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(overChange.valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tforwardMap.set(\"self\", overChange.valueReplace.dst);\n\t\t\t}\n\t\t\tif (overChange.valueReplace.src !== undefined) {\n\t\t\t\tforwardMap.set(overChange.valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst rebasedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tconst newDst = tryGetFromNestedMap(overSrcToDst, src.revision, src.localId);\n\t\t\trebasedMoves.push([src, newDst ?? dst]);\n\t\t}\n\n\t\tconst overChildChangesBySrc = new RegisterMap<NodeId>();\n\t\tfor (const [id, childChange] of overChange.childChanges) {\n\t\t\toverChildChangesBySrc.set(id, childChange);\n\t\t}\n\n\t\tconst rebasedChildChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of childChanges) {\n\t\t\tconst overChildChange = overChildChangesBySrc.get(id);\n\t\t\tif (overChildChange !== undefined) {\n\t\t\t\toverChildChangesBySrc.delete(id);\n\t\t\t}\n\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tchildChange,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeAttachState.Attached : NodeAttachState.Detached,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, overChildChange] of overChildChangesBySrc.entries()) {\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tundefined,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeAttachState.Attached : NodeAttachState.Detached,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tconst rebased: Mutable<OptionalChangeset> = {\n\t\t\tmoves: rebasedMoves,\n\t\t\tchildChanges: rebasedChildChanges,\n\t\t};\n\n\t\tif (field !== undefined) {\n\t\t\tconst replace: Mutable<Replace> = {\n\t\t\t\tisEmpty:\n\t\t\t\t\toverChange.valueReplace === undefined\n\t\t\t\t\t\t? field.isEmpty\n\t\t\t\t\t\t: overChange.valueReplace.src === undefined,\n\t\t\t\tdst: field.dst,\n\t\t\t};\n\t\t\tif (field.src !== undefined) {\n\t\t\t\treplace.src = forwardMap.get(field.src) ?? field.src;\n\t\t\t}\n\t\t\trebased.valueReplace = replace;\n\t\t}\n\n\t\treturn rebased;\n\t},\n\n\tprune: (change: OptionalChangeset, pruneChild: NodeChangePruner): OptionalChangeset => {\n\t\tconst childChanges: ChildChange[] = [];\n\t\tconst prunedChange: Mutable<OptionalChangeset> = {\n\t\t\tmoves: change.moves,\n\t\t\tchildChanges,\n\t\t};\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tprunedChange.valueReplace = change.valueReplace;\n\t\t}\n\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst prunedChildChange = pruneChild(childChange);\n\t\t\tif (prunedChildChange !== undefined) {\n\t\t\t\tchildChanges.push([id, prunedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\treturn prunedChange;\n\t},\n\n\treplaceRevisions: (\n\t\tchange: OptionalChangeset,\n\t\toldRevisions: Set<RevisionTag | undefined>,\n\t\tnewRevision: RevisionTag | undefined,\n\t): OptionalChangeset => {\n\t\tconst valueReplace = replaceReplaceRevisions(\n\t\t\tchange.valueReplace,\n\t\t\toldRevisions,\n\t\t\tnewRevision,\n\t\t);\n\n\t\tconst childChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tchildChanges.push([\n\t\t\t\treplaceRegisterRevisions(id, oldRevisions, newRevision),\n\t\t\t\treplaceAtomRevisions(childChange, oldRevisions, newRevision),\n\t\t\t]);\n\t\t}\n\n\t\tconst moves: Move[] = [];\n\t\tfor (const [src, dst] of change.moves) {\n\t\t\tmoves.push([\n\t\t\t\treplaceAtomRevisions(src, oldRevisions, newRevision),\n\t\t\t\treplaceAtomRevisions(dst, oldRevisions, newRevision),\n\t\t\t]);\n\t\t}\n\n\t\tconst updated: Mutable<OptionalChangeset> = { childChanges, moves };\n\t\tif (valueReplace !== undefined) {\n\t\t\tupdated.valueReplace = valueReplace;\n\t\t}\n\n\t\treturn updated;\n\t},\n};\n\nfunction replaceReplaceRevisions(\n\treplace: Replace | undefined,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): Replace | undefined {\n\tif (replace === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst updated: Mutable<Replace> = {\n\t\t...replace,\n\t\tdst: replaceAtomRevisions(replace.dst, oldRevisions, newRevision),\n\t};\n\n\tif (replace.src !== undefined) {\n\t\tupdated.src = replaceRegisterRevisions(replace.src, oldRevisions, newRevision);\n\t}\n\n\treturn updated;\n}\n\nfunction replaceRegisterRevisions(\n\tregister: RegisterId,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): RegisterId {\n\treturn register === \"self\"\n\t\t? register\n\t\t: replaceAtomRevisions(register, oldRevisions, newRevision);\n}\n\nfunction getComposedReplaceDst(\n\tchange1: Replace | undefined,\n\tchange2: OptionalChangeset,\n): ChangeAtomId {\n\tconst dst1 = change1?.dst;\n\tif (change2.valueReplace === undefined) {\n\t\tassert(dst1 !== undefined, 0x8ce /* Both replace replaces should not be undefined */);\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n\n\tif (\n\t\tdst1 === undefined ||\n\t\tchange1?.src === \"self\" ||\n\t\t(change2.valueReplace.src !== undefined &&\n\t\t\tareEqualRegisterIds(change2.valueReplace.src, dst1))\n\t) {\n\t\tassert(\n\t\t\tchange2.valueReplace !== undefined,\n\t\t\t0x8cf /* Both replace replaces should not be undefined */,\n\t\t);\n\t\treturn change2.valueReplace.dst;\n\t} else {\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n}\n\nfunction getIdAfterMoves(id: ChangeAtomId, moves: readonly Move[]): ChangeAtomId {\n\tfor (const [src, dst] of moves) {\n\t\tif (areEqualChangeAtomIds(id, src)) {\n\t\t\treturn dst;\n\t\t}\n\t}\n\treturn id;\n}\n\nfunction areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {\n\treturn id1 === \"self\" || id2 === \"self\" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);\n}\n\nfunction getBidirectionalMaps(moves: OptionalChangeset[\"moves\"]): {\n\tsrcToDst: ChangeAtomIdMap<ChangeAtomId>;\n\tdstToSrc: ChangeAtomIdMap<ChangeAtomId>;\n} {\n\tconst srcToDst: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tconst dstToSrc: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tfor (const [src, dst] of moves) {\n\t\tsetInNestedMap(srcToDst, src.revision, src.localId, dst);\n\t\tsetInNestedMap(dstToSrc, dst.revision, dst.localId, src);\n\t}\n\treturn { srcToDst, dstToSrc };\n}\n\ntype EffectfulReplace =\n\t| {\n\t\t\tisEmpty: true;\n\t\t\tsrc?: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t }\n\t| {\n\t\t\tisEmpty: boolean;\n\t\t\tsrc: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t };\n\nfunction isReplaceEffectful(replace: Replace): replace is EffectfulReplace {\n\tif (replace.src === \"self\") {\n\t\treturn false;\n\t}\n\treturn !replace.isEmpty || replace.src !== undefined;\n}\n\nfunction getEffectfulDst(replace: Replace | undefined): ChangeAtomId | undefined {\n\treturn replace === undefined || replace.isEmpty || replace.src === \"self\"\n\t\t? undefined\n\t\t: replace.dst;\n}\n\nexport function taggedRegister(id: RegisterId, revision: RevisionTag | undefined): RegisterId {\n\tif (id === \"self\") {\n\t\treturn id;\n\t}\n\n\treturn taggedAtomId(id, revision);\n}\n\nexport interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {\n\t/**\n\t * Creates a change which replaces the field with `newContent`\n\t * @param newContent - the new content for the field\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param changeId - the ID associated with the replacement of the current content.\n\t * @param buildId - the ID associated with the creation of the `newContent`.\n\t */\n\tset(\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangesetLocalId;\n\t\t\tdetach: ChangesetLocalId;\n\t\t},\n\t): OptionalChangeset;\n\n\t/**\n\t * Creates a change which clears the field's contents (if any).\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param changeId - the ID associated with the detach.\n\t */\n\tclear(wasEmpty: boolean, id: ChangesetLocalId): OptionalChangeset;\n}\n\nexport const optionalFieldEditor: OptionalFieldEditor = {\n\tset: (\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangesetLocalId;\n\t\t\t// Should be interpreted as a set of an empty field if undefined.\n\t\t\tdetach: ChangesetLocalId;\n\t\t},\n\t): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tsrc: { localId: ids.fill },\n\t\t\tdst: { localId: ids.detach },\n\t\t},\n\t}),\n\n\tclear: (wasEmpty: boolean, detachId: ChangesetLocalId): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tdst: { localId: detachId },\n\t\t},\n\t}),\n\n\tbuildChildChange: (index: number, childChange: NodeId): OptionalChangeset => {\n\t\tassert(index === 0, 0x404 /* Optional fields only support a single child node */);\n\t\treturn {\n\t\t\tmoves: [],\n\t\t\tchildChanges: [[\"self\", childChange]],\n\t\t};\n\t},\n};\n\nexport function optionalFieldIntoDelta(\n\tchange: OptionalChangeset,\n\tdeltaFromChild: ToDelta,\n): DeltaFieldChanges {\n\tconst delta: Mutable<DeltaFieldChanges> = {};\n\n\tlet markIsANoop = true;\n\tconst mark: Mutable<DeltaMark> = { count: 1 };\n\n\tif (change.valueReplace !== undefined && isReplaceEffectful(change.valueReplace)) {\n\t\tif (!change.valueReplace.isEmpty) {\n\t\t\tmark.detach = nodeIdFromChangeAtom(change.valueReplace.dst);\n\t\t}\n\t\tif (change.valueReplace.src !== undefined) {\n\t\t\tmark.attach = nodeIdFromChangeAtom(change.valueReplace.src);\n\t\t}\n\t\tmarkIsANoop = false;\n\t}\n\n\tif (change.moves.length > 0) {\n\t\tdelta.rename = change.moves.map(([src, dst]) => ({\n\t\t\tcount: 1,\n\t\t\toldId: nodeIdFromChangeAtom(src),\n\t\t\tnewId: nodeIdFromChangeAtom(dst),\n\t\t}));\n\t}\n\n\tif (change.childChanges.length > 0) {\n\t\tconst globals: DeltaDetachedNodeChanges[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst childDelta = deltaFromChild(childChange);\n\t\t\tif (id !== \"self\") {\n\t\t\t\tconst fields = childDelta;\n\t\t\t\tglobals.push({\n\t\t\t\t\tid: { major: id.revision, minor: id.localId },\n\t\t\t\t\tfields,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmark.fields = childDelta;\n\t\t\t\tmarkIsANoop = false;\n\t\t\t}\n\t\t}\n\n\t\tif (globals.length > 0) {\n\t\t\tdelta.global = globals;\n\t\t}\n\t}\n\n\tif (!markIsANoop) {\n\t\tdelta.local = [mark];\n\t}\n\n\treturn delta;\n}\n\nexport const optionalChangeHandler: FieldChangeHandler<OptionalChangeset, OptionalFieldEditor> = {\n\trebaser: optionalChangeRebaser,\n\tcodecsFactory: makeOptionalFieldCodecFamily,\n\teditor: optionalFieldEditor,\n\n\tintoDelta: optionalFieldIntoDelta,\n\trelevantRemovedRoots,\n\n\tisEmpty: (change: OptionalChangeset) =>\n\t\tchange.childChanges.length === 0 &&\n\t\tchange.moves.length === 0 &&\n\t\tchange.valueReplace === undefined,\n\n\tgetNestedChanges,\n\n\tcreateEmpty: () => ({ moves: [], childChanges: [] }),\n};\n\nfunction getNestedChanges(change: OptionalChangeset): [NodeId, number | undefined][] {\n\treturn change.childChanges.map(([register, nodeId]) => [\n\t\tnodeId,\n\t\tregister === \"self\" ? 0 : undefined,\n\t]);\n}\n\nfunction* relevantRemovedRoots(\n\tchange: OptionalChangeset,\n\trelevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,\n): Iterable<DeltaDetachedNodeId> {\n\tconst alreadyYielded = new RegisterMap<boolean>();\n\n\tfor (const [src] of change.moves) {\n\t\tif (!alreadyYielded.has(src)) {\n\t\t\talreadyYielded.set(src, true);\n\t\t\tyield nodeIdFromChangeAtom(src);\n\t\t}\n\t}\n\n\tfor (const [id, childChange] of change.childChanges) {\n\t\t// Child changes make the tree they apply to relevant unless that tree existed in the starting context of\n\t\t// of this change.\n\t\tif (id !== \"self\" && !alreadyYielded.has(id)) {\n\t\t\talreadyYielded.set(id, true);\n\t\t\tyield nodeIdFromChangeAtom(id);\n\t\t}\n\t\tyield* relevantRemovedRootsFromChild(childChange);\n\t}\n\n\tconst selfSrc = change.valueReplace?.src;\n\tif (selfSrc !== undefined && selfSrc !== \"self\" && !alreadyYielded.has(selfSrc)) {\n\t\tyield nodeIdFromChangeAtom(selfSrc);\n\t}\n}\n"]}
@@ -13,14 +13,10 @@ const schemaStringKey = "SchemaString";
13
13
  * Provides methods for summarizing and loading a schema repository.
14
14
  */
15
15
  export class SchemaSummarizer {
16
- runtime;
17
- schema;
18
- key = "Schema";
19
- codec;
20
- schemaIndexLastChangedSeq;
21
16
  constructor(runtime, schema, options, collabWindow) {
22
17
  this.runtime = runtime;
23
18
  this.schema = schema;
19
+ this.key = "Schema";
24
20
  this.codec = makeSchemaCodec(options);
25
21
  this.schema.on("afterSchemaChange", () => {
26
22
  // Invalidate the cache, as we need to regenerate the blob if the schema changes
@@ -1 +1 @@
1
- {"version":3,"file":"schemaSummarizer.js","sourceRoot":"","sources":["../../../src/feature-libraries/schema-index/schemaSummarizer.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 { bufferToString } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { SummaryType } from \"@fluidframework/driver-definitions\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tIGarbageCollectionData,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\n\nimport type { ICodecOptions, IJsonCodec } from \"../../codec/index.js\";\nimport {\n\ttype MutableTreeStoredSchema,\n\ttype TreeStoredSchema,\n\tschemaDataIsEmpty,\n} from \"../../core/index.js\";\nimport type {\n\tSummarizable,\n\tSummaryElementParser,\n\tSummaryElementStringifier,\n} from \"../../shared-tree-core/index.js\";\nimport type { JsonCompatible } from \"../../util/index.js\";\nimport type { CollabWindow } from \"../incrementalSummarizationUtils.js\";\n\nimport { encodeRepo, makeSchemaCodec } from \"./codec.js\";\nimport type { Format } from \"./format.js\";\n\nconst schemaStringKey = \"SchemaString\";\n/**\n * Provides methods for summarizing and loading a schema repository.\n */\nexport class SchemaSummarizer implements Summarizable {\n\tpublic readonly key = \"Schema\";\n\n\tprivate readonly codec: IJsonCodec<TreeStoredSchema, Format>;\n\n\tprivate schemaIndexLastChangedSeq: number | undefined;\n\n\tpublic constructor(\n\t\tprivate readonly runtime: IFluidDataStoreRuntime,\n\t\tprivate readonly schema: MutableTreeStoredSchema,\n\t\toptions: ICodecOptions,\n\t\tcollabWindow: CollabWindow,\n\t) {\n\t\tthis.codec = makeSchemaCodec(options);\n\t\tthis.schema.on(\"afterSchemaChange\", () => {\n\t\t\t// Invalidate the cache, as we need to regenerate the blob if the schema changes\n\t\t\t// We are assuming that schema changes from remote ops are valid, as we are in a summarization context.\n\t\t\tthis.schemaIndexLastChangedSeq = collabWindow.getCurrentSeq();\n\t\t});\n\t}\n\n\tpublic getAttachSummary(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext | undefined,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (\n\t\t\tincrementalSummaryContext !== undefined &&\n\t\t\tthis.schemaIndexLastChangedSeq !== undefined &&\n\t\t\tincrementalSummaryContext.latestSummarySequenceNumber >= this.schemaIndexLastChangedSeq\n\t\t) {\n\t\t\tbuilder.addHandle(\n\t\t\t\tschemaStringKey,\n\t\t\t\tSummaryType.Blob,\n\t\t\t\t`${incrementalSummaryContext.summaryPath}/indexes/${this.key}/${schemaStringKey}`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst dataString = JSON.stringify(this.codec.encode(this.schema));\n\t\t\tbuilder.addBlob(schemaStringKey, dataString);\n\t\t}\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tpublic async summarize(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext | undefined,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic getGCData(fullGC?: boolean): IGarbageCollectionData {\n\t\t// TODO: Properly implement garbage collection. Right now, garbage collection is performed automatically\n\t\t// by the code in SharedObject (from which SharedTreeCore extends). The `runtime.uploadBlob` API delegates\n\t\t// to the `BlobManager`, which automatically populates the summary with ISummaryAttachment entries for each\n\t\t// blob.\n\t\treturn {\n\t\t\tgcNodes: {},\n\t\t};\n\t}\n\n\tpublic async load(\n\t\tservices: IChannelStorageService,\n\t\tparse: SummaryElementParser,\n\t): Promise<void> {\n\t\tconst schemaBuffer: ArrayBufferLike = await services.readBlob(schemaStringKey);\n\t\t// After the awaits, validate that the schema is in a clean state.\n\t\t// This detects any schema that could have been accidentally added through\n\t\t// invalid means and are about to be overwritten.\n\t\tassert(\n\t\t\tschemaDataIsEmpty(this.schema),\n\t\t\t0x3da /* there should not already be stored schema when loading stored schema */,\n\t\t);\n\n\t\tconst schemaString = bufferToString(schemaBuffer, \"utf-8\");\n\t\t// Currently no Fluid handles are used, so just use JSON.parse.\n\t\tconst decoded = this.codec.decode(JSON.parse(schemaString));\n\t\tthis.schema.apply(decoded);\n\t\tthis.schemaIndexLastChangedSeq = 0;\n\t}\n}\n\n/**\n * Dumps schema into a deterministic JSON compatible semi-human readable but unspecified format.\n *\n * @remarks\n * This can be used to help inspect schema for debugging, and to save a snapshot of schema to help detect and review changes to an applications schema.\n *\n * This format may change across major versions of this package: such changes are considered breaking.\n * Beyond that, no compatibility guarantee is provided for this format: it should never be relied upon to load data, it should only be used for comparing outputs from this function.\n * @privateRemarks\n * This currently uses the schema summary format, but that could be changed to something more human readable (particularly if the encoded format becomes less human readable).\n * This intentionally does not leak the format types in the API.\n * @internal\n */\nexport function encodeTreeSchema(schema: TreeStoredSchema): JsonCompatible {\n\treturn encodeRepo(schema);\n}\n"]}
1
+ {"version":3,"file":"schemaSummarizer.js","sourceRoot":"","sources":["../../../src/feature-libraries/schema-index/schemaSummarizer.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 { bufferToString } from \"@fluid-internal/client-utils\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { SummaryType } from \"@fluidframework/driver-definitions\";\nimport type {\n\tIExperimentalIncrementalSummaryContext,\n\tIGarbageCollectionData,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\n\nimport type { ICodecOptions, IJsonCodec } from \"../../codec/index.js\";\nimport {\n\ttype MutableTreeStoredSchema,\n\ttype TreeStoredSchema,\n\tschemaDataIsEmpty,\n} from \"../../core/index.js\";\nimport type {\n\tSummarizable,\n\tSummaryElementParser,\n\tSummaryElementStringifier,\n} from \"../../shared-tree-core/index.js\";\nimport type { JsonCompatible } from \"../../util/index.js\";\nimport type { CollabWindow } from \"../incrementalSummarizationUtils.js\";\n\nimport { encodeRepo, makeSchemaCodec } from \"./codec.js\";\nimport type { Format } from \"./format.js\";\n\nconst schemaStringKey = \"SchemaString\";\n/**\n * Provides methods for summarizing and loading a schema repository.\n */\nexport class SchemaSummarizer implements Summarizable {\n\tpublic readonly key = \"Schema\";\n\n\tprivate readonly codec: IJsonCodec<TreeStoredSchema, Format>;\n\n\tprivate schemaIndexLastChangedSeq: number | undefined;\n\n\tpublic constructor(\n\t\tprivate readonly runtime: IFluidDataStoreRuntime,\n\t\tprivate readonly schema: MutableTreeStoredSchema,\n\t\toptions: ICodecOptions,\n\t\tcollabWindow: CollabWindow,\n\t) {\n\t\tthis.codec = makeSchemaCodec(options);\n\t\tthis.schema.on(\"afterSchemaChange\", () => {\n\t\t\t// Invalidate the cache, as we need to regenerate the blob if the schema changes\n\t\t\t// We are assuming that schema changes from remote ops are valid, as we are in a summarization context.\n\t\t\tthis.schemaIndexLastChangedSeq = collabWindow.getCurrentSeq();\n\t\t});\n\t}\n\n\tpublic getAttachSummary(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext | undefined,\n\t): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tif (\n\t\t\tincrementalSummaryContext !== undefined &&\n\t\t\tthis.schemaIndexLastChangedSeq !== undefined &&\n\t\t\tincrementalSummaryContext.latestSummarySequenceNumber >= this.schemaIndexLastChangedSeq\n\t\t) {\n\t\t\tbuilder.addHandle(\n\t\t\t\tschemaStringKey,\n\t\t\t\tSummaryType.Blob,\n\t\t\t\t`${incrementalSummaryContext.summaryPath}/indexes/${this.key}/${schemaStringKey}`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst dataString = JSON.stringify(this.codec.encode(this.schema));\n\t\t\tbuilder.addBlob(schemaStringKey, dataString);\n\t\t}\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tpublic async summarize(\n\t\tstringify: SummaryElementStringifier,\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext | undefined,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic getGCData(fullGC?: boolean): IGarbageCollectionData {\n\t\t// TODO: Properly implement garbage collection. Right now, garbage collection is performed automatically\n\t\t// by the code in SharedObject (from which SharedTreeCore extends). The `runtime.uploadBlob` API delegates\n\t\t// to the `BlobManager`, which automatically populates the summary with ISummaryAttachment entries for each\n\t\t// blob.\n\t\treturn {\n\t\t\tgcNodes: {},\n\t\t};\n\t}\n\n\tpublic async load(\n\t\tservices: IChannelStorageService,\n\t\tparse: SummaryElementParser,\n\t): Promise<void> {\n\t\tconst schemaBuffer: ArrayBufferLike = await services.readBlob(schemaStringKey);\n\t\t// After the awaits, validate that the schema is in a clean state.\n\t\t// This detects any schema that could have been accidentally added through\n\t\t// invalid means and are about to be overwritten.\n\t\tassert(\n\t\t\tschemaDataIsEmpty(this.schema),\n\t\t\t0x3da /* there should not already be stored schema when loading stored schema */,\n\t\t);\n\n\t\tconst schemaString = bufferToString(schemaBuffer, \"utf-8\");\n\t\t// Currently no Fluid handles are used, so just use JSON.parse.\n\t\tconst decoded = this.codec.decode(JSON.parse(schemaString));\n\t\tthis.schema.apply(decoded);\n\t\tthis.schemaIndexLastChangedSeq = 0;\n\t}\n}\n\n/**\n * Dumps schema into a deterministic JSON compatible semi-human readable but unspecified format.\n *\n * @remarks\n * This can be used to help inspect schema for debugging, and to save a snapshot of schema to help detect and review changes to an applications schema.\n *\n * This format may change across major versions of this package: such changes are considered breaking.\n * Beyond that, no compatibility guarantee is provided for this format: it should never be relied upon to load data, it should only be used for comparing outputs from this function.\n * @privateRemarks\n * This currently uses the schema summary format, but that could be changed to something more human readable (particularly if the encoded format becomes less human readable).\n * This intentionally does not leak the format types in the API.\n * @internal\n */\nexport function encodeTreeSchema(schema: TreeStoredSchema): JsonCompatible {\n\treturn encodeRepo(schema);\n}\n"]}
@@ -16,25 +16,14 @@ import { Any, FlexFieldNodeSchema, FlexFieldSchema, FlexMapNodeSchema, FlexObjec
16
16
  * All use of such implicit defaults is done by subclasses, which thus get versioning implications.
17
17
  */
18
18
  export class SchemaBuilderBase {
19
- defaultKind;
20
- lintConfiguration;
21
- libraries;
22
- finalized = false;
23
- treeNodeSchema = new Map();
24
- adapters = {};
25
- /**
26
- * Prefix appended to the identifiers of all {@link FlexTreeNodeSchema} produced by this builder.
27
- */
28
- scope;
29
- /**
30
- * Used in error messages to identify content produced by this builder.
31
- */
32
- name;
33
19
  /**
34
20
  * @param defaultKind - The default field kind to use when inferring a {@link FlexFieldSchema} from {@link FlexImplicitAllowedTypes}.
35
21
  */
36
22
  constructor(defaultKind, options) {
37
23
  this.defaultKind = defaultKind;
24
+ this.finalized = false;
25
+ this.treeNodeSchema = new Map();
26
+ this.adapters = {};
38
27
  this.name = options.name ?? options.scope;
39
28
  this.lintConfiguration = { ...schemaLintDefault, ...options.lint };
40
29
  this.libraries = new Set();