@fluidframework/tree 2.1.0-276985 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +7 -0
- package/.vscode/Tree.code-workspace +9 -2
- package/CHANGELOG.md +38 -0
- package/README.md +55 -12
- package/api-report/tree.alpha.api.md +2 -1
- package/api-report/tree.beta.api.md +2 -1
- package/api-report/tree.public.api.md +2 -1
- package/beta.d.ts +1 -1
- package/dist/beta.d.ts +1 -1
- package/dist/core/forest/editableForest.d.ts +6 -3
- package/dist/core/forest/editableForest.d.ts.map +1 -1
- package/dist/core/forest/editableForest.js +16 -4
- package/dist/core/forest/editableForest.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/index.d.ts +1 -1
- package/dist/core/rebase/index.d.ts.map +1 -1
- package/dist/core/rebase/index.js +3 -1
- package/dist/core/rebase/index.js.map +1 -1
- package/dist/core/rebase/types.d.ts +2 -0
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js +9 -1
- package/dist/core/rebase/types.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts +1 -0
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +13 -0
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts +48 -11
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +144 -20
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.js +13 -4
- package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.d.ts +39 -4
- package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/dist/core/tree/index.d.ts +2 -1
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/visitDelta.d.ts +3 -1
- package/dist/core/tree/visitDelta.d.ts.map +1 -1
- package/dist/core/tree/visitDelta.js +31 -15
- package/dist/core/tree/visitDelta.js.map +1 -1
- package/dist/core/tree/visitorUtils.d.ts +3 -3
- package/dist/core/tree/visitorUtils.d.ts.map +1 -1
- package/dist/core/tree/visitorUtils.js +4 -4
- package/dist/core/tree/visitorUtils.js.map +1 -1
- package/dist/events/events.d.ts +4 -1
- package/dist/events/events.d.ts.map +1 -1
- package/dist/events/events.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/editableTreeBinder.js +1 -1
- package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -10
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +0 -72
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -51
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/flex-tree/index.d.ts +3 -2
- package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/index.js +5 -1
- package/dist/feature-libraries/flex-tree/index.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts +1 -6
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +11 -32
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts +1 -5
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +0 -30
- package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +3 -3
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +6 -3
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +11 -0
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/dist/feature-libraries/modular-schema/discrepancies.d.ts +96 -0
- package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -0
- package/dist/feature-libraries/modular-schema/discrepancies.js +264 -0
- package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -0
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -2
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js +3 -0
- package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +2 -1
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +3 -1
- package/dist/feature-libraries/modular-schema/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +42 -26
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +51 -2
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +827 -245
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormat.js +2 -0
- package/dist/feature-libraries/modular-schema/modularChangeFormat.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +44 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/dist/feature-libraries/node-key/index.d.ts +0 -1
- package/dist/feature-libraries/node-key/index.d.ts.map +1 -1
- package/dist/feature-libraries/node-key/index.js +1 -3
- package/dist/feature-libraries/node-key/index.js.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.d.ts +3 -2
- package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +5 -4
- package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.js +1 -0
- package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/dist/feature-libraries/sequence-field/index.d.ts +1 -1
- package/dist/feature-libraries/sequence-field/index.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/index.js +1 -2
- package/dist/feature-libraries/sequence-field/index.js.map +1 -1
- package/dist/feature-libraries/sequence-field/invert.js +1 -1
- package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
- package/dist/feature-libraries/sequence-field/rebase.js +6 -1
- package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +1 -0
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.d.ts +2 -17
- package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +31 -39
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts +1 -0
- package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +1 -1
- package/dist/feature-libraries/typed-schema/typedTreeSchema.js +2 -0
- package/dist/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +4 -2
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +240 -184
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +5 -1
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +157 -90
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/treeApi.js +1 -1
- package/dist/shared-tree/treeApi.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +10 -1
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +47 -3
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree/treeView.d.ts.map +1 -1
- package/dist/shared-tree/treeView.js +7 -3
- package/dist/shared-tree/treeView.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +6 -0
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +3 -0
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +8 -6
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +271 -209
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/simple-tree/arrayNode.d.ts +4 -0
- package/dist/simple-tree/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/arrayNode.js +36 -19
- package/dist/simple-tree/arrayNode.js.map +1 -1
- package/dist/simple-tree/index.d.ts +3 -3
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +2 -1
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/leafNodeSchema.d.ts +22 -1
- package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/leafNodeSchema.js +2 -1
- package/dist/simple-tree/leafNodeSchema.js.map +1 -1
- package/dist/simple-tree/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/mapNode.js.map +1 -1
- package/dist/simple-tree/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/objectNode.js +2 -1
- package/dist/simple-tree/objectNode.js.map +1 -1
- package/dist/simple-tree/proxies.d.ts.map +1 -1
- package/dist/simple-tree/proxies.js +9 -25
- package/dist/simple-tree/proxies.js.map +1 -1
- package/dist/simple-tree/proxyBinding.d.ts +4 -0
- package/dist/simple-tree/proxyBinding.d.ts.map +1 -1
- package/dist/simple-tree/proxyBinding.js +23 -1
- package/dist/simple-tree/proxyBinding.js.map +1 -1
- package/dist/simple-tree/schemaFactory.d.ts +16 -1
- package/dist/simple-tree/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/schemaFactory.js +32 -4
- package/dist/simple-tree/schemaFactory.js.map +1 -1
- package/dist/simple-tree/schemaTypes.d.ts +36 -1
- package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
- package/dist/simple-tree/schemaTypes.js.map +1 -1
- package/dist/simple-tree/toFlexSchema.d.ts +2 -2
- package/dist/simple-tree/toFlexSchema.d.ts.map +1 -1
- package/dist/simple-tree/toFlexSchema.js +3 -2
- package/dist/simple-tree/toFlexSchema.js.map +1 -1
- package/dist/simple-tree/tree.d.ts +4 -1
- package/dist/simple-tree/tree.d.ts.map +1 -1
- package/dist/simple-tree/tree.js +48 -1
- package/dist/simple-tree/tree.js.map +1 -1
- package/dist/simple-tree/treeNodeApi.d.ts +2 -75
- package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/treeNodeApi.js +17 -25
- package/dist/simple-tree/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/treeNodeKernel.d.ts +26 -0
- package/dist/simple-tree/treeNodeKernel.d.ts.map +1 -0
- package/dist/simple-tree/treeNodeKernel.js +83 -0
- package/dist/simple-tree/treeNodeKernel.js.map +1 -0
- package/dist/simple-tree/types.d.ts +95 -3
- package/dist/simple-tree/types.d.ts.map +1 -1
- package/dist/simple-tree/types.js +120 -21
- package/dist/simple-tree/types.js.map +1 -1
- package/dist/util/breakable.d.ts +83 -0
- package/dist/util/breakable.d.ts.map +1 -0
- package/dist/util/breakable.js +178 -0
- package/dist/util/breakable.js.map +1 -0
- package/dist/util/index.d.ts +3 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +9 -2
- package/dist/util/index.js.map +1 -1
- package/dist/util/nestedMap.d.ts +17 -3
- package/dist/util/nestedMap.d.ts.map +1 -1
- package/dist/util/nestedMap.js +21 -1
- package/dist/util/nestedMap.js.map +1 -1
- package/dist/util/utils.d.ts +7 -0
- package/dist/util/utils.d.ts.map +1 -1
- package/dist/util/utils.js +15 -1
- package/dist/util/utils.js.map +1 -1
- package/internal.d.ts +1 -1
- package/lib/beta.d.ts +1 -1
- package/lib/core/forest/editableForest.d.ts +6 -3
- package/lib/core/forest/editableForest.d.ts.map +1 -1
- package/lib/core/forest/editableForest.js +17 -5
- package/lib/core/forest/editableForest.js.map +1 -1
- package/lib/core/index.d.ts +1 -1
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/index.js.map +1 -1
- package/lib/core/rebase/index.d.ts +1 -1
- package/lib/core/rebase/index.d.ts.map +1 -1
- package/lib/core/rebase/index.js +1 -1
- package/lib/core/rebase/index.js.map +1 -1
- package/lib/core/rebase/types.d.ts +2 -0
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js +7 -1
- package/lib/core/rebase/types.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts +1 -0
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +13 -0
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts +48 -11
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +145 -21
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.js +13 -4
- package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.d.ts +39 -4
- package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/lib/core/tree/index.d.ts +2 -1
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/visitDelta.d.ts +3 -1
- package/lib/core/tree/visitDelta.d.ts.map +1 -1
- package/lib/core/tree/visitDelta.js +31 -15
- package/lib/core/tree/visitDelta.js.map +1 -1
- package/lib/core/tree/visitorUtils.d.ts +3 -3
- package/lib/core/tree/visitorUtils.d.ts.map +1 -1
- package/lib/core/tree/visitorUtils.js +4 -4
- package/lib/core/tree/visitorUtils.js.map +1 -1
- package/lib/events/events.d.ts +4 -1
- package/lib/events/events.d.ts.map +1 -1
- package/lib/events/events.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/editableTreeBinder.js +1 -1
- package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -10
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +2 -74
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -51
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/flex-tree/index.d.ts +3 -2
- package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/index.js +2 -1
- package/lib/feature-libraries/flex-tree/index.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts +1 -6
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +13 -34
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts +1 -5
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +3 -33
- package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +3 -3
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +3 -3
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +11 -0
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/lib/feature-libraries/modular-schema/discrepancies.d.ts +96 -0
- package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -0
- package/lib/feature-libraries/modular-schema/discrepancies.js +260 -0
- package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -0
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -2
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js +3 -0
- package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts +2 -1
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js +1 -0
- package/lib/feature-libraries/modular-schema/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +42 -26
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +51 -2
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +826 -247
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormat.js +2 -0
- package/lib/feature-libraries/modular-schema/modularChangeFormat.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +44 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/lib/feature-libraries/node-key/index.d.ts +0 -1
- package/lib/feature-libraries/node-key/index.d.ts.map +1 -1
- package/lib/feature-libraries/node-key/index.js +0 -1
- package/lib/feature-libraries/node-key/index.js.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.d.ts +3 -2
- package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +5 -4
- package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.js +1 -0
- package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/lib/feature-libraries/sequence-field/index.d.ts +1 -1
- package/lib/feature-libraries/sequence-field/index.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/index.js +1 -1
- package/lib/feature-libraries/sequence-field/index.js.map +1 -1
- package/lib/feature-libraries/sequence-field/invert.js +1 -1
- package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
- package/lib/feature-libraries/sequence-field/rebase.js +6 -1
- package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +2 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.d.ts +2 -17
- package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +31 -39
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts +1 -0
- package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +1 -1
- package/lib/feature-libraries/typed-schema/typedTreeSchema.js +4 -2
- package/lib/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +4 -2
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +242 -185
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +5 -1
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +158 -90
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/treeApi.js +1 -1
- package/lib/shared-tree/treeApi.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +10 -1
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +47 -3
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree/treeView.d.ts.map +1 -1
- package/lib/shared-tree/treeView.js +4 -0
- package/lib/shared-tree/treeView.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +6 -0
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +3 -0
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +8 -6
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +273 -210
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/simple-tree/arrayNode.d.ts +4 -0
- package/lib/simple-tree/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/arrayNode.js +39 -22
- package/lib/simple-tree/arrayNode.js.map +1 -1
- package/lib/simple-tree/index.d.ts +3 -3
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +1 -1
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/leafNodeSchema.d.ts +22 -1
- package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/leafNodeSchema.js +1 -1
- package/lib/simple-tree/leafNodeSchema.js.map +1 -1
- package/lib/simple-tree/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/mapNode.js.map +1 -1
- package/lib/simple-tree/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/objectNode.js +3 -2
- package/lib/simple-tree/objectNode.js.map +1 -1
- package/lib/simple-tree/proxies.d.ts.map +1 -1
- package/lib/simple-tree/proxies.js +9 -25
- package/lib/simple-tree/proxies.js.map +1 -1
- package/lib/simple-tree/proxyBinding.d.ts +4 -0
- package/lib/simple-tree/proxyBinding.d.ts.map +1 -1
- package/lib/simple-tree/proxyBinding.js +19 -0
- package/lib/simple-tree/proxyBinding.js.map +1 -1
- package/lib/simple-tree/schemaFactory.d.ts +16 -1
- package/lib/simple-tree/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/schemaFactory.js +30 -3
- package/lib/simple-tree/schemaFactory.js.map +1 -1
- package/lib/simple-tree/schemaTypes.d.ts +36 -1
- package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
- package/lib/simple-tree/schemaTypes.js.map +1 -1
- package/lib/simple-tree/toFlexSchema.d.ts +2 -2
- package/lib/simple-tree/toFlexSchema.d.ts.map +1 -1
- package/lib/simple-tree/toFlexSchema.js +3 -2
- package/lib/simple-tree/toFlexSchema.js.map +1 -1
- package/lib/simple-tree/tree.d.ts +4 -1
- package/lib/simple-tree/tree.d.ts.map +1 -1
- package/lib/simple-tree/tree.js +44 -0
- package/lib/simple-tree/tree.js.map +1 -1
- package/lib/simple-tree/treeNodeApi.d.ts +2 -75
- package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/treeNodeApi.js +20 -28
- package/lib/simple-tree/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/treeNodeKernel.d.ts +26 -0
- package/lib/simple-tree/treeNodeKernel.d.ts.map +1 -0
- package/lib/simple-tree/treeNodeKernel.js +79 -0
- package/lib/simple-tree/treeNodeKernel.js.map +1 -0
- package/lib/simple-tree/types.d.ts +95 -3
- package/lib/simple-tree/types.d.ts.map +1 -1
- package/lib/simple-tree/types.js +121 -22
- package/lib/simple-tree/types.js.map +1 -1
- package/lib/util/breakable.d.ts +83 -0
- package/lib/util/breakable.d.ts.map +1 -0
- package/lib/util/breakable.js +171 -0
- package/lib/util/breakable.js.map +1 -0
- package/lib/util/index.d.ts +3 -2
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +3 -2
- package/lib/util/index.js.map +1 -1
- package/lib/util/nestedMap.d.ts +17 -3
- package/lib/util/nestedMap.d.ts.map +1 -1
- package/lib/util/nestedMap.js +19 -0
- package/lib/util/nestedMap.js.map +1 -1
- package/lib/util/utils.d.ts +7 -0
- package/lib/util/utils.d.ts.map +1 -1
- package/lib/util/utils.js +13 -0
- package/lib/util/utils.js.map +1 -1
- package/package.json +29 -27
- package/src/core/forest/editableForest.ts +25 -4
- package/src/core/index.ts +2 -0
- package/src/core/rebase/index.ts +2 -0
- package/src/core/rebase/types.ts +17 -0
- package/src/core/tree/anchorSet.ts +14 -0
- package/src/core/tree/detachedFieldIndex.ts +217 -35
- package/src/core/tree/detachedFieldIndexCodec.ts +17 -8
- package/src/core/tree/detachedFieldIndexFormat.ts +1 -1
- package/src/core/tree/detachedFieldIndexTypes.ts +41 -5
- package/src/core/tree/index.ts +2 -1
- package/src/core/tree/visitDelta.ts +58 -16
- package/src/core/tree/visitorUtils.ts +7 -4
- package/src/events/events.ts +4 -2
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +1 -1
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -0
- package/src/feature-libraries/editableTreeBinder.ts +1 -1
- package/src/feature-libraries/flex-map-tree/mapTreeNode.ts +1 -95
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -62
- package/src/feature-libraries/flex-tree/index.ts +7 -2
- package/src/feature-libraries/flex-tree/lazyEntity.ts +0 -3
- package/src/feature-libraries/flex-tree/lazyField.ts +15 -47
- package/src/feature-libraries/flex-tree/lazyNode.ts +1 -48
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -0
- package/src/feature-libraries/index.ts +4 -2
- package/src/feature-libraries/modular-schema/crossFieldQueries.ts +18 -0
- package/src/feature-libraries/modular-schema/discrepancies.ts +395 -0
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +10 -2
- package/src/feature-libraries/modular-schema/genericFieldKind.ts +3 -0
- package/src/feature-libraries/modular-schema/index.ts +2 -0
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +81 -35
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +1521 -444
- package/src/feature-libraries/modular-schema/modularChangeFormat.ts +2 -0
- package/src/feature-libraries/modular-schema/modularChangeTypes.ts +51 -0
- package/src/feature-libraries/node-key/index.ts +0 -1
- package/src/feature-libraries/object-forest/objectForest.ts +7 -3
- package/src/feature-libraries/optional-field/optionalField.ts +1 -0
- package/src/feature-libraries/sequence-field/index.ts +0 -2
- package/src/feature-libraries/sequence-field/invert.ts +1 -1
- package/src/feature-libraries/sequence-field/rebase.ts +7 -1
- package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +2 -1
- package/src/feature-libraries/sequence-field/utils.ts +37 -85
- package/src/feature-libraries/typed-schema/typedTreeSchema.ts +10 -0
- package/src/index.ts +0 -1
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/schematizingTreeView.ts +6 -2
- package/src/shared-tree/sharedTree.ts +12 -1
- package/src/shared-tree/sharedTreeChangeEnricher.ts +1 -1
- package/src/shared-tree/treeApi.ts +1 -1
- package/src/shared-tree/treeCheckout.ts +60 -5
- package/src/shared-tree/treeView.ts +5 -0
- package/src/shared-tree-core/branch.ts +10 -0
- package/src/shared-tree-core/sharedTreeCore.ts +25 -6
- package/src/simple-tree/arrayNode.ts +50 -23
- package/src/simple-tree/index.ts +3 -3
- package/src/simple-tree/leafNodeSchema.ts +1 -1
- package/src/simple-tree/mapNode.ts +2 -2
- package/src/simple-tree/objectNode.ts +9 -3
- package/src/simple-tree/proxies.ts +10 -33
- package/src/simple-tree/proxyBinding.ts +23 -0
- package/src/simple-tree/schemaFactory.ts +37 -2
- package/src/simple-tree/schemaTypes.ts +36 -1
- package/src/simple-tree/toFlexSchema.ts +5 -4
- package/src/simple-tree/tree.ts +68 -4
- package/src/simple-tree/treeNodeApi.ts +29 -111
- package/src/simple-tree/treeNodeKernel.ts +91 -0
- package/src/simple-tree/types.ts +292 -31
- package/src/util/breakable.ts +214 -0
- package/src/util/index.ts +11 -0
- package/src/util/nestedMap.ts +33 -3
- package/src/util/utils.ts +17 -0
- package/dist/feature-libraries/node-key/nodeKeyIndex.d.ts +0 -41
- package/dist/feature-libraries/node-key/nodeKeyIndex.d.ts.map +0 -1
- package/dist/feature-libraries/node-key/nodeKeyIndex.js +0 -101
- package/dist/feature-libraries/node-key/nodeKeyIndex.js.map +0 -1
- package/lib/feature-libraries/node-key/nodeKeyIndex.d.ts +0 -41
- package/lib/feature-libraries/node-key/nodeKeyIndex.d.ts.map +0 -1
- package/lib/feature-libraries/node-key/nodeKeyIndex.js +0 -97
- package/lib/feature-libraries/node-key/nodeKeyIndex.js.map +0 -1
- package/src/feature-libraries/node-key/nodeKeyIndex.ts +0 -132
|
@@ -130,6 +130,8 @@ export const EncodedModularChangeset = Type.Object(
|
|
|
130
130
|
maxId: Type.Optional(ChangesetLocalIdSchema),
|
|
131
131
|
changes: EncodedFieldChangeMap,
|
|
132
132
|
revisions: Type.ReadonlyOptional(Type.Array(EncodedRevisionInfo)),
|
|
133
|
+
// TODO#8574: separating `builds` and `refreshers` here means that we encode their `EncodedBuilds.trees` separately.
|
|
134
|
+
// This can lead to a less efficient wire representation because of duplicated schema/shape information.
|
|
133
135
|
builds: Type.Optional(EncodedBuilds),
|
|
134
136
|
refreshers: Type.Optional(EncodedBuilds),
|
|
135
137
|
/**
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import type { BTree } from "@tylerbu/sorted-btree-es6";
|
|
6
7
|
import type {
|
|
7
8
|
ChangeAtomId,
|
|
8
9
|
ChangeAtomIdMap,
|
|
@@ -10,9 +11,11 @@ import type {
|
|
|
10
11
|
FieldKey,
|
|
11
12
|
FieldKindIdentifier,
|
|
12
13
|
RevisionInfo,
|
|
14
|
+
RevisionTag,
|
|
13
15
|
} from "../../core/index.js";
|
|
14
16
|
import type { Brand } from "../../util/index.js";
|
|
15
17
|
import type { TreeChunk } from "../chunked-forest/index.js";
|
|
18
|
+
import type { CrossFieldTarget } from "./crossFieldQueries.js";
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
21
|
* @internal
|
|
@@ -30,13 +33,61 @@ export interface ModularChangeset extends HasFieldChanges {
|
|
|
30
33
|
*/
|
|
31
34
|
readonly revisions?: readonly RevisionInfo[];
|
|
32
35
|
readonly fieldChanges: FieldChangeMap;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Maps from this changeset's canonical ID for a node (see comment on node aliases) to the changes for that node.
|
|
39
|
+
*/
|
|
33
40
|
readonly nodeChanges: ChangeAtomIdMap<NodeChangeset>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Maps from this changeset's canonical ID for a node to the ID for the field which contains that node.
|
|
44
|
+
*/
|
|
45
|
+
// TODO: Should this be merged with `nodeChanges`?
|
|
46
|
+
readonly nodeToParent: ChangeAtomIdMap<FieldId>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Maps from a node ID to another ID for the same node.
|
|
50
|
+
* If a node ID used in this changeset has no entry in this table, then it is the canonical ID for that node.
|
|
51
|
+
* The aliases form a set of trees, where the root of each tree is a canonical ID.
|
|
52
|
+
*
|
|
53
|
+
* When composing changesets with different canonical IDs for the same node,
|
|
54
|
+
* one of those IDs becomes the canonical ID for the composition, while the other is added to this table as an alias.
|
|
55
|
+
*
|
|
56
|
+
* Node aliases are preserved when composing changesets so we can avoid having to find and update all changed node IDs
|
|
57
|
+
* in the field IDs in nodeToParent and crossFieldKeys.
|
|
58
|
+
*/
|
|
59
|
+
readonly nodeAliases: ChangeAtomIdMap<NodeId>;
|
|
60
|
+
readonly crossFieldKeys: CrossFieldKeyTable;
|
|
34
61
|
readonly constraintViolationCount?: number;
|
|
35
62
|
readonly builds?: ChangeAtomIdMap<TreeChunk>;
|
|
36
63
|
readonly destroys?: ChangeAtomIdMap<number>;
|
|
37
64
|
readonly refreshers?: ChangeAtomIdMap<TreeChunk>;
|
|
38
65
|
}
|
|
39
66
|
|
|
67
|
+
export type TupleBTree<K, V> = Brand<BTree<K, V>, "TupleBTree">;
|
|
68
|
+
export type CrossFieldKeyTable = TupleBTree<CrossFieldKeyRange, FieldId>;
|
|
69
|
+
export type CrossFieldKeyRange = readonly [
|
|
70
|
+
CrossFieldTarget,
|
|
71
|
+
RevisionTag | undefined,
|
|
72
|
+
ChangesetLocalId,
|
|
73
|
+
/**
|
|
74
|
+
* The length of this range.
|
|
75
|
+
* TODO: This does not need to be part of the key and could be part of the value instead.
|
|
76
|
+
*/
|
|
77
|
+
number,
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
export type CrossFieldKey = readonly [
|
|
81
|
+
CrossFieldTarget,
|
|
82
|
+
RevisionTag | undefined,
|
|
83
|
+
ChangesetLocalId,
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
export interface FieldId {
|
|
87
|
+
readonly nodeId: NodeId | undefined;
|
|
88
|
+
readonly field: FieldKey;
|
|
89
|
+
}
|
|
90
|
+
|
|
40
91
|
/**
|
|
41
92
|
* @internal
|
|
42
93
|
*/
|
|
@@ -94,6 +94,7 @@ export class ObjectForest implements IEditableForest {
|
|
|
94
94
|
|
|
95
95
|
public constructor(
|
|
96
96
|
public readonly anchors: AnchorSet = new AnchorSet(),
|
|
97
|
+
public readonly additionalAsserts: boolean = false,
|
|
97
98
|
roots?: MapTree,
|
|
98
99
|
) {
|
|
99
100
|
this.#roots =
|
|
@@ -117,7 +118,7 @@ export class ObjectForest implements IEditableForest {
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
public clone(_: TreeStoredSchemaSubscription, anchors: AnchorSet): ObjectForest {
|
|
120
|
-
return new ObjectForest(anchors, this.roots);
|
|
121
|
+
return new ObjectForest(anchors, this.additionalAsserts, this.roots);
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
public forgetAnchor(anchor: Anchor): void {
|
|
@@ -554,6 +555,9 @@ class Cursor extends SynchronousCursor implements ITreeSubscriptionCursor {
|
|
|
554
555
|
/**
|
|
555
556
|
* @returns an implementation of {@link IEditableForest} with no data or schema.
|
|
556
557
|
*/
|
|
557
|
-
export function buildForest(
|
|
558
|
-
|
|
558
|
+
export function buildForest(
|
|
559
|
+
anchors?: AnchorSet,
|
|
560
|
+
additionalAsserts: boolean = false,
|
|
561
|
+
): ObjectForest {
|
|
562
|
+
return new ObjectForest(anchors, additionalAsserts);
|
|
559
563
|
}
|
|
@@ -713,6 +713,7 @@ export const optionalChangeHandler: FieldChangeHandler<
|
|
|
713
713
|
getNestedChanges,
|
|
714
714
|
|
|
715
715
|
createEmpty: () => ({ moves: [], childChanges: [] }),
|
|
716
|
+
getCrossFieldKeys: (_change) => [],
|
|
716
717
|
};
|
|
717
718
|
|
|
718
719
|
function getNestedChanges(change: OptionalChangeset): [NodeId, number | undefined][] {
|
|
@@ -194,7 +194,6 @@ function invertMark(
|
|
|
194
194
|
return applyMovedChanges(invertedMark, mark.revision, crossFieldManager);
|
|
195
195
|
}
|
|
196
196
|
case "AttachAndDetach": {
|
|
197
|
-
// Which should get the child change? Don't want to invert twice
|
|
198
197
|
const attach: Mark = {
|
|
199
198
|
count: mark.count,
|
|
200
199
|
cellId: mark.cellId,
|
|
@@ -294,6 +293,7 @@ function applyMovedChanges(
|
|
|
294
293
|
}
|
|
295
294
|
|
|
296
295
|
if (entry.value !== undefined) {
|
|
296
|
+
manager.onMoveIn(entry.value);
|
|
297
297
|
return [withNodeChange<CellMark<MoveOut>, MoveOut>(mark, entry.value)];
|
|
298
298
|
}
|
|
299
299
|
|
|
@@ -270,6 +270,7 @@ function rebaseMark(
|
|
|
270
270
|
0x8dc /* Unexpected collision of new node changes */,
|
|
271
271
|
);
|
|
272
272
|
rebasedMark.changes = movedNodeChanges;
|
|
273
|
+
moveEffects.onMoveIn(movedNodeChanges);
|
|
273
274
|
}
|
|
274
275
|
|
|
275
276
|
return rebaseMarkIgnoreChild(rebasedMark, baseMark, moveEffects);
|
|
@@ -514,7 +515,12 @@ function getMovedEffect(
|
|
|
514
515
|
): MarkEffect | undefined {
|
|
515
516
|
const effect = getMoveEffect(moveEffects, CrossFieldTarget.Destination, revision, id, count);
|
|
516
517
|
assert(effect.length === count, 0x6f3 /* Expected effect to cover entire mark */);
|
|
517
|
-
|
|
518
|
+
const movedEffect = effect.value?.movedEffect;
|
|
519
|
+
if (movedEffect !== undefined && movedEffect.type === "MoveOut") {
|
|
520
|
+
moveEffects.moveKey(CrossFieldTarget.Source, movedEffect.revision, movedEffect.id, count);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return movedEffect;
|
|
518
524
|
}
|
|
519
525
|
|
|
520
526
|
function getMovedChangesFromBaseMark(
|
|
@@ -11,7 +11,7 @@ import { sequenceFieldChangeCodecFactory } from "./sequenceFieldCodecs.js";
|
|
|
11
11
|
import { type SequenceFieldEditor, sequenceFieldEditor } from "./sequenceFieldEditor.js";
|
|
12
12
|
import { sequenceFieldToDelta } from "./sequenceFieldToDelta.js";
|
|
13
13
|
import type { Changeset } from "./types.js";
|
|
14
|
-
import { createEmpty, getNestedChanges, isEmpty } from "./utils.js";
|
|
14
|
+
import { createEmpty, getCrossFieldKeys, getNestedChanges, isEmpty } from "./utils.js";
|
|
15
15
|
|
|
16
16
|
export type SequenceFieldChangeHandler = FieldChangeHandler<Changeset, SequenceFieldEditor>;
|
|
17
17
|
|
|
@@ -24,4 +24,5 @@ export const sequenceFieldChangeHandler: SequenceFieldChangeHandler = {
|
|
|
24
24
|
isEmpty,
|
|
25
25
|
getNestedChanges,
|
|
26
26
|
createEmpty,
|
|
27
|
+
getCrossFieldKeys,
|
|
27
28
|
};
|
|
@@ -13,20 +13,11 @@ import {
|
|
|
13
13
|
areEqualChangeAtomIds,
|
|
14
14
|
makeChangeAtomId,
|
|
15
15
|
} from "../../core/index.js";
|
|
16
|
+
import { type Mutable, brand, fail } from "../../util/index.js";
|
|
16
17
|
import {
|
|
17
|
-
type Mutable,
|
|
18
|
-
type RangeMap,
|
|
19
|
-
brand,
|
|
20
|
-
fail,
|
|
21
|
-
getFromRangeMap,
|
|
22
|
-
} from "../../util/index.js";
|
|
23
|
-
import {
|
|
24
|
-
type CrossFieldManager,
|
|
25
|
-
type CrossFieldQuerySet,
|
|
26
18
|
CrossFieldTarget,
|
|
27
19
|
type NodeId,
|
|
28
|
-
|
|
29
|
-
setInCrossFieldMap,
|
|
20
|
+
type CrossFieldKeyRange,
|
|
30
21
|
} from "../modular-schema/index.js";
|
|
31
22
|
|
|
32
23
|
import type {
|
|
@@ -47,7 +38,6 @@ import {
|
|
|
47
38
|
type Insert,
|
|
48
39
|
type Mark,
|
|
49
40
|
type MarkEffect,
|
|
50
|
-
type MoveId,
|
|
51
41
|
type MoveIn,
|
|
52
42
|
type MoveOut,
|
|
53
43
|
type NoopMark,
|
|
@@ -708,79 +698,6 @@ function tryMergeEffects(
|
|
|
708
698
|
return undefined;
|
|
709
699
|
}
|
|
710
700
|
|
|
711
|
-
/**
|
|
712
|
-
* @internal
|
|
713
|
-
*/
|
|
714
|
-
export interface CrossFieldTable<T = unknown> extends CrossFieldManager<T> {
|
|
715
|
-
srcQueries: CrossFieldQuerySet;
|
|
716
|
-
dstQueries: CrossFieldQuerySet;
|
|
717
|
-
isInvalidated: boolean;
|
|
718
|
-
mapSrc: Map<RevisionTag | undefined, RangeMap<T>>;
|
|
719
|
-
mapDst: Map<RevisionTag | undefined, RangeMap<T>>;
|
|
720
|
-
reset: () => void;
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/**
|
|
724
|
-
* @internal
|
|
725
|
-
*/
|
|
726
|
-
export function newCrossFieldTable<T = unknown>(): CrossFieldTable<T> {
|
|
727
|
-
const srcQueries: CrossFieldQuerySet = new Map();
|
|
728
|
-
const dstQueries: CrossFieldQuerySet = new Map();
|
|
729
|
-
const mapSrc: Map<RevisionTag | undefined, RangeMap<T>> = new Map();
|
|
730
|
-
const mapDst: Map<RevisionTag | undefined, RangeMap<T>> = new Map();
|
|
731
|
-
|
|
732
|
-
const getMap = (target: CrossFieldTarget): Map<RevisionTag | undefined, RangeMap<T>> =>
|
|
733
|
-
target === CrossFieldTarget.Source ? mapSrc : mapDst;
|
|
734
|
-
|
|
735
|
-
const getQueries = (target: CrossFieldTarget): CrossFieldQuerySet =>
|
|
736
|
-
target === CrossFieldTarget.Source ? srcQueries : dstQueries;
|
|
737
|
-
|
|
738
|
-
const table = {
|
|
739
|
-
srcQueries,
|
|
740
|
-
dstQueries,
|
|
741
|
-
isInvalidated: false,
|
|
742
|
-
mapSrc,
|
|
743
|
-
mapDst,
|
|
744
|
-
|
|
745
|
-
get: (
|
|
746
|
-
target: CrossFieldTarget,
|
|
747
|
-
revision: RevisionTag | undefined,
|
|
748
|
-
id: MoveId,
|
|
749
|
-
count: number,
|
|
750
|
-
addDependency: boolean,
|
|
751
|
-
) => {
|
|
752
|
-
if (addDependency) {
|
|
753
|
-
addCrossFieldQuery(getQueries(target), revision, id, count);
|
|
754
|
-
}
|
|
755
|
-
return getFromRangeMap(getMap(target).get(revision) ?? [], id, count);
|
|
756
|
-
},
|
|
757
|
-
set: (
|
|
758
|
-
target: CrossFieldTarget,
|
|
759
|
-
revision: RevisionTag | undefined,
|
|
760
|
-
id: MoveId,
|
|
761
|
-
count: number,
|
|
762
|
-
value: T,
|
|
763
|
-
invalidateDependents: boolean,
|
|
764
|
-
) => {
|
|
765
|
-
if (
|
|
766
|
-
invalidateDependents &&
|
|
767
|
-
getFromRangeMap(getQueries(target).get(revision) ?? [], id, count) !== undefined
|
|
768
|
-
) {
|
|
769
|
-
table.isInvalidated = true;
|
|
770
|
-
}
|
|
771
|
-
setInCrossFieldMap(getMap(target), revision, id, count, value);
|
|
772
|
-
},
|
|
773
|
-
|
|
774
|
-
reset: () => {
|
|
775
|
-
table.isInvalidated = false;
|
|
776
|
-
table.srcQueries.clear();
|
|
777
|
-
table.dstQueries.clear();
|
|
778
|
-
},
|
|
779
|
-
};
|
|
780
|
-
|
|
781
|
-
return table;
|
|
782
|
-
}
|
|
783
|
-
|
|
784
701
|
/**
|
|
785
702
|
* Splits the `mark` into two marks such that the first returned mark has length `length`.
|
|
786
703
|
* @param mark - The mark to split.
|
|
@@ -969,3 +886,38 @@ export function getEndpoint(effect: MoveMarkEffect): ChangeAtomId {
|
|
|
969
886
|
}
|
|
970
887
|
: { revision: effect.revision, localId: effect.id };
|
|
971
888
|
}
|
|
889
|
+
|
|
890
|
+
export function getCrossFieldKeys(change: Changeset): CrossFieldKeyRange[] {
|
|
891
|
+
const keys: CrossFieldKeyRange[] = [];
|
|
892
|
+
for (const mark of change) {
|
|
893
|
+
keys.push(...getCrossFieldKeysForMarkEffect(mark, mark.count));
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
return keys;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
function getCrossFieldKeysForMarkEffect(
|
|
900
|
+
effect: MarkEffect,
|
|
901
|
+
count: number,
|
|
902
|
+
): CrossFieldKeyRange[] {
|
|
903
|
+
switch (effect.type) {
|
|
904
|
+
case "Insert":
|
|
905
|
+
// An insert behaves like a move where the source and destination are at the same location.
|
|
906
|
+
// An insert can become a move when after rebasing.
|
|
907
|
+
return [
|
|
908
|
+
[CrossFieldTarget.Source, effect.revision, effect.id, count],
|
|
909
|
+
[CrossFieldTarget.Destination, effect.revision, effect.id, count],
|
|
910
|
+
];
|
|
911
|
+
case "MoveOut":
|
|
912
|
+
return [[CrossFieldTarget.Source, effect.revision, effect.id, count]];
|
|
913
|
+
case "MoveIn":
|
|
914
|
+
return [[CrossFieldTarget.Destination, effect.revision, effect.id, count]];
|
|
915
|
+
case "AttachAndDetach":
|
|
916
|
+
return [
|
|
917
|
+
...getCrossFieldKeysForMarkEffect(effect.attach, count),
|
|
918
|
+
...getCrossFieldKeysForMarkEffect(effect.detach, count),
|
|
919
|
+
];
|
|
920
|
+
default:
|
|
921
|
+
return [];
|
|
922
|
+
}
|
|
923
|
+
}
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
type TreeStoredSchema,
|
|
20
20
|
type TreeTypeSet,
|
|
21
21
|
type ValueSchema,
|
|
22
|
+
identifierFieldKindIdentifier,
|
|
22
23
|
} from "../../core/index.js";
|
|
23
24
|
import {
|
|
24
25
|
type Assume,
|
|
@@ -28,6 +29,7 @@ import {
|
|
|
28
29
|
mapIterable,
|
|
29
30
|
oneFromSet,
|
|
30
31
|
type requireAssignableTo,
|
|
32
|
+
filterIterable,
|
|
31
33
|
} from "../../util/index.js";
|
|
32
34
|
import { FieldKinds } from "../default-schema/index.js";
|
|
33
35
|
import type { FlexFieldKind, FullSchemaPolicy } from "../modular-schema/index.js";
|
|
@@ -154,6 +156,7 @@ export class FlexObjectNodeSchema<
|
|
|
154
156
|
const out Specification extends Unenforced<FlexObjectNodeFields> = FlexObjectNodeFields,
|
|
155
157
|
> extends TreeNodeSchemaBase<Name, Specification> {
|
|
156
158
|
protected _typeCheck2?: MakeNominal;
|
|
159
|
+
public readonly identifierFieldKeys: readonly FieldKey[] = [];
|
|
157
160
|
|
|
158
161
|
public static create<
|
|
159
162
|
const Name extends string,
|
|
@@ -192,6 +195,13 @@ export class FlexObjectNodeSchema<
|
|
|
192
195
|
) {
|
|
193
196
|
const fields = mapIterable(objectNodeFields, ([k, v]) => [k, v.stored] as const);
|
|
194
197
|
super(builder, name, info, new ObjectNodeStoredSchema(new Map(fields)));
|
|
198
|
+
this.identifierFieldKeys = Array.from(
|
|
199
|
+
filterIterable(
|
|
200
|
+
objectNodeFields.entries(),
|
|
201
|
+
([k, f]) => f.kind.identifier === identifierFieldKindIdentifier,
|
|
202
|
+
),
|
|
203
|
+
([k]) => k,
|
|
204
|
+
);
|
|
195
205
|
}
|
|
196
206
|
|
|
197
207
|
public override getFieldSchema(field: FieldKey): FlexFieldSchema {
|
package/src/index.ts
CHANGED
package/src/packageVersion.ts
CHANGED
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
mapTreeFromNodeData,
|
|
40
40
|
prepareContentForHydration,
|
|
41
41
|
} from "../simple-tree/index.js";
|
|
42
|
-
import { disposeSymbol } from "../util/index.js";
|
|
42
|
+
import { Breakable, breakingClass, disposeSymbol, type WithBreakable } from "../util/index.js";
|
|
43
43
|
|
|
44
44
|
import { canInitialize, ensureSchema, initialize } from "./schematizeTree.js";
|
|
45
45
|
import type { TreeCheckout } from "./treeCheckout.js";
|
|
@@ -48,8 +48,9 @@ import { CheckoutFlexTreeView } from "./treeView.js";
|
|
|
48
48
|
/**
|
|
49
49
|
* Implementation of TreeView wrapping a FlexTreeView.
|
|
50
50
|
*/
|
|
51
|
+
@breakingClass
|
|
51
52
|
export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitFieldSchema>
|
|
52
|
-
implements TreeView<TRootSchema
|
|
53
|
+
implements TreeView<TRootSchema>, WithBreakable
|
|
53
54
|
{
|
|
54
55
|
/**
|
|
55
56
|
* The view is set to undefined when this object is disposed or the view schema does not support viewing the document's stored schema.
|
|
@@ -86,6 +87,7 @@ export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitField
|
|
|
86
87
|
public readonly checkout: TreeCheckout,
|
|
87
88
|
public readonly config: TreeViewConfiguration<TRootSchema>,
|
|
88
89
|
public readonly nodeKeyManager: NodeKeyManager,
|
|
90
|
+
public readonly breaker: Breakable = new Breakable("SchematizingSimpleTreeView"),
|
|
89
91
|
) {
|
|
90
92
|
const policy = {
|
|
91
93
|
...defaultSchemaPolicy,
|
|
@@ -306,6 +308,7 @@ export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitField
|
|
|
306
308
|
}
|
|
307
309
|
|
|
308
310
|
public get root(): TreeFieldFromImplicitField<TRootSchema> {
|
|
311
|
+
this.breaker.use();
|
|
309
312
|
if (!this.compatibility.canView) {
|
|
310
313
|
throw new UsageError(
|
|
311
314
|
"Document is out of schema. Check TreeView.compatibility before accessing TreeView.root.",
|
|
@@ -316,6 +319,7 @@ export class SchematizingSimpleTreeView<in out TRootSchema extends ImplicitField
|
|
|
316
319
|
}
|
|
317
320
|
|
|
318
321
|
public set root(newRoot: InsertableTreeFieldFromImplicitField<TRootSchema>) {
|
|
322
|
+
this.breaker.use();
|
|
319
323
|
if (!this.compatibility.canView) {
|
|
320
324
|
throw new UsageError(
|
|
321
325
|
"Document is out of schema. Check TreeView.compatibility before accessing TreeView.root.",
|
|
@@ -64,6 +64,7 @@ import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
|
|
|
64
64
|
import type { SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
|
|
65
65
|
import { type CheckoutEvents, type TreeCheckout, createTreeCheckout } from "./treeCheckout.js";
|
|
66
66
|
import type { CheckoutFlexTreeView, FlexTreeView } from "./treeView.js";
|
|
67
|
+
import { breakingClass, throwIfBroken } from "../util/index.js";
|
|
67
68
|
|
|
68
69
|
/**
|
|
69
70
|
* Copy of data from an {@link ISharedTree} at some point in time.
|
|
@@ -162,6 +163,7 @@ function getCodecVersions(formatVersion: number): ExplicitCodecVersions {
|
|
|
162
163
|
*
|
|
163
164
|
* TODO: detail compatibility requirements.
|
|
164
165
|
*/
|
|
166
|
+
@breakingClass
|
|
165
167
|
export class SharedTree
|
|
166
168
|
extends SharedTreeCore<SharedTreeEditBuilder, SharedTreeChange>
|
|
167
169
|
implements ISharedTree
|
|
@@ -191,7 +193,9 @@ export class SharedTree
|
|
|
191
193
|
const forest =
|
|
192
194
|
options.forest === ForestType.Optimized
|
|
193
195
|
? buildChunkedForest(makeTreeChunker(schema, defaultSchemaPolicy))
|
|
194
|
-
:
|
|
196
|
+
: options.forest === ForestType.Reference
|
|
197
|
+
? buildForest()
|
|
198
|
+
: buildForest(undefined, true);
|
|
195
199
|
const revisionTagCodec = new RevisionTagCodec(runtime.idCompressor);
|
|
196
200
|
const removedRoots = makeDetachedFieldIndex(
|
|
197
201
|
"repair",
|
|
@@ -288,6 +292,7 @@ export class SharedTree
|
|
|
288
292
|
);
|
|
289
293
|
}
|
|
290
294
|
|
|
295
|
+
@throwIfBroken
|
|
291
296
|
public contentSnapshot(): SharedTreeContentSnapshot {
|
|
292
297
|
const cursor = this.checkout.forest.allocateCursor("contentSnapshot");
|
|
293
298
|
try {
|
|
@@ -326,11 +331,13 @@ export class SharedTree
|
|
|
326
331
|
this.checkout,
|
|
327
332
|
config,
|
|
328
333
|
createNodeKeyManager(this.runtime.idCompressor),
|
|
334
|
+
this.breaker,
|
|
329
335
|
);
|
|
330
336
|
}
|
|
331
337
|
|
|
332
338
|
protected override async loadCore(services: IChannelStorageService): Promise<void> {
|
|
333
339
|
await super.loadCore(services);
|
|
340
|
+
this.checkout.setTipRevisionForLoadedData(this.trunkHeadRevision);
|
|
334
341
|
this._events.emit("afterBatch");
|
|
335
342
|
}
|
|
336
343
|
}
|
|
@@ -419,6 +426,10 @@ export enum ForestType {
|
|
|
419
426
|
* The "ChunkedForest" forest type.
|
|
420
427
|
*/
|
|
421
428
|
Optimized = 1,
|
|
429
|
+
/**
|
|
430
|
+
* The "ObjectForest" forest type with expensive asserts for debugging.
|
|
431
|
+
*/
|
|
432
|
+
Expensive = 2,
|
|
422
433
|
}
|
|
423
434
|
|
|
424
435
|
export const defaultSharedTreeOptions: Required<SharedTreeOptions> = {
|
|
@@ -87,7 +87,7 @@ export class SharedTreeMutableChangeEnricher
|
|
|
87
87
|
case "data": {
|
|
88
88
|
const delta = intoDelta(tagChange(dataOrSchemaChange.innerChange, revision));
|
|
89
89
|
const visitor = this.forest.acquireVisitor();
|
|
90
|
-
visitDelta(delta, visitor, this.removedRoots);
|
|
90
|
+
visitDelta(delta, visitor, this.removedRoots, revision);
|
|
91
91
|
visitor.free();
|
|
92
92
|
break;
|
|
93
93
|
}
|
|
@@ -455,7 +455,7 @@ function runTransactionInCheckout<TResult>(
|
|
|
455
455
|
case "nodeInDocument": {
|
|
456
456
|
const node = getFlexNode(constraint.node);
|
|
457
457
|
assert(
|
|
458
|
-
|
|
458
|
+
treeApi.status(constraint.node) === TreeStatus.InDocument,
|
|
459
459
|
0x90f /* Attempted to apply "nodeExists" constraint when building a transaction, but the node is not in the document. */,
|
|
460
460
|
);
|
|
461
461
|
checkout.editor.addNodeExistsConstraint(node.anchorNode);
|
|
@@ -387,6 +387,11 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
387
387
|
SharedTreeBranch<SharedTreeEditBuilder, SharedTreeChange>
|
|
388
388
|
>();
|
|
389
389
|
|
|
390
|
+
/**
|
|
391
|
+
* copies of the removed roots used as snapshots for reverting to previous state when transactions are aborted
|
|
392
|
+
*/
|
|
393
|
+
private readonly removedRootsSnapshots: DetachedFieldIndex[] = [];
|
|
394
|
+
|
|
390
395
|
/**
|
|
391
396
|
* The name of the telemetry event logged for calls to {@link TreeCheckout.revertRevertible}.
|
|
392
397
|
* @privateRemarks Exposed for testing purposes.
|
|
@@ -405,7 +410,7 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
405
410
|
private readonly mintRevisionTag: () => RevisionTag,
|
|
406
411
|
private readonly revisionTagCodec: RevisionTagCodec,
|
|
407
412
|
private readonly idCompressor: IIdCompressor,
|
|
408
|
-
private
|
|
413
|
+
private removedRoots: DetachedFieldIndex = makeDetachedFieldIndex(
|
|
409
414
|
"repair",
|
|
410
415
|
revisionTagCodec,
|
|
411
416
|
idCompressor,
|
|
@@ -413,18 +418,38 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
413
418
|
/** Optional logger for telemetry. */
|
|
414
419
|
private readonly logger?: ITelemetryLoggerExt,
|
|
415
420
|
) {
|
|
421
|
+
// when a transaction is started, take a snapshot of the current state of removed roots
|
|
422
|
+
branch.on("transactionStarted", () => {
|
|
423
|
+
this.removedRootsSnapshots.push(this.removedRoots.clone());
|
|
424
|
+
});
|
|
425
|
+
// when a transaction is committed, the latest snapshot of removed roots can be discarded
|
|
426
|
+
branch.on("transactionCommitted", () => {
|
|
427
|
+
this.removedRootsSnapshots.pop();
|
|
428
|
+
});
|
|
429
|
+
// after a transaction is rolled back, revert removed roots back to the latest snapshot
|
|
430
|
+
branch.on("transactionRolledBack", () => {
|
|
431
|
+
const snapshot = this.removedRootsSnapshots.pop();
|
|
432
|
+
assert(snapshot !== undefined, 0x9ae /* a snapshot for removed roots does not exist */);
|
|
433
|
+
this.removedRoots = snapshot;
|
|
434
|
+
});
|
|
435
|
+
|
|
416
436
|
// We subscribe to `beforeChange` rather than `afterChange` here because it's possible that the change is invalid WRT our forest.
|
|
417
437
|
// For example, a bug in the editor might produce a malformed change object and thus applying the change to the forest will throw an error.
|
|
418
438
|
// In such a case we will crash here, preventing the change from being added to the commit graph, and preventing `afterChange` from firing.
|
|
419
439
|
// One important consequence of this is that we will not submit the op containing the invalid change, since op submissions happens in response to `afterChange`.
|
|
420
440
|
branch.on("beforeChange", (event) => {
|
|
421
441
|
if (event.change !== undefined) {
|
|
442
|
+
const revision =
|
|
443
|
+
event.type === "replace"
|
|
444
|
+
? event.newCommits[event.newCommits.length - 1].revision
|
|
445
|
+
: event.change.revision;
|
|
446
|
+
|
|
422
447
|
// Conflicts due to schema will be empty and thus are not applied.
|
|
423
448
|
for (const change of event.change.change.changes) {
|
|
424
449
|
if (change.type === "data") {
|
|
425
|
-
const delta = intoDelta(tagChange(change.innerChange,
|
|
450
|
+
const delta = intoDelta(tagChange(change.innerChange, revision));
|
|
426
451
|
this.withCombinedVisitor((visitor) => {
|
|
427
|
-
visitDelta(delta, visitor, this.removedRoots);
|
|
452
|
+
visitDelta(delta, visitor, this.removedRoots, revision);
|
|
428
453
|
});
|
|
429
454
|
} else if (change.type === "schema") {
|
|
430
455
|
// Schema changes from a current to a new schema are expected to be backwards compatible.
|
|
@@ -518,6 +543,24 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
518
543
|
this.events.emit("commitApplied", data, getRevertible);
|
|
519
544
|
withinEventContext = false;
|
|
520
545
|
});
|
|
546
|
+
|
|
547
|
+
// When the branch is trimmed, we can garbage collect any repair data whose latest relevant revision is one of the
|
|
548
|
+
// trimmed revisions.
|
|
549
|
+
branch.on("ancestryTrimmed", (revisions) => {
|
|
550
|
+
this.withCombinedVisitor((visitor) => {
|
|
551
|
+
revisions.forEach((revision) => {
|
|
552
|
+
// get all the roots last created or used by the revision
|
|
553
|
+
const roots = this.removedRoots.getRootsLastTouchedByRevision(revision);
|
|
554
|
+
|
|
555
|
+
// get the detached field for the root and delete it from the removed roots
|
|
556
|
+
for (const root of roots) {
|
|
557
|
+
visitor.destroy(this.removedRoots.toFieldKey(root), 1);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
this.removedRoots.deleteRootsLastTouchedByRevision(revision);
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
});
|
|
521
564
|
}
|
|
522
565
|
|
|
523
566
|
private withCombinedVisitor(fn: (visitor: DeltaVisitor) => void): void {
|
|
@@ -572,6 +615,10 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
572
615
|
|
|
573
616
|
public rebase(view: TreeCheckout): void {
|
|
574
617
|
this.checkNotDisposed();
|
|
618
|
+
assert(
|
|
619
|
+
!view.transaction.inProgress(),
|
|
620
|
+
0x9af /* A view cannot be rebased while it has a pending transaction */,
|
|
621
|
+
);
|
|
575
622
|
view.branch.rebaseOnto(this.branch);
|
|
576
623
|
}
|
|
577
624
|
|
|
@@ -585,8 +632,8 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
585
632
|
public merge(view: TreeCheckout, disposeView = true): void {
|
|
586
633
|
this.checkNotDisposed();
|
|
587
634
|
assert(
|
|
588
|
-
!this.transaction.inProgress()
|
|
589
|
-
|
|
635
|
+
!this.transaction.inProgress(),
|
|
636
|
+
0x9b0 /* Views cannot be merged into a view while it has a pending transaction */,
|
|
590
637
|
);
|
|
591
638
|
while (view.transaction.inProgress()) {
|
|
592
639
|
view.transaction.commit();
|
|
@@ -625,6 +672,14 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
625
672
|
return trees;
|
|
626
673
|
}
|
|
627
674
|
|
|
675
|
+
/**
|
|
676
|
+
* This sets the tip revision as the latest relevant revision for any removed roots that are loaded from a summary.
|
|
677
|
+
* This needs to be called right after loading {@link this.removedRoots} from a summary to allow loaded data to be garbage collected.
|
|
678
|
+
*/
|
|
679
|
+
public setTipRevisionForLoadedData(revision: RevisionTag): void {
|
|
680
|
+
this.removedRoots.setRevisionsForLoadedData(revision);
|
|
681
|
+
}
|
|
682
|
+
|
|
628
683
|
private purgeRevertibles(): void {
|
|
629
684
|
for (const revertible of this.revertibles) {
|
|
630
685
|
revertible.dispose();
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
type NodeKeyManager,
|
|
13
13
|
getTreeContext,
|
|
14
14
|
} from "../feature-libraries/index.js";
|
|
15
|
+
import { tryDisposeTreeNode } from "../simple-tree/index.js";
|
|
15
16
|
import { type IDisposable, disposeSymbol } from "../util/index.js";
|
|
16
17
|
|
|
17
18
|
import type { ITreeCheckout, ITreeCheckoutFork, TreeCheckout } from "./treeCheckout.js";
|
|
@@ -94,6 +95,10 @@ export class CheckoutFlexTreeView<
|
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
public [disposeSymbol](): void {
|
|
98
|
+
for (const anchorNode of this.checkout.forest.anchors) {
|
|
99
|
+
tryDisposeTreeNode(anchorNode);
|
|
100
|
+
}
|
|
101
|
+
|
|
97
102
|
this.context[disposeSymbol]();
|
|
98
103
|
this.onDispose?.();
|
|
99
104
|
}
|