@fluidframework/tree 2.10.0 → 2.11.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/CHANGELOG.md +25 -0
- package/api-report/tree.alpha.api.md +47 -16
- package/api-report/tree.beta.api.md +5 -14
- package/api-report/tree.legacy.alpha.api.md +5 -14
- package/api-report/tree.legacy.public.api.md +5 -14
- package/api-report/tree.public.api.md +5 -14
- package/dist/alpha.d.ts +9 -0
- package/dist/core/forest/forest.d.ts +10 -2
- package/dist/core/forest/forest.d.ts.map +1 -1
- package/dist/core/forest/forest.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/utils.d.ts +1 -1
- package/dist/core/rebase/utils.d.ts.map +1 -1
- package/dist/core/rebase/utils.js +11 -8
- package/dist/core/rebase/utils.js.map +1 -1
- package/dist/core/revertible.d.ts +30 -1
- package/dist/core/revertible.d.ts.map +1 -1
- package/dist/core/revertible.js.map +1 -1
- package/dist/core/schema-stored/storedSchemaRepository.d.ts +2 -2
- package/dist/core/schema-stored/storedSchemaRepository.d.ts.map +1 -1
- package/dist/core/schema-stored/storedSchemaRepository.js +5 -5
- package/dist/core/schema-stored/storedSchemaRepository.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts +2 -2
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +21 -21
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.js +3 -2
- package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/dist/core/tree/index.d.ts +1 -1
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js +2 -1
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/visitorUtils.d.ts +25 -1
- package/dist/core/tree/visitorUtils.d.ts.map +1 -1
- package/dist/core/tree/visitorUtils.js +29 -1
- package/dist/core/tree/visitorUtils.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts +5 -2
- package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkedForest.js +24 -14
- package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/uniformChunk.js +2 -2
- package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/context.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +1 -0
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +4 -1
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts +132 -0
- package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -0
- package/dist/feature-libraries/indexing/anchorTreeIndex.js +361 -0
- package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -0
- package/dist/feature-libraries/indexing/index.d.ts +7 -0
- package/dist/feature-libraries/indexing/index.d.ts.map +1 -0
- package/dist/feature-libraries/indexing/index.js +11 -0
- package/dist/feature-libraries/indexing/index.js.map +1 -0
- package/dist/feature-libraries/indexing/types.d.ts +32 -0
- package/dist/feature-libraries/indexing/types.d.ts.map +1 -0
- package/dist/{events/interop.js → feature-libraries/indexing/types.js} +1 -1
- package/dist/feature-libraries/indexing/types.js.map +1 -0
- package/dist/feature-libraries/object-forest/objectForest.d.ts +5 -2
- package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +21 -11
- package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/invert.js +2 -2
- package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +3 -2
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/index.d.ts +1 -1
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js +1 -2
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +7 -1
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +31 -30
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +3 -0
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +56 -20
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js +3 -3
- package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +28 -64
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +152 -129
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +25 -81
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +72 -151
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.d.ts +19 -33
- package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.js +73 -54
- package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.js +2 -1
- package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
- package/dist/shared-tree-core/editManager.d.ts.map +1 -1
- package/dist/shared-tree-core/editManager.js +2 -2
- package/dist/shared-tree-core/editManager.js.map +1 -1
- package/dist/shared-tree-core/index.d.ts +1 -1
- package/dist/shared-tree-core/index.d.ts.map +1 -1
- package/dist/shared-tree-core/index.js +4 -3
- package/dist/shared-tree-core/index.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +2 -2
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +11 -52
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/shared-tree-core/transaction.d.ts +108 -0
- package/dist/shared-tree-core/transaction.d.ts.map +1 -0
- package/dist/shared-tree-core/transaction.js +99 -0
- package/dist/shared-tree-core/transaction.js.map +1 -0
- package/dist/shared-tree-core/transactionEnricher.d.ts +8 -13
- package/dist/shared-tree-core/transactionEnricher.d.ts.map +1 -1
- package/dist/shared-tree-core/transactionEnricher.js +41 -21
- package/dist/shared-tree-core/transactionEnricher.js.map +1 -1
- package/dist/simple-tree/api/identifierIndex.d.ts +21 -0
- package/dist/simple-tree/api/identifierIndex.d.ts.map +1 -0
- package/dist/simple-tree/api/identifierIndex.js +45 -0
- package/dist/simple-tree/api/identifierIndex.js.map +1 -0
- package/dist/simple-tree/api/index.d.ts +2 -0
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +5 -1
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +9 -7
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/simpleTreeIndex.d.ts +65 -0
- package/dist/simple-tree/api/simpleTreeIndex.d.ts.map +1 -0
- package/dist/simple-tree/api/simpleTreeIndex.js +91 -0
- package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -0
- package/dist/simple-tree/api/tree.d.ts +4 -5
- package/dist/simple-tree/api/tree.d.ts.map +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +1 -1
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +2 -1
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts +6 -2
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +53 -22
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.js +2 -2
- package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/dist/simple-tree/index.d.ts +1 -1
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +4 -2
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/objectNode.d.ts +7 -2
- package/dist/simple-tree/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/objectNode.js.map +1 -1
- package/dist/simple-tree/toMapTree.js +3 -3
- package/dist/simple-tree/toMapTree.js.map +1 -1
- package/dist/util/index.d.ts +1 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +5 -4
- package/dist/util/index.js.map +1 -1
- package/dist/util/typeCheck.d.ts +6 -1
- package/dist/util/typeCheck.d.ts.map +1 -1
- package/dist/util/typeCheck.js.map +1 -1
- package/dist/util/typeCheckTests.d.ts +14 -2
- package/dist/util/typeCheckTests.d.ts.map +1 -1
- package/dist/util/typeCheckTests.js.map +1 -1
- package/dist/util/utils.d.ts +29 -0
- package/dist/util/utils.d.ts.map +1 -1
- package/dist/util/utils.js +13 -1
- package/dist/util/utils.js.map +1 -1
- package/lib/alpha.d.ts +9 -0
- package/lib/core/forest/forest.d.ts +10 -2
- package/lib/core/forest/forest.d.ts.map +1 -1
- package/lib/core/forest/forest.js.map +1 -1
- package/lib/core/index.d.ts +2 -2
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +2 -2
- package/lib/core/index.js.map +1 -1
- package/lib/core/rebase/utils.d.ts +1 -1
- package/lib/core/rebase/utils.d.ts.map +1 -1
- package/lib/core/rebase/utils.js +11 -8
- package/lib/core/rebase/utils.js.map +1 -1
- package/lib/core/revertible.d.ts +30 -1
- package/lib/core/revertible.d.ts.map +1 -1
- package/lib/core/revertible.js.map +1 -1
- package/lib/core/schema-stored/storedSchemaRepository.d.ts +2 -2
- package/lib/core/schema-stored/storedSchemaRepository.d.ts.map +1 -1
- package/lib/core/schema-stored/storedSchemaRepository.js +1 -1
- package/lib/core/schema-stored/storedSchemaRepository.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts +2 -2
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +1 -1
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.js +4 -3
- package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/lib/core/tree/index.d.ts +1 -1
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js +1 -1
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/visitorUtils.d.ts +25 -1
- package/lib/core/tree/visitorUtils.d.ts.map +1 -1
- package/lib/core/tree/visitorUtils.js +27 -0
- package/lib/core/tree/visitorUtils.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts +5 -2
- package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkedForest.js +18 -8
- package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/uniformChunk.js +3 -3
- package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/context.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +1 -0
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +1 -0
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts +132 -0
- package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -0
- package/lib/feature-libraries/indexing/anchorTreeIndex.js +356 -0
- package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -0
- package/lib/feature-libraries/indexing/index.d.ts +7 -0
- package/lib/feature-libraries/indexing/index.d.ts.map +1 -0
- package/lib/{events → feature-libraries/indexing}/index.js +1 -1
- package/lib/feature-libraries/indexing/index.js.map +1 -0
- package/lib/feature-libraries/indexing/types.d.ts +32 -0
- package/lib/feature-libraries/indexing/types.d.ts.map +1 -0
- package/lib/{events/interop.js → feature-libraries/indexing/types.js} +1 -1
- package/lib/feature-libraries/indexing/types.js.map +1 -0
- package/lib/feature-libraries/object-forest/objectForest.d.ts +5 -2
- package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +15 -5
- package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/invert.js +4 -4
- package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +4 -3
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/lib/index.d.ts +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/index.d.ts +1 -1
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js +1 -1
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +7 -1
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +2 -2
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +3 -0
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +37 -1
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js +5 -5
- package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +28 -64
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +140 -116
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +25 -81
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +72 -151
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/shared-tree-core/branchCommitEnricher.d.ts +19 -33
- package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
- package/lib/shared-tree-core/branchCommitEnricher.js +74 -55
- package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
- package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/lib/shared-tree-core/defaultResubmitMachine.js +3 -2
- package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
- package/lib/shared-tree-core/editManager.d.ts.map +1 -1
- package/lib/shared-tree-core/editManager.js +1 -1
- package/lib/shared-tree-core/editManager.js.map +1 -1
- package/lib/shared-tree-core/index.d.ts +1 -1
- package/lib/shared-tree-core/index.d.ts.map +1 -1
- package/lib/shared-tree-core/index.js +1 -1
- package/lib/shared-tree-core/index.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +2 -2
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +12 -53
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/shared-tree-core/transaction.d.ts +108 -0
- package/lib/shared-tree-core/transaction.d.ts.map +1 -0
- package/lib/shared-tree-core/transaction.js +95 -0
- package/lib/shared-tree-core/transaction.js.map +1 -0
- package/lib/shared-tree-core/transactionEnricher.d.ts +8 -13
- package/lib/shared-tree-core/transactionEnricher.d.ts.map +1 -1
- package/lib/shared-tree-core/transactionEnricher.js +41 -21
- package/lib/shared-tree-core/transactionEnricher.js.map +1 -1
- package/lib/simple-tree/api/identifierIndex.d.ts +21 -0
- package/lib/simple-tree/api/identifierIndex.d.ts.map +1 -0
- package/lib/simple-tree/api/identifierIndex.js +41 -0
- package/lib/simple-tree/api/identifierIndex.js.map +1 -0
- package/lib/simple-tree/api/index.d.ts +2 -0
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +2 -0
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +11 -9
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/simpleTreeIndex.d.ts +65 -0
- package/lib/simple-tree/api/simpleTreeIndex.d.ts.map +1 -0
- package/lib/simple-tree/api/simpleTreeIndex.js +87 -0
- package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -0
- package/lib/simple-tree/api/tree.d.ts +4 -5
- package/lib/simple-tree/api/tree.d.ts.map +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +1 -1
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +1 -1
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts +6 -2
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +31 -1
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/lib/simple-tree/index.d.ts +1 -1
- 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/objectNode.d.ts +7 -2
- package/lib/simple-tree/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/objectNode.js.map +1 -1
- package/lib/simple-tree/toMapTree.js +5 -5
- package/lib/simple-tree/toMapTree.js.map +1 -1
- package/lib/util/index.d.ts +1 -2
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +1 -2
- package/lib/util/index.js.map +1 -1
- package/lib/util/typeCheck.d.ts +6 -1
- package/lib/util/typeCheck.d.ts.map +1 -1
- package/lib/util/typeCheck.js.map +1 -1
- package/lib/util/typeCheckTests.d.ts +14 -2
- package/lib/util/typeCheckTests.d.ts.map +1 -1
- package/lib/util/typeCheckTests.js.map +1 -1
- package/lib/util/utils.d.ts +29 -0
- package/lib/util/utils.d.ts.map +1 -1
- package/lib/util/utils.js +9 -0
- package/lib/util/utils.js.map +1 -1
- package/package.json +22 -22
- package/src/core/forest/forest.ts +12 -1
- package/src/core/index.ts +8 -1
- package/src/core/rebase/utils.ts +12 -10
- package/src/core/revertible.ts +35 -1
- package/src/core/schema-stored/storedSchemaRepository.ts +2 -1
- package/src/core/tree/anchorSet.ts +2 -1
- package/src/core/tree/detachedFieldIndexCodec.ts +4 -3
- package/src/core/tree/index.ts +1 -0
- package/src/core/tree/visitorUtils.ts +56 -1
- package/src/feature-libraries/chunked-forest/chunkedForest.ts +33 -7
- package/src/feature-libraries/chunked-forest/uniformChunk.ts +3 -3
- package/src/feature-libraries/flex-tree/context.ts +1 -1
- package/src/feature-libraries/index.ts +9 -0
- package/src/feature-libraries/indexing/anchorTreeIndex.ts +453 -0
- package/src/feature-libraries/indexing/index.ts +11 -0
- package/src/feature-libraries/indexing/types.ts +37 -0
- package/src/feature-libraries/object-forest/objectForest.ts +22 -4
- package/src/feature-libraries/sequence-field/invert.ts +4 -4
- package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +4 -4
- package/src/index.ts +16 -6
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/index.ts +0 -2
- package/src/shared-tree/schematizingTreeView.ts +7 -7
- package/src/shared-tree/sharedTree.ts +60 -6
- package/src/shared-tree/sharedTreeChangeFamily.ts +5 -4
- package/src/shared-tree/treeCheckout.ts +186 -193
- package/src/shared-tree-core/branch.ts +93 -220
- package/src/shared-tree-core/branchCommitEnricher.ts +69 -64
- package/src/shared-tree-core/defaultResubmitMachine.ts +3 -2
- package/src/shared-tree-core/editManager.ts +1 -1
- package/src/shared-tree-core/index.ts +9 -2
- package/src/shared-tree-core/sharedTreeCore.ts +17 -62
- package/src/shared-tree-core/transaction.ts +165 -0
- package/src/shared-tree-core/transactionEnricher.ts +30 -24
- package/src/simple-tree/api/identifierIndex.ts +64 -0
- package/src/simple-tree/api/index.ts +5 -0
- package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +17 -18
- package/src/simple-tree/api/simpleTreeIndex.ts +231 -0
- package/src/simple-tree/api/tree.ts +8 -5
- package/src/simple-tree/api/treeNodeApi.ts +1 -1
- package/src/simple-tree/core/index.ts +1 -0
- package/src/simple-tree/core/treeNodeKernel.ts +37 -2
- package/src/simple-tree/core/unhydratedFlexTree.ts +2 -1
- package/src/simple-tree/index.ts +4 -0
- package/src/simple-tree/objectNode.ts +19 -12
- package/src/simple-tree/toMapTree.ts +5 -5
- package/src/util/index.ts +3 -1
- package/src/util/typeCheck.ts +6 -1
- package/src/util/typeCheckTests.ts +11 -1
- package/src/util/utils.ts +38 -0
- package/dist/events/emitter.d.ts +0 -139
- package/dist/events/emitter.d.ts.map +0 -1
- package/dist/events/emitter.js +0 -165
- package/dist/events/emitter.js.map +0 -1
- package/dist/events/index.d.ts +0 -7
- package/dist/events/index.d.ts.map +0 -1
- package/dist/events/index.js +0 -11
- package/dist/events/index.js.map +0 -1
- package/dist/events/interop.d.ts +0 -30
- package/dist/events/interop.d.ts.map +0 -1
- package/dist/events/interop.js.map +0 -1
- package/dist/events/listeners.d.ts +0 -76
- package/dist/events/listeners.d.ts.map +0 -1
- package/dist/events/listeners.js +0 -7
- package/dist/events/listeners.js.map +0 -1
- package/dist/shared-tree-core/transactionStack.d.ts +0 -29
- package/dist/shared-tree-core/transactionStack.d.ts.map +0 -1
- package/dist/shared-tree-core/transactionStack.js +0 -41
- package/dist/shared-tree-core/transactionStack.js.map +0 -1
- package/dist/util/transactionResult.d.ts +0 -19
- package/dist/util/transactionResult.d.ts.map +0 -1
- package/dist/util/transactionResult.js +0 -23
- package/dist/util/transactionResult.js.map +0 -1
- package/lib/events/emitter.d.ts +0 -139
- package/lib/events/emitter.d.ts.map +0 -1
- package/lib/events/emitter.js +0 -160
- package/lib/events/emitter.js.map +0 -1
- package/lib/events/index.d.ts +0 -7
- package/lib/events/index.d.ts.map +0 -1
- package/lib/events/index.js.map +0 -1
- package/lib/events/interop.d.ts +0 -30
- package/lib/events/interop.d.ts.map +0 -1
- package/lib/events/interop.js.map +0 -1
- package/lib/events/listeners.d.ts +0 -76
- package/lib/events/listeners.d.ts.map +0 -1
- package/lib/events/listeners.js +0 -6
- package/lib/events/listeners.js.map +0 -1
- package/lib/shared-tree-core/transactionStack.d.ts +0 -29
- package/lib/shared-tree-core/transactionStack.d.ts.map +0 -1
- package/lib/shared-tree-core/transactionStack.js +0 -37
- package/lib/shared-tree-core/transactionStack.js.map +0 -1
- package/lib/util/transactionResult.d.ts +0 -19
- package/lib/util/transactionResult.d.ts.map +0 -1
- package/lib/util/transactionResult.js +0 -20
- package/lib/util/transactionResult.js.map +0 -1
- package/src/events/README.md +0 -3
- package/src/events/emitter.ts +0 -256
- package/src/events/index.ts +0 -19
- package/src/events/interop.ts +0 -38
- package/src/events/listeners.ts +0 -80
- package/src/shared-tree-core/transactionStack.ts +0 -45
- package/src/util/transactionResult.ts +0 -19
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
AnchorNode,
|
|
8
|
+
FieldKey,
|
|
9
|
+
ITreeSubscriptionCursor,
|
|
10
|
+
TreeNodeSchemaIdentifier,
|
|
11
|
+
} from "../../core/index.js";
|
|
12
|
+
import {
|
|
13
|
+
AnchorTreeIndex,
|
|
14
|
+
isTreeValue,
|
|
15
|
+
type TreeIndexNodes,
|
|
16
|
+
hasElement,
|
|
17
|
+
type TreeIndex,
|
|
18
|
+
type TreeIndexKey,
|
|
19
|
+
type KeyFinder,
|
|
20
|
+
} from "../../feature-libraries/index.js";
|
|
21
|
+
import { brand, fail } from "../../util/index.js";
|
|
22
|
+
import type { ImplicitFieldSchema, NodeFromSchema } from "../schemaTypes.js";
|
|
23
|
+
import { treeNodeFromAnchor, type TreeNode, type TreeNodeSchema } from "../core/index.js";
|
|
24
|
+
import { treeNodeApi } from "./treeNodeApi.js";
|
|
25
|
+
import type { TreeView } from "./tree.js";
|
|
26
|
+
import { walkFieldSchema } from "../walkFieldSchema.js";
|
|
27
|
+
import type { SchematizingSimpleTreeView } from "../../shared-tree/index.js";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A {@link TreeIndex} that returns tree nodes given their associated keys.
|
|
31
|
+
*
|
|
32
|
+
* @alpha
|
|
33
|
+
*/
|
|
34
|
+
export type SimpleTreeIndex<TKey extends TreeIndexKey, TValue> = TreeIndex<TKey, TValue>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Creates a {@link SimpleTreeIndex} with a specified indexer.
|
|
38
|
+
*
|
|
39
|
+
* @param view - the view for the tree being indexed
|
|
40
|
+
* @param indexer - a function that takes in a {@link TreeNodeSchema} and returns the field name that all nodes of the given schema
|
|
41
|
+
* should be keyed on, must be pure and functional
|
|
42
|
+
* @param getValue - given at least one {@link TreeNode}, returns an associated value
|
|
43
|
+
* @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
|
|
44
|
+
*
|
|
45
|
+
* @alpha
|
|
46
|
+
*/
|
|
47
|
+
export function createSimpleTreeIndex<
|
|
48
|
+
TFieldSchema extends ImplicitFieldSchema,
|
|
49
|
+
TKey extends TreeIndexKey,
|
|
50
|
+
TValue,
|
|
51
|
+
>(
|
|
52
|
+
view: TreeView<TFieldSchema>,
|
|
53
|
+
indexer: (schema: TreeNodeSchema) => string | undefined,
|
|
54
|
+
getValue: (nodes: TreeIndexNodes<TreeNode>) => TValue,
|
|
55
|
+
isKeyValid: (key: TreeIndexKey) => key is TKey,
|
|
56
|
+
): SimpleTreeIndex<TKey, TValue>;
|
|
57
|
+
/**
|
|
58
|
+
* Creates a {@link SimpleTreeIndex} with a specified indexer.
|
|
59
|
+
*
|
|
60
|
+
* @param view - the view for the tree being indexed
|
|
61
|
+
* @param indexer - a function that takes in a {@link TreeNodeSchema} and returns the field name that all nodes of the given schema
|
|
62
|
+
* should be keyed on, must be pure and functional
|
|
63
|
+
* @param getValue - given at least one {@link TreeNode}, returns an associated value
|
|
64
|
+
* @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
|
|
65
|
+
* @param indexableSchema - a list of all the schema types that can be indexed
|
|
66
|
+
*
|
|
67
|
+
* @alpha
|
|
68
|
+
*/
|
|
69
|
+
export function createSimpleTreeIndex<
|
|
70
|
+
TFieldSchema extends ImplicitFieldSchema,
|
|
71
|
+
TKey extends TreeIndexKey,
|
|
72
|
+
TValue,
|
|
73
|
+
TSchema extends TreeNodeSchema,
|
|
74
|
+
>(
|
|
75
|
+
view: TreeView<TFieldSchema>,
|
|
76
|
+
indexer: (schema: TSchema) => string | undefined,
|
|
77
|
+
getValue: (nodes: TreeIndexNodes<NodeFromSchema<TSchema>>) => TValue,
|
|
78
|
+
isKeyValid: (key: TreeIndexKey) => key is TKey,
|
|
79
|
+
indexableSchema: readonly TSchema[],
|
|
80
|
+
): SimpleTreeIndex<TKey, TValue>;
|
|
81
|
+
/**
|
|
82
|
+
* Creates a {@link SimpleTreeIndex} with a specified indexer.
|
|
83
|
+
*
|
|
84
|
+
* @param view - the view for the tree being indexed
|
|
85
|
+
* @param indexer - a map from {@link TreeNodeSchema} to the field name that all nodes of the given schema
|
|
86
|
+
* should be keyed on
|
|
87
|
+
* @param getValue - given at least one {@link TreeNode}, returns an associated value
|
|
88
|
+
* @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
|
|
89
|
+
*
|
|
90
|
+
* @alpha
|
|
91
|
+
*/
|
|
92
|
+
export function createSimpleTreeIndex<
|
|
93
|
+
TFieldSchema extends ImplicitFieldSchema,
|
|
94
|
+
TKey extends TreeIndexKey,
|
|
95
|
+
TValue,
|
|
96
|
+
>(
|
|
97
|
+
view: TreeView<TFieldSchema>,
|
|
98
|
+
indexer: Map<TreeNodeSchema, string>,
|
|
99
|
+
getValue: (nodes: TreeIndexNodes<TreeNode>) => TValue,
|
|
100
|
+
isKeyValid: (key: TreeIndexKey) => key is TKey,
|
|
101
|
+
): SimpleTreeIndex<TKey, TValue>;
|
|
102
|
+
/**
|
|
103
|
+
* Creates a {@link SimpleTreeIndex} with a specified indexer.
|
|
104
|
+
*
|
|
105
|
+
* @param view - the view for the tree being indexed
|
|
106
|
+
* @param indexer - a map from {@link TreeNodeSchema} to the field name that all nodes of the given schema
|
|
107
|
+
* should be keyed on
|
|
108
|
+
* @param getValue - given at least one {@link TreeNode}, returns an associated value
|
|
109
|
+
* @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
|
|
110
|
+
* @param indexableSchema - a list of all the schema types that can be indexed
|
|
111
|
+
*
|
|
112
|
+
* @alpha
|
|
113
|
+
*/
|
|
114
|
+
export function createSimpleTreeIndex<
|
|
115
|
+
TFieldSchema extends ImplicitFieldSchema,
|
|
116
|
+
TKey extends TreeIndexKey,
|
|
117
|
+
TValue,
|
|
118
|
+
TSchema extends TreeNodeSchema,
|
|
119
|
+
>(
|
|
120
|
+
view: TreeView<TFieldSchema>,
|
|
121
|
+
indexer: Map<TreeNodeSchema, string>,
|
|
122
|
+
getValue: (nodes: TreeIndexNodes<NodeFromSchema<TSchema>>) => TValue,
|
|
123
|
+
isKeyValid: (key: TreeIndexKey) => key is TKey,
|
|
124
|
+
indexableSchema: readonly TSchema[],
|
|
125
|
+
): SimpleTreeIndex<TKey, TValue>;
|
|
126
|
+
/**
|
|
127
|
+
* Creates a {@link SimpleTreeIndex} with a specified indexer.
|
|
128
|
+
*
|
|
129
|
+
* @alpha
|
|
130
|
+
*/
|
|
131
|
+
export function createSimpleTreeIndex<
|
|
132
|
+
TFieldSchema extends ImplicitFieldSchema,
|
|
133
|
+
TKey extends TreeIndexKey,
|
|
134
|
+
TValue,
|
|
135
|
+
>(
|
|
136
|
+
view: TreeView<TFieldSchema>,
|
|
137
|
+
indexer: ((schema: TreeNodeSchema) => string | undefined) | Map<TreeNodeSchema, string>,
|
|
138
|
+
getValue:
|
|
139
|
+
| ((nodes: TreeIndexNodes<TreeNode>) => TValue)
|
|
140
|
+
| ((nodes: TreeIndexNodes<NodeFromSchema<TreeNodeSchema>>) => TValue),
|
|
141
|
+
isKeyValid: (key: TreeIndexKey) => key is TKey,
|
|
142
|
+
indexableSchema?: readonly TreeNodeSchema[],
|
|
143
|
+
): SimpleTreeIndex<TKey, TValue> {
|
|
144
|
+
const indexableSchemaMap = new Map();
|
|
145
|
+
if (indexableSchema !== undefined) {
|
|
146
|
+
for (const schemus of indexableSchema) {
|
|
147
|
+
indexableSchemaMap.set(schemus.identifier, schemus);
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
walkFieldSchema(view.schema, {
|
|
151
|
+
node: (schemus) => indexableSchemaMap.set(schemus.identifier, schemus),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const schemaIndexer =
|
|
156
|
+
indexableSchema === undefined
|
|
157
|
+
? (schemaIdentifier: TreeNodeSchemaIdentifier) => {
|
|
158
|
+
// if indexable schema isn't provided, we check if the node is in schema
|
|
159
|
+
const schemus = indexableSchemaMap.get(schemaIdentifier);
|
|
160
|
+
if (schemus !== undefined) {
|
|
161
|
+
const keyLocation =
|
|
162
|
+
typeof indexer === "function" ? indexer(schemus) : indexer.get(schemus);
|
|
163
|
+
if (keyLocation !== undefined) {
|
|
164
|
+
return makeGenericKeyFinder<TKey>(brand(keyLocation), isKeyValid);
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
fail("node is out of schema");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
: (schemaIdentifier: TreeNodeSchemaIdentifier) => {
|
|
171
|
+
const schemus = indexableSchemaMap.get(schemaIdentifier);
|
|
172
|
+
if (schemus !== undefined) {
|
|
173
|
+
const keyLocation =
|
|
174
|
+
typeof indexer === "function" ? indexer(schemus) : indexer.get(schemus);
|
|
175
|
+
if (keyLocation !== undefined) {
|
|
176
|
+
return makeGenericKeyFinder<TKey>(brand(keyLocation), isKeyValid);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const index = new AnchorTreeIndex<TKey, TValue>(
|
|
182
|
+
(view as SchematizingSimpleTreeView<TFieldSchema>).getView().checkout.forest,
|
|
183
|
+
schemaIndexer,
|
|
184
|
+
(anchorNodes) => {
|
|
185
|
+
const simpleTreeNodes: TreeNode[] = [];
|
|
186
|
+
for (const anchorNode of anchorNodes) {
|
|
187
|
+
const simpleTree = treeNodeFromAnchor(anchorNode);
|
|
188
|
+
if (!isTreeValue(simpleTree)) {
|
|
189
|
+
simpleTreeNodes.push(simpleTree);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (hasElement(simpleTreeNodes)) {
|
|
194
|
+
return getValue(simpleTreeNodes);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
(anchorNode: AnchorNode) => {
|
|
198
|
+
const simpleTree = treeNodeFromAnchor(anchorNode);
|
|
199
|
+
if (!isTreeValue(simpleTree)) {
|
|
200
|
+
return treeNodeApi.status(simpleTree);
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
// all the type checking guarantees that we put nodes of the correct type in the index
|
|
206
|
+
// but it's not captured in the type system
|
|
207
|
+
return index as SimpleTreeIndex<TKey, TValue>;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function makeGenericKeyFinder<TKey extends TreeIndexKey>(
|
|
211
|
+
keyField: FieldKey,
|
|
212
|
+
isKeyValid: (key: TreeIndexKey) => key is TKey,
|
|
213
|
+
): KeyFinder<TKey> {
|
|
214
|
+
return (cursor: ITreeSubscriptionCursor) => {
|
|
215
|
+
cursor.enterField(keyField);
|
|
216
|
+
cursor.firstNode();
|
|
217
|
+
const value = cursor.value;
|
|
218
|
+
cursor.exitNode();
|
|
219
|
+
cursor.exitField();
|
|
220
|
+
|
|
221
|
+
if (value === undefined) {
|
|
222
|
+
fail("a value for the key does not exist");
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (!isKeyValid(value)) {
|
|
226
|
+
fail("the key is an unexpected type");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return value;
|
|
230
|
+
};
|
|
231
|
+
}
|
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { IFluidLoadable, IDisposable } from "@fluidframework/core-interfaces";
|
|
6
|
+
import type { IFluidLoadable, IDisposable, Listenable } from "@fluidframework/core-interfaces";
|
|
7
7
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
8
8
|
|
|
9
|
-
import type {
|
|
10
|
-
|
|
9
|
+
import type {
|
|
10
|
+
CommitMetadata,
|
|
11
|
+
RevertibleAlphaFactory,
|
|
12
|
+
RevertibleFactory,
|
|
13
|
+
} from "../../core/index.js";
|
|
11
14
|
|
|
12
15
|
import {
|
|
13
16
|
type ImplicitFieldSchema,
|
|
@@ -629,7 +632,7 @@ export interface TreeBranchEvents {
|
|
|
629
632
|
* @param getRevertible - a function that allows users to get a revertible for the change. If not provided,
|
|
630
633
|
* this change is not revertible.
|
|
631
634
|
*/
|
|
632
|
-
changed(data: CommitMetadata, getRevertible?:
|
|
635
|
+
changed(data: CommitMetadata, getRevertible?: RevertibleAlphaFactory): void;
|
|
633
636
|
|
|
634
637
|
/**
|
|
635
638
|
* Fired when:
|
|
@@ -644,7 +647,7 @@ export interface TreeBranchEvents {
|
|
|
644
647
|
* @param getRevertible - a function provided that allows users to get a revertible for the commit that was applied. If not provided,
|
|
645
648
|
* this commit is not revertible.
|
|
646
649
|
*/
|
|
647
|
-
commitApplied(data: CommitMetadata, getRevertible?:
|
|
650
|
+
commitApplied(data: CommitMetadata, getRevertible?: RevertibleAlphaFactory): void;
|
|
648
651
|
}
|
|
649
652
|
|
|
650
653
|
/**
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "../leafNodeSchema.js";
|
|
25
25
|
import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
|
|
26
26
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
27
|
-
import type { Off } from "
|
|
27
|
+
import type { Off } from "@fluidframework/core-interfaces";
|
|
28
28
|
import {
|
|
29
29
|
getKernel,
|
|
30
30
|
isTreeNode,
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { assert, Lazy } from "@fluidframework/core-utils/internal";
|
|
7
|
-
import { createEmitter
|
|
8
|
-
import type {
|
|
7
|
+
import { createEmitter } from "@fluid-internal/client-utils";
|
|
8
|
+
import type { Listenable, Off } from "@fluidframework/core-interfaces";
|
|
9
|
+
import type { InternalTreeNode, TreeNode, Unhydrated } from "./types.js";
|
|
9
10
|
import {
|
|
10
11
|
anchorSlot,
|
|
11
12
|
type AnchorEvents,
|
|
12
13
|
type AnchorNode,
|
|
13
14
|
type AnchorSet,
|
|
15
|
+
type TreeValue,
|
|
14
16
|
type UpPath,
|
|
15
17
|
} from "../../core/index.js";
|
|
16
18
|
import {
|
|
@@ -447,3 +449,36 @@ export function getOrCreateInnerNode(treeNode: TreeNode, allowFreed = false): In
|
|
|
447
449
|
const kernel = getKernel(treeNode);
|
|
448
450
|
return kernel.getOrCreateInnerNode(allowFreed);
|
|
449
451
|
}
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Gets a flex node from an anchor node
|
|
455
|
+
*/
|
|
456
|
+
function flexNodeFromAnchor(anchorNode: AnchorNode): FlexTreeNode {
|
|
457
|
+
// the proxy is bound to an anchor node, but it may or may not have an actual flex node yet
|
|
458
|
+
const flexNode = anchorNode.slots.get(flexTreeSlot);
|
|
459
|
+
if (flexNode !== undefined) {
|
|
460
|
+
return flexNode; // If it does have a flex node, return it...
|
|
461
|
+
} // ...otherwise, the flex node must be created
|
|
462
|
+
const context = anchorNode.anchorSet.slots.get(ContextSlot) ?? fail("missing context");
|
|
463
|
+
const cursor = context.checkout.forest.allocateCursor("getFlexNode");
|
|
464
|
+
context.checkout.forest.moveCursorToPath(anchorNode, cursor);
|
|
465
|
+
const newFlexNode = makeTree(context, cursor);
|
|
466
|
+
cursor.free();
|
|
467
|
+
return newFlexNode;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Gets a tree node from an anchor node
|
|
472
|
+
*/
|
|
473
|
+
export function treeNodeFromAnchor(anchorNode: AnchorNode): TreeNode | TreeValue {
|
|
474
|
+
const cached = anchorNode.slots.get(proxySlot);
|
|
475
|
+
if (cached !== undefined) {
|
|
476
|
+
return cached;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const flexNode = flexNodeFromAnchor(anchorNode);
|
|
480
|
+
const classSchema = getTreeNodeSchemaFromHydratedFlexNode(flexNode);
|
|
481
|
+
return typeof classSchema === "function"
|
|
482
|
+
? new classSchema(flexNode as unknown as InternalTreeNode)
|
|
483
|
+
: (classSchema as { create(data: FlexTreeNode): TreeValue }).create(flexNode);
|
|
484
|
+
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { assert, oob } from "@fluidframework/core-utils/internal";
|
|
7
|
+
import { createEmitter } from "@fluid-internal/client-utils";
|
|
8
|
+
import type { Listenable } from "@fluidframework/core-interfaces";
|
|
7
9
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
8
10
|
|
|
9
11
|
import {
|
|
@@ -43,7 +45,6 @@ import {
|
|
|
43
45
|
cursorForMapTreeNode,
|
|
44
46
|
} from "../../feature-libraries/index.js";
|
|
45
47
|
import type { Context } from "./context.js";
|
|
46
|
-
import { createEmitter, type Listenable } from "../../events/index.js";
|
|
47
48
|
|
|
48
49
|
interface UnhydratedTreeSequenceFieldEditBuilder
|
|
49
50
|
extends SequenceFieldEditBuilder<ExclusiveMapTree[]> {
|
package/src/simple-tree/index.ts
CHANGED
|
@@ -51,6 +51,10 @@ export {
|
|
|
51
51
|
type NodeChangedData,
|
|
52
52
|
TreeBeta,
|
|
53
53
|
type TreeChangeEventsBeta,
|
|
54
|
+
type SimpleTreeIndex,
|
|
55
|
+
type IdentifierIndex,
|
|
56
|
+
createSimpleTreeIndex,
|
|
57
|
+
createIdentifierIndex,
|
|
54
58
|
type SimpleNodeSchemaBase,
|
|
55
59
|
type SimpleTreeSchema,
|
|
56
60
|
type SimpleNodeSchema,
|
|
@@ -100,24 +100,31 @@ export type FieldHasDefault<T extends ImplicitFieldSchema> = T extends FieldSche
|
|
|
100
100
|
*
|
|
101
101
|
* @see {@link Input}
|
|
102
102
|
*
|
|
103
|
-
* @privateRemarks
|
|
103
|
+
* @privateRemarks
|
|
104
|
+
* TODO: consider separating these cases into different types.
|
|
105
|
+
*
|
|
106
|
+
* Empty objects don't get "no excess property" checks in literals.
|
|
107
|
+
* To prevent extraneous properties in literals for the fields of an empty object from compiling, the empty case is special cased to produce `Record<string, never>`.
|
|
108
|
+
* More details at {@link https://mercury.com/blog/creating-an-emptyobject-type-in-typescript}.
|
|
104
109
|
*
|
|
105
110
|
* @system @public
|
|
106
111
|
*/
|
|
107
112
|
export type InsertableObjectFromSchemaRecord<
|
|
108
113
|
T extends RestrictiveStringRecord<ImplicitFieldSchema>,
|
|
109
|
-
> =
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
> = Record<string, never> extends T
|
|
115
|
+
? Record<string, never>
|
|
116
|
+
: FlattenKeys<
|
|
117
|
+
{
|
|
118
|
+
readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<
|
|
119
|
+
T[Property & string]
|
|
120
|
+
>;
|
|
121
|
+
} & {
|
|
122
|
+
// Field does not have a known default, make it required:
|
|
123
|
+
readonly [Property in keyof T as FieldHasDefault<T[Property & string]> extends false
|
|
124
|
+
? Property
|
|
125
|
+
: never]: InsertableTreeFieldFromImplicitField<T[Property & string]>;
|
|
126
|
+
}
|
|
113
127
|
>;
|
|
114
|
-
} & {
|
|
115
|
-
// Field does not have a known default, make it required:
|
|
116
|
-
readonly [Property in keyof T as FieldHasDefault<T[Property & string]> extends false
|
|
117
|
-
? Property
|
|
118
|
-
: never]: InsertableTreeFieldFromImplicitField<T[Property & string]>;
|
|
119
|
-
}
|
|
120
|
-
>;
|
|
121
128
|
|
|
122
129
|
/**
|
|
123
130
|
* Maps from simple field keys ("property" keys) to information about the field.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { assert
|
|
6
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
8
8
|
import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
|
|
9
9
|
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
valueSchemaAllows,
|
|
22
22
|
type NodeKeyManager,
|
|
23
23
|
} from "../feature-libraries/index.js";
|
|
24
|
-
import { brand, fail, isReadonlyArray, find } from "../util/index.js";
|
|
24
|
+
import { brand, fail, isReadonlyArray, find, hasSome, hasSingle } from "../util/index.js";
|
|
25
25
|
|
|
26
26
|
import { nullSchema } from "./leafNodeSchema.js";
|
|
27
27
|
import {
|
|
@@ -465,10 +465,10 @@ function getType(
|
|
|
465
465
|
);
|
|
466
466
|
}
|
|
467
467
|
assert(
|
|
468
|
-
possibleTypes
|
|
468
|
+
hasSome(possibleTypes),
|
|
469
469
|
0x84e /* data is incompatible with all types allowed by the schema */,
|
|
470
470
|
);
|
|
471
|
-
if (possibleTypes
|
|
471
|
+
if (!hasSingle(possibleTypes)) {
|
|
472
472
|
throw new UsageError(
|
|
473
473
|
`The provided data is compatible with more than one type allowed by the schema.
|
|
474
474
|
The set of possible types is ${JSON.stringify([
|
|
@@ -478,7 +478,7 @@ Explicitly construct an unhydrated node of the desired type to disambiguate.
|
|
|
478
478
|
For class-based schema, this can be done by replacing an expression like "{foo: 1}" with "new MySchema({foo: 1})".`,
|
|
479
479
|
);
|
|
480
480
|
}
|
|
481
|
-
return possibleTypes[0]
|
|
481
|
+
return possibleTypes[0];
|
|
482
482
|
}
|
|
483
483
|
|
|
484
484
|
/**
|
package/src/util/index.ts
CHANGED
|
@@ -37,7 +37,6 @@ export {
|
|
|
37
37
|
} from "./nestedMap.js";
|
|
38
38
|
export { addToNestedSet, type NestedSet, nestedSetContains } from "./nestedSet.js";
|
|
39
39
|
export { type OffsetList, OffsetListFactory } from "./offsetList.js";
|
|
40
|
-
export { TransactionResult } from "./transactionResult.js";
|
|
41
40
|
export type {
|
|
42
41
|
areSafelyAssignable,
|
|
43
42
|
Contravariant,
|
|
@@ -91,6 +90,9 @@ export {
|
|
|
91
90
|
compareStrings,
|
|
92
91
|
find,
|
|
93
92
|
count,
|
|
93
|
+
getLast,
|
|
94
|
+
hasSome,
|
|
95
|
+
hasSingle,
|
|
94
96
|
} from "./utils.js";
|
|
95
97
|
export { ReferenceCountedBase, type ReferenceCounted } from "./referenceCounting.js";
|
|
96
98
|
|
package/src/util/typeCheck.ts
CHANGED
|
@@ -193,6 +193,11 @@ export type requireAssignableTo<_A extends B, B> = true;
|
|
|
193
193
|
|
|
194
194
|
/**
|
|
195
195
|
* Returns a type parameter that is true iff the `Keys` union includes all the keys of `T`.
|
|
196
|
+
*
|
|
197
|
+
* @remarks
|
|
198
|
+
* This does not handle when the T has an index signature permitting keys like `string` which
|
|
199
|
+
* TypeScript cannot omit members from.
|
|
200
|
+
*
|
|
196
201
|
* @example
|
|
197
202
|
* ```ts
|
|
198
203
|
* type _check = requireTrue<areOnlyKeys<{a: number, b: number}, 'a' | 'b'>> // true`
|
|
@@ -201,5 +206,5 @@ export type requireAssignableTo<_A extends B, B> = true;
|
|
|
201
206
|
*/
|
|
202
207
|
export type areOnlyKeys<T, Keys extends keyof T> = isAssignableTo<
|
|
203
208
|
Record<string, never>,
|
|
204
|
-
Omit<T
|
|
209
|
+
Omit<Required<T>, Keys>
|
|
205
210
|
>;
|
|
@@ -15,6 +15,7 @@ import type {
|
|
|
15
15
|
Covariant,
|
|
16
16
|
Invariant,
|
|
17
17
|
MakeNominal,
|
|
18
|
+
areOnlyKeys,
|
|
18
19
|
areSafelyAssignable,
|
|
19
20
|
eitherIsAny,
|
|
20
21
|
isAny,
|
|
@@ -221,10 +222,19 @@ export type EnforceTypeCheckTests =
|
|
|
221
222
|
| requireTrue<isStrictSubset<[1, true], [1 | 2, true | false]>>
|
|
222
223
|
| requireTrue<isStrictSubset<[1, true], [1, true | false]>>
|
|
223
224
|
| requireTrue<isStrictSubset<[1, true], [1, true] | [1 | false]>>
|
|
225
|
+
| requireTrue<isStrictSubset<1, number>>
|
|
224
226
|
| requireFalse<isStrictSubset<1, 1>>
|
|
225
227
|
| requireFalse<isStrictSubset<1, 2>>
|
|
226
228
|
| requireFalse<isStrictSubset<[1, true], [1, true]>>
|
|
227
|
-
| requireFalse<isStrictSubset<1 | 2, 1
|
|
229
|
+
| requireFalse<isStrictSubset<1 | 2, 1>>
|
|
230
|
+
|
|
231
|
+
// areOnlyKeys
|
|
232
|
+
| requireTrue<areOnlyKeys<{ a: number; b: number }, "a" | "b">>
|
|
233
|
+
| requireTrue<areOnlyKeys<{ a?: number; b: number }, "a" | "b">>
|
|
234
|
+
| requireFalse<areOnlyKeys<{ a?: number; b: number }, "b">>
|
|
235
|
+
| requireFalse<areOnlyKeys<{ a: number; b: number }, "a">>;
|
|
236
|
+
// This case is explicitly documented as unsupported.
|
|
237
|
+
// | requireFalse<areOnlyKeys<Record<string, unknown>, "a">>;
|
|
228
238
|
|
|
229
239
|
// negative tests (should not build)
|
|
230
240
|
// @ts-expect-error negative test
|
package/src/util/utils.ts
CHANGED
|
@@ -79,6 +79,44 @@ export function makeArray<T>(size: number, filler: (index: number) => T): T[] {
|
|
|
79
79
|
return array;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Returns the last element of an array, or `undefined` if the array has no elements.
|
|
84
|
+
* @param array - The array to get the last element from.
|
|
85
|
+
* @remarks
|
|
86
|
+
* If the type of the array has been narrowed by e.g. {@link hasSome | hasSome(array)} or {@link hasSingle | hasOne(array)} then the return type will be `T` rather than `T | undefined`.
|
|
87
|
+
*/
|
|
88
|
+
export function getLast<T>(array: readonly [T, ...T[]]): T;
|
|
89
|
+
export function getLast<T>(array: { [index: number]: T; length: number }): T | undefined;
|
|
90
|
+
export function getLast<T>(array: { [index: number]: T; length: number }): T | undefined {
|
|
91
|
+
return array[array.length - 1];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns true if and only if the given array has at least one element.
|
|
96
|
+
* @param array - The array to check.
|
|
97
|
+
* @remarks
|
|
98
|
+
* If `array` contains at least one element, its type will be narrowed and can benefit from improved typing from e.g. `array[0]` and {@link getLast | getLast(array)}.
|
|
99
|
+
* This is especially useful when "noUncheckedIndexedAccess" is enabled in the TypeScript compiler options, since the return type of `array[0]` will be `T` rather than `T | undefined`.
|
|
100
|
+
*/
|
|
101
|
+
export function hasSome<T>(array: T[]): array is [T, ...T[]];
|
|
102
|
+
export function hasSome<T>(array: readonly T[]): array is readonly [T, ...T[]];
|
|
103
|
+
export function hasSome<T>(array: readonly T[]): array is [T, ...T[]] {
|
|
104
|
+
return array.length > 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Returns true if and only if the given array has exactly one element.
|
|
109
|
+
* @param array - The array to check.
|
|
110
|
+
* @remarks
|
|
111
|
+
* If `array` contains exactly one element, its type will be narrowed and can benefit from improved typing from e.g. `array[0]` and {@link getLast | getLast(array)}.
|
|
112
|
+
* This is especially useful when "noUncheckedIndexedAccess" is enabled in the TypeScript compiler options, since the return type of `array[0]` will be `T` rather than `T | undefined`.
|
|
113
|
+
*/
|
|
114
|
+
export function hasSingle<T>(array: T[]): array is [T];
|
|
115
|
+
export function hasSingle<T>(array: readonly T[]): array is readonly [T];
|
|
116
|
+
export function hasSingle<T>(array: readonly T[]): array is [T] {
|
|
117
|
+
return array.length === 1;
|
|
118
|
+
}
|
|
119
|
+
|
|
82
120
|
/**
|
|
83
121
|
* Compares two sets using callbacks.
|
|
84
122
|
* Early returns on first false comparison.
|