@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
package/src/simple-tree/tree.ts
CHANGED
|
@@ -9,11 +9,20 @@ import type { CommitMetadata } from "../core/index.js";
|
|
|
9
9
|
import type { Listenable } from "../events/index.js";
|
|
10
10
|
import type { RevertibleFactory } from "../shared-tree/index.js";
|
|
11
11
|
|
|
12
|
-
import
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
import {
|
|
13
|
+
type ImplicitAllowedTypes,
|
|
14
|
+
NodeKind,
|
|
15
|
+
normalizeFieldSchema,
|
|
16
|
+
type ImplicitFieldSchema,
|
|
17
|
+
type InsertableTreeFieldFromImplicitField,
|
|
18
|
+
type TreeFieldFromImplicitField,
|
|
19
|
+
type TreeNodeSchema,
|
|
16
20
|
} from "./schemaTypes.js";
|
|
21
|
+
import { toFlexSchema } from "./toFlexSchema.js";
|
|
22
|
+
import { LeafNodeSchema } from "./leafNodeSchema.js";
|
|
23
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
24
|
+
import { isObjectNodeSchema } from "./objectNode.js";
|
|
25
|
+
import { markSchemaMostDerived } from "./schemaFactory.js";
|
|
17
26
|
|
|
18
27
|
/**
|
|
19
28
|
* Channel for a Fluid Tree DDS.
|
|
@@ -130,6 +139,61 @@ export class TreeViewConfiguration<TSchema extends ImplicitFieldSchema = Implici
|
|
|
130
139
|
const config = { ...defaultTreeConfigurationOptions, ...props };
|
|
131
140
|
this.schema = config.schema;
|
|
132
141
|
this.enableSchemaValidation = config.enableSchemaValidation;
|
|
142
|
+
|
|
143
|
+
// Ensure all reachable schema are marked as most derived.
|
|
144
|
+
// This ensures if multiple schema extending the same schema factory generated class are present (or have been constructed, or get constructed in the future),
|
|
145
|
+
// an error is reported.
|
|
146
|
+
walkFieldSchema(config.schema, markSchemaMostDerived);
|
|
147
|
+
// Eagerly perform this conversion to surface errors sooner.
|
|
148
|
+
toFlexSchema(config.schema);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function walkNodeSchema(
|
|
153
|
+
schema: TreeNodeSchema,
|
|
154
|
+
visitor: (schema: TreeNodeSchema) => void,
|
|
155
|
+
visitedSet: Set<TreeNodeSchema>,
|
|
156
|
+
): void {
|
|
157
|
+
if (visitedSet.has(schema)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
visitedSet.add(schema);
|
|
161
|
+
if (schema instanceof LeafNodeSchema) {
|
|
162
|
+
// nothing to do
|
|
163
|
+
} else if (isObjectNodeSchema(schema)) {
|
|
164
|
+
for (const field of schema.fields.values()) {
|
|
165
|
+
walkAllowedTypes(field.allowedTypeSet, visitor, visitedSet);
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
assert(
|
|
169
|
+
schema.kind === NodeKind.Array || schema.kind === NodeKind.Map,
|
|
170
|
+
0x9b3 /* invalid schema */,
|
|
171
|
+
);
|
|
172
|
+
const childTypes = schema.info as ImplicitAllowedTypes;
|
|
173
|
+
walkFieldSchema(childTypes, visitor, visitedSet);
|
|
174
|
+
}
|
|
175
|
+
// This visit is done at the end so the traversal order is most inner types first.
|
|
176
|
+
// This was picked since when fixing errors,
|
|
177
|
+
// working from the inner types out to the types that use them will probably go better than the reverse.
|
|
178
|
+
// This does not however ensure all types referenced by a type are visited before it, since in recursive cases thats impossible.
|
|
179
|
+
visitor(schema);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function walkFieldSchema(
|
|
183
|
+
schema: ImplicitFieldSchema,
|
|
184
|
+
visitor: (schema: TreeNodeSchema) => void,
|
|
185
|
+
visitedSet: Set<TreeNodeSchema> = new Set(),
|
|
186
|
+
): void {
|
|
187
|
+
walkAllowedTypes(normalizeFieldSchema(schema).allowedTypeSet, visitor, visitedSet);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function walkAllowedTypes(
|
|
191
|
+
allowedTypes: Iterable<TreeNodeSchema>,
|
|
192
|
+
visitor: (schema: TreeNodeSchema) => void,
|
|
193
|
+
visitedSet: Set<TreeNodeSchema>,
|
|
194
|
+
): void {
|
|
195
|
+
for (const childType of allowedTypes) {
|
|
196
|
+
walkNodeSchema(childType, visitor, visitedSet);
|
|
133
197
|
}
|
|
134
198
|
}
|
|
135
199
|
|
|
@@ -3,20 +3,20 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { assert
|
|
6
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
|
|
8
8
|
import { Multiplicity, rootFieldKey } from "../core/index.js";
|
|
9
9
|
import {
|
|
10
|
-
FieldKinds,
|
|
11
10
|
type LazyItem,
|
|
12
11
|
type TreeStatus,
|
|
13
12
|
isLazy,
|
|
14
13
|
isTreeValue,
|
|
14
|
+
FlexObjectNodeSchema,
|
|
15
15
|
} from "../feature-libraries/index.js";
|
|
16
16
|
import { fail, extractFromOpaque, isReadonlyArray } from "../util/index.js";
|
|
17
17
|
|
|
18
18
|
import { getOrCreateNodeProxy, isTreeNode } from "./proxies.js";
|
|
19
|
-
import { getFlexNode } from "./proxyBinding.js";
|
|
19
|
+
import { getFlexNode, getKernel } from "./proxyBinding.js";
|
|
20
20
|
import { tryGetSimpleNodeSchema } from "./schemaCaching.js";
|
|
21
21
|
import {
|
|
22
22
|
NodeKind,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
type ImplicitAllowedTypes,
|
|
28
28
|
type TreeNodeFromImplicitAllowedTypes,
|
|
29
29
|
} from "./schemaTypes.js";
|
|
30
|
-
import type { TreeNode } from "./types.js";
|
|
30
|
+
import type { TreeNode, TreeChangeEvents } from "./types.js";
|
|
31
31
|
import {
|
|
32
32
|
booleanSchema,
|
|
33
33
|
handleSchema,
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
} from "./leafNodeSchema.js";
|
|
38
38
|
import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
|
|
39
39
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
40
|
+
import type { Off } from "../events/index.js";
|
|
40
41
|
|
|
41
42
|
/**
|
|
42
43
|
* Provides various functions for analyzing {@link TreeNode}s.
|
|
@@ -102,7 +103,7 @@ export interface TreeNodeApi {
|
|
|
102
103
|
/**
|
|
103
104
|
* Returns the {@link TreeStatus} of the given node.
|
|
104
105
|
*/
|
|
105
|
-
|
|
106
|
+
status(node: TreeNode): TreeStatus;
|
|
106
107
|
|
|
107
108
|
/**
|
|
108
109
|
* Returns the {@link SchemaFactory.identifier | identifier} of the given node in the most compressed form possible.
|
|
@@ -127,7 +128,7 @@ export interface TreeNodeApi {
|
|
|
127
128
|
* The `Tree` object holds various functions for analyzing {@link TreeNode}s.
|
|
128
129
|
*/
|
|
129
130
|
export const treeNodeApi: TreeNodeApi = {
|
|
130
|
-
parent
|
|
131
|
+
parent(node: TreeNode): TreeNode | undefined {
|
|
131
132
|
const editNode = getFlexNode(node).parentField.parent.parent;
|
|
132
133
|
if (editNode === undefined) {
|
|
133
134
|
return undefined;
|
|
@@ -140,7 +141,7 @@ export const treeNodeApi: TreeNodeApi = {
|
|
|
140
141
|
);
|
|
141
142
|
return output;
|
|
142
143
|
},
|
|
143
|
-
key
|
|
144
|
+
key(node: TreeNode): string | number {
|
|
144
145
|
// If the parent is undefined, then this node is under the root field,
|
|
145
146
|
// so we know its key is the special root one.
|
|
146
147
|
const parent = treeNodeApi.parent(node);
|
|
@@ -156,28 +157,20 @@ export const treeNodeApi: TreeNodeApi = {
|
|
|
156
157
|
const viewKey = getViewKeyFromStoredKey(parentSchema, storedKey);
|
|
157
158
|
return viewKey;
|
|
158
159
|
},
|
|
159
|
-
on
|
|
160
|
+
on<K extends keyof TreeChangeEvents>(
|
|
160
161
|
node: TreeNode,
|
|
161
162
|
eventName: K,
|
|
162
163
|
listener: TreeChangeEvents[K],
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
switch (eventName) {
|
|
166
|
-
case "nodeChanged":
|
|
167
|
-
return flex.on("nodeChanged", listener);
|
|
168
|
-
case "treeChanged":
|
|
169
|
-
return flex.on("treeChanged", listener);
|
|
170
|
-
default:
|
|
171
|
-
return unreachableCase(eventName);
|
|
172
|
-
}
|
|
164
|
+
): Off {
|
|
165
|
+
return getKernel(node).on(eventName, listener);
|
|
173
166
|
},
|
|
174
|
-
status
|
|
175
|
-
return
|
|
167
|
+
status(node: TreeNode): TreeStatus {
|
|
168
|
+
return getKernel(node).getStatus();
|
|
176
169
|
},
|
|
177
|
-
is
|
|
170
|
+
is<TSchema extends ImplicitAllowedTypes>(
|
|
178
171
|
value: unknown,
|
|
179
172
|
schema: TSchema,
|
|
180
|
-
): value is TreeNodeFromImplicitAllowedTypes<TSchema>
|
|
173
|
+
): value is TreeNodeFromImplicitAllowedTypes<TSchema> {
|
|
181
174
|
const actualSchema = tryGetSchema(value);
|
|
182
175
|
if (actualSchema === undefined) {
|
|
183
176
|
return false;
|
|
@@ -201,26 +194,26 @@ export const treeNodeApi: TreeNodeApi = {
|
|
|
201
194
|
},
|
|
202
195
|
shortId(node: TreeNode): number | string | undefined {
|
|
203
196
|
const flexNode = getFlexNode(node);
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const identifier =
|
|
197
|
+
const flexSchema = flexNode.schema;
|
|
198
|
+
const identifierFieldKeys =
|
|
199
|
+
flexSchema instanceof FlexObjectNodeSchema ? flexSchema.identifierFieldKeys : [];
|
|
200
|
+
|
|
201
|
+
switch (identifierFieldKeys.length) {
|
|
202
|
+
case 0:
|
|
203
|
+
return undefined;
|
|
204
|
+
case 1: {
|
|
205
|
+
const identifier = flexNode.tryGetField(identifierFieldKeys[0])?.boxedAt(0);
|
|
213
206
|
assert(identifier !== undefined, 0x927 /* The identifier must exist */);
|
|
214
207
|
const identifierValue = identifier.value as string;
|
|
215
208
|
const localNodeKey =
|
|
216
209
|
identifier.context.nodeKeyManager.tryLocalizeNodeKey(identifierValue);
|
|
217
|
-
|
|
218
|
-
shortId =
|
|
219
|
-
localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : identifierValue;
|
|
210
|
+
return localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : identifierValue;
|
|
220
211
|
}
|
|
212
|
+
default:
|
|
213
|
+
throw new UsageError(
|
|
214
|
+
"shortId() may not be called on a node with more than one identifier. Consider converting extraneous identifier fields to string fields.",
|
|
215
|
+
);
|
|
221
216
|
}
|
|
222
|
-
|
|
223
|
-
return shortId;
|
|
224
217
|
},
|
|
225
218
|
};
|
|
226
219
|
|
|
@@ -304,78 +297,3 @@ function getViewKeyFromStoredKey(
|
|
|
304
297
|
|
|
305
298
|
return storedKey;
|
|
306
299
|
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* A collection of events that can be emitted by a {@link TreeNode}.
|
|
310
|
-
*
|
|
311
|
-
* @privateRemarks
|
|
312
|
-
* TODO: add a way to subscribe to a specific field (for nodeChanged and treeChanged).
|
|
313
|
-
* Probably have object node and map node specific APIs for this.
|
|
314
|
-
*
|
|
315
|
-
* TODO: ensure that subscription API for fields aligns with API for subscribing to the root.
|
|
316
|
-
*
|
|
317
|
-
* TODO: add more wider area (avoid needing tons of nodeChanged registration) events for use-cases other than treeChanged.
|
|
318
|
-
* Some ideas:
|
|
319
|
-
*
|
|
320
|
-
* - treeChanged, but with some subtrees/fields/paths excluded
|
|
321
|
-
* - helper to batch several nodeChanged calls to a treeChanged scope
|
|
322
|
-
* - parent change (ex: registration on the parent field for a specific index: maybe allow it for a range. Ex: node event takes optional field and optional index range?)
|
|
323
|
-
* - new content inserted into subtree. Either provide event for this and/or enough info to treeChanged to find and search the new sub-trees.
|
|
324
|
-
* Add separate (non event related) API to efficiently scan tree for given set of types (using low level cursor and schema based filtering)
|
|
325
|
-
* to allow efficiently searching for new content (and initial content) of a given type.
|
|
326
|
-
*
|
|
327
|
-
* @sealed @public
|
|
328
|
-
*/
|
|
329
|
-
export interface TreeChangeEvents {
|
|
330
|
-
/**
|
|
331
|
-
* Emitted by a node after a batch of changes has been applied to the tree, if a change affected the node, where a
|
|
332
|
-
* change is:
|
|
333
|
-
*
|
|
334
|
-
* - For an object node, when the value of one of its properties changes (i.e., the property's value is set
|
|
335
|
-
* to something else, including `undefined`).
|
|
336
|
-
*
|
|
337
|
-
* - For an array node, when an element is added, removed, or moved.
|
|
338
|
-
*
|
|
339
|
-
* - For a map node, when an entry is added, updated, or removed.
|
|
340
|
-
*
|
|
341
|
-
* @remarks
|
|
342
|
-
* This event is not emitted when:
|
|
343
|
-
*
|
|
344
|
-
* - Properties of a child node change. Notably, updates to an array node or a map node (like adding or removing
|
|
345
|
-
* elements/entries) will emit this event on the array/map node itself, but not on the node that contains the
|
|
346
|
-
* array/map node as one of its properties.
|
|
347
|
-
*
|
|
348
|
-
* - The node is moved to a different location in the tree or removed from the tree.
|
|
349
|
-
* In this case the event is emitted on the _parent_ node, not the node itself.
|
|
350
|
-
*
|
|
351
|
-
* For remote edits, this event is not guaranteed to occur in the same order or quantity that it did in
|
|
352
|
-
* the client that made the original edit.
|
|
353
|
-
*
|
|
354
|
-
* When it is emitted, the tree is guaranteed to be in-schema.
|
|
355
|
-
*
|
|
356
|
-
* @privateRemarks
|
|
357
|
-
* This event occurs whenever the apparent contents of the node instance change, regardless of what caused the change.
|
|
358
|
-
* For example, it will fire when the local client reassigns a child, when part of a remote edit is applied to the
|
|
359
|
-
* node, or when the node has to be updated due to resolution of a merge conflict
|
|
360
|
-
* (for example a previously applied local change might be undone, then reapplied differently or not at all).
|
|
361
|
-
*/
|
|
362
|
-
nodeChanged(): void;
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Emitted by a node after a batch of changes has been applied to the tree, when something changed anywhere in the
|
|
366
|
-
* subtree rooted at it.
|
|
367
|
-
*
|
|
368
|
-
* @remarks
|
|
369
|
-
* This event is not emitted when the node itself is moved to a different location in the tree or removed from the tree.
|
|
370
|
-
* In that case it is emitted on the _parent_ node, not the node itself.
|
|
371
|
-
*
|
|
372
|
-
* The node itself is part of the subtree, so this event will be emitted even if the only changes are to the properties
|
|
373
|
-
* of the node itself.
|
|
374
|
-
*
|
|
375
|
-
* For remote edits, this event is not guaranteed to occur in the same order or quantity that it did in
|
|
376
|
-
* the client that made the original edit.
|
|
377
|
-
*
|
|
378
|
-
* When it is emitted, the tree is guaranteed to be in-schema.
|
|
379
|
-
*/
|
|
380
|
-
treeChanged(): void;
|
|
381
|
-
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
|
+
import { createEmitter, type Listenable, type Off } from "../events/index.js";
|
|
8
|
+
import type { TreeChangeEvents, TreeNode } from "./types.js";
|
|
9
|
+
import type { AnchorNode } from "../core/index.js";
|
|
10
|
+
import {
|
|
11
|
+
flexTreeSlot,
|
|
12
|
+
isFreedSymbol,
|
|
13
|
+
LazyEntity,
|
|
14
|
+
TreeStatus,
|
|
15
|
+
treeStatusFromAnchorCache,
|
|
16
|
+
} from "../feature-libraries/index.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Contains state and an internal API for managing {@link TreeNode}s.
|
|
20
|
+
* @remarks All {@link TreeNode}s have an associated kernel object.
|
|
21
|
+
* The kernel has the same lifetime as the node and spans both its unhydrated and hydrated states.
|
|
22
|
+
* When hydration occurs, the kernel is notified via the {@link TreeNodeKernel.hydrate | hydrate} method.
|
|
23
|
+
*/
|
|
24
|
+
export class TreeNodeKernel implements Listenable<TreeChangeEvents> {
|
|
25
|
+
#hydrated?: {
|
|
26
|
+
anchorNode: AnchorNode;
|
|
27
|
+
offAnchorNode: Off;
|
|
28
|
+
};
|
|
29
|
+
#events = createEmitter<TreeChangeEvents>();
|
|
30
|
+
|
|
31
|
+
public constructor(public readonly node: TreeNode) {}
|
|
32
|
+
|
|
33
|
+
public hydrate(anchorNode: AnchorNode): void {
|
|
34
|
+
const offChildrenChanged = anchorNode.on("childrenChangedAfterBatch", () => {
|
|
35
|
+
this.#events.emit("nodeChanged");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const offSubtreeChanged = anchorNode.on("subtreeChangedAfterBatch", () => {
|
|
39
|
+
this.#events.emit("treeChanged");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const offAfterDestroy = anchorNode.on("afterDestroy", () => this.dispose());
|
|
43
|
+
|
|
44
|
+
this.#hydrated = {
|
|
45
|
+
anchorNode,
|
|
46
|
+
offAnchorNode: () => {
|
|
47
|
+
offChildrenChanged();
|
|
48
|
+
offSubtreeChanged();
|
|
49
|
+
offAfterDestroy();
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public dehydrate(): void {
|
|
55
|
+
this.#hydrated?.offAnchorNode?.();
|
|
56
|
+
this.#hydrated = undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public isHydrated(): boolean {
|
|
60
|
+
return this.#hydrated !== undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public getStatus(): TreeStatus {
|
|
64
|
+
if (this.#hydrated?.anchorNode === undefined) {
|
|
65
|
+
return TreeStatus.New;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// TODO: Replace this check with the proper check against the cursor state when the cursor becomes part of the kernel
|
|
69
|
+
const flex = this.#hydrated.anchorNode.slots.get(flexTreeSlot);
|
|
70
|
+
if (flex !== undefined) {
|
|
71
|
+
assert(flex instanceof LazyEntity, 0x9b4 /* Unexpected flex node implementation */);
|
|
72
|
+
if (flex[isFreedSymbol]()) {
|
|
73
|
+
return TreeStatus.Deleted;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return treeStatusFromAnchorCache(this.#hydrated.anchorNode);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public on<K extends keyof TreeChangeEvents>(
|
|
81
|
+
eventName: K,
|
|
82
|
+
listener: TreeChangeEvents[K],
|
|
83
|
+
): Off {
|
|
84
|
+
return this.#events.on(eventName, listener);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public dispose(): void {
|
|
88
|
+
this.dehydrate();
|
|
89
|
+
// TODO: go to the context and remove myself from withAnchors
|
|
90
|
+
}
|
|
91
|
+
}
|