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