@fluidframework/tree 2.41.0 → 2.42.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/.vscode/settings.json +1 -0
- package/CHANGELOG.md +33 -0
- package/api-report/tree.alpha.api.md +11 -7
- package/dist/alpha.d.ts +1 -0
- package/dist/codec/codec.d.ts +23 -3
- package/dist/codec/codec.d.ts.map +1 -1
- package/dist/codec/codec.js.map +1 -1
- package/dist/codec/index.d.ts +1 -1
- package/dist/codec/index.d.ts.map +1 -1
- package/dist/codec/index.js.map +1 -1
- package/dist/codec/versioned/codec.d.ts +35 -2
- package/dist/codec/versioned/codec.d.ts.map +1 -1
- package/dist/codec/versioned/codec.js +38 -3
- package/dist/codec/versioned/codec.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts +2 -2
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +5 -1
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/mapTree.d.ts +2 -1
- package/dist/core/tree/mapTree.d.ts.map +1 -1
- package/dist/core/tree/mapTree.js +11 -5
- package/dist/core/tree/mapTree.js.map +1 -1
- package/dist/core/tree/visitorUtils.d.ts +2 -2
- package/dist/core/tree/visitorUtils.d.ts.map +1 -1
- package/dist/core/tree/visitorUtils.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +3 -2
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.d.ts +4 -3
- package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.js +4 -3
- package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts +14 -6
- 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/flex-tree/flexTreeTypes.d.ts +34 -14
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js +4 -0
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/flex-tree/index.d.ts +2 -2
- package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/index.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts +6 -6
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts +3 -2
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +3 -0
- package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -2
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +7 -7
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +2 -2
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +4 -2
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/mapTreeCursor.d.ts +39 -3
- package/dist/feature-libraries/mapTreeCursor.d.ts.map +1 -1
- package/dist/feature-libraries/mapTreeCursor.js +45 -7
- package/dist/feature-libraries/mapTreeCursor.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +5 -5
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.d.ts +5 -1
- package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.js +8 -2
- package/dist/feature-libraries/treeCursorUtils.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.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +11 -1
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +36 -22
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +3 -3
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +1 -0
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/tree.d.ts.map +1 -1
- package/dist/shared-tree/tree.js +8 -24
- package/dist/shared-tree/tree.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts +2 -3
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +13 -15
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +5 -2
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts +2 -2
- package/dist/simple-tree/api/configuration.js +1 -1
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/create.d.ts +9 -4
- package/dist/simple-tree/api/create.d.ts.map +1 -1
- package/dist/simple-tree/api/create.js +29 -16
- package/dist/simple-tree/api/create.js.map +1 -1
- package/dist/simple-tree/api/customTree.d.ts +4 -0
- package/dist/simple-tree/api/customTree.d.ts.map +1 -1
- package/dist/simple-tree/api/customTree.js +9 -1
- package/dist/simple-tree/api/customTree.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +1 -1
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +1 -2
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +10 -2
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +38 -9
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.d.ts +14 -3
- package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js +32 -17
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/verboseTree.js +12 -9
- package/dist/simple-tree/api/verboseTree.js.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.js +2 -1
- package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +2 -2
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +3 -4
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts +15 -25
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +26 -33
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts +128 -59
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.js +169 -182
- package/dist/simple-tree/core/unhydratedFlexTree.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 +5 -5
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.js +5 -6
- package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/index.d.ts +1 -1
- package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/index.js +1 -2
- package/dist/simple-tree/node-kinds/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
- package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
- package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/index.js +1 -2
- package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts +3 -14
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js +12 -43
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +20 -6
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +26 -19
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/schemaTypes.d.ts +8 -8
- package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
- package/dist/simple-tree/schemaTypes.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts +6 -1
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +6 -3
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/{toMapTree.d.ts → unhydratedFlexTreeFromInsertable.d.ts} +12 -23
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -0
- package/dist/simple-tree/{toMapTree.js → unhydratedFlexTreeFromInsertable.js} +103 -185
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -0
- package/dist/treeFactory.d.ts.map +1 -1
- package/dist/treeFactory.js +6 -1
- package/dist/treeFactory.js.map +1 -1
- package/dist/util/index.d.ts +1 -1
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +2 -1
- package/dist/util/index.js.map +1 -1
- package/dist/util/utils.d.ts +4 -0
- package/dist/util/utils.d.ts.map +1 -1
- package/dist/util/utils.js +8 -1
- package/dist/util/utils.js.map +1 -1
- package/docs/user-facing/schema-evolution.md +1 -1
- package/lib/alpha.d.ts +1 -0
- package/lib/codec/codec.d.ts +23 -3
- package/lib/codec/codec.d.ts.map +1 -1
- package/lib/codec/codec.js.map +1 -1
- package/lib/codec/index.d.ts +1 -1
- package/lib/codec/index.d.ts.map +1 -1
- package/lib/codec/index.js.map +1 -1
- package/lib/codec/versioned/codec.d.ts +35 -2
- package/lib/codec/versioned/codec.d.ts.map +1 -1
- package/lib/codec/versioned/codec.js +36 -2
- package/lib/codec/versioned/codec.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts +2 -2
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +6 -2
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/mapTree.d.ts +2 -1
- package/lib/core/tree/mapTree.d.ts.map +1 -1
- package/lib/core/tree/mapTree.js +11 -5
- package/lib/core/tree/mapTree.js.map +1 -1
- package/lib/core/tree/visitorUtils.d.ts +2 -2
- package/lib/core/tree/visitorUtils.d.ts.map +1 -1
- package/lib/core/tree/visitorUtils.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +3 -2
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.d.ts +4 -3
- package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.js +4 -3
- package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts +14 -6
- 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/flex-tree/flexTreeTypes.d.ts +34 -14
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js +4 -0
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/flex-tree/index.d.ts +2 -2
- package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/index.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts +6 -6
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts +3 -2
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +3 -0
- package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -2
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +2 -2
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +2 -2
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +1 -1
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/mapTreeCursor.d.ts +39 -3
- package/lib/feature-libraries/mapTreeCursor.d.ts.map +1 -1
- package/lib/feature-libraries/mapTreeCursor.js +43 -7
- package/lib/feature-libraries/mapTreeCursor.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +5 -5
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.d.ts +5 -1
- package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.js +8 -2
- package/lib/feature-libraries/treeCursorUtils.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.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +11 -1
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +34 -21
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +3 -3
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +2 -1
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/tree.d.ts.map +1 -1
- package/lib/shared-tree/tree.js +2 -18
- package/lib/shared-tree/tree.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts +2 -3
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +4 -6
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +6 -3
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts +2 -2
- package/lib/simple-tree/api/configuration.js +1 -1
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/create.d.ts +9 -4
- package/lib/simple-tree/api/create.d.ts.map +1 -1
- package/lib/simple-tree/api/create.js +22 -9
- package/lib/simple-tree/api/create.js.map +1 -1
- package/lib/simple-tree/api/customTree.d.ts +4 -0
- package/lib/simple-tree/api/customTree.d.ts.map +1 -1
- package/lib/simple-tree/api/customTree.js +7 -0
- package/lib/simple-tree/api/customTree.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +1 -1
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +1 -1
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +10 -2
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +40 -11
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.d.ts +14 -3
- package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +35 -20
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/verboseTree.js +13 -10
- package/lib/simple-tree/api/verboseTree.js.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.js +3 -2
- package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +2 -2
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +2 -2
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts +15 -25
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +24 -32
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts +128 -59
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js +166 -181
- package/lib/simple-tree/core/unhydratedFlexTree.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 +3 -3
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.js +4 -5
- package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/index.d.ts +1 -1
- package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/index.js +1 -1
- package/lib/simple-tree/node-kinds/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.js +3 -3
- package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
- package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/index.js +1 -1
- package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts +3 -14
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js +3 -33
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +20 -6
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +25 -19
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/schemaTypes.d.ts +8 -8
- package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
- package/lib/simple-tree/schemaTypes.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts +6 -1
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +4 -1
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/{toMapTree.d.ts → unhydratedFlexTreeFromInsertable.d.ts} +12 -23
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -0
- package/lib/simple-tree/{toMapTree.js → unhydratedFlexTreeFromInsertable.js} +105 -186
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -0
- package/lib/treeFactory.d.ts.map +1 -1
- package/lib/treeFactory.js +6 -1
- package/lib/treeFactory.js.map +1 -1
- package/lib/util/index.d.ts +1 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +1 -1
- package/lib/util/index.js.map +1 -1
- package/lib/util/utils.d.ts +4 -0
- package/lib/util/utils.d.ts.map +1 -1
- package/lib/util/utils.js +6 -0
- package/lib/util/utils.js.map +1 -1
- package/package.json +21 -21
- package/src/codec/codec.ts +24 -3
- package/src/codec/index.ts +1 -0
- package/src/codec/versioned/codec.ts +42 -5
- package/src/core/tree/detachedFieldIndex.ts +13 -4
- package/src/core/tree/mapTree.ts +22 -7
- package/src/core/tree/visitorUtils.ts +2 -2
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +3 -2
- package/src/feature-libraries/default-schema/schemaChecker.ts +7 -6
- package/src/feature-libraries/flex-tree/context.ts +17 -7
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +36 -15
- package/src/feature-libraries/flex-tree/index.ts +4 -0
- package/src/feature-libraries/flex-tree/lazyField.ts +8 -6
- package/src/feature-libraries/flex-tree/lazyNode.ts +6 -2
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +3 -2
- package/src/feature-libraries/index.ts +9 -0
- package/src/feature-libraries/mapTreeCursor.ts +103 -16
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +9 -5
- package/src/feature-libraries/treeCursorUtils.ts +21 -10
- package/src/index.ts +1 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/schematizingTreeView.ts +40 -22
- package/src/shared-tree/sharedTree.ts +9 -3
- package/src/shared-tree/tree.ts +5 -20
- package/src/shared-tree/treeAlpha.ts +17 -11
- package/src/shared-tree/treeCheckout.ts +6 -3
- package/src/simple-tree/api/configuration.ts +3 -3
- package/src/simple-tree/api/create.ts +49 -19
- package/src/simple-tree/api/customTree.ts +10 -0
- package/src/simple-tree/api/index.ts +1 -4
- package/src/simple-tree/api/schemaFactory.ts +62 -13
- package/src/simple-tree/api/treeNodeApi.ts +48 -27
- package/src/simple-tree/api/verboseTree.ts +15 -12
- package/src/simple-tree/core/getOrCreateNode.ts +4 -2
- package/src/simple-tree/core/index.ts +2 -3
- package/src/simple-tree/core/treeNodeKernel.ts +37 -54
- package/src/simple-tree/core/unhydratedFlexTree.ts +222 -261
- package/src/simple-tree/index.ts +3 -3
- package/src/simple-tree/node-kinds/array/arrayNode.ts +12 -13
- package/src/simple-tree/node-kinds/index.ts +0 -1
- package/src/simple-tree/node-kinds/map/mapNode.ts +6 -9
- package/src/simple-tree/node-kinds/object/index.ts +0 -1
- package/src/simple-tree/node-kinds/object/objectNode.ts +7 -49
- package/src/simple-tree/prepareForInsertion.ts +49 -42
- package/src/simple-tree/schemaTypes.ts +9 -8
- package/src/simple-tree/toStoredSchema.ts +7 -1
- package/src/simple-tree/{toMapTree.ts → unhydratedFlexTreeFromInsertable.ts} +134 -226
- package/src/treeFactory.ts +6 -1
- package/src/util/index.ts +1 -0
- package/src/util/utils.ts +7 -0
- package/dist/simple-tree/toMapTree.d.ts.map +0 -1
- package/dist/simple-tree/toMapTree.js.map +0 -1
- package/lib/simple-tree/toMapTree.d.ts.map +0 -1
- package/lib/simple-tree/toMapTree.js.map +0 -1
|
@@ -8,72 +8,92 @@ import { assert, oob, fail } from "@fluidframework/core-utils/internal";
|
|
|
8
8
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
9
9
|
import { EmptyKey, forbiddenFieldKindIdentifier, } from "../../core/index.js";
|
|
10
10
|
import { FlexTreeEntityKind, flexTreeMarker, indexForAt, FieldKinds, cursorForMapTreeNode, } from "../../feature-libraries/index.js";
|
|
11
|
-
import { brand,
|
|
11
|
+
import { brand, filterIterable, getOrCreate } from "../../util/index.js";
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
* @remarks
|
|
15
|
-
* MapTreeNodes are unconditionally cached -
|
|
16
|
-
* when retrieved via {@link getOrCreateNodeFromInnerNode}, the same {@link MapTree} object will always produce the same `UnhydratedFlexTreeNode` object.
|
|
17
|
-
*
|
|
18
|
-
* Create a `UnhydratedFlexTreeNode` by calling {@link getOrCreate}.
|
|
13
|
+
* The {@link Unhydrated} implementation of {@link FlexTreeNode}.
|
|
19
14
|
*/
|
|
20
15
|
export class UnhydratedFlexTreeNode {
|
|
21
|
-
|
|
22
|
-
return
|
|
16
|
+
isHydrated() {
|
|
17
|
+
return false;
|
|
23
18
|
}
|
|
24
19
|
get storedSchema() {
|
|
25
|
-
return (this.context.schema.nodeSchema.get(this.
|
|
20
|
+
return (this.context.schema.nodeSchema.get(this.data.type) ?? fail(0xb46 /* missing schema */));
|
|
26
21
|
}
|
|
27
22
|
get events() {
|
|
28
23
|
return this._events;
|
|
29
24
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Create a {@link UnhydratedFlexTreeNode} that wraps the given {@link MapTree}, or get the node that already exists for that {@link MapTree} if there is one.
|
|
32
|
-
* @param nodeSchema - the {@link FlexTreeNodeSchema | schema} that the node conforms to
|
|
33
|
-
* @param mapTree - the {@link MapTree} containing the data for this node.
|
|
34
|
-
* @remarks It must conform to the `nodeSchema`.
|
|
35
|
-
*/
|
|
36
|
-
static getOrCreate(context, mapTree) {
|
|
37
|
-
return nodeCache.get(mapTree) ?? new UnhydratedFlexTreeNode(context, mapTree, undefined);
|
|
38
|
-
}
|
|
39
25
|
get context() {
|
|
40
26
|
return this.simpleContext.flexContext;
|
|
41
27
|
}
|
|
42
28
|
/**
|
|
43
29
|
* Create a new UnhydratedFlexTreeNode.
|
|
44
|
-
* @param location - the parentage of this node, if it is being created underneath an existing node and field, or undefined if not
|
|
45
|
-
* @remarks This class (and its subclasses) should not be directly constructed outside of this module.
|
|
46
|
-
* Instead, use {@link getOrCreateNodeFromInnerNode} to create a UnhydratedFlexTreeNode from a {@link MapTree}.
|
|
47
|
-
* A `UnhydratedFlexTreeNode` may never be constructed more than once for the same {@link MapTree} object.
|
|
48
|
-
* Instead, it should always be acquired via {@link getOrCreateNodeFromInnerNode}.
|
|
49
30
|
*/
|
|
50
|
-
constructor(
|
|
51
|
-
/**
|
|
52
|
-
|
|
31
|
+
constructor(
|
|
32
|
+
/**
|
|
33
|
+
* The {@link NodeData} for this node.
|
|
34
|
+
*/
|
|
35
|
+
data,
|
|
36
|
+
/**
|
|
37
|
+
* All {@link UnhydratedFlexTreeField} for this node that have been created so far.
|
|
38
|
+
* @remarks
|
|
39
|
+
* This includes all non-empty fields, but also any empty fields which have been previously requested.
|
|
40
|
+
*/
|
|
41
|
+
fieldsAll,
|
|
42
|
+
/**
|
|
43
|
+
* The {@link Context} for this node.
|
|
44
|
+
* @remarks
|
|
45
|
+
* Provides access to all schema reachable from this node.
|
|
46
|
+
* See {@link getUnhydratedContext}.
|
|
47
|
+
*/
|
|
48
|
+
simpleContext) {
|
|
49
|
+
this.data = data;
|
|
50
|
+
this.fieldsAll = fieldsAll;
|
|
53
51
|
this.simpleContext = simpleContext;
|
|
54
|
-
this.
|
|
55
|
-
this.location = location;
|
|
52
|
+
this.location = unparentedLocation;
|
|
56
53
|
this[_a] = FlexTreeEntityKind.Node;
|
|
57
54
|
this._events = createEmitter();
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
55
|
+
/**
|
|
56
|
+
* The non-empty fields on this node.
|
|
57
|
+
* @remarks
|
|
58
|
+
* This is needed to implement {@link MapTreeNodeViewGeneric.fields}, which must omit empty fields.
|
|
59
|
+
* Due to having to detect if a field is empty, this forces the evaluation of any pending defaults in the fields.
|
|
60
|
+
* Use {@link allFieldsLazy} to avoid evaluating pending defaults.
|
|
61
|
+
*/
|
|
62
|
+
this.fields = {
|
|
63
|
+
get: (key) => this.tryGetField(key),
|
|
64
|
+
[Symbol.iterator]: () => filterIterable(this.fieldsAll, ([, field]) => field.length > 0),
|
|
65
|
+
};
|
|
66
|
+
for (const [_key, field] of this.fieldsAll) {
|
|
67
|
+
field.parent = this;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Gets all fields, without filtering out empty ones.
|
|
72
|
+
* @remarks
|
|
73
|
+
* This avoids forcing the evaluating of pending defaults in the fields, and also saves a copy on access.
|
|
74
|
+
*/
|
|
75
|
+
get allFieldsLazy() {
|
|
76
|
+
return this.fieldsAll;
|
|
68
77
|
}
|
|
69
78
|
get type() {
|
|
70
|
-
return this.
|
|
79
|
+
return this.data.type;
|
|
80
|
+
}
|
|
81
|
+
get schema() {
|
|
82
|
+
return this.data.type;
|
|
83
|
+
}
|
|
84
|
+
getOrCreateField(key) {
|
|
85
|
+
return getOrCreate(this.fieldsAll, key, () => {
|
|
86
|
+
const stored = this.storedSchema.getFieldSchema(key).kind;
|
|
87
|
+
const field = createField(this.context, stored, key, []);
|
|
88
|
+
field.parent = this;
|
|
89
|
+
return field;
|
|
90
|
+
});
|
|
71
91
|
}
|
|
72
92
|
adoptBy(parent, index) {
|
|
73
93
|
if (parent !== undefined) {
|
|
74
94
|
assert(index !== undefined, 0xa08 /* Expected index */);
|
|
75
95
|
if (this.location !== unparentedLocation) {
|
|
76
|
-
throw new UsageError("A node may not be
|
|
96
|
+
throw new UsageError("A node may not be in more than one place in the tree");
|
|
77
97
|
}
|
|
78
98
|
let unhydratedNode = parent.parent;
|
|
79
99
|
while (unhydratedNode !== undefined) {
|
|
@@ -99,49 +119,27 @@ export class UnhydratedFlexTreeNode {
|
|
|
99
119
|
return this.location;
|
|
100
120
|
}
|
|
101
121
|
borrowCursor() {
|
|
102
|
-
return cursorForMapTreeNode(this
|
|
122
|
+
return cursorForMapTreeNode(this);
|
|
103
123
|
}
|
|
104
124
|
tryGetField(key) {
|
|
105
|
-
const field = this.
|
|
125
|
+
const field = this.fieldsAll.get(key);
|
|
106
126
|
// Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.
|
|
107
127
|
if (field !== undefined && field.length > 0) {
|
|
108
|
-
return
|
|
128
|
+
return field;
|
|
109
129
|
}
|
|
110
130
|
}
|
|
111
131
|
getBoxed(key) {
|
|
112
132
|
const fieldKey = brand(key);
|
|
113
|
-
return
|
|
133
|
+
return this.getOrCreateField(fieldKey);
|
|
114
134
|
}
|
|
115
135
|
boxedIterator() {
|
|
116
|
-
return
|
|
136
|
+
return Array.from(this.fields, ([key, field]) => field)[Symbol.iterator]();
|
|
117
137
|
}
|
|
118
138
|
keys() {
|
|
119
|
-
|
|
120
|
-
return this.mapTree.fields.keys();
|
|
139
|
+
return Array.from(this.fields, ([key]) => key)[Symbol.iterator]();
|
|
121
140
|
}
|
|
122
141
|
get value() {
|
|
123
|
-
return this.
|
|
124
|
-
}
|
|
125
|
-
get anchorNode() {
|
|
126
|
-
// This API is relevant to `LazyTreeNode`s, but not `UnhydratedFlexTreeNode`s.
|
|
127
|
-
// TODO: Refactor the FlexTreeNode interface so that stubbing this out isn't necessary.
|
|
128
|
-
return fail(0xb47 /* UnhydratedFlexTreeNode does not implement anchorNode */);
|
|
129
|
-
}
|
|
130
|
-
walkTree() {
|
|
131
|
-
for (const [key, mapTrees] of this.mapTree.fields) {
|
|
132
|
-
const field = getOrCreateField(this, key, this.storedSchema.getFieldSchema(key).kind, () => this.emitChangedEvent(key));
|
|
133
|
-
for (let index = 0; index < field.length; index++) {
|
|
134
|
-
const child = getOrCreateChild(this.simpleContext, mapTrees[index] ?? oob(), {
|
|
135
|
-
parent: field,
|
|
136
|
-
index,
|
|
137
|
-
});
|
|
138
|
-
// These next asserts detect the case where `getOrCreateChild` gets a cache hit of a different node than the one we're trying to create
|
|
139
|
-
assert(child.location !== undefined, 0x98d /* Expected node to have parent */);
|
|
140
|
-
assert(child.location.parent.parent === this, 0x98e /* Node may not be multi-parented */);
|
|
141
|
-
assert(child.location.index === index, 0x98f /* Node may not be multi-parented */);
|
|
142
|
-
child.walkTree();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
142
|
+
return this.data.value;
|
|
145
143
|
}
|
|
146
144
|
emitChangedEvent(key) {
|
|
147
145
|
this._events.emit("childrenChangedAfterBatch", { changedFields: new Set([key]) });
|
|
@@ -202,61 +200,82 @@ const unparentedLocation = {
|
|
|
202
200
|
},
|
|
203
201
|
index: -1,
|
|
204
202
|
};
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
constructor(
|
|
210
|
-
|
|
203
|
+
/**
|
|
204
|
+
* The {@link Unhydrated} implementation of {@link FlexTreeField}.
|
|
205
|
+
*/
|
|
206
|
+
export class UnhydratedFlexTreeField {
|
|
207
|
+
constructor(context, schema, key,
|
|
208
|
+
/**
|
|
209
|
+
* The children of this field.
|
|
210
|
+
* @remarks
|
|
211
|
+
* This is either an array of {@link UnhydratedFlexTreeNode}s or a {@link ContextualFieldProvider} that will be used to populate the children lazily (after which it will become an array).
|
|
212
|
+
* See {@link fillPendingDefaults}.
|
|
213
|
+
* Note that any fields using a {@link ConstantFieldProvider} should be evaluated before constructing the UnhydratedFlexTreeField.
|
|
214
|
+
*/
|
|
215
|
+
lazyChildren) {
|
|
216
|
+
this.context = context;
|
|
211
217
|
this.schema = schema;
|
|
212
218
|
this.key = key;
|
|
213
|
-
this.
|
|
214
|
-
this.onEdit = onEdit;
|
|
219
|
+
this.lazyChildren = lazyChildren;
|
|
215
220
|
this[_b] = FlexTreeEntityKind.Field;
|
|
216
|
-
|
|
217
|
-
assert(!fieldKeyCache.has(key), 0x990 /* A field already exists for the given MapTrees */);
|
|
218
|
-
fieldKeyCache.set(key, this);
|
|
221
|
+
this.parent = undefined;
|
|
219
222
|
// When this field is created (which only happens one time, because it is cached), all the children become parented for the first time.
|
|
220
223
|
// "Adopt" each child by updating its parent information to point to this field.
|
|
221
|
-
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
if (mapTreeNodeChild.parentField !== unparentedLocation) {
|
|
225
|
-
throw new UsageError("A node may not be in more than one place in the tree");
|
|
226
|
-
}
|
|
227
|
-
mapTreeNodeChild.adoptBy(this, i);
|
|
224
|
+
if (Array.isArray(lazyChildren)) {
|
|
225
|
+
for (const [i, child] of lazyChildren.entries()) {
|
|
226
|
+
child.adoptBy(this, i);
|
|
228
227
|
}
|
|
229
228
|
}
|
|
230
229
|
}
|
|
231
|
-
|
|
232
|
-
return
|
|
230
|
+
getPendingDefault() {
|
|
231
|
+
return !Array.isArray(this.lazyChildren) ? this.lazyChildren : undefined;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Populate pending default (if present) using the provided context.
|
|
235
|
+
* @remarks
|
|
236
|
+
* This apply to just this field: caller will likely want to recursively walk the tree.
|
|
237
|
+
* @see {@link pendingDefault}.
|
|
238
|
+
*/
|
|
239
|
+
fillPendingDefaults(context) {
|
|
240
|
+
const provider = this.getPendingDefault();
|
|
241
|
+
if (provider) {
|
|
242
|
+
const content = provider(context);
|
|
243
|
+
this.lazyChildren = content;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Returns true if this field has a pending default due to defined defined using a {@link ContextualFieldProvider}.
|
|
248
|
+
*/
|
|
249
|
+
get pendingDefault() {
|
|
250
|
+
return this.getPendingDefault() !== undefined;
|
|
251
|
+
}
|
|
252
|
+
get children() {
|
|
253
|
+
const provider = this.getPendingDefault();
|
|
254
|
+
if (provider) {
|
|
255
|
+
const content = provider("UseGlobalContext");
|
|
256
|
+
this.lazyChildren = content;
|
|
257
|
+
}
|
|
258
|
+
return this.lazyChildren;
|
|
233
259
|
}
|
|
234
260
|
get length() {
|
|
235
|
-
return this.
|
|
261
|
+
return this.children.length;
|
|
236
262
|
}
|
|
237
263
|
is(kind) {
|
|
238
264
|
return this.schema === kind.identifier;
|
|
239
265
|
}
|
|
240
266
|
boxedIterator() {
|
|
241
|
-
return this.
|
|
242
|
-
.map((m, index) => getOrCreateChild(this.simpleContext, m, {
|
|
243
|
-
parent: this,
|
|
244
|
-
index,
|
|
245
|
-
}))
|
|
246
|
-
.values();
|
|
267
|
+
return this.children[Symbol.iterator]();
|
|
247
268
|
}
|
|
248
269
|
boxedAt(index) {
|
|
249
270
|
const i = indexForAt(index, this.length);
|
|
250
271
|
if (i === undefined) {
|
|
251
272
|
return undefined;
|
|
252
273
|
}
|
|
253
|
-
const m = this.
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
});
|
|
259
|
-
}
|
|
274
|
+
const m = this.children[i];
|
|
275
|
+
return m;
|
|
276
|
+
}
|
|
277
|
+
[(_b = flexTreeMarker, Symbol.iterator)]() {
|
|
278
|
+
return this.boxedIterator();
|
|
260
279
|
}
|
|
261
280
|
/**
|
|
262
281
|
* Mutate this field.
|
|
@@ -267,43 +286,40 @@ class UnhydratedFlexTreeField {
|
|
|
267
286
|
* This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.
|
|
268
287
|
*/
|
|
269
288
|
edit(edit) {
|
|
270
|
-
|
|
271
|
-
const
|
|
272
|
-
|
|
273
|
-
this.parent.mapTree.fields.set(this.key, newMapTrees);
|
|
289
|
+
// Clear parents for all old map trees.
|
|
290
|
+
for (const tree of this.children) {
|
|
291
|
+
tree.adoptBy(undefined);
|
|
274
292
|
}
|
|
275
|
-
|
|
276
|
-
|
|
293
|
+
this.lazyChildren = edit(this.children) ?? this.children;
|
|
294
|
+
// Set parents for all new map trees.
|
|
295
|
+
for (const [index, tree] of this.children.entries()) {
|
|
296
|
+
tree.adoptBy(this, index);
|
|
277
297
|
}
|
|
278
|
-
this.
|
|
298
|
+
this.parent?.emitChangedEvent(this.key);
|
|
279
299
|
}
|
|
280
300
|
getFieldPath() {
|
|
281
301
|
throw unsupportedUsageError("Editing an array");
|
|
282
302
|
}
|
|
283
303
|
/** Unboxes leaf nodes to their values */
|
|
284
304
|
unboxed(index) {
|
|
285
|
-
const
|
|
286
|
-
const value =
|
|
305
|
+
const child = this.children[index] ?? oob();
|
|
306
|
+
const value = child.value;
|
|
287
307
|
if (value !== undefined) {
|
|
288
308
|
return value;
|
|
289
309
|
}
|
|
290
|
-
return
|
|
310
|
+
return child;
|
|
291
311
|
}
|
|
292
312
|
}
|
|
293
|
-
|
|
294
|
-
|
|
313
|
+
/**
|
|
314
|
+
* The {@link Unhydrated} implementation of {@link FlexTreeOptionalField}.
|
|
315
|
+
*/
|
|
316
|
+
export class UnhydratedOptionalField extends UnhydratedFlexTreeField {
|
|
295
317
|
constructor() {
|
|
296
318
|
super(...arguments);
|
|
297
319
|
this.editor = {
|
|
298
320
|
set: (newContent) => {
|
|
299
|
-
// If the new content is a UnhydratedFlexTreeNode, it needs to have its parent pointer updated
|
|
300
321
|
if (newContent !== undefined) {
|
|
301
|
-
|
|
302
|
-
}
|
|
303
|
-
// If the old content is a UnhydratedFlexTreeNode, it needs to have its parent pointer unset
|
|
304
|
-
const oldContent = this.mapTrees[0];
|
|
305
|
-
if (oldContent !== undefined) {
|
|
306
|
-
nodeCache.get(oldContent)?.adoptBy(undefined);
|
|
322
|
+
assert(newContent instanceof UnhydratedFlexTreeNode, 0xbb7 /* Expected unhydrated node */);
|
|
307
323
|
}
|
|
308
324
|
this.edit((mapTrees) => {
|
|
309
325
|
if (newContent !== undefined) {
|
|
@@ -317,46 +333,48 @@ class EagerMapTreeOptionalField extends UnhydratedFlexTreeField {
|
|
|
317
333
|
};
|
|
318
334
|
}
|
|
319
335
|
get content() {
|
|
320
|
-
const value = this.
|
|
336
|
+
const value = this.children[0];
|
|
321
337
|
if (value !== undefined) {
|
|
322
338
|
return this.unboxed(0);
|
|
323
339
|
}
|
|
324
340
|
return undefined;
|
|
325
341
|
}
|
|
326
342
|
}
|
|
327
|
-
class
|
|
343
|
+
class UnhydratedRequiredField extends UnhydratedOptionalField {
|
|
328
344
|
get content() {
|
|
329
345
|
// This cannot use ?? since null is a legal value here.
|
|
330
346
|
assert(super.content !== undefined, 0xa57 /* Expected EagerMapTree required field to have a value */);
|
|
331
347
|
return super.content;
|
|
332
348
|
}
|
|
333
349
|
}
|
|
334
|
-
|
|
350
|
+
/**
|
|
351
|
+
* The {@link Unhydrated} implementation of {@link FlexTreeSequenceField}.
|
|
352
|
+
*/
|
|
353
|
+
export class UnhydratedSequenceField extends UnhydratedFlexTreeField {
|
|
335
354
|
constructor() {
|
|
336
355
|
super(...arguments);
|
|
337
356
|
this.editor = {
|
|
338
357
|
insert: (index, newContent) => {
|
|
339
|
-
for (
|
|
340
|
-
const c = newContent[i];
|
|
358
|
+
for (const c of newContent) {
|
|
341
359
|
assert(c !== undefined, 0xa0a /* Unexpected sparse array content */);
|
|
342
|
-
|
|
360
|
+
assert(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);
|
|
343
361
|
}
|
|
362
|
+
const newContentChecked = newContent;
|
|
344
363
|
this.edit((mapTrees) => {
|
|
345
364
|
if (newContent.length < 1000) {
|
|
346
365
|
// For "smallish arrays" (`1000` is not empirically derived), the `splice` function is appropriate...
|
|
347
|
-
mapTrees.splice(index, 0, ...
|
|
366
|
+
mapTrees.splice(index, 0, ...newContentChecked);
|
|
348
367
|
}
|
|
349
368
|
else {
|
|
350
369
|
// ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).
|
|
351
|
-
return mapTrees.slice(0, index).concat(
|
|
370
|
+
return mapTrees.slice(0, index).concat(newContentChecked, mapTrees.slice(index));
|
|
352
371
|
}
|
|
353
372
|
});
|
|
354
373
|
},
|
|
355
374
|
remove: (index, count) => {
|
|
356
375
|
for (let i = index; i < index + count; i++) {
|
|
357
|
-
const c = this.
|
|
376
|
+
const c = this.children[i];
|
|
358
377
|
assert(c !== undefined, 0xa0b /* Unexpected sparse array */);
|
|
359
|
-
nodeCache.get(c)?.adoptBy(undefined);
|
|
360
378
|
}
|
|
361
379
|
let removed;
|
|
362
380
|
this.edit((mapTrees) => {
|
|
@@ -376,58 +394,25 @@ export class UnhydratedTreeSequenceField extends UnhydratedFlexTreeField {
|
|
|
376
394
|
map(callbackfn) {
|
|
377
395
|
return Array.from(this, callbackfn);
|
|
378
396
|
}
|
|
379
|
-
*[Symbol.iterator]() {
|
|
380
|
-
for (const [i] of this.mapTrees.entries()) {
|
|
381
|
-
yield this.unboxed(i);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
397
|
}
|
|
385
398
|
// #endregion Fields
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
function getOrCreateChild(context, mapTree, parent) {
|
|
402
|
-
const cached = nodeCache.get(mapTree);
|
|
403
|
-
if (cached !== undefined) {
|
|
404
|
-
return cached;
|
|
405
|
-
}
|
|
406
|
-
return new UnhydratedFlexTreeNode(context, mapTree, parent);
|
|
407
|
-
}
|
|
408
|
-
/** Creates a field with the given attributes, or returns a cached field if there is one */
|
|
409
|
-
function getOrCreateField(parent, key, schema, onEdit) {
|
|
410
|
-
const cached = getFieldKeyCache(parent).get(key);
|
|
411
|
-
if (cached !== undefined) {
|
|
412
|
-
return cached;
|
|
413
|
-
}
|
|
414
|
-
if (schema === FieldKinds.required.identifier ||
|
|
415
|
-
schema === FieldKinds.identifier.identifier) {
|
|
416
|
-
return new EagerMapTreeRequiredField(parent.simpleContext, schema, key, parent, onEdit);
|
|
417
|
-
}
|
|
418
|
-
if (schema === FieldKinds.optional.identifier) {
|
|
419
|
-
return new EagerMapTreeOptionalField(parent.simpleContext, schema, key, parent, onEdit);
|
|
420
|
-
}
|
|
421
|
-
if (schema === FieldKinds.sequence.identifier) {
|
|
422
|
-
return new UnhydratedTreeSequenceField(parent.simpleContext, schema, key, parent, onEdit);
|
|
423
|
-
}
|
|
424
|
-
// TODO: this seems to used by unknown optional fields. They should probably use "optional" not "Forbidden" schema.
|
|
425
|
-
if (schema === FieldKinds.forbidden.identifier) {
|
|
426
|
-
return new UnhydratedFlexTreeField(parent.simpleContext, schema, key, parent, onEdit);
|
|
399
|
+
/** Creates a field with the given attributes */
|
|
400
|
+
export function createField(...args) {
|
|
401
|
+
switch (args[1]) {
|
|
402
|
+
case FieldKinds.required.identifier:
|
|
403
|
+
case FieldKinds.identifier.identifier:
|
|
404
|
+
return new UnhydratedRequiredField(...args);
|
|
405
|
+
case FieldKinds.optional.identifier:
|
|
406
|
+
return new UnhydratedOptionalField(...args);
|
|
407
|
+
case FieldKinds.sequence.identifier:
|
|
408
|
+
return new UnhydratedSequenceField(...args);
|
|
409
|
+
case FieldKinds.forbidden.identifier:
|
|
410
|
+
// TODO: this seems to used by unknown optional fields. They should probably use "optional" not "Forbidden" schema.
|
|
411
|
+
return new UnhydratedFlexTreeField(...args);
|
|
412
|
+
default:
|
|
413
|
+
return fail(0xb9d /* unsupported field kind */);
|
|
427
414
|
}
|
|
428
|
-
return fail(0xb9d /* unsupported field kind */);
|
|
429
415
|
}
|
|
430
|
-
// #endregion Caching and unboxing utilities
|
|
431
416
|
export function unsupportedUsageError(message) {
|
|
432
417
|
return new UsageError(`${message ?? "Operation"} is not supported for content that has not yet been inserted into the tree`);
|
|
433
418
|
}
|