@fluidframework/tree 2.63.0-359734 → 2.63.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 +81 -0
- package/api-report/tree.alpha.api.md +42 -8
- package/dist/alpha.d.ts +7 -0
- package/dist/codec/codec.d.ts +10 -27
- package/dist/codec/codec.d.ts.map +1 -1
- package/dist/codec/codec.js +9 -28
- package/dist/codec/codec.js.map +1 -1
- package/dist/codec/versioned/codec.d.ts +6 -5
- package/dist/codec/versioned/codec.d.ts.map +1 -1
- package/dist/codec/versioned/codec.js +4 -4
- package/dist/codec/versioned/codec.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +1 -1
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecs.js +1 -1
- package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkTree.d.ts +67 -13
- package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkTree.js +70 -35
- package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -8
- package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.js +2 -2
- package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +23 -0
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -0
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js +15 -0
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -0
- package/dist/feature-libraries/chunked-forest/codec/index.d.ts +1 -0
- package/dist/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/index.js +3 -1
- package/dist/feature-libraries/chunked-forest/codec/index.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +3 -2
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/index.d.ts +1 -1
- package/dist/feature-libraries/chunked-forest/index.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/index.js +2 -1
- package/dist/feature-libraries/chunked-forest/index.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +3 -3
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +3 -3
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +4 -11
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +2 -6
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +1 -1
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +2 -1
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/schema-index/codec.d.ts +6 -5
- package/dist/feature-libraries/schema-index/codec.d.ts.map +1 -1
- package/dist/feature-libraries/schema-index/codec.js +3 -3
- package/dist/feature-libraries/schema-index/codec.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/independentView.d.ts.map +1 -1
- package/dist/shared-tree/independentView.js +2 -2
- package/dist/shared-tree/independentView.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +5 -0
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +37 -7
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +6 -8
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +7 -9
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.js +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/dist/shared-tree/tree.js +1 -1
- package/dist/shared-tree/tree.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts +1 -1
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +3 -3
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.js +1 -1
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.js +3 -2
- package/dist/shared-tree-core/defaultResubmitMachine.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.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +37 -2
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.js +34 -14
- package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/dist/simple-tree/api/schemaStatics.js +3 -0
- package/dist/simple-tree/api/schemaStatics.js.map +1 -1
- package/dist/simple-tree/api/storedSchema.d.ts +4 -3
- package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/storedSchema.js +3 -3
- package/dist/simple-tree/api/storedSchema.js.map +1 -1
- package/dist/simple-tree/api/treeBeta.js +2 -2
- package/dist/simple-tree/api/treeBeta.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js +3 -3
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/api/typesUnsafe.d.ts +60 -1
- package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
- package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
- package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/core/allowedTypes.js +1 -1
- package/dist/simple-tree/core/allowedTypes.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 -2
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts +7 -11
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +24 -47
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/getTreeNodeForField.js +1 -1
- package/dist/simple-tree/getTreeNodeForField.js.map +1 -1
- package/dist/simple-tree/index.d.ts +2 -2
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +2 -2
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.js +2 -2
- package/dist/simple-tree/node-kinds/array/arrayNode.js.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/objectNode.js +3 -3
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.js +6 -6
- package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +36 -4
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +43 -15
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/treeFactory.d.ts.map +1 -1
- package/dist/treeFactory.js +13 -4
- package/dist/treeFactory.js.map +1 -1
- package/lib/alpha.d.ts +7 -0
- package/lib/codec/codec.d.ts +10 -27
- package/lib/codec/codec.d.ts.map +1 -1
- package/lib/codec/codec.js +8 -27
- package/lib/codec/codec.js.map +1 -1
- package/lib/codec/versioned/codec.d.ts +6 -5
- package/lib/codec/versioned/codec.d.ts.map +1 -1
- package/lib/codec/versioned/codec.js +4 -4
- package/lib/codec/versioned/codec.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +1 -1
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecs.js +1 -1
- package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkTree.d.ts +67 -13
- package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkTree.js +68 -32
- package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -8
- package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/codecs.js +2 -2
- package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +23 -0
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -0
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js +11 -0
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -0
- package/lib/feature-libraries/chunked-forest/codec/index.d.ts +1 -0
- package/lib/feature-libraries/chunked-forest/codec/index.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/index.js +1 -0
- package/lib/feature-libraries/chunked-forest/codec/index.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +3 -2
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/index.d.ts +1 -1
- package/lib/feature-libraries/chunked-forest/index.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/index.js +1 -1
- package/lib/feature-libraries/chunked-forest/index.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +3 -3
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +3 -3
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +4 -11
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +2 -6
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +1 -1
- 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/schema-index/codec.d.ts +6 -5
- package/lib/feature-libraries/schema-index/codec.d.ts.map +1 -1
- package/lib/feature-libraries/schema-index/codec.js +3 -3
- package/lib/feature-libraries/schema-index/codec.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/independentView.d.ts.map +1 -1
- package/lib/shared-tree/independentView.js +3 -3
- package/lib/shared-tree/independentView.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +5 -0
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +40 -10
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +6 -8
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +8 -10
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.js +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/lib/shared-tree/tree.js +2 -2
- package/lib/shared-tree/tree.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts +1 -1
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +4 -4
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.js +1 -1
- package/lib/shared-tree/treeCheckout.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/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.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +37 -2
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.js +34 -14
- package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/lib/simple-tree/api/schemaStatics.js +3 -0
- package/lib/simple-tree/api/schemaStatics.js.map +1 -1
- package/lib/simple-tree/api/storedSchema.d.ts +4 -3
- package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/storedSchema.js +3 -3
- package/lib/simple-tree/api/storedSchema.js.map +1 -1
- package/lib/simple-tree/api/treeBeta.js +2 -2
- package/lib/simple-tree/api/treeBeta.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +4 -4
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/typesUnsafe.d.ts +60 -1
- package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
- package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
- package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/core/allowedTypes.js +1 -1
- package/lib/simple-tree/core/allowedTypes.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 +7 -11
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +23 -46
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/getTreeNodeForField.js +1 -1
- package/lib/simple-tree/getTreeNodeForField.js.map +1 -1
- package/lib/simple-tree/index.d.ts +2 -2
- 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/node-kinds/array/arrayNode.js +3 -3
- package/lib/simple-tree/node-kinds/array/arrayNode.js.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/objectNode.js +4 -4
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.js +7 -7
- package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +36 -4
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +45 -17
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/treeFactory.d.ts.map +1 -1
- package/lib/treeFactory.js +13 -4
- package/lib/treeFactory.js.map +1 -1
- package/package.json +21 -20
- package/src/codec/codec.ts +11 -29
- package/src/codec/versioned/codec.ts +6 -6
- package/src/core/tree/detachedFieldIndex.ts +1 -1
- package/src/core/tree/detachedFieldIndexCodecs.ts +1 -1
- package/src/feature-libraries/chunked-forest/chunkTree.ts +112 -45
- package/src/feature-libraries/chunked-forest/codec/codecs.ts +7 -12
- package/src/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.ts +33 -0
- package/src/feature-libraries/chunked-forest/codec/index.ts +4 -0
- package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +4 -7
- package/src/feature-libraries/chunked-forest/index.ts +2 -0
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +1 -1
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +8 -12
- package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +3 -12
- package/src/feature-libraries/index.ts +2 -0
- package/src/feature-libraries/schema-index/codec.ts +5 -5
- package/src/index.ts +7 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/independentView.ts +3 -0
- package/src/shared-tree/schematizingTreeView.ts +63 -8
- package/src/shared-tree/sharedTree.ts +34 -21
- package/src/shared-tree/sharedTreeChangeCodecs.ts +1 -1
- package/src/shared-tree/tree.ts +2 -2
- package/src/shared-tree/treeAlpha.ts +6 -12
- package/src/shared-tree/treeCheckout.ts +1 -1
- package/src/shared-tree-core/defaultResubmitMachine.ts +3 -2
- package/src/simple-tree/api/index.ts +7 -0
- package/src/simple-tree/api/schemaFactoryAlpha.ts +79 -19
- package/src/simple-tree/api/schemaStatics.ts +3 -0
- package/src/simple-tree/api/storedSchema.ts +5 -4
- package/src/simple-tree/api/treeBeta.ts +2 -2
- package/src/simple-tree/api/treeNodeApi.ts +4 -4
- package/src/simple-tree/api/typesUnsafe.ts +81 -0
- package/src/simple-tree/core/TreeNodeBinding.md +14 -70
- package/src/simple-tree/core/allowedTypes.ts +4 -1
- package/src/simple-tree/core/index.ts +1 -1
- package/src/simple-tree/core/treeNodeKernel.ts +25 -59
- package/src/simple-tree/getTreeNodeForField.ts +1 -1
- package/src/simple-tree/index.ts +8 -1
- package/src/simple-tree/node-kinds/array/arrayNode.ts +3 -3
- package/src/simple-tree/node-kinds/map/mapNode.ts +3 -3
- package/src/simple-tree/node-kinds/object/objectNode.ts +4 -4
- package/src/simple-tree/node-kinds/record/recordNode.ts +7 -7
- package/src/simple-tree/prepareForInsertion.ts +87 -25
- package/src/treeFactory.ts +17 -4
|
@@ -29,6 +29,8 @@ import type {
|
|
|
29
29
|
TreeLeafValue,
|
|
30
30
|
FlexListToUnion,
|
|
31
31
|
LazyItem,
|
|
32
|
+
AnnotatedAllowedType,
|
|
33
|
+
AnnotatedAllowedTypes,
|
|
32
34
|
} from "../core/index.js";
|
|
33
35
|
import type { TreeArrayNode } from "../node-kinds/index.js";
|
|
34
36
|
import type { SimpleArrayNodeSchema, SimpleMapNodeSchema } from "../simpleSchema.js";
|
|
@@ -543,3 +545,82 @@ export interface TreeRecordNodeUnsafe<
|
|
|
543
545
|
[string, System_Unsafe.TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>]
|
|
544
546
|
>;
|
|
545
547
|
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* {@link Unenforced} utility to remove {@link AnnotatedAllowedTypeUnsafe} wrappers.
|
|
551
|
+
* @remarks
|
|
552
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
553
|
+
* @sealed
|
|
554
|
+
* @alpha
|
|
555
|
+
* @system
|
|
556
|
+
*/
|
|
557
|
+
export type UnannotateAllowedTypeUnsafe<
|
|
558
|
+
T extends Unenforced<
|
|
559
|
+
AnnotatedAllowedTypeUnsafe | LazyItem<System_Unsafe.TreeNodeSchemaUnsafe>
|
|
560
|
+
>,
|
|
561
|
+
> = T extends AnnotatedAllowedTypeUnsafe<infer X> ? X : T;
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* {@link Unenforced} version of {@link AnnotatedAllowedType}.
|
|
565
|
+
* @remarks
|
|
566
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
567
|
+
* @system @sealed @alpha
|
|
568
|
+
*/
|
|
569
|
+
export interface AnnotatedAllowedTypeUnsafe<T = Unenforced<LazyItem<TreeNodeSchema>>>
|
|
570
|
+
extends AnnotatedAllowedType<T> {}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* {@link Unenforced} version of {@link AnnotatedAllowedTypes}.
|
|
574
|
+
* @remarks
|
|
575
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
576
|
+
* @system @sealed @alpha
|
|
577
|
+
*/
|
|
578
|
+
export interface AnnotatedAllowedTypesUnsafe
|
|
579
|
+
extends AnnotatedAllowedTypes<LazyItem<System_Unsafe.TreeNodeSchemaUnsafe>> {}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* {@link Unenforced} version of {@link AllowedTypesFull}.
|
|
583
|
+
* @remarks
|
|
584
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
585
|
+
* @system @sealed @alpha
|
|
586
|
+
*/
|
|
587
|
+
export type AllowedTypesFullUnsafe<
|
|
588
|
+
T extends readonly AnnotatedAllowedTypeUnsafe[] = readonly AnnotatedAllowedTypeUnsafe[],
|
|
589
|
+
> = AnnotatedAllowedTypes<T> & UnannotateAllowedTypesListUnsafe<T>;
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* {@link Unenforced} version of {@link AllowedTypesFullFromMixed}.
|
|
593
|
+
* @remarks
|
|
594
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
595
|
+
* @system @sealed @alpha
|
|
596
|
+
*/
|
|
597
|
+
export type AllowedTypesFullFromMixedUnsafe<
|
|
598
|
+
T extends readonly Unenforced<AnnotatedAllowedType | LazyItem<TreeNodeSchema>>[],
|
|
599
|
+
> = UnannotateAllowedTypesListUnsafe<T> &
|
|
600
|
+
AnnotatedAllowedTypes<AnnotateAllowedTypesListUnsafe<T>>;
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* {@link Unenforced} version of {@link UnannotateAllowedTypesList}.
|
|
604
|
+
* @remarks
|
|
605
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
606
|
+
* @system @sealed @alpha
|
|
607
|
+
*/
|
|
608
|
+
export type UnannotateAllowedTypesListUnsafe<
|
|
609
|
+
T extends readonly Unenforced<AnnotatedAllowedType | LazyItem<TreeNodeSchema>>[],
|
|
610
|
+
> = {
|
|
611
|
+
readonly [I in keyof T]: T[I] extends { type: infer X } ? X : T[I];
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* {@link Unenforced} version of {@link AnnotateAllowedTypesList}.
|
|
616
|
+
* @remarks
|
|
617
|
+
* Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
|
|
618
|
+
* @system @sealed @alpha
|
|
619
|
+
*/
|
|
620
|
+
export type AnnotateAllowedTypesListUnsafe<
|
|
621
|
+
T extends readonly Unenforced<AnnotatedAllowedType | LazyItem<TreeNodeSchema>>[],
|
|
622
|
+
> = {
|
|
623
|
+
[I in keyof T]: T[I] extends AnnotatedAllowedTypeUnsafe
|
|
624
|
+
? T[I]
|
|
625
|
+
: AnnotatedAllowedTypeUnsafe<T[I]>;
|
|
626
|
+
};
|
|
@@ -8,9 +8,7 @@ Here is an example:
|
|
|
8
8
|
function addPoint(curve: Curve, x: number, y: number): Point {
|
|
9
9
|
const point = new Point({ x: 3, y: 3 });
|
|
10
10
|
curve.points.insertAtEnd(point);
|
|
11
|
-
//
|
|
12
|
-
assert(point.x === 3);
|
|
13
|
-
// In fact, `point` is the same simple-tree node object that you would get from reading it off of its new parent in the tree:
|
|
11
|
+
// `point` is the same simple-tree node object that you would get from reading it off of its new parent in the tree:
|
|
14
12
|
assert(point === curve.points[curve.points.length - 1]);
|
|
15
13
|
// So, to read the content that was just inserted, the original object can be used and there is no need to read via the parent:
|
|
16
14
|
return point;
|
|
@@ -22,83 +20,29 @@ function addPoint(curve: Curve, x: number, y: number): Point {
|
|
|
22
20
|
|
|
23
21
|
This feature is supported by doing some bookkeeping to ensure that the simple-tree objects,
|
|
24
22
|
flex tree nodes and anchor nodes in the tree get associated and disassociated at the right times.
|
|
25
|
-
There are three states that a node simple-tree node can be in: "
|
|
23
|
+
There are three states that a node simple-tree node can be in: "Unhydrated", "hydrating" and "Hydrated".
|
|
26
24
|
|
|
27
|
-
|
|
25
|
+
### Unhydrated Nodes
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
A newly created simple-tree node, a.k.a. a **raw** simple-tree node. A raw simple-tree node is produced by invoking the schema-provided constructor for a node:
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
const rawPoint = new Point({ x: 3, y: 3 });
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Such a simple-tree node will be raw until it is inserted into the tree and becomes "marinated" (see below).
|
|
38
|
-
As raw nodes can be read or mutated.
|
|
39
|
-
|
|
40
|
-
### Marinated Proxies
|
|
41
|
-
|
|
42
|
-
Proxies become **marinated** as soon as they are inserted into the tree.
|
|
43
|
-
|
|
44
|
-
This happens whether proxies are inserted directly, as the root of the content subtree...
|
|
27
|
+
A newly created simple-tree node, a.k.a. an **unhydrated** simple-tree node. An unhydrated simple-tree node is produced by invoking the schema-provided constructor for a node:
|
|
45
28
|
|
|
46
29
|
```ts
|
|
47
|
-
|
|
48
|
-
app.graph.curves[0].insertAtEnd(rawPoint);
|
|
30
|
+
const unhydratedPoint = new Point({ x: 3, y: 3 });
|
|
49
31
|
```
|
|
50
32
|
|
|
51
|
-
|
|
33
|
+
Such a simple-tree node will be unhydrated until it is inserted into the tree and becomes "hydrated" (see below).
|
|
34
|
+
Unhydrated nodes can be read or mutated just like hydrated ones.
|
|
52
35
|
|
|
53
|
-
|
|
54
|
-
// Upon insertion, `rawPoint` transitions from "raw" to the next state, "marinated"
|
|
55
|
-
app.graph = {
|
|
56
|
-
curves: [
|
|
57
|
-
[new Point({ x: 10, y: 10 }), new Point({ x: 20, y: 20 })],
|
|
58
|
-
[new Point({ x: 2, y: 2 }), rawPoint, new Point({ x: 4, y: 4 })],
|
|
59
|
-
],
|
|
60
|
-
};
|
|
61
|
-
```
|
|
36
|
+
### Hydrating Nodes
|
|
62
37
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
The simple-tree node for that content will then be mapped to the `AnchorNode` (via its kernel) and the `AnchorNode` will be mapped to the simple-tree node.
|
|
66
|
-
Note that the `AnchorNode` may not yet have a `FlexTreeNode` associated with it - that happens when the node becomes "cooked" (see below).
|
|
38
|
+
Between insertion edit and the change callback which updates the node to "Hydrated" (see [prepareForInsertion.ts](../prepareForInsertion.ts)),
|
|
39
|
+
the node is in a poorly defined "hydrating" state and should not be interacted with.
|
|
67
40
|
|
|
68
|
-
###
|
|
41
|
+
### Hydrated Nodes
|
|
69
42
|
|
|
70
|
-
A simple-tree node is fully
|
|
71
|
-
This happens lazily on demand, if/when a marinated simple-tree node is read or mutated (by the local client).
|
|
43
|
+
A simple-tree node is fully hydrated when it is associated with a `HydratedFlexTreeNode`.
|
|
72
44
|
|
|
73
45
|
```ts
|
|
74
|
-
const point = new Point({ x: 3, y: 3 }); // `point` is
|
|
75
|
-
curves.points.insertAtEnd(point); // `point` becomes
|
|
76
|
-
const x = point.x; // `point` becomes cooked in order to support the read of `x`
|
|
46
|
+
const point = new Point({ x: 3, y: 3 }); // `point` is unhydrated
|
|
47
|
+
curves.points.insertAtEnd(point); // `point` becomes hydrated
|
|
77
48
|
```
|
|
78
|
-
|
|
79
|
-
This laziness prevents the simple-tree node tree from generating unnecessary `FlexTreeNodes`.
|
|
80
|
-
|
|
81
|
-
Cooking a marinated simple-tree node works as follows:
|
|
82
|
-
|
|
83
|
-
1. Get the `AnchorNode` associated with the marinated simple-tree node.
|
|
84
|
-
2. Get or create a `FlexTreeNode` for the anchor.
|
|
85
|
-
3. This will cause the `FlexTreeNode` to be generated which corresponds to the simple-tree node.
|
|
86
|
-
|
|
87
|
-
### Mappings
|
|
88
|
-
|
|
89
|
-
```mermaid
|
|
90
|
-
graph LR;
|
|
91
|
-
AnchorNode(AnchorNode)<-->|Cooked and sometimes when Marinated|FlexTreeNode(FlexTreeNode)
|
|
92
|
-
AnchorNode<--->|Marinated or Cooked|TreeNode(TreeNode)-.->|Raw|RawTreeNode(RawTreeNode)
|
|
93
|
-
linkStyle 0 stroke:#0f0
|
|
94
|
-
linkStyle 1 stroke:#00f
|
|
95
|
-
linkStyle 2 stroke:#f00
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
Note that it is possible for the `Cooked` mappings between an `AnchorNode` and a `FlexTreeNode` to exist regardless of whether there is also a simple-tree node yet created for that node.
|
|
99
|
-
In that case, when that simple-tree node is created it will immediately be given its `Marinated` mappings and therefore already be cooked.
|
|
100
|
-
|
|
101
|
-
`RawTreeNode`s, which implement the `FlexTreeNode` interface (or at least, as of 2024-03-21, pretend to), are substitutes for the true `FlexTreeNode`s that don't yet exist for a raw node.
|
|
102
|
-
The `Raw` mapping is removed when a simple-tree node is marinated, and the `RawTreeNode` is forgotten.
|
|
103
|
-
|
|
104
|
-
See [proxyBinding.ts](./proxyBinding.ts) for more details.
|
|
@@ -539,7 +539,10 @@ export function normalizeAllowedTypesInternal(
|
|
|
539
539
|
return getOrCreate(cachedNormalize, type, () => {
|
|
540
540
|
// Due to more specific internal type, the above does not narrow sufficiently, so more narrowing is needed.
|
|
541
541
|
// It is possible this will give a false error if a TreeNodeSchema which matches this check is used.
|
|
542
|
-
assert(
|
|
542
|
+
assert(
|
|
543
|
+
!("types" in type && "metadata" in type),
|
|
544
|
+
0xc7d /* invalid AnnotatedAllowedTypes */,
|
|
545
|
+
);
|
|
543
546
|
|
|
544
547
|
const annotatedTypes: AnnotatedAllowedType[] = (isReadonlyArray(type) ? type : [type]).map(
|
|
545
548
|
normalizeToAnnotatedAllowedType,
|
|
@@ -17,14 +17,11 @@ import {
|
|
|
17
17
|
anchorSlot,
|
|
18
18
|
type AnchorEvents,
|
|
19
19
|
type AnchorNode,
|
|
20
|
-
type AnchorSet,
|
|
21
20
|
type FieldKey,
|
|
22
21
|
type TreeValue,
|
|
23
|
-
type UpPath,
|
|
24
22
|
} from "../../core/index.js";
|
|
25
23
|
import { getOrCreateHydratedFlexTreeNode } from "../../feature-libraries/index.js";
|
|
26
24
|
import {
|
|
27
|
-
assertFlexTreeEntityNotFreed,
|
|
28
25
|
ContextSlot,
|
|
29
26
|
flexTreeSlot,
|
|
30
27
|
LazyEntity,
|
|
@@ -85,10 +82,8 @@ interface UnhydratedState {
|
|
|
85
82
|
|
|
86
83
|
/** The {@link HydrationState} of a {@link TreeNodeKernel} after the kernel is hydrated */
|
|
87
84
|
interface HydratedState {
|
|
88
|
-
/** The flex node for this kernel
|
|
89
|
-
innerNode
|
|
90
|
-
/** The {@link AnchorNode} that this node is associated with. */
|
|
91
|
-
readonly anchorNode: AnchorNode;
|
|
85
|
+
/** The flex node for this kernel */
|
|
86
|
+
readonly innerNode: HydratedFlexTreeNode;
|
|
92
87
|
/** All {@link Off | event deregistration functions} that should be run when the kernel is disposed. */
|
|
93
88
|
readonly offAnchorNode: Set<Off>;
|
|
94
89
|
}
|
|
@@ -98,7 +93,7 @@ type HydrationState = UnhydratedState | HydratedState;
|
|
|
98
93
|
|
|
99
94
|
/** True if and only if the given {@link HydrationState} is post-hydration */
|
|
100
95
|
function isHydrated(state: HydrationState): state is HydratedState {
|
|
101
|
-
return (
|
|
96
|
+
return state.innerNode.isHydrated();
|
|
102
97
|
}
|
|
103
98
|
|
|
104
99
|
/**
|
|
@@ -137,7 +132,7 @@ export class TreeNodeKernel {
|
|
|
137
132
|
* Create a TreeNodeKernel which can be looked up with {@link getKernel}.
|
|
138
133
|
*
|
|
139
134
|
* @param initialContext - context from when this node was originally created. Only used when unhydrated.
|
|
140
|
-
* @param innerNode - When unhydrated
|
|
135
|
+
* @param innerNode - When unhydrated the MapTreeNode. Otherwise HydratedFlexTreeNode.
|
|
141
136
|
* @remarks
|
|
142
137
|
* Exactly one kernel per TreeNode should be created.
|
|
143
138
|
*/
|
|
@@ -165,9 +160,7 @@ export class TreeNodeKernel {
|
|
|
165
160
|
this.#eventBuffer = new KernelEventBuffer(innerNode.events);
|
|
166
161
|
} else {
|
|
167
162
|
// Hydrated case
|
|
168
|
-
this.#hydrationState = this.createHydratedState(innerNode
|
|
169
|
-
this.#hydrationState.innerNode = innerNode;
|
|
170
|
-
|
|
163
|
+
this.#hydrationState = this.createHydratedState(innerNode);
|
|
171
164
|
this.#eventBuffer = new KernelEventBuffer(innerNode.anchorNode.events);
|
|
172
165
|
}
|
|
173
166
|
}
|
|
@@ -176,7 +169,7 @@ export class TreeNodeKernel {
|
|
|
176
169
|
if (isHydrated(this.#hydrationState)) {
|
|
177
170
|
// This can't be cached on this.#hydrated during hydration since initial tree is hydrated before the context is cached on the anchorSet.
|
|
178
171
|
return (
|
|
179
|
-
this.#hydrationState
|
|
172
|
+
this.#hydrationState.innerNode.anchorNode.anchorSet.slots.get(SimpleContextSlot) ??
|
|
180
173
|
fail(0xb40 /* missing simple-tree context */)
|
|
181
174
|
);
|
|
182
175
|
}
|
|
@@ -185,38 +178,33 @@ export class TreeNodeKernel {
|
|
|
185
178
|
|
|
186
179
|
/**
|
|
187
180
|
* Transition from {@link Unhydrated} to hydrated.
|
|
188
|
-
* Bi-directionally associates the given hydrated TreeNode to the
|
|
181
|
+
* Bi-directionally associates the given hydrated TreeNode to the HydratedFlexTreeNode.
|
|
189
182
|
* @remarks
|
|
190
183
|
* Happens at most once for any given node.
|
|
191
184
|
* Cleans up mappings to {@link UnhydratedFlexTreeNode} - it is assumed that they are no longer needed once this node has an anchor node.
|
|
192
185
|
*/
|
|
193
|
-
public hydrate(
|
|
186
|
+
public hydrate(inner: HydratedFlexTreeNode): void {
|
|
194
187
|
assert(!this.disposed, 0xa2a /* cannot hydrate a disposed node */);
|
|
195
188
|
assert(!isHydrated(this.#hydrationState), 0xa2b /* hydration should only happen once */);
|
|
196
189
|
|
|
197
|
-
|
|
198
|
-
const anchorNode =
|
|
199
|
-
anchors.locate(anchor) ?? fail(0xb42 /* Expected anchor node to be present */);
|
|
200
|
-
|
|
201
|
-
this.#hydrationState = this.createHydratedState(anchorNode);
|
|
202
|
-
this.#hydrationState.offAnchorNode.add(() => anchors.forget(anchor));
|
|
190
|
+
this.#hydrationState = this.createHydratedState(inner);
|
|
203
191
|
|
|
204
192
|
// Lazily migrate existing event listeners to the anchor node
|
|
205
|
-
this.#eventBuffer.migrateEventSource(anchorNode.events);
|
|
193
|
+
this.#eventBuffer.migrateEventSource(inner.anchorNode.events);
|
|
206
194
|
}
|
|
207
195
|
|
|
208
|
-
private createHydratedState(
|
|
196
|
+
private createHydratedState(innerNode: HydratedFlexTreeNode): HydratedState {
|
|
209
197
|
assert(
|
|
210
|
-
!anchorNode.slots.has(simpleTreeNodeSlot),
|
|
198
|
+
!innerNode.anchorNode.slots.has(simpleTreeNodeSlot),
|
|
211
199
|
0x7f5 /* Cannot associate an flex node with multiple simple-tree nodes */,
|
|
212
200
|
);
|
|
213
|
-
anchorNode.slots.set(simpleTreeNodeSlot, this.node);
|
|
201
|
+
innerNode.anchorNode.slots.set(simpleTreeNodeSlot, this.node);
|
|
214
202
|
return {
|
|
215
|
-
|
|
203
|
+
innerNode,
|
|
216
204
|
offAnchorNode: new Set([
|
|
217
|
-
anchorNode.events.on("afterDestroy", () => this.dispose()),
|
|
205
|
+
innerNode.anchorNode.events.on("afterDestroy", () => this.dispose()),
|
|
218
206
|
// TODO: this should be triggered on change even for unhydrated nodes.
|
|
219
|
-
anchorNode.events.on("childrenChanging", () => {
|
|
207
|
+
innerNode.anchorNode.events.on("childrenChanging", () => {
|
|
220
208
|
this.generationNumber += 1;
|
|
221
209
|
}),
|
|
222
210
|
]),
|
|
@@ -232,7 +220,7 @@ export class TreeNodeKernel {
|
|
|
232
220
|
}
|
|
233
221
|
|
|
234
222
|
// TODO: Replace this check with the proper check against the cursor state when the cursor becomes part of the kernel
|
|
235
|
-
const flex = this.#hydrationState.anchorNode.slots.get(flexTreeSlot);
|
|
223
|
+
const flex = this.#hydrationState.innerNode.anchorNode.slots.get(flexTreeSlot);
|
|
236
224
|
if (flex !== undefined) {
|
|
237
225
|
assert(flex instanceof LazyEntity, 0x9b4 /* Unexpected flex node implementation */);
|
|
238
226
|
if (flex.isFreed()) {
|
|
@@ -240,7 +228,7 @@ export class TreeNodeKernel {
|
|
|
240
228
|
}
|
|
241
229
|
}
|
|
242
230
|
|
|
243
|
-
return treeStatusFromAnchorCache(this.#hydrationState.anchorNode);
|
|
231
|
+
return treeStatusFromAnchorCache(this.#hydrationState.innerNode.anchorNode);
|
|
244
232
|
}
|
|
245
233
|
|
|
246
234
|
public get events(): Listenable<KernelEvents> {
|
|
@@ -264,7 +252,9 @@ export class TreeNodeKernel {
|
|
|
264
252
|
}
|
|
265
253
|
|
|
266
254
|
public get anchorNode(): AnchorNode | undefined {
|
|
267
|
-
return isHydrated(this.#hydrationState)
|
|
255
|
+
return isHydrated(this.#hydrationState)
|
|
256
|
+
? this.#hydrationState.innerNode.anchorNode
|
|
257
|
+
: undefined;
|
|
268
258
|
}
|
|
269
259
|
|
|
270
260
|
/**
|
|
@@ -273,11 +263,10 @@ export class TreeNodeKernel {
|
|
|
273
263
|
* For {@link Unhydrated} nodes, this returns the MapTreeNode.
|
|
274
264
|
*
|
|
275
265
|
* For hydrated nodes it returns a FlexTreeNode backed by the forest.
|
|
276
|
-
* Note that for "marinated" nodes, this FlexTreeNode exists and returns it: it does not return the MapTreeNode which is the current InnerNode.
|
|
277
266
|
*
|
|
278
267
|
* @throws A {@link @fluidframework/telemetry-utils#UsageError} if the node has been deleted.
|
|
279
268
|
*/
|
|
280
|
-
public
|
|
269
|
+
public getInnerNode(): InnerNode {
|
|
281
270
|
if (!isHydrated(this.#hydrationState)) {
|
|
282
271
|
debugAssert(
|
|
283
272
|
() =>
|
|
@@ -291,26 +280,6 @@ export class TreeNodeKernel {
|
|
|
291
280
|
throw new UsageError("Cannot access a deleted node.");
|
|
292
281
|
}
|
|
293
282
|
|
|
294
|
-
if (this.#hydrationState.innerNode === undefined) {
|
|
295
|
-
// Marinated case -> cooked
|
|
296
|
-
const anchorNode = this.#hydrationState.anchorNode;
|
|
297
|
-
// This TreeNode is bound to an anchor node, but it may or may not have an actual flex node yet
|
|
298
|
-
const flexNode = anchorNode.slots.get(flexTreeSlot);
|
|
299
|
-
if (flexNode !== undefined) {
|
|
300
|
-
// If the flex node already exists, use it...
|
|
301
|
-
this.#hydrationState.innerNode = flexNode;
|
|
302
|
-
} else {
|
|
303
|
-
// ...otherwise, the flex node must be created
|
|
304
|
-
const context =
|
|
305
|
-
anchorNode.anchorSet.slots.get(ContextSlot) ?? fail(0xb41 /* missing context */);
|
|
306
|
-
const cursor = context.checkout.forest.allocateCursor("getFlexNode");
|
|
307
|
-
context.checkout.forest.moveCursorToPath(anchorNode, cursor);
|
|
308
|
-
this.#hydrationState.innerNode = getOrCreateHydratedFlexTreeNode(context, cursor);
|
|
309
|
-
cursor.free();
|
|
310
|
-
assertFlexTreeEntityNotFreed(this.#hydrationState.innerNode);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
283
|
return this.#hydrationState.innerNode;
|
|
315
284
|
}
|
|
316
285
|
|
|
@@ -553,10 +522,8 @@ class KernelEventBuffer implements Listenable<KernelEvents> {
|
|
|
553
522
|
// #endregion
|
|
554
523
|
|
|
555
524
|
/**
|
|
556
|
-
* For
|
|
525
|
+
* For hydrated nodes this is a HydratedFlexTreeNode thats a projection of forest content.
|
|
557
526
|
* For {@link Unhydrated} nodes this is a UnhydratedFlexTreeNode.
|
|
558
|
-
*
|
|
559
|
-
* For "marinated" nodes, some code (ex: getOrCreateInnerNode) returns the FlexTreeNode thats a projection of forest content, and some code (ex: tryGetInnerNode) returns undefined.
|
|
560
527
|
*/
|
|
561
528
|
export type InnerNode = FlexTreeNode;
|
|
562
529
|
|
|
@@ -621,13 +588,12 @@ export function getSimpleContextFromInnerNode(innerNode: InnerNode): Context {
|
|
|
621
588
|
* For {@link Unhydrated} nodes, this returns the MapTreeNode.
|
|
622
589
|
*
|
|
623
590
|
* For hydrated nodes it returns a FlexTreeNode backed by the forest.
|
|
624
|
-
* Note that for "marinated" nodes, this FlexTreeNode exists and returns it: it does not return the MapTreeNode which is the current InnerNode.
|
|
625
591
|
*
|
|
626
592
|
* @throws A {@link @fluidframework/telemetry-utils#UsageError} if the node has been deleted.
|
|
627
593
|
*/
|
|
628
|
-
export function
|
|
594
|
+
export function getInnerNode(treeNode: TreeNode): InnerNode {
|
|
629
595
|
const kernel = getKernel(treeNode);
|
|
630
|
-
return kernel.
|
|
596
|
+
return kernel.getInnerNode();
|
|
631
597
|
}
|
|
632
598
|
|
|
633
599
|
/**
|
|
@@ -40,7 +40,7 @@ export function tryGetTreeNodeForField(
|
|
|
40
40
|
return tryToUnboxLeaves(typedField);
|
|
41
41
|
}
|
|
42
42
|
case FieldKinds.identifier.identifier: {
|
|
43
|
-
// Identifier fields are just
|
|
43
|
+
// Identifier fields are just required fields that hold strings
|
|
44
44
|
return (field as FlexTreeRequiredField).content as string;
|
|
45
45
|
}
|
|
46
46
|
|
package/src/simple-tree/index.ts
CHANGED
|
@@ -21,7 +21,7 @@ export {
|
|
|
21
21
|
tryDisposeTreeNode,
|
|
22
22
|
HydratedContext,
|
|
23
23
|
SimpleContextSlot,
|
|
24
|
-
|
|
24
|
+
getInnerNode,
|
|
25
25
|
getOrCreateNodeFromInnerNode,
|
|
26
26
|
getOrCreateNodeFromInnerUnboxedNode,
|
|
27
27
|
getKernel,
|
|
@@ -127,6 +127,13 @@ export {
|
|
|
127
127
|
type ArrayNodeCustomizableSchemaUnsafe,
|
|
128
128
|
type MapNodeCustomizableSchemaUnsafe,
|
|
129
129
|
type TreeRecordNodeUnsafe,
|
|
130
|
+
type UnannotateAllowedTypeUnsafe,
|
|
131
|
+
type AnnotatedAllowedTypeUnsafe,
|
|
132
|
+
type AnnotatedAllowedTypesUnsafe,
|
|
133
|
+
type AllowedTypesFullUnsafe,
|
|
134
|
+
type AllowedTypesFullFromMixedUnsafe,
|
|
135
|
+
type UnannotateAllowedTypesListUnsafe,
|
|
136
|
+
type AnnotateAllowedTypesListUnsafe,
|
|
130
137
|
type TreeViewAlpha,
|
|
131
138
|
type TreeBranch,
|
|
132
139
|
type TreeBranchEvents,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
typeSchemaSymbol,
|
|
26
26
|
getOrCreateNodeFromInnerNode,
|
|
27
27
|
getSimpleNodeSchemaFromInnerNode,
|
|
28
|
-
|
|
28
|
+
getInnerNode,
|
|
29
29
|
type TreeNodeSchemaClass,
|
|
30
30
|
getKernel,
|
|
31
31
|
type UnhydratedFlexTreeNode,
|
|
@@ -477,7 +477,7 @@ export class IterableTreeArrayContent<T> implements Iterable<T> {
|
|
|
477
477
|
* Given a array node proxy, returns its underlying LazySequence field.
|
|
478
478
|
*/
|
|
479
479
|
function getSequenceField(arrayNode: ReadonlyArrayNode): FlexTreeSequenceField {
|
|
480
|
-
return
|
|
480
|
+
return getInnerNode(arrayNode).getBoxed(EmptyKey) as FlexTreeSequenceField;
|
|
481
481
|
}
|
|
482
482
|
|
|
483
483
|
// For compatibility, we are initially implement 'readonly T[]' by applying the Array.prototype methods
|
|
@@ -886,7 +886,7 @@ abstract class CustomArrayNodeBase<const T extends ImplicitAllowedTypes>
|
|
|
886
886
|
);
|
|
887
887
|
|
|
888
888
|
const kernel = getKernel(this);
|
|
889
|
-
const flexContext = kernel.
|
|
889
|
+
const flexContext = kernel.getInnerNode().context;
|
|
890
890
|
assert(
|
|
891
891
|
flexContext === kernel.context.flexContext,
|
|
892
892
|
0xc14 /* Expected flexContext to match */,
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
typeNameSymbol,
|
|
27
27
|
type TreeNode,
|
|
28
28
|
typeSchemaSymbol,
|
|
29
|
-
|
|
29
|
+
getInnerNode,
|
|
30
30
|
type InternalTreeNode,
|
|
31
31
|
type UnhydratedFlexTreeNode,
|
|
32
32
|
normalizeAllowedTypes,
|
|
@@ -173,7 +173,7 @@ abstract class CustomMapNodeBase<const T extends ImplicitAllowedTypes> extends T
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
private get innerNode(): InnerNode {
|
|
176
|
-
return
|
|
176
|
+
return getInnerNode(this);
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
private editor(key: string): OptionalFieldEditBuilder<FlexibleNodeContent> {
|
|
@@ -242,7 +242,7 @@ abstract class CustomMapNodeBase<const T extends ImplicitAllowedTypes> extends T
|
|
|
242
242
|
callbackFn: (value: TreeNodeFromImplicitAllowedTypes<T>, key: string, map: TThis) => void,
|
|
243
243
|
thisArg?: unknown,
|
|
244
244
|
): void {
|
|
245
|
-
for (const field of
|
|
245
|
+
for (const field of getInnerNode(this)) {
|
|
246
246
|
const node = tryGetTreeNodeForField(field) as TreeNodeFromImplicitAllowedTypes<T>;
|
|
247
247
|
callbackFn.call(thisArg, node, field.key, this);
|
|
248
248
|
}
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
type InternalTreeNode,
|
|
39
39
|
type TreeNode,
|
|
40
40
|
type UnhydratedFlexTreeNode,
|
|
41
|
-
|
|
41
|
+
getInnerNode,
|
|
42
42
|
type NodeSchemaMetadata,
|
|
43
43
|
type ImplicitAllowedTypes,
|
|
44
44
|
TreeNodeValid,
|
|
@@ -243,7 +243,7 @@ function createProxyHandler(
|
|
|
243
243
|
get(target, propertyKey, proxy): unknown {
|
|
244
244
|
const fieldInfo = schema.flexKeyMap.get(propertyKey);
|
|
245
245
|
if (fieldInfo !== undefined) {
|
|
246
|
-
const flexNode =
|
|
246
|
+
const flexNode = getInnerNode(proxy);
|
|
247
247
|
debugAssert(() => !flexNode.context.isDisposed() || "FlexTreeNode is disposed");
|
|
248
248
|
const field = flexNode.tryGetField(fieldInfo.storedKey);
|
|
249
249
|
if (field !== undefined) {
|
|
@@ -274,7 +274,7 @@ function createProxyHandler(
|
|
|
274
274
|
: false;
|
|
275
275
|
}
|
|
276
276
|
|
|
277
|
-
const innerNode =
|
|
277
|
+
const innerNode = getInnerNode(proxy);
|
|
278
278
|
|
|
279
279
|
const innerSchema = innerNode.context.schema.nodeSchema.get(brand(schema.identifier));
|
|
280
280
|
assert(
|
|
@@ -321,7 +321,7 @@ function createProxyHandler(
|
|
|
321
321
|
// If a refactoring is done to associated flex tree data with the target not the proxy, this extra map could be removed,
|
|
322
322
|
// and the design would be more compatible with proxyless nodes.
|
|
323
323
|
const proxy = targetToProxy.get(target) ?? fail(0xadd /* missing proxy */);
|
|
324
|
-
const field =
|
|
324
|
+
const field = getInnerNode(proxy).tryGetField(fieldInfo.storedKey);
|
|
325
325
|
|
|
326
326
|
const p: PropertyDescriptor = {
|
|
327
327
|
value: field === undefined ? undefined : tryGetTreeNodeForField(field),
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
typeNameSymbol,
|
|
16
16
|
typeSchemaSymbol,
|
|
17
17
|
type UnhydratedFlexTreeNode,
|
|
18
|
-
|
|
18
|
+
getInnerNode,
|
|
19
19
|
getKernel,
|
|
20
20
|
type InternalTreeNode,
|
|
21
21
|
type NodeSchemaMetadata,
|
|
@@ -105,7 +105,7 @@ function createRecordNodeProxy(
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
if (typeof key === "string") {
|
|
108
|
-
const innerNode =
|
|
108
|
+
const innerNode = getInnerNode(receiver);
|
|
109
109
|
const field = innerNode.tryGetField(brand(key));
|
|
110
110
|
if (field !== undefined) {
|
|
111
111
|
return tryGetTreeNodeForField(field);
|
|
@@ -119,7 +119,7 @@ function createRecordNodeProxy(
|
|
|
119
119
|
return false;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
const innerNode =
|
|
122
|
+
const innerNode = getInnerNode(receiver);
|
|
123
123
|
const field = innerNode.getBoxed(brand(key)) as FlexTreeOptionalField;
|
|
124
124
|
const kernel = getKernel(receiver);
|
|
125
125
|
const innerSchema = innerNode.context.schema.nodeSchema.get(brand(schema.identifier));
|
|
@@ -143,13 +143,13 @@ function createRecordNodeProxy(
|
|
|
143
143
|
return false;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
const innerNode =
|
|
146
|
+
const innerNode = getInnerNode(proxy);
|
|
147
147
|
const childField = innerNode.tryGetField(brand(key));
|
|
148
148
|
|
|
149
149
|
return childField !== undefined;
|
|
150
150
|
},
|
|
151
151
|
ownKeys: (target) => {
|
|
152
|
-
const innerNode =
|
|
152
|
+
const innerNode = getInnerNode(proxy);
|
|
153
153
|
return [...innerNode.keys()];
|
|
154
154
|
},
|
|
155
155
|
getOwnPropertyDescriptor: (target, key) => {
|
|
@@ -157,7 +157,7 @@ function createRecordNodeProxy(
|
|
|
157
157
|
return undefined;
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
-
const innerNode =
|
|
160
|
+
const innerNode = getInnerNode(proxy);
|
|
161
161
|
const field = innerNode.tryGetField(brand(key));
|
|
162
162
|
|
|
163
163
|
if (field === undefined) {
|
|
@@ -179,7 +179,7 @@ function createRecordNodeProxy(
|
|
|
179
179
|
return false;
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
const innerNode =
|
|
182
|
+
const innerNode = getInnerNode(proxy);
|
|
183
183
|
const field = innerNode.tryGetField(brand(key)) as FlexTreeOptionalField | undefined;
|
|
184
184
|
if (field !== undefined) {
|
|
185
185
|
field.editor.set(undefined, field.length === 0);
|