@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
|
@@ -137,6 +137,13 @@ export interface SharedTreeBranchEvents<TEditor extends ChangeFamilyEditor, TCha
|
|
|
137
137
|
*/
|
|
138
138
|
transactionAborted(isOuterTransaction: boolean): void;
|
|
139
139
|
|
|
140
|
+
/**
|
|
141
|
+
* Fired after the current transaction is completely rolled back.
|
|
142
|
+
* @param isOuterTransaction - true iff the transaction being aborted is the outermost transaction
|
|
143
|
+
* as opposed to a nested transaction.
|
|
144
|
+
*/
|
|
145
|
+
transactionRolledBack(isOuterTransaction: boolean): void;
|
|
146
|
+
|
|
140
147
|
/**
|
|
141
148
|
* Fired after the current transaction is committed.
|
|
142
149
|
* @param isOuterTransaction - true iff the transaction being committed is the outermost transaction
|
|
@@ -244,6 +251,7 @@ export class SharedTreeBranch<
|
|
|
244
251
|
): [change: TChange, newCommit: GraphCommit<TChange>] {
|
|
245
252
|
this.assertNotDisposed();
|
|
246
253
|
|
|
254
|
+
// TODO: This should not be necessary when receiving changes from other clients.
|
|
247
255
|
const changeWithRevision = this.changeFamily.rebaser.changeRevision(change, revision);
|
|
248
256
|
|
|
249
257
|
const newHead = mintCommit(this.head, {
|
|
@@ -360,6 +368,7 @@ export class SharedTreeBranch<
|
|
|
360
368
|
|
|
361
369
|
this.emit("transactionAborted", this.transactions.size === 0);
|
|
362
370
|
if (commits.length === 0) {
|
|
371
|
+
this.emit("transactionRolledBack", this.transactions.size === 0);
|
|
363
372
|
return [undefined, []];
|
|
364
373
|
}
|
|
365
374
|
|
|
@@ -386,6 +395,7 @@ export class SharedTreeBranch<
|
|
|
386
395
|
this.emit("beforeChange", changeEvent);
|
|
387
396
|
this.head = startCommit;
|
|
388
397
|
this.emit("afterChange", changeEvent);
|
|
398
|
+
this.emit("transactionRolledBack", this.transactions.size === 0);
|
|
389
399
|
return [change, commits];
|
|
390
400
|
}
|
|
391
401
|
|
|
@@ -34,7 +34,14 @@ import {
|
|
|
34
34
|
type SchemaPolicy,
|
|
35
35
|
type TreeStoredSchemaRepository,
|
|
36
36
|
} from "../core/index.js";
|
|
37
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
type JsonCompatibleReadOnly,
|
|
39
|
+
brand,
|
|
40
|
+
Breakable,
|
|
41
|
+
type WithBreakable,
|
|
42
|
+
throwIfBroken,
|
|
43
|
+
breakingClass,
|
|
44
|
+
} from "../util/index.js";
|
|
38
45
|
|
|
39
46
|
import { type SharedTreeBranch, getChangeReplaceType } from "./branch.js";
|
|
40
47
|
import { EditManager, minimumPossibleSequenceNumber } from "./editManager.js";
|
|
@@ -62,12 +69,15 @@ export interface ClonableSchemaAndPolicy extends SchemaAndPolicy {
|
|
|
62
69
|
}
|
|
63
70
|
|
|
64
71
|
/**
|
|
65
|
-
* Generic shared tree, which needs to be configured with indexes, field kinds and
|
|
66
|
-
*
|
|
67
|
-
* TODO: actually implement
|
|
68
|
-
* TODO: is history policy a detail of what indexes are used, or is there something else to it?
|
|
72
|
+
* Generic shared tree, which needs to be configured with indexes, field kinds and other configuration.
|
|
69
73
|
*/
|
|
70
|
-
|
|
74
|
+
@breakingClass
|
|
75
|
+
export class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange>
|
|
76
|
+
extends SharedObject
|
|
77
|
+
implements WithBreakable
|
|
78
|
+
{
|
|
79
|
+
public readonly breaker: Breakable = new Breakable("Shared Tree");
|
|
80
|
+
|
|
71
81
|
private readonly editManager: EditManager<TEditor, TChange, ChangeFamily<TEditor, TChange>>;
|
|
72
82
|
private readonly summarizables: readonly Summarizable[];
|
|
73
83
|
/**
|
|
@@ -85,6 +95,13 @@ export class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange> extends
|
|
|
85
95
|
return this.getLocalBranch().editor;
|
|
86
96
|
}
|
|
87
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Gets the revision at the head of the trunk.
|
|
100
|
+
*/
|
|
101
|
+
protected get trunkHeadRevision(): RevisionTag {
|
|
102
|
+
return this.editManager.getTrunkHead().revision;
|
|
103
|
+
}
|
|
104
|
+
|
|
88
105
|
/**
|
|
89
106
|
* Used to encode/decode messages sent to/received from the Fluid runtime.
|
|
90
107
|
*
|
|
@@ -262,6 +279,7 @@ export class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange> extends
|
|
|
262
279
|
|
|
263
280
|
// TODO: SharedObject's merging of the two summary methods into summarizeCore is not what we want here:
|
|
264
281
|
// We might want to not subclass it, or override/reimplement most of its functionality.
|
|
282
|
+
@throwIfBroken
|
|
265
283
|
protected summarizeCore(
|
|
266
284
|
serializer: IFluidSerializer,
|
|
267
285
|
telemetryContext?: ITelemetryContext,
|
|
@@ -304,6 +322,7 @@ export class SharedTreeCore<TEditor extends ChangeFamilyEditor, TChange> extends
|
|
|
304
322
|
* @returns the submitted commit. This is undefined if the underlying `SharedObject` is not attached,
|
|
305
323
|
* and may differ from `commit` due to enrichments like detached tree refreshers.
|
|
306
324
|
*/
|
|
325
|
+
|
|
307
326
|
private submitCommit(
|
|
308
327
|
commit: GraphCommit<TChange>,
|
|
309
328
|
schemaAndPolicy: ClonableSchemaAndPolicy,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
getOrCreateMapTreeNode,
|
|
20
20
|
getSchemaAndPolicy,
|
|
21
21
|
isMapTreeNode,
|
|
22
|
+
isFlexTreeNode,
|
|
22
23
|
} from "../feature-libraries/index.js";
|
|
23
24
|
import {
|
|
24
25
|
type InsertableContent,
|
|
@@ -26,7 +27,7 @@ import {
|
|
|
26
27
|
markContentType,
|
|
27
28
|
prepareContentForHydration,
|
|
28
29
|
} from "./proxies.js";
|
|
29
|
-
import { getFlexNode } from "./proxyBinding.js";
|
|
30
|
+
import { getFlexNode, getKernel } from "./proxyBinding.js";
|
|
30
31
|
import {
|
|
31
32
|
NodeKind,
|
|
32
33
|
type ImplicitAllowedTypes,
|
|
@@ -39,7 +40,12 @@ import {
|
|
|
39
40
|
normalizeFieldSchema,
|
|
40
41
|
} from "./schemaTypes.js";
|
|
41
42
|
import { mapTreeFromNodeData } from "./toMapTree.js";
|
|
42
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
type TreeNode,
|
|
45
|
+
TreeNodeValid,
|
|
46
|
+
type InternalTreeNode,
|
|
47
|
+
type MostDerivedData,
|
|
48
|
+
} from "./types.js";
|
|
43
49
|
import { fail } from "../util/index.js";
|
|
44
50
|
import { getFlexSchema } from "./toFlexSchema.js";
|
|
45
51
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
@@ -215,6 +221,11 @@ export interface TreeArrayNodeBase<out T, in TNew, in TMoveFrom>
|
|
|
215
221
|
sourceEnd: number,
|
|
216
222
|
source: TMoveFrom,
|
|
217
223
|
): void;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Returns a custom IterableIterator which throws usage errors if concurrent editing and iteration occurs.
|
|
227
|
+
*/
|
|
228
|
+
values(): IterableIterator<T>;
|
|
218
229
|
}
|
|
219
230
|
|
|
220
231
|
/**
|
|
@@ -315,7 +326,6 @@ const arrayPrototypeKeys = [
|
|
|
315
326
|
"some",
|
|
316
327
|
"toLocaleString",
|
|
317
328
|
"toString",
|
|
318
|
-
"values",
|
|
319
329
|
|
|
320
330
|
// "copyWithin",
|
|
321
331
|
// "fill",
|
|
@@ -489,7 +499,6 @@ declare abstract class NodeWithArrayFeatures<Input, T>
|
|
|
489
499
|
): boolean;
|
|
490
500
|
toLocaleString(): string;
|
|
491
501
|
toString(): string;
|
|
492
|
-
values(): IterableIterator<T>;
|
|
493
502
|
}
|
|
494
503
|
/* eslint-enable @typescript-eslint/explicit-member-accessibility, @typescript-eslint/no-explicit-any */
|
|
495
504
|
|
|
@@ -554,16 +563,8 @@ function createArrayNodeProxy(
|
|
|
554
563
|
return Reflect.get(dispatchTarget, key, receiver) as unknown;
|
|
555
564
|
}
|
|
556
565
|
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
if (value === undefined) {
|
|
560
|
-
return undefined;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
// TODO: Ideally, we would return leaves without first boxing them. However, this is not
|
|
564
|
-
// as simple as calling '.content' since this skips the node and returns the FieldNode's
|
|
565
|
-
// inner field.
|
|
566
|
-
return getOrCreateNodeProxy(value);
|
|
566
|
+
const maybeContent = field.at(maybeIndex);
|
|
567
|
+
return isFlexTreeNode(maybeContent) ? getOrCreateNodeProxy(maybeContent) : maybeContent;
|
|
567
568
|
},
|
|
568
569
|
set: (target, key, newValue, receiver) => {
|
|
569
570
|
if (key === "length") {
|
|
@@ -590,7 +591,7 @@ function createArrayNodeProxy(
|
|
|
590
591
|
"Cannot set indexed properties on array nodes. Use array node mutation APIs to alter the array.",
|
|
591
592
|
);
|
|
592
593
|
}
|
|
593
|
-
return allowAdditionalProperties ? Reflect.set(target, key, newValue) : false;
|
|
594
|
+
return allowAdditionalProperties ? Reflect.set(target, key, newValue, receiver) : false;
|
|
594
595
|
},
|
|
595
596
|
has: (target, key) => {
|
|
596
597
|
const field = getSequenceField(proxy);
|
|
@@ -672,6 +673,21 @@ abstract class CustomArrayNodeBase<const T extends ImplicitAllowedTypes>
|
|
|
672
673
|
|
|
673
674
|
protected abstract get simpleSchema(): T;
|
|
674
675
|
|
|
676
|
+
/**
|
|
677
|
+
* Generation number which is incremented any time we have an edit on the node.
|
|
678
|
+
* Used during iteration to make sure there has been no edits that were concurrently made.
|
|
679
|
+
*/
|
|
680
|
+
#generationNumber: number = 0;
|
|
681
|
+
|
|
682
|
+
public constructor(
|
|
683
|
+
input: Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>> | InternalTreeNode,
|
|
684
|
+
) {
|
|
685
|
+
super(input);
|
|
686
|
+
getKernel(this).on("nodeChanged", () => {
|
|
687
|
+
this.#generationNumber += 1;
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
|
|
675
691
|
#cursorFromFieldData(value: Insertable<T>): ITreeCursorSynchronous {
|
|
676
692
|
if (isMapTreeNode(getFlexNode(this))) {
|
|
677
693
|
throw new UsageError(`An array cannot be mutated before being inserted into the tree`);
|
|
@@ -827,13 +843,7 @@ abstract class CustomArrayNodeBase<const T extends ImplicitAllowedTypes>
|
|
|
827
843
|
const destinationField = getSequenceField(this);
|
|
828
844
|
validateIndex(destinationIndex, destinationField, "moveRangeToIndex", true);
|
|
829
845
|
validateIndexRange(sourceStart, sourceEnd, source ?? destinationField, "moveRangeToIndex");
|
|
830
|
-
const sourceField =
|
|
831
|
-
source !== undefined
|
|
832
|
-
? destinationField.isSameAs(getSequenceField(source))
|
|
833
|
-
? destinationField
|
|
834
|
-
: getSequenceField(source)
|
|
835
|
-
: destinationField;
|
|
836
|
-
|
|
846
|
+
const sourceField = source !== undefined ? getSequenceField(source) : destinationField;
|
|
837
847
|
// TODO: determine support for move across different sequence types
|
|
838
848
|
if (destinationField.schema.types !== undefined && sourceField !== destinationField) {
|
|
839
849
|
for (let i = sourceStart; i < sourceEnd; i++) {
|
|
@@ -855,6 +865,23 @@ abstract class CustomArrayNodeBase<const T extends ImplicitAllowedTypes>
|
|
|
855
865
|
destinationIndex,
|
|
856
866
|
);
|
|
857
867
|
}
|
|
868
|
+
|
|
869
|
+
public values(): IterableIterator<TreeNodeFromImplicitAllowedTypes<T>> {
|
|
870
|
+
return this.generateValues(this.#generationNumber);
|
|
871
|
+
}
|
|
872
|
+
private *generateValues(
|
|
873
|
+
initialLastUpdatedStamp: number,
|
|
874
|
+
): Generator<TreeNodeFromImplicitAllowedTypes<T>> {
|
|
875
|
+
if (initialLastUpdatedStamp !== this.#generationNumber) {
|
|
876
|
+
throw new UsageError(`Concurrent editing and iteration is not allowed.`);
|
|
877
|
+
}
|
|
878
|
+
for (let i = 0; i < this.length; i++) {
|
|
879
|
+
yield this.at(i) ?? fail("Index is out of bounds");
|
|
880
|
+
if (initialLastUpdatedStamp !== this.#generationNumber) {
|
|
881
|
+
throw new UsageError(`Concurrent editing and iteration is not allowed.`);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
}
|
|
858
885
|
}
|
|
859
886
|
|
|
860
887
|
/**
|
|
@@ -921,7 +948,7 @@ export function arraySchema<
|
|
|
921
948
|
);
|
|
922
949
|
}
|
|
923
950
|
|
|
924
|
-
protected static override constructorCached:
|
|
951
|
+
protected static override constructorCached: MostDerivedData | undefined = undefined;
|
|
925
952
|
|
|
926
953
|
protected static override oneTimeSetup<T2>(this: typeof TreeNodeValid<T2>): void {
|
|
927
954
|
flexSchema = getFlexSchema(this as unknown as TreeNodeSchema) as FlexFieldNodeSchema;
|
package/src/simple-tree/index.ts
CHANGED
|
@@ -39,8 +39,8 @@ export {
|
|
|
39
39
|
type ApplyKind,
|
|
40
40
|
} from "./schemaTypes.js";
|
|
41
41
|
export { SchemaFactory, type ScopedSchemaName } from "./schemaFactory.js";
|
|
42
|
-
export { getFlexNode } from "./proxyBinding.js";
|
|
43
|
-
export { treeNodeApi, type TreeNodeApi
|
|
42
|
+
export { getFlexNode, tryDisposeTreeNode } from "./proxyBinding.js";
|
|
43
|
+
export { treeNodeApi, type TreeNodeApi } from "./treeNodeApi.js";
|
|
44
44
|
export { toFlexSchema, cursorFromUnhydratedRoot } from "./toFlexSchema.js";
|
|
45
45
|
export type {
|
|
46
46
|
FieldHasDefaultUnsafe,
|
|
@@ -82,7 +82,7 @@ export {
|
|
|
82
82
|
|
|
83
83
|
// TreeNode is only type exported, which prevents use of the class object for unsupported use-cases like direct sub-classing and instancof.
|
|
84
84
|
// See docs on TreeNode for more details.
|
|
85
|
-
export type { TreeNode, Unhydrated, InternalTreeNode } from "./types.js";
|
|
85
|
+
export type { TreeChangeEvents, TreeNode, Unhydrated, InternalTreeNode } from "./types.js";
|
|
86
86
|
export {
|
|
87
87
|
TreeArrayNode,
|
|
88
88
|
IterableTreeArrayContent,
|
|
@@ -32,7 +32,7 @@ type UnbrandedName<T extends FlexLeafNodeSchema> = T["name"] extends TreeNodeSch
|
|
|
32
32
|
* @privateRemarks
|
|
33
33
|
* This class refers to the underlying flex tree schema in its constructor, so this class can't be included in the package API.
|
|
34
34
|
*/
|
|
35
|
-
class LeafNodeSchema<T extends FlexLeafNodeSchema>
|
|
35
|
+
export class LeafNodeSchema<T extends FlexLeafNodeSchema>
|
|
36
36
|
implements TreeNodeSchemaNonClass<UnbrandedName<T>, NodeKind.Leaf, TreeValue<T["info"]>>
|
|
37
37
|
{
|
|
38
38
|
public readonly identifier: UnbrandedName<T>;
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
typeNameSymbol,
|
|
33
33
|
} from "./schemaTypes.js";
|
|
34
34
|
import { mapTreeFromNodeData } from "./toMapTree.js";
|
|
35
|
-
import { type TreeNode, TreeNodeValid } from "./types.js";
|
|
35
|
+
import { type MostDerivedData, type TreeNode, TreeNodeValid } from "./types.js";
|
|
36
36
|
import { getFlexSchema } from "./toFlexSchema.js";
|
|
37
37
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
38
38
|
|
|
@@ -246,7 +246,7 @@ export function mapSchema<
|
|
|
246
246
|
);
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
-
protected static override constructorCached:
|
|
249
|
+
protected static override constructorCached: MostDerivedData | undefined = undefined;
|
|
250
250
|
|
|
251
251
|
protected static override oneTimeSetup<T2>(this: typeof TreeNodeValid<T2>): void {
|
|
252
252
|
flexSchema = getFlexSchema(this as unknown as TreeNodeSchema) as FlexMapNodeSchema;
|
|
@@ -44,7 +44,12 @@ import {
|
|
|
44
44
|
FieldKind,
|
|
45
45
|
} from "./schemaTypes.js";
|
|
46
46
|
import { mapTreeFromNodeData } from "./toMapTree.js";
|
|
47
|
-
import {
|
|
47
|
+
import {
|
|
48
|
+
type InternalTreeNode,
|
|
49
|
+
type MostDerivedData,
|
|
50
|
+
type TreeNode,
|
|
51
|
+
TreeNodeValid,
|
|
52
|
+
} from "./types.js";
|
|
48
53
|
import { type RestrictiveReadonlyRecord, fail, type FlattenKeys } from "../util/index.js";
|
|
49
54
|
import { getFlexSchema } from "./toFlexSchema.js";
|
|
50
55
|
|
|
@@ -187,7 +192,8 @@ function createProxyHandler(
|
|
|
187
192
|
set(target, viewKey, value: InsertableContent | undefined, proxy) {
|
|
188
193
|
const fieldInfo = flexKeyMap.get(viewKey);
|
|
189
194
|
if (fieldInfo === undefined) {
|
|
190
|
-
|
|
195
|
+
// Pass the proxy as the receiver here, so that setters on the prototype receive `proxy` as `this`.
|
|
196
|
+
return allowAdditionalProperties ? Reflect.set(target, viewKey, value, proxy) : false;
|
|
191
197
|
}
|
|
192
198
|
|
|
193
199
|
const flexNode = getFlexNode(proxy);
|
|
@@ -359,7 +365,7 @@ export function objectSchema<
|
|
|
359
365
|
);
|
|
360
366
|
}
|
|
361
367
|
|
|
362
|
-
protected static override constructorCached:
|
|
368
|
+
protected static override constructorCached: MostDerivedData | undefined = undefined;
|
|
363
369
|
|
|
364
370
|
protected static override oneTimeSetup<T2>(this: typeof TreeNodeValid<T2>): void {
|
|
365
371
|
// One time initialization that required knowing the most derived type (from this.constructor) and thus has to be lazy.
|
|
@@ -20,9 +20,7 @@ import {
|
|
|
20
20
|
type FlexFieldSchema,
|
|
21
21
|
type FlexTreeField,
|
|
22
22
|
type FlexTreeNode,
|
|
23
|
-
type FlexTreeNodeEvents,
|
|
24
23
|
type FlexTreeTypedField,
|
|
25
|
-
type MapTreeNode,
|
|
26
24
|
tryGetMapTreeNode,
|
|
27
25
|
typeNameSymbol,
|
|
28
26
|
isFlexTreeNode,
|
|
@@ -32,7 +30,6 @@ import { type Mutable, fail, isReadonlyArray } from "../util/index.js";
|
|
|
32
30
|
import { anchorProxy, tryGetFlexNode, tryGetProxy } from "./proxyBinding.js";
|
|
33
31
|
import { tryGetSimpleNodeSchema } from "./schemaCaching.js";
|
|
34
32
|
import type { TreeNode, Unhydrated } from "./types.js";
|
|
35
|
-
import type { Off } from "../events/index.js";
|
|
36
33
|
|
|
37
34
|
/**
|
|
38
35
|
* Detects if the given 'candidate' is a TreeNode.
|
|
@@ -61,10 +58,8 @@ export function getProxyForField(field: FlexTreeField): TreeNode | TreeValue | u
|
|
|
61
58
|
FlexFieldSchema<typeof FieldKinds.required | typeof FieldKinds.optional>
|
|
62
59
|
>,
|
|
63
60
|
): TreeNode | TreeValue | undefined {
|
|
64
|
-
const
|
|
65
|
-
return isFlexTreeNode(
|
|
66
|
-
? getOrCreateNodeProxy(maybeUnboxedContent)
|
|
67
|
-
: maybeUnboxedContent;
|
|
61
|
+
const maybeContent = flexField.content;
|
|
62
|
+
return isFlexTreeNode(maybeContent) ? getOrCreateNodeProxy(maybeContent) : maybeContent;
|
|
68
63
|
}
|
|
69
64
|
switch (field.schema.kind) {
|
|
70
65
|
case FieldKinds.required: {
|
|
@@ -118,7 +113,6 @@ export function getOrCreateNodeProxy(flexNode: FlexTreeNode): TreeNode | TreeVal
|
|
|
118
113
|
/** The path of a proxy, relative to the root of the content tree that the proxy belongs to */
|
|
119
114
|
interface RelativeProxyPath {
|
|
120
115
|
readonly path: UpPath;
|
|
121
|
-
readonly mapTreeNode: MapTreeNode;
|
|
122
116
|
readonly proxy: TreeNode;
|
|
123
117
|
}
|
|
124
118
|
|
|
@@ -152,8 +146,8 @@ export function prepareContentForHydration(
|
|
|
152
146
|
proxyPaths: [],
|
|
153
147
|
};
|
|
154
148
|
|
|
155
|
-
walkMapTree(content, proxies.rootPath, (p,
|
|
156
|
-
proxies.proxyPaths.push({ path: p,
|
|
149
|
+
walkMapTree(content, proxies.rootPath, (p, proxy) => {
|
|
150
|
+
proxies.proxyPaths.push({ path: p, proxy });
|
|
157
151
|
});
|
|
158
152
|
|
|
159
153
|
bindProxies([proxies], forest);
|
|
@@ -174,8 +168,8 @@ function prepareArrayContentForHydration(
|
|
|
174
168
|
},
|
|
175
169
|
proxyPaths: [],
|
|
176
170
|
});
|
|
177
|
-
walkMapTree(content[i], proxies[i].rootPath, (p,
|
|
178
|
-
proxies[i].proxyPaths.push({ path: p,
|
|
171
|
+
walkMapTree(content[i], proxies[i].rootPath, (p, proxy) => {
|
|
172
|
+
proxies[i].proxyPaths.push({ path: p, proxy });
|
|
179
173
|
});
|
|
180
174
|
}
|
|
181
175
|
|
|
@@ -185,13 +179,13 @@ function prepareArrayContentForHydration(
|
|
|
185
179
|
function walkMapTree(
|
|
186
180
|
mapTree: MapTree,
|
|
187
181
|
path: UpPath,
|
|
188
|
-
onVisitTreeNode: (path: UpPath,
|
|
182
|
+
onVisitTreeNode: (path: UpPath, treeNode: TreeNode) => void,
|
|
189
183
|
): void {
|
|
190
184
|
const mapTreeNode = tryGetMapTreeNode(mapTree);
|
|
191
185
|
if (mapTreeNode !== undefined) {
|
|
192
186
|
const treeNode = tryGetProxy(mapTreeNode);
|
|
193
187
|
if (treeNode !== undefined) {
|
|
194
|
-
onVisitTreeNode(path,
|
|
188
|
+
onVisitTreeNode(path, treeNode);
|
|
195
189
|
}
|
|
196
190
|
}
|
|
197
191
|
|
|
@@ -217,25 +211,8 @@ function bindProxies(proxies: RootedProxyPaths[], forest: IForestSubscription):
|
|
|
217
211
|
let i = 0;
|
|
218
212
|
const off = forest.on("afterRootFieldCreated", (fieldKey) => {
|
|
219
213
|
(proxies[i].rootPath as Mutable<UpPath>).parentField = fieldKey;
|
|
220
|
-
for (const { path,
|
|
221
|
-
|
|
222
|
-
mapTreeNode.forwardEvents({
|
|
223
|
-
on<K extends keyof FlexTreeNodeEvents>(
|
|
224
|
-
eventName: K,
|
|
225
|
-
listener: FlexTreeNodeEvents[K],
|
|
226
|
-
): Off {
|
|
227
|
-
switch (eventName) {
|
|
228
|
-
case "nodeChanged": {
|
|
229
|
-
return anchorNode.on("childrenChangedAfterBatch", listener);
|
|
230
|
-
}
|
|
231
|
-
case "treeChanged": {
|
|
232
|
-
return anchorNode.on("subtreeChangedAfterBatch", listener);
|
|
233
|
-
}
|
|
234
|
-
default:
|
|
235
|
-
fail("Unexpected event subscription");
|
|
236
|
-
}
|
|
237
|
-
},
|
|
238
|
-
});
|
|
214
|
+
for (const { path, proxy } of proxies[i].proxyPaths) {
|
|
215
|
+
anchorProxy(forest.anchors, path, proxy);
|
|
239
216
|
}
|
|
240
217
|
if (++i === proxies.length) {
|
|
241
218
|
off();
|
|
@@ -29,6 +29,7 @@ import type { TreeNode } from "./types.js";
|
|
|
29
29
|
// eslint-disable-next-line import/no-internal-modules
|
|
30
30
|
import { makeTree } from "../feature-libraries/flex-tree/lazyNode.js";
|
|
31
31
|
import type { TreeMapNode } from "./mapNode.js";
|
|
32
|
+
import { TreeNodeKernel } from "./treeNodeKernel.js";
|
|
32
33
|
|
|
33
34
|
// This file contains various maps and helpers for supporting proxy binding (a.k.a. proxy hydration).
|
|
34
35
|
// See ./ProxyBinding.md for a high-level overview of the process.
|
|
@@ -185,9 +186,31 @@ function bindProxyToAnchorNode(proxy: TreeNode, anchorNode: AnchorNode): void {
|
|
|
185
186
|
proxyToAnchorNode.set(proxy, anchorNode);
|
|
186
187
|
// However, it's fine for an anchor node to rotate through different proxies when the content at that place in the tree is replaced.
|
|
187
188
|
anchorNode.slots.set(proxySlot, proxy);
|
|
189
|
+
getKernel(proxy).hydrate(anchorNode);
|
|
188
190
|
}
|
|
189
191
|
|
|
190
192
|
/**
|
|
191
193
|
* Given a node's schema, return the corresponding object in the proxy-based API.
|
|
192
194
|
*/
|
|
193
195
|
type TypedNode<TSchema extends FlexTreeNodeSchema> = TreeNode & WithType<TSchema["name"]>;
|
|
196
|
+
|
|
197
|
+
export function createKernel(node: TreeNode): void {
|
|
198
|
+
treeNodeToKernel.set(node, new TreeNodeKernel(node));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function getKernel(node: TreeNode): TreeNodeKernel {
|
|
202
|
+
const kernel = treeNodeToKernel.get(node);
|
|
203
|
+
assert(kernel !== undefined, 0x9b1 /* Expected tree node to have kernel */);
|
|
204
|
+
return kernel;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function tryDisposeTreeNode(anchorNode: AnchorNode): void {
|
|
208
|
+
const treeNode = anchorNode.slots.get(proxySlot);
|
|
209
|
+
if (treeNode !== undefined) {
|
|
210
|
+
const kernel = treeNodeToKernel.get(treeNode);
|
|
211
|
+
assert(kernel !== undefined, 0x9b2 /* Expected tree node to have kernel */);
|
|
212
|
+
kernel.dispose();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const treeNodeToKernel = new WeakMap<TreeNode, TreeNodeKernel>();
|
|
@@ -8,6 +8,8 @@ import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
|
|
|
8
8
|
// which degrades the API-Extractor report quality since API-Extractor can not tell the inline import is the same as the non-inline one.
|
|
9
9
|
// eslint-disable-next-line unused-imports/no-unused-imports
|
|
10
10
|
import type { IFluidHandle as _dummyImport } from "@fluidframework/core-interfaces";
|
|
11
|
+
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
12
|
+
import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
|
|
11
13
|
|
|
12
14
|
import type { TreeValue } from "../core/index.js";
|
|
13
15
|
import { type NodeKeyManager, type Unenforced, isLazy } from "../feature-libraries/index.js";
|
|
@@ -20,6 +22,7 @@ import {
|
|
|
20
22
|
import {
|
|
21
23
|
booleanSchema,
|
|
22
24
|
handleSchema,
|
|
25
|
+
LeafNodeSchema,
|
|
23
26
|
nullSchema,
|
|
24
27
|
numberSchema,
|
|
25
28
|
stringSchema,
|
|
@@ -40,7 +43,6 @@ import {
|
|
|
40
43
|
getDefaultProvider,
|
|
41
44
|
} from "./schemaTypes.js";
|
|
42
45
|
import { type TreeArrayNode, arraySchema } from "./arrayNode.js";
|
|
43
|
-
import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
|
|
44
46
|
import {
|
|
45
47
|
type InsertableObjectFromSchemaRecord,
|
|
46
48
|
type TreeObjectNode,
|
|
@@ -64,6 +66,7 @@ import type {
|
|
|
64
66
|
TreeObjectNodeUnsafe,
|
|
65
67
|
} from "./typesUnsafe.js";
|
|
66
68
|
import { createFieldSchemaUnsafe } from "./schemaFactoryRecursive.js";
|
|
69
|
+
import { inPrototypeChain, TreeNodeValid } from "./types.js";
|
|
67
70
|
/**
|
|
68
71
|
* Gets the leaf domain schema compatible with a given {@link TreeValue}.
|
|
69
72
|
*/
|
|
@@ -161,6 +164,13 @@ export class SchemaFactory<
|
|
|
161
164
|
out TScope extends string | undefined = string | undefined,
|
|
162
165
|
TName extends number | string = string,
|
|
163
166
|
> {
|
|
167
|
+
/**
|
|
168
|
+
* TODO:
|
|
169
|
+
* If users of this generate the same name because two different schema with the same identifier were used,
|
|
170
|
+
* the second use can get a cache hit, and reference the wrong schema.
|
|
171
|
+
* Such usage should probably return a distinct type or error but currently does not.
|
|
172
|
+
* The use of markSchemaMostDerived in structuralName at least ensure an error in the case where the collision is from two types extending the same schema factor class.
|
|
173
|
+
*/
|
|
164
174
|
private readonly structuralTypes: Map<string, TreeNodeSchema> = new Map();
|
|
165
175
|
|
|
166
176
|
/**
|
|
@@ -236,7 +246,7 @@ export class SchemaFactory<
|
|
|
236
246
|
public readonly handle = handleSchema;
|
|
237
247
|
|
|
238
248
|
/**
|
|
239
|
-
* Define a {@link
|
|
249
|
+
* Define a {@link TreeNodeSchemaClass} for a {@link TreeObjectNode}.
|
|
240
250
|
*
|
|
241
251
|
* @param name - Unique identifier for this schema within this factory's scope.
|
|
242
252
|
* @param fields - Schema for fields of the object node's schema. Defines what children can be placed under each key.
|
|
@@ -729,6 +739,7 @@ export function structuralName<const T extends string>(
|
|
|
729
739
|
const names = allowedTypes.map((t): string => {
|
|
730
740
|
// Ensure that lazy types (functions) don't slip through here.
|
|
731
741
|
assert(!isLazy(t), 0x83d /* invalid type provided */);
|
|
742
|
+
markSchemaMostDerived(t);
|
|
732
743
|
return t.identifier;
|
|
733
744
|
});
|
|
734
745
|
// Ensure name is order independent
|
|
@@ -740,3 +751,27 @@ export function structuralName<const T extends string>(
|
|
|
740
751
|
}
|
|
741
752
|
return `${collectionName}<${inner}>`;
|
|
742
753
|
}
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* Indicates that a schema is the "most derived" version which is allowed to be used, see {@link MostDerivedData}.
|
|
757
|
+
* Calling helps with error messages about invalid schema usage (using more than one type from single schema factor produced type,
|
|
758
|
+
* and thus calling this for one than one subclass).
|
|
759
|
+
* @remarks
|
|
760
|
+
* Helper for invoking {@link TreeNodeValid.markMostDerived} for any {@link TreeNodeSchema} if it needed.
|
|
761
|
+
*/
|
|
762
|
+
export function markSchemaMostDerived(schema: TreeNodeSchema): void {
|
|
763
|
+
if (schema instanceof LeafNodeSchema) {
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
if (!inPrototypeChain(schema, TreeNodeValid)) {
|
|
768
|
+
// Use JSON.stringify to quote and escape identifier string.
|
|
769
|
+
throw new UsageError(
|
|
770
|
+
`Schema for ${JSON.stringify(
|
|
771
|
+
schema.identifier,
|
|
772
|
+
)} does not extend a SchemaFactory generated class. This is invalid.`,
|
|
773
|
+
);
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
(schema as typeof TreeNodeValid & TreeNodeSchema).markMostDerived();
|
|
777
|
+
}
|
|
@@ -67,6 +67,41 @@ export interface TreeNodeSchemaNonClass<
|
|
|
67
67
|
*
|
|
68
68
|
* Using classes in this way allows introducing a named type and a named value at the same time, helping keep the runtime and compile time information together and easy to refer to un a uniform way.
|
|
69
69
|
* Additionally, this works around https://github.com/microsoft/TypeScript/issues/55832 which causes similar patterns with less explicit types to infer "any" in the d.ts file.
|
|
70
|
+
*
|
|
71
|
+
* When sub-classing a a `TreeNodeSchemaClass`, some extra rules must be followed:
|
|
72
|
+
*
|
|
73
|
+
* - Only ever use a single class from the schema's class hierarchy within a document and its schema.
|
|
74
|
+
* For example, if using {@link SchemaFactory.object} you can do:
|
|
75
|
+
* ```typescript
|
|
76
|
+
* // Recommended "customizable" object schema pattern.
|
|
77
|
+
* class Good extends schemaFactory.object("A", {
|
|
78
|
+
* exampleField: schemaFactory.number,
|
|
79
|
+
* }) {
|
|
80
|
+
* public exampleCustomMethod(): void {
|
|
81
|
+
* this.exampleField++;
|
|
82
|
+
* }
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
* But should avoid:
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // This by itself is ok, and opts into "POJO mode".
|
|
88
|
+
* const base = schemaFactory.object("A", {});
|
|
89
|
+
* // This is a bad pattern since it leaves two classes in scope which derive from the same SchemaFactory defined class.
|
|
90
|
+
* // If both get used, its an error!
|
|
91
|
+
* class Invalid extends base {}
|
|
92
|
+
* ```
|
|
93
|
+
* - Do not modify the constructor input parameter types or values:
|
|
94
|
+
* ```typescript
|
|
95
|
+
* class Invalid extends schemaFactory.object("A", {
|
|
96
|
+
* exampleField: schemaFactory.number,
|
|
97
|
+
* }) {
|
|
98
|
+
* // This Modifies the type of the constructor input.
|
|
99
|
+
* // This is unsupported due to programmatic access to the constructor being used internally.
|
|
100
|
+
* public constructor(a: number) {
|
|
101
|
+
* super({ exampleField: a });
|
|
102
|
+
* }
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
70
105
|
* @sealed @public
|
|
71
106
|
*/
|
|
72
107
|
export interface TreeNodeSchemaClass<
|
|
@@ -81,7 +116,7 @@ export interface TreeNodeSchemaClass<
|
|
|
81
116
|
* Constructs an {@link Unhydrated} node with this schema.
|
|
82
117
|
* @remarks
|
|
83
118
|
* This constructor is also used internally to construct hydrated nodes with a different parameter type.
|
|
84
|
-
*
|
|
119
|
+
* Therefore, overriding this constructor with different argument types is not type-safe and is not supported.
|
|
85
120
|
* @sealed
|
|
86
121
|
*/
|
|
87
122
|
new (data: TInsertable | InternalTreeNode): Unhydrated<TNode>;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/* eslint-disable import/no-internal-modules */
|
|
7
7
|
import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
|
|
8
|
+
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
8
9
|
|
|
9
10
|
import type {
|
|
10
11
|
ITreeCursorSynchronous,
|
|
@@ -75,8 +76,8 @@ export function cursorFromUnhydratedRoot(
|
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
interface SchemaInfo {
|
|
78
|
-
toFlex: () => FlexTreeNodeSchema;
|
|
79
|
-
original: TreeNodeSchema;
|
|
79
|
+
readonly toFlex: () => FlexTreeNodeSchema;
|
|
80
|
+
readonly original: TreeNodeSchema;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
type SchemaMap = Map<TreeNodeSchemaIdentifier, SchemaInfo>;
|
|
@@ -180,8 +181,8 @@ export function convertNodeSchema(
|
|
|
180
181
|
const fromMap = schemaMap.get(brand(schema.identifier));
|
|
181
182
|
if (fromMap !== undefined) {
|
|
182
183
|
if (fromMap.original !== schema) {
|
|
183
|
-
// Use JSON.stringify to quote and escape string.
|
|
184
|
-
throw new
|
|
184
|
+
// Use JSON.stringify to quote and escape identifier string.
|
|
185
|
+
throw new UsageError(
|
|
185
186
|
`Multiple schema encountered with the identifier ${JSON.stringify(
|
|
186
187
|
schema.identifier,
|
|
187
188
|
)}. Remove or rename them to avoid the collision.`,
|