@fluidframework/tree 2.50.0 → 2.51.0-347100
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/Tree.code-workspace +14 -1
- package/.vscode/settings.json +16 -0
- package/CHANGELOG.md +2 -2
- package/api-report/tree.alpha.api.md +7 -7
- package/dist/core/schema-stored/schema.d.ts +14 -1
- package/dist/core/schema-stored/schema.d.ts.map +1 -1
- package/dist/core/schema-stored/schema.js.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.js +3 -0
- package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts +7 -2
- package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/context.js +4 -4
- package/dist/feature-libraries/flex-tree/context.js.map +1 -1
- package/dist/feature-libraries/flex-tree/index.d.ts +1 -0
- package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/index.js +3 -1
- package/dist/feature-libraries/flex-tree/index.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +5 -5
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts +3 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +5 -3
- package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +3 -4
- package/dist/feature-libraries/forest-summary/forestSummarizer.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/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/index.d.ts +0 -1
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js +1 -3
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
- package/dist/shared-tree/schematizeTree.js +2 -6
- package/dist/shared-tree/schematizeTree.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +11 -13
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +58 -81
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeTypes.d.ts +1 -1
- package/dist/shared-tree/sharedTreeChangeTypes.js.map +1 -1
- package/dist/shared-tree/tree.d.ts.map +1 -1
- package/dist/shared-tree/tree.js +4 -3
- package/dist/shared-tree/tree.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts +7 -1
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +7 -2
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +4 -1
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/simple-tree/api/conciseTree.d.ts +1 -1
- package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/conciseTree.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts +1 -1
- package/dist/simple-tree/api/configuration.d.ts.map +1 -1
- package/dist/simple-tree/api/configuration.js +5 -5
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/create.d.ts +3 -1
- package/dist/simple-tree/api/create.d.ts.map +1 -1
- package/dist/simple-tree/api/create.js +2 -0
- package/dist/simple-tree/api/create.js.map +1 -1
- package/dist/simple-tree/api/customTree.d.ts +1 -2
- package/dist/simple-tree/api/customTree.d.ts.map +1 -1
- package/dist/simple-tree/api/customTree.js.map +1 -1
- package/dist/simple-tree/api/getJsonSchema.d.ts +1 -1
- package/dist/simple-tree/api/getJsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/getJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/getSimpleSchema.d.ts +1 -1
- package/dist/simple-tree/api/getSimpleSchema.js.map +1 -1
- package/dist/simple-tree/api/identifierIndex.d.ts +1 -1
- package/dist/simple-tree/api/identifierIndex.js +2 -2
- package/dist/simple-tree/api/identifierIndex.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/schemaCompatibilityTester.d.ts +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/schemaCreationUtilities.d.ts +14 -2
- package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCreationUtilities.js +41 -4
- package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +36 -3
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +18 -18
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +16 -16
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +2 -2
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js +2 -2
- package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/dist/simple-tree/api/schemaFromSimple.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFromSimple.js +4 -4
- package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +2 -2
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/simpleTreeIndex.d.ts +2 -2
- package/dist/simple-tree/api/simpleTreeIndex.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleTreeIndex.js +1 -1
- package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
- package/dist/simple-tree/api/storedSchema.d.ts +1 -1
- package/dist/simple-tree/api/storedSchema.js +2 -2
- package/dist/simple-tree/api/storedSchema.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +2 -1
- package/dist/simple-tree/api/tree.d.ts.map +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/api/treeBeta.d.ts +4 -1
- package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
- package/dist/simple-tree/api/treeBeta.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.d.ts +1 -2
- package/dist/simple-tree/api/treeNodeApi.d.ts.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 +2 -3
- 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/api/verboseTree.d.ts +2 -1
- package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/verboseTree.js.map +1 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts +1 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +2 -2
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
- package/dist/simple-tree/core/allowedTypes.d.ts +316 -0
- package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -0
- package/dist/simple-tree/core/allowedTypes.js +173 -0
- package/dist/simple-tree/core/allowedTypes.js.map +1 -0
- package/dist/simple-tree/core/context.d.ts +3 -9
- package/dist/simple-tree/core/context.d.ts.map +1 -1
- package/dist/simple-tree/core/context.js +3 -11
- package/dist/simple-tree/core/context.js.map +1 -1
- package/dist/simple-tree/core/flexList.d.ts.map +1 -0
- package/dist/simple-tree/core/flexList.js.map +1 -0
- package/dist/simple-tree/core/getOrCreateNode.d.ts +1 -1
- package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +9 -3
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +19 -3
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts +8 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +24 -20
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.d.ts +182 -39
- package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.js +47 -17
- package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/dist/simple-tree/{treeNodeValid.d.ts → core/treeNodeValid.d.ts} +18 -4
- package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -0
- package/dist/simple-tree/{treeNodeValid.js → core/treeNodeValid.js} +41 -11
- package/dist/simple-tree/core/treeNodeValid.js.map +1 -0
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/dist/simple-tree/core/walkSchema.d.ts +2 -1
- package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/walkSchema.js +6 -2
- package/dist/simple-tree/core/walkSchema.js.map +1 -1
- package/dist/simple-tree/createContext.d.ts +6 -2
- package/dist/simple-tree/createContext.d.ts.map +1 -1
- package/dist/simple-tree/createContext.js +15 -3
- package/dist/simple-tree/createContext.js.map +1 -1
- package/dist/simple-tree/fieldSchema.d.ts +423 -0
- package/dist/simple-tree/fieldSchema.d.ts.map +1 -0
- package/dist/simple-tree/{schemaTypes.js → fieldSchema.js} +5 -195
- package/dist/simple-tree/fieldSchema.js.map +1 -0
- package/dist/simple-tree/index.d.ts +5 -5
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +11 -11
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/leafNodeSchema.d.ts +14 -5
- package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/leafNodeSchema.js +117 -2
- package/dist/simple-tree/leafNodeSchema.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +3 -4
- package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.js +97 -26
- package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +2 -2
- package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
- package/dist/simple-tree/node-kinds/common.d.ts +16 -0
- package/dist/simple-tree/node-kinds/common.d.ts.map +1 -0
- package/dist/simple-tree/node-kinds/common.js +42 -0
- package/dist/simple-tree/node-kinds/common.js.map +1 -0
- 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.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts +2 -3
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.js +64 -26
- package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts +2 -2
- package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNodeTypes.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.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts +19 -5
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js +131 -27
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +11 -4
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts +2 -2
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.js +41 -13
- package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +2 -2
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +2 -2
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +3 -3
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/simpleSchema.d.ts +2 -2
- package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/simpleSchema.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +6 -7
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +5 -11
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +25 -395
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/dist/simple-tree/unsafeUnknownSchema.d.ts +52 -0
- package/dist/simple-tree/unsafeUnknownSchema.d.ts.map +1 -0
- package/dist/simple-tree/unsafeUnknownSchema.js +13 -0
- package/dist/simple-tree/unsafeUnknownSchema.js.map +1 -0
- package/dist/simple-tree/walkFieldSchema.d.ts +1 -1
- package/dist/simple-tree/walkFieldSchema.js +2 -2
- package/dist/simple-tree/walkFieldSchema.js.map +1 -1
- package/dist/tableSchema.d.ts +12 -12
- package/dist/treeFactory.d.ts +0 -1
- package/dist/treeFactory.d.ts.map +1 -1
- package/dist/treeFactory.js +0 -1
- package/dist/treeFactory.js.map +1 -1
- package/lib/core/schema-stored/schema.d.ts +14 -1
- package/lib/core/schema-stored/schema.d.ts.map +1 -1
- package/lib/core/schema-stored/schema.js.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.js +3 -0
- package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts +7 -2
- package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/context.js +4 -4
- package/lib/feature-libraries/flex-tree/context.js.map +1 -1
- package/lib/feature-libraries/flex-tree/index.d.ts +1 -0
- package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/index.js +1 -0
- package/lib/feature-libraries/flex-tree/index.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +6 -6
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts +3 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +3 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -2
- package/lib/feature-libraries/forest-summary/forestSummarizer.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/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/index.d.ts +0 -1
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js +0 -1
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
- package/lib/shared-tree/schematizeTree.js +2 -6
- package/lib/shared-tree/schematizeTree.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +11 -13
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +59 -81
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeTypes.d.ts +1 -1
- package/lib/shared-tree/sharedTreeChangeTypes.js.map +1 -1
- package/lib/shared-tree/tree.d.ts.map +1 -1
- package/lib/shared-tree/tree.js +4 -3
- package/lib/shared-tree/tree.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts +7 -1
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +7 -2
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +5 -2
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/simple-tree/api/conciseTree.d.ts +1 -1
- package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/conciseTree.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts +1 -1
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- package/lib/simple-tree/api/configuration.js +2 -2
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/create.d.ts +3 -1
- package/lib/simple-tree/api/create.d.ts.map +1 -1
- package/lib/simple-tree/api/create.js +2 -0
- package/lib/simple-tree/api/create.js.map +1 -1
- package/lib/simple-tree/api/customTree.d.ts +1 -2
- package/lib/simple-tree/api/customTree.d.ts.map +1 -1
- package/lib/simple-tree/api/customTree.js.map +1 -1
- package/lib/simple-tree/api/getJsonSchema.d.ts +1 -1
- package/lib/simple-tree/api/getJsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/getJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/getSimpleSchema.d.ts +1 -1
- package/lib/simple-tree/api/getSimpleSchema.js.map +1 -1
- package/lib/simple-tree/api/identifierIndex.d.ts +1 -1
- package/lib/simple-tree/api/identifierIndex.js +1 -1
- package/lib/simple-tree/api/identifierIndex.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/schemaCompatibilityTester.d.ts +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/schemaCreationUtilities.d.ts +14 -2
- package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCreationUtilities.js +40 -4
- package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +36 -3
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +2 -2
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +16 -16
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +2 -2
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/lib/simple-tree/api/schemaFromSimple.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFromSimple.js +1 -1
- package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/simpleTreeIndex.d.ts +2 -2
- package/lib/simple-tree/api/simpleTreeIndex.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleTreeIndex.js +2 -2
- package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
- package/lib/simple-tree/api/storedSchema.d.ts +1 -1
- package/lib/simple-tree/api/storedSchema.js +1 -1
- package/lib/simple-tree/api/storedSchema.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +2 -1
- package/lib/simple-tree/api/tree.d.ts.map +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/api/treeBeta.d.ts +4 -1
- package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
- package/lib/simple-tree/api/treeBeta.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.d.ts +1 -2
- package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +2 -2
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/typesUnsafe.d.ts +2 -3
- 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/api/verboseTree.d.ts +2 -1
- package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/verboseTree.js.map +1 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts +1 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +1 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
- package/lib/simple-tree/core/allowedTypes.d.ts +316 -0
- package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -0
- package/lib/simple-tree/core/allowedTypes.js +162 -0
- package/lib/simple-tree/core/allowedTypes.js.map +1 -0
- package/lib/simple-tree/core/context.d.ts +3 -9
- package/lib/simple-tree/core/context.d.ts.map +1 -1
- package/lib/simple-tree/core/context.js +0 -8
- package/lib/simple-tree/core/context.js.map +1 -1
- package/lib/simple-tree/core/flexList.d.ts.map +1 -0
- package/lib/simple-tree/core/flexList.js.map +1 -0
- package/lib/simple-tree/core/getOrCreateNode.d.ts +1 -1
- package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +9 -3
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +6 -3
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts +8 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +10 -6
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.d.ts +182 -39
- package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.js +44 -14
- package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/lib/simple-tree/{treeNodeValid.d.ts → core/treeNodeValid.d.ts} +18 -4
- package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -0
- package/lib/simple-tree/{treeNodeValid.js → core/treeNodeValid.js} +31 -3
- package/lib/simple-tree/core/treeNodeValid.js.map +1 -0
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/lib/simple-tree/core/walkSchema.d.ts +2 -1
- package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/walkSchema.js +7 -3
- package/lib/simple-tree/core/walkSchema.js.map +1 -1
- package/lib/simple-tree/createContext.d.ts +6 -2
- package/lib/simple-tree/createContext.d.ts.map +1 -1
- package/lib/simple-tree/createContext.js +13 -2
- package/lib/simple-tree/createContext.js.map +1 -1
- package/lib/simple-tree/fieldSchema.d.ts +423 -0
- package/lib/simple-tree/fieldSchema.d.ts.map +1 -0
- package/lib/simple-tree/{schemaTypes.js → fieldSchema.js} +3 -183
- package/lib/simple-tree/fieldSchema.js.map +1 -0
- package/lib/simple-tree/index.d.ts +5 -5
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +2 -2
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/leafNodeSchema.d.ts +14 -5
- package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/leafNodeSchema.js +117 -3
- package/lib/simple-tree/leafNodeSchema.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +3 -4
- package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.js +86 -15
- package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +2 -2
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.js +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
- package/lib/simple-tree/node-kinds/common.d.ts +16 -0
- package/lib/simple-tree/node-kinds/common.d.ts.map +1 -0
- package/lib/simple-tree/node-kinds/common.js +38 -0
- package/lib/simple-tree/node-kinds/common.js.map +1 -0
- 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.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts +2 -3
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.js +51 -13
- package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts +2 -2
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.js +1 -1
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.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.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts +19 -5
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js +116 -14
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +11 -4
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.js +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts +2 -2
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.js +40 -12
- package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +2 -2
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.js +1 -1
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +2 -2
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +2 -2
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/simpleSchema.d.ts +2 -2
- package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/simpleSchema.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +2 -3
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +5 -11
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +10 -381
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/lib/simple-tree/unsafeUnknownSchema.d.ts +52 -0
- package/lib/simple-tree/unsafeUnknownSchema.d.ts.map +1 -0
- package/lib/simple-tree/unsafeUnknownSchema.js +10 -0
- package/lib/simple-tree/unsafeUnknownSchema.js.map +1 -0
- package/lib/simple-tree/walkFieldSchema.d.ts +1 -1
- package/lib/simple-tree/walkFieldSchema.js +1 -1
- package/lib/simple-tree/walkFieldSchema.js.map +1 -1
- package/lib/tableSchema.d.ts +12 -12
- package/lib/treeFactory.d.ts +0 -1
- package/lib/treeFactory.d.ts.map +1 -1
- package/lib/treeFactory.js +0 -1
- package/lib/treeFactory.js.map +1 -1
- package/package.json +22 -23
- package/src/core/schema-stored/schema.ts +14 -1
- package/src/feature-libraries/default-schema/schemaChecker.ts +3 -0
- package/src/feature-libraries/flex-tree/context.ts +10 -5
- package/src/feature-libraries/flex-tree/index.ts +2 -0
- package/src/feature-libraries/flex-tree/lazyField.ts +10 -6
- package/src/feature-libraries/flex-tree/lazyNode.ts +6 -1
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -2
- package/src/feature-libraries/index.ts +1 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/index.ts +0 -2
- package/src/shared-tree/schematizeTree.ts +2 -6
- package/src/shared-tree/schematizingTreeView.ts +72 -107
- package/src/shared-tree/sharedTreeChangeTypes.ts +1 -1
- package/src/shared-tree/tree.ts +4 -3
- package/src/shared-tree/treeAlpha.ts +7 -1
- package/src/shared-tree/treeCheckout.ts +15 -2
- package/src/simple-tree/api/conciseTree.ts +1 -2
- package/src/simple-tree/api/configuration.ts +7 -4
- package/src/simple-tree/api/create.ts +3 -1
- package/src/simple-tree/api/customTree.ts +1 -2
- package/src/simple-tree/api/getJsonSchema.ts +1 -1
- package/src/simple-tree/api/getSimpleSchema.ts +1 -1
- package/src/simple-tree/api/identifierIndex.ts +1 -1
- package/src/simple-tree/api/index.ts +2 -0
- package/src/simple-tree/api/schemaCompatibilityTester.ts +1 -1
- package/src/simple-tree/api/schemaCreationUtilities.ts +47 -5
- package/src/simple-tree/api/schemaFactory.ts +45 -10
- package/src/simple-tree/api/schemaFactoryAlpha.ts +4 -7
- package/src/simple-tree/api/schemaFactoryRecursive.ts +9 -4
- package/src/simple-tree/api/schemaFromSimple.ts +2 -3
- package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +1 -1
- package/src/simple-tree/api/simpleTreeIndex.ts +8 -3
- package/src/simple-tree/api/storedSchema.ts +1 -1
- package/src/simple-tree/api/tree.ts +2 -2
- package/src/simple-tree/api/treeBeta.ts +4 -1
- package/src/simple-tree/api/treeNodeApi.ts +5 -8
- package/src/simple-tree/api/typesUnsafe.ts +5 -4
- package/src/simple-tree/api/verboseTree.ts +3 -6
- package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +1 -1
- package/src/simple-tree/core/README.md +1 -1
- package/src/simple-tree/core/allowedTypes.ts +496 -0
- package/src/simple-tree/core/context.ts +3 -10
- package/src/simple-tree/core/getOrCreateNode.ts +1 -1
- package/src/simple-tree/core/index.ts +62 -9
- package/src/simple-tree/core/treeNodeKernel.ts +12 -6
- package/src/simple-tree/core/treeNodeSchema.ts +247 -63
- package/src/simple-tree/{treeNodeValid.ts → core/treeNodeValid.ts} +59 -15
- package/src/simple-tree/core/unhydratedFlexTree.ts +1 -1
- package/src/simple-tree/core/walkSchema.ts +9 -5
- package/src/simple-tree/createContext.ts +26 -2
- package/src/simple-tree/fieldSchema.ts +734 -0
- package/src/simple-tree/index.ts +32 -30
- package/src/simple-tree/leafNodeSchema.ts +137 -5
- package/src/simple-tree/node-kinds/array/arrayNode.ts +141 -30
- package/src/simple-tree/node-kinds/array/arrayNodeTypes.ts +5 -7
- package/src/simple-tree/node-kinds/common.ts +60 -0
- package/src/simple-tree/node-kinds/index.ts +1 -0
- package/src/simple-tree/node-kinds/map/mapNode.ts +91 -33
- package/src/simple-tree/node-kinds/map/mapNodeTypes.ts +5 -7
- package/src/simple-tree/node-kinds/object/index.ts +1 -0
- package/src/simple-tree/node-kinds/object/objectNode.ts +205 -25
- package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +22 -5
- package/src/simple-tree/node-kinds/record/recordNode.ts +68 -26
- package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +6 -8
- package/src/simple-tree/prepareForInsertion.ts +7 -6
- package/src/simple-tree/simpleSchema.ts +2 -2
- package/src/simple-tree/toStoredSchema.ts +2 -3
- package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +12 -494
- package/src/simple-tree/unsafeUnknownSchema.ts +70 -0
- package/src/simple-tree/walkFieldSchema.ts +1 -1
- package/src/treeFactory.ts +0 -1
- package/dist/shared-tree/checkoutFlexTreeView.d.ts +0 -58
- package/dist/shared-tree/checkoutFlexTreeView.d.ts.map +0 -1
- package/dist/shared-tree/checkoutFlexTreeView.js +0 -77
- package/dist/shared-tree/checkoutFlexTreeView.js.map +0 -1
- package/dist/simple-tree/flexList.d.ts.map +0 -1
- package/dist/simple-tree/flexList.js.map +0 -1
- package/dist/simple-tree/schemaTypes.d.ts +0 -856
- package/dist/simple-tree/schemaTypes.d.ts.map +0 -1
- package/dist/simple-tree/schemaTypes.js.map +0 -1
- package/dist/simple-tree/treeNodeValid.d.ts.map +0 -1
- package/dist/simple-tree/treeNodeValid.js.map +0 -1
- package/lib/shared-tree/checkoutFlexTreeView.d.ts +0 -58
- package/lib/shared-tree/checkoutFlexTreeView.d.ts.map +0 -1
- package/lib/shared-tree/checkoutFlexTreeView.js +0 -72
- package/lib/shared-tree/checkoutFlexTreeView.js.map +0 -1
- package/lib/simple-tree/flexList.d.ts.map +0 -1
- package/lib/simple-tree/flexList.js.map +0 -1
- package/lib/simple-tree/schemaTypes.d.ts +0 -856
- package/lib/simple-tree/schemaTypes.d.ts.map +0 -1
- package/lib/simple-tree/schemaTypes.js.map +0 -1
- package/lib/simple-tree/treeNodeValid.d.ts.map +0 -1
- package/lib/simple-tree/treeNodeValid.js.map +0 -1
- package/src/shared-tree/checkoutFlexTreeView.ts +0 -100
- package/src/simple-tree/schemaTypes.ts +0 -1420
- /package/dist/simple-tree/{flexList.d.ts → core/flexList.d.ts} +0 -0
- /package/dist/simple-tree/{flexList.js → core/flexList.js} +0 -0
- /package/lib/simple-tree/{flexList.d.ts → core/flexList.d.ts} +0 -0
- /package/lib/simple-tree/{flexList.js → core/flexList.js} +0 -0
- /package/src/simple-tree/{flexList.ts → core/flexList.ts} +0 -0
|
@@ -16,10 +16,9 @@ import { anchorSlot, type SchemaPolicy } from "../core/index.js";
|
|
|
16
16
|
import {
|
|
17
17
|
type NodeIdentifierManager,
|
|
18
18
|
defaultSchemaPolicy,
|
|
19
|
-
ContextSlot,
|
|
20
19
|
cursorForMapTreeNode,
|
|
21
|
-
type FullSchemaPolicy,
|
|
22
20
|
TreeStatus,
|
|
21
|
+
Context,
|
|
23
22
|
} from "../feature-libraries/index.js";
|
|
24
23
|
import {
|
|
25
24
|
type ImplicitFieldSchema,
|
|
@@ -53,6 +52,7 @@ import {
|
|
|
53
52
|
createUnknownOptionalFieldPolicy,
|
|
54
53
|
prepareForInsertionContextless,
|
|
55
54
|
type FieldSchema,
|
|
55
|
+
tryDisposeTreeNode,
|
|
56
56
|
} from "../simple-tree/index.js";
|
|
57
57
|
import {
|
|
58
58
|
type Breakable,
|
|
@@ -61,7 +61,6 @@ import {
|
|
|
61
61
|
type WithBreakable,
|
|
62
62
|
} from "../util/index.js";
|
|
63
63
|
|
|
64
|
-
import { CheckoutFlexTreeView } from "./checkoutFlexTreeView.js";
|
|
65
64
|
import { canInitialize, ensureSchema, initialize } from "./schematizeTree.js";
|
|
66
65
|
import type { ITreeCheckout, TreeCheckout } from "./treeCheckout.js";
|
|
67
66
|
|
|
@@ -80,11 +79,11 @@ export class SchematizingSimpleTreeView<
|
|
|
80
79
|
> implements TreeBranch, TreeViewAlpha<TRootSchema>, WithBreakable
|
|
81
80
|
{
|
|
82
81
|
/**
|
|
83
|
-
*
|
|
82
|
+
* This is set to undefined when this object is disposed or the view schema does not support viewing the document's stored schema.
|
|
84
83
|
*
|
|
85
84
|
* The view schema may be incompatible with the stored schema. Use `compatibility` to check.
|
|
86
85
|
*/
|
|
87
|
-
private
|
|
86
|
+
private flexTreeContext: Context | undefined;
|
|
88
87
|
|
|
89
88
|
/**
|
|
90
89
|
* Undefined iff uninitialized or disposed.
|
|
@@ -97,6 +96,11 @@ export class SchematizingSimpleTreeView<
|
|
|
97
96
|
|
|
98
97
|
private readonly viewSchema: SchemaCompatibilityTester;
|
|
99
98
|
|
|
99
|
+
/**
|
|
100
|
+
* Events to unregister upon flex-tree view disposal.
|
|
101
|
+
*/
|
|
102
|
+
private readonly flexTreeViewUnregisterCallbacks = new Set<() => void>();
|
|
103
|
+
|
|
100
104
|
/**
|
|
101
105
|
* Events to unregister upon disposal.
|
|
102
106
|
*/
|
|
@@ -203,7 +207,7 @@ export class SchematizingSimpleTreeView<
|
|
|
203
207
|
|
|
204
208
|
if (!compatibility.canUpgrade) {
|
|
205
209
|
throw new UsageError(
|
|
206
|
-
"Existing stored schema
|
|
210
|
+
"Existing stored schema cannot be upgraded (see TreeView.compatibility.canUpgrade).",
|
|
207
211
|
);
|
|
208
212
|
}
|
|
209
213
|
|
|
@@ -214,12 +218,12 @@ export class SchematizingSimpleTreeView<
|
|
|
214
218
|
}
|
|
215
219
|
|
|
216
220
|
/**
|
|
217
|
-
* Gets the
|
|
221
|
+
* Gets the flex-tree context. Throws when disposed or out of schema.
|
|
218
222
|
*/
|
|
219
|
-
public
|
|
223
|
+
public getFlexTreeContext(): Context {
|
|
220
224
|
this.ensureUndisposed();
|
|
221
|
-
assert(this.
|
|
222
|
-
return this.
|
|
225
|
+
assert(this.flexTreeContext !== undefined, 0x8c0 /* unexpected getViewOrError */);
|
|
226
|
+
return this.flexTreeContext;
|
|
223
227
|
}
|
|
224
228
|
|
|
225
229
|
/**
|
|
@@ -301,82 +305,65 @@ export class SchematizingSimpleTreeView<
|
|
|
301
305
|
* If implicit initialization (or some other edit) is desired, it should be done outside of this method.
|
|
302
306
|
*/
|
|
303
307
|
private update(): void {
|
|
304
|
-
this.
|
|
308
|
+
this.disposeFlexView();
|
|
305
309
|
|
|
306
310
|
const compatibility = this.viewSchema.checkCompatibility(this.checkout.storedSchema);
|
|
307
311
|
|
|
308
|
-
let lastRoot =
|
|
309
|
-
this.compatibility.canView && this.view !== undefined ? this.root : undefined;
|
|
310
312
|
this.currentCompatibility = {
|
|
311
313
|
...compatibility,
|
|
312
314
|
canInitialize: canInitialize(this.checkout),
|
|
313
315
|
};
|
|
314
316
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
// Currently there is no good way to do this as FlexTreeField has no events for changes.
|
|
318
|
-
// this.view.flexTree.on(????)
|
|
319
|
-
// As a workaround for the above, trigger "rootChanged" in "afterBatch"
|
|
320
|
-
// which isn't the correct time since we normally do events during the batch when the forest is modified, but its better than nothing.
|
|
321
|
-
// TODO: provide a better event: this.view.flexTree.on(????)
|
|
322
|
-
const cleanupCheckOutEvents = this.checkout.events.on("afterBatch", () => {
|
|
323
|
-
// In the initialization flow, this event is raised before the correct compatibility w.r.t the new schema is calculated.
|
|
324
|
-
// Accessing `this.root` in that case can throw. It's OK to ignore this because:
|
|
325
|
-
// - The rootChanged event will already be raised at the end of the current upgrade
|
|
326
|
-
// - It doesn't matter that `lastRoot` isn't updated in this case, because `update` will be called again before the upgrade
|
|
327
|
-
// completes (at which point this callback and the `lastRoot` captured here will be out of scope anyway)
|
|
328
|
-
if (!this.midUpgrade && lastRoot !== this.root) {
|
|
329
|
-
lastRoot = this.root;
|
|
330
|
-
this.events.emit("rootChanged");
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
const onViewDispose = (): void => {
|
|
335
|
-
cleanupCheckOutEvents();
|
|
336
|
-
this.view = undefined;
|
|
337
|
-
if (!this.disposed) {
|
|
338
|
-
this.update();
|
|
339
|
-
}
|
|
340
|
-
};
|
|
317
|
+
const anchors = this.checkout.forest.anchors;
|
|
318
|
+
const slots = anchors.slots;
|
|
341
319
|
|
|
342
|
-
|
|
320
|
+
if (compatibility.canView) {
|
|
321
|
+
this.flexTreeContext = new Context(
|
|
322
|
+
this.schemaPolicy,
|
|
343
323
|
this.checkout,
|
|
344
|
-
this.viewSchema,
|
|
345
|
-
onViewDispose,
|
|
346
324
|
this.nodeKeyManager,
|
|
347
|
-
this.schemaPolicy,
|
|
348
|
-
);
|
|
349
|
-
this.view = view;
|
|
350
|
-
assert(
|
|
351
|
-
!this.checkout.forest.anchors.slots.has(SimpleContextSlot),
|
|
352
|
-
0xa47 /* extra simple tree context */,
|
|
353
325
|
);
|
|
354
|
-
|
|
326
|
+
assert(!slots.has(SimpleContextSlot), 0xa47 /* extra simple tree context */);
|
|
327
|
+
slots.set(
|
|
355
328
|
SimpleContextSlot,
|
|
356
329
|
new HydratedContext(
|
|
357
330
|
normalizeFieldSchema(this.rootFieldSchema).annotatedAllowedTypesNormalized,
|
|
358
|
-
|
|
331
|
+
this.flexTreeContext,
|
|
359
332
|
),
|
|
360
333
|
);
|
|
361
334
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
this.
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
335
|
+
// Trigger "rootChanged" events if the root changes in the future.
|
|
336
|
+
{
|
|
337
|
+
// Currently there is no good way to do this as FlexTreeField has no events for changes.
|
|
338
|
+
// this.root.on(????)
|
|
339
|
+
// As a workaround for the above, trigger "rootChanged" in "afterBatch".
|
|
340
|
+
// Ideally these events would be just events for changes within the root.
|
|
341
|
+
// TODO: provide a better event: this.view.flexTree.on(????) and/or integrate with with the normal event code paths.
|
|
342
|
+
|
|
343
|
+
// Track what the root was before to be able to detect changes.
|
|
344
|
+
let lastRoot: ReadableField<TRootSchema> = this.root;
|
|
345
|
+
|
|
346
|
+
this.flexTreeViewUnregisterCallbacks.add(
|
|
347
|
+
this.checkout.events.on("afterBatch", () => {
|
|
348
|
+
// In the initialization flow, this event is raised before the correct compatibility w.r.t the new schema is calculated.
|
|
349
|
+
// Accessing `this.root` in that case can throw. It's OK to ignore this because:
|
|
350
|
+
// - The rootChanged event will already be raised at the end of the current upgrade
|
|
351
|
+
// - It doesn't matter that `lastRoot` isn't updated in this case, because `update` will be called again before the upgrade
|
|
352
|
+
// completes (at which point this callback and the `lastRoot` captured here will be out of scope anyway)
|
|
353
|
+
if (!this.midUpgrade && lastRoot !== this.root) {
|
|
354
|
+
lastRoot = this.root;
|
|
355
|
+
this.events.emit("rootChanged");
|
|
356
|
+
}
|
|
357
|
+
}),
|
|
358
|
+
);
|
|
359
|
+
}
|
|
378
360
|
}
|
|
379
361
|
|
|
362
|
+
this.flexTreeViewUnregisterCallbacks.add(
|
|
363
|
+
// Will dispose the old view (if there is one) when its no longer valid, and create a new one if appropriate.
|
|
364
|
+
this.checkout.storedSchema.events.on("afterSchemaChange", () => this.update()),
|
|
365
|
+
);
|
|
366
|
+
|
|
380
367
|
if (!this.midUpgrade) {
|
|
381
368
|
this.events.emit("schemaChanged");
|
|
382
369
|
this.events.emit("rootChanged");
|
|
@@ -394,14 +381,20 @@ export class SchematizingSimpleTreeView<
|
|
|
394
381
|
this.events.emit("rootChanged");
|
|
395
382
|
}
|
|
396
383
|
|
|
397
|
-
private
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
384
|
+
private disposeFlexView(): void {
|
|
385
|
+
const anchors = this.checkout.forest.anchors;
|
|
386
|
+
if (this.flexTreeContext !== undefined) {
|
|
387
|
+
// Cleanup any TreeNodes cached in the AnchorSet when disposing the flex-tree which they wrap.
|
|
388
|
+
for (const anchorNode of anchors) {
|
|
389
|
+
tryDisposeTreeNode(anchorNode);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
this.flexTreeContext[disposeSymbol]();
|
|
393
|
+
this.flexTreeContext = undefined;
|
|
403
394
|
}
|
|
404
|
-
this.
|
|
395
|
+
this.flexTreeViewUnregisterCallbacks.forEach((unregister) => unregister());
|
|
396
|
+
this.flexTreeViewUnregisterCallbacks.clear();
|
|
397
|
+
anchors.slots.delete(SimpleContextSlot);
|
|
405
398
|
}
|
|
406
399
|
|
|
407
400
|
public get compatibility(): SchemaCompatibilityStatus {
|
|
@@ -413,7 +406,8 @@ export class SchematizingSimpleTreeView<
|
|
|
413
406
|
|
|
414
407
|
public dispose(): void {
|
|
415
408
|
this.disposed = true;
|
|
416
|
-
this.
|
|
409
|
+
this.disposeFlexView();
|
|
410
|
+
this.unregisterCallbacks.forEach((unregister) => unregister());
|
|
417
411
|
this.checkout.forest.anchors.slots.delete(ViewSlot);
|
|
418
412
|
this.currentCompatibility = undefined;
|
|
419
413
|
this.onDispose?.();
|
|
@@ -430,8 +424,8 @@ export class SchematizingSimpleTreeView<
|
|
|
430
424
|
"Document is out of schema. Check TreeView.compatibility before accessing TreeView.root.",
|
|
431
425
|
);
|
|
432
426
|
}
|
|
433
|
-
const view = this.
|
|
434
|
-
return tryGetTreeNodeForField(view.
|
|
427
|
+
const view = this.getFlexTreeContext();
|
|
428
|
+
return tryGetTreeNodeForField(view.root) as ReadableField<TRootSchema>;
|
|
435
429
|
}
|
|
436
430
|
|
|
437
431
|
public set root(newRoot: InsertableField<TRootSchema>) {
|
|
@@ -441,12 +435,8 @@ export class SchematizingSimpleTreeView<
|
|
|
441
435
|
"Document is out of schema. Check TreeView.compatibility before accessing TreeView.root.",
|
|
442
436
|
);
|
|
443
437
|
}
|
|
444
|
-
const view = this.
|
|
445
|
-
setField(
|
|
446
|
-
view.context.root,
|
|
447
|
-
this.rootFieldSchema,
|
|
448
|
-
newRoot as InsertableContent | undefined,
|
|
449
|
-
);
|
|
438
|
+
const view = this.getFlexTreeContext();
|
|
439
|
+
setField(view.root, this.rootFieldSchema, newRoot as InsertableContent | undefined);
|
|
450
440
|
}
|
|
451
441
|
|
|
452
442
|
// #region Branching
|
|
@@ -478,31 +468,6 @@ export function getCheckout(context: TreeBranch): TreeCheckout {
|
|
|
478
468
|
throw new UsageError("Unsupported context implementation");
|
|
479
469
|
}
|
|
480
470
|
|
|
481
|
-
/**
|
|
482
|
-
* Creates a view that self-disposes whenever the stored schema changes.
|
|
483
|
-
* This may only be called when the schema is already known to be compatible (typically via ensureSchema).
|
|
484
|
-
*/
|
|
485
|
-
export function requireSchema(
|
|
486
|
-
checkout: ITreeCheckout,
|
|
487
|
-
viewSchema: SchemaCompatibilityTester,
|
|
488
|
-
onDispose: () => void,
|
|
489
|
-
nodeKeyManager: NodeIdentifierManager,
|
|
490
|
-
schemaPolicy: FullSchemaPolicy,
|
|
491
|
-
): CheckoutFlexTreeView {
|
|
492
|
-
const slots = checkout.forest.anchors.slots;
|
|
493
|
-
assert(!slots.has(ContextSlot), 0x8c2 /* Cannot create second view from checkout */);
|
|
494
|
-
|
|
495
|
-
{
|
|
496
|
-
const compatibility = viewSchema.checkCompatibility(checkout.storedSchema);
|
|
497
|
-
assert(compatibility.canView, 0x8c3 /* requireSchema invoked with incompatible schema */);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
const view = new CheckoutFlexTreeView(checkout, schemaPolicy, nodeKeyManager, onDispose);
|
|
501
|
-
assert(slots.has(ContextSlot), 0x90d /* Context should be tracked in slot */);
|
|
502
|
-
|
|
503
|
-
return view;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
471
|
/**
|
|
507
472
|
* Adds constraints to a `checkout`'s pending transaction.
|
|
508
473
|
*
|
|
@@ -16,7 +16,7 @@ export type SharedTreeInnerChange =
|
|
|
16
16
|
export interface SharedTreeChange {
|
|
17
17
|
/**
|
|
18
18
|
* The changes to apply.
|
|
19
|
-
* @remarks while not
|
|
19
|
+
* @remarks while not expressible in TypeScript, these changes should never have two `ModularChangeset`s adjacent in the list.
|
|
20
20
|
* This restriction exists because this change type should preserve the composition behavior of `ModularChangeFamily`, which
|
|
21
21
|
* always composes runs of `ModularChangeset`s into a single `ModularChangeset`.
|
|
22
22
|
*/
|
package/src/shared-tree/tree.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
7
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
8
|
|
|
8
9
|
import {
|
|
9
10
|
type ImplicitFieldSchema,
|
|
@@ -16,12 +17,12 @@ import {
|
|
|
16
17
|
type TransactionConstraint,
|
|
17
18
|
} from "../simple-tree/index.js";
|
|
18
19
|
|
|
19
|
-
import { getCheckoutFlexTreeView } from "./checkoutFlexTreeView.js";
|
|
20
20
|
import {
|
|
21
21
|
addConstraintsToTransaction,
|
|
22
22
|
SchematizingSimpleTreeView,
|
|
23
23
|
} from "./schematizingTreeView.js";
|
|
24
24
|
import type { ITreeCheckout } from "./treeCheckout.js";
|
|
25
|
+
import { Context } from "../feature-libraries/index.js";
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Provides various functions for interacting with {@link TreeNode}s.
|
|
@@ -449,8 +450,8 @@ export function runTransaction<
|
|
|
449
450
|
"Transactions cannot be run on Unhydrated nodes. Transactions apply to a TreeView and Unhydrated nodes are not part of a TreeView.",
|
|
450
451
|
);
|
|
451
452
|
}
|
|
452
|
-
|
|
453
|
-
return runTransactionInCheckout(
|
|
453
|
+
assert(context instanceof Context, "Expected context to be a Context instance.");
|
|
454
|
+
return runTransactionInCheckout(context.checkout, () => t(node), preconditions);
|
|
454
455
|
}
|
|
455
456
|
}
|
|
456
457
|
|
|
@@ -191,6 +191,12 @@ export interface TreeIdentifierUtils {
|
|
|
191
191
|
* Extensions to {@link (Tree:interface)} and {@link (TreeBeta:interface)} which are not yet stable.
|
|
192
192
|
* @remarks
|
|
193
193
|
* Use via the {@link (TreeAlpha:variable)} singleton.
|
|
194
|
+
* @privateRemarks
|
|
195
|
+
* TODO: AB#43548:
|
|
196
|
+
* How all the create and all the import and export APIs handle unknown optional fields needs to be figured out, tested and documented.
|
|
197
|
+
* This will need to be extended/generalized to cover other future schema evolution options as well once they exist.
|
|
198
|
+
* See also TreeBeta.clone with a similar issue.
|
|
199
|
+
*
|
|
194
200
|
* @system @sealed @alpha
|
|
195
201
|
*/
|
|
196
202
|
export interface TreeAlpha {
|
|
@@ -214,7 +220,7 @@ export interface TreeAlpha {
|
|
|
214
220
|
* This function exists as a generalization that can be used in other cases as well,
|
|
215
221
|
* such as when `undefined` might be allowed (for an optional field), or when the type should be inferred from the data when more than one type is possible.
|
|
216
222
|
* @privateRemarks
|
|
217
|
-
* There should be a way to provide a source for defaulted identifiers, either via this API or some way to add them to its output later.
|
|
223
|
+
* TODO: AB#43548: There should be a way to provide a source for defaulted identifiers, either via this API or some way to add them to its output later.
|
|
218
224
|
*/
|
|
219
225
|
create<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(
|
|
220
226
|
schema: UnsafeUnknownSchema extends TSchema
|
|
@@ -46,8 +46,10 @@ import {
|
|
|
46
46
|
import {
|
|
47
47
|
type FieldBatchCodec,
|
|
48
48
|
type TreeCompressionStrategy,
|
|
49
|
+
allowsRepoSuperset,
|
|
49
50
|
buildForest,
|
|
50
51
|
createNodeIdentifierManager,
|
|
52
|
+
defaultSchemaPolicy,
|
|
51
53
|
intoDelta,
|
|
52
54
|
jsonableTreeFromCursor,
|
|
53
55
|
makeFieldBatchCodec,
|
|
@@ -229,8 +231,13 @@ export interface ITreeCheckout extends AnchorLocator, ViewableTree, WithBreakabl
|
|
|
229
231
|
/**
|
|
230
232
|
* Replaces all schema with the provided schema.
|
|
231
233
|
* Can over-write preexisting schema, and removes unmentioned schema.
|
|
234
|
+
*
|
|
235
|
+
* @param newSchema - The new schema to replace the existing schema.
|
|
236
|
+
* @param allowNonSupersetSchema - Whether to allow non-superset schemas.
|
|
237
|
+
* Defaults to false.
|
|
238
|
+
* If false, an assert will be thrown if the new schema does not permit all possible documents which were permitted under the old schema.
|
|
232
239
|
*/
|
|
233
|
-
updateSchema(newSchema: TreeStoredSchema): void;
|
|
240
|
+
updateSchema(newSchema: TreeStoredSchema, allowNonSupersetSchema?: true): void;
|
|
234
241
|
|
|
235
242
|
/**
|
|
236
243
|
* Events about this view.
|
|
@@ -776,8 +783,14 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
776
783
|
}
|
|
777
784
|
}
|
|
778
785
|
|
|
779
|
-
public updateSchema(newSchema: TreeStoredSchema): void {
|
|
786
|
+
public updateSchema(newSchema: TreeStoredSchema, allowNonSupersetSchema?: true): void {
|
|
780
787
|
this.checkNotDisposed();
|
|
788
|
+
if (allowNonSupersetSchema !== true) {
|
|
789
|
+
assert(
|
|
790
|
+
allowsRepoSuperset(defaultSchemaPolicy, this.storedSchema.clone(), newSchema),
|
|
791
|
+
"New schema must allow all documents allowed by old schema",
|
|
792
|
+
);
|
|
793
|
+
}
|
|
781
794
|
this.editor.schema.setStoredSchema(this.storedSchema.clone(), newSchema);
|
|
782
795
|
}
|
|
783
796
|
|
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
import type { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
7
7
|
|
|
8
8
|
import type { ITreeCursor } from "../../core/index.js";
|
|
9
|
-
import type { TreeNodeSchema } from "../core/index.js";
|
|
9
|
+
import type { TreeNodeSchema, TreeLeafValue, ImplicitAllowedTypes } from "../core/index.js";
|
|
10
10
|
import { getUnhydratedContext } from "../createContext.js";
|
|
11
|
-
import type { TreeLeafValue, ImplicitAllowedTypes } from "../schemaTypes.js";
|
|
12
11
|
|
|
13
12
|
import {
|
|
14
13
|
customFromCursor,
|
|
@@ -15,13 +15,16 @@ import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
|
15
15
|
import {
|
|
16
16
|
type FieldSchemaAlpha,
|
|
17
17
|
type ImplicitFieldSchema,
|
|
18
|
-
evaluateLazySchema,
|
|
19
18
|
FieldKind,
|
|
19
|
+
normalizeFieldSchema,
|
|
20
|
+
} from "../fieldSchema.js";
|
|
21
|
+
import {
|
|
22
|
+
NodeKind,
|
|
23
|
+
type TreeNodeSchema,
|
|
20
24
|
isAnnotatedAllowedType,
|
|
25
|
+
evaluateLazySchema,
|
|
21
26
|
markSchemaMostDerived,
|
|
22
|
-
|
|
23
|
-
} from "../schemaTypes.js";
|
|
24
|
-
import { NodeKind, type TreeNodeSchema } from "../core/index.js";
|
|
27
|
+
} from "../core/index.js";
|
|
25
28
|
import { toStoredSchema } from "../toStoredSchema.js";
|
|
26
29
|
import {
|
|
27
30
|
isArrayNodeSchema,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
type ITreeCursorSynchronous,
|
|
13
13
|
type SchemaAndPolicy,
|
|
14
14
|
} from "../../core/index.js";
|
|
15
|
-
import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../
|
|
15
|
+
import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../fieldSchema.js";
|
|
16
16
|
import {
|
|
17
17
|
type Context,
|
|
18
18
|
getOrCreateNodeFromInnerNode,
|
|
@@ -37,6 +37,8 @@ import { unknownTypeError } from "./customTree.js";
|
|
|
37
37
|
* @remarks
|
|
38
38
|
* Does not support defaults.
|
|
39
39
|
* Validates the field is in schema.
|
|
40
|
+
*
|
|
41
|
+
* TODO: AB#43548: How this handles unknown optional fields needs to be figured out, tested and documented.
|
|
40
42
|
*/
|
|
41
43
|
export function createFromCursor<const TSchema extends ImplicitFieldSchema>(
|
|
42
44
|
schema: TSchema,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "../../core/index.js";
|
|
23
23
|
import { FieldKinds, valueSchemaAllows } from "../../feature-libraries/index.js";
|
|
24
24
|
import { cloneWithReplacements } from "../../util/index.js";
|
|
25
|
-
import type { TreeNodeSchema } from "../core/index.js";
|
|
25
|
+
import type { TreeNodeSchema, TreeLeafValue } from "../core/index.js";
|
|
26
26
|
import {
|
|
27
27
|
booleanSchema,
|
|
28
28
|
handleSchema,
|
|
@@ -31,7 +31,6 @@ import {
|
|
|
31
31
|
stringSchema,
|
|
32
32
|
} from "../leafNodeSchema.js";
|
|
33
33
|
import { isArrayNodeSchema, isObjectNodeSchema } from "../node-kinds/index.js";
|
|
34
|
-
import type { TreeLeafValue } from "../schemaTypes.js";
|
|
35
34
|
|
|
36
35
|
/**
|
|
37
36
|
* Options for how to interpret or encode a tree when schema information is available.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { JsonTreeSchema } from "./jsonSchema.js";
|
|
7
|
-
import type { ImplicitAllowedTypes } from "../
|
|
7
|
+
import type { ImplicitAllowedTypes } from "../core/index.js";
|
|
8
8
|
import { toJsonSchema } from "./simpleSchemaToJsonSchema.js";
|
|
9
9
|
import type { TreeEncodingOptions } from "./customTree.js";
|
|
10
10
|
import { TreeViewConfigurationAlpha } from "./configuration.js";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { ImplicitFieldSchema } from "../
|
|
6
|
+
import type { ImplicitFieldSchema } from "../fieldSchema.js";
|
|
7
7
|
import type { SimpleTreeSchema } from "../simpleSchema.js";
|
|
8
8
|
|
|
9
9
|
import { toSimpleTreeSchema } from "./viewSchemaToSimpleSchema.js";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
7
7
|
import type { TreeIndexKey } from "../../feature-libraries/index.js";
|
|
8
|
-
import { FieldKind, type ImplicitFieldSchema } from "../
|
|
8
|
+
import { FieldKind, type ImplicitFieldSchema } from "../fieldSchema.js";
|
|
9
9
|
import type { TreeNode } from "../core/index.js";
|
|
10
10
|
import { ObjectNodeSchema } from "../node-kinds/index.js";
|
|
11
11
|
import type { TreeView } from "./tree.js";
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
fieldRealizer,
|
|
24
24
|
comparePosetElements,
|
|
25
25
|
} from "../../feature-libraries/index.js";
|
|
26
|
-
import type { FieldSchema } from "../
|
|
26
|
+
import type { FieldSchema } from "../fieldSchema.js";
|
|
27
27
|
import { toStoredSchema } from "../toStoredSchema.js";
|
|
28
28
|
|
|
29
29
|
import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
7
|
-
import { fail } from "@fluidframework/core-utils/internal";
|
|
7
|
+
import { assert, fail } from "@fluidframework/core-utils/internal";
|
|
8
8
|
|
|
9
9
|
import type { SchemaFactory, ScopedSchemaName } from "./schemaFactory.js";
|
|
10
|
-
import type { NodeFromSchema } from "../schemaTypes.js";
|
|
11
10
|
import type {
|
|
11
|
+
NodeFromSchema,
|
|
12
12
|
InternalTreeNode,
|
|
13
13
|
NodeKind,
|
|
14
14
|
TreeNode,
|
|
@@ -47,6 +47,12 @@ export function singletonSchema<TScope extends string, TName extends string | nu
|
|
|
47
47
|
public get value(): TName {
|
|
48
48
|
return name;
|
|
49
49
|
}
|
|
50
|
+
|
|
51
|
+
public static override toString(): string {
|
|
52
|
+
return `SingletonSchema(${name})`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public static [Symbol.toStringTag] = `SingletonSchema(${name})`;
|
|
50
56
|
}
|
|
51
57
|
|
|
52
58
|
type SingletonNodeType = TreeNode & { readonly value: TName };
|
|
@@ -71,10 +77,16 @@ export function singletonSchema<TScope extends string, TName extends string | nu
|
|
|
71
77
|
|
|
72
78
|
/**
|
|
73
79
|
* Converts an enum into a collection of schema which can be used in a union.
|
|
80
|
+
*
|
|
81
|
+
* @typeParam TScope - The scope of the provided factory.
|
|
82
|
+
* There is a known issue where if a factory is provided that is typed as a {@link SchemaFactoryAlpha}, and its scope contains a "." character,
|
|
83
|
+
* the inferred type for the scope will end up as a union of the scope up to the first "." character and the scope as it should be.
|
|
84
|
+
* This can be mitigated by explicitly providing the TScope type parameter or by typing the provided factory as a {@link SchemaFactory} instead of a {@link SchemaFactoryAlpha}.
|
|
85
|
+
*
|
|
74
86
|
* @remarks
|
|
75
87
|
* The string value of the enum is used as the name of the schema: callers must ensure that it is stable and unique.
|
|
76
88
|
* Numeric enums values have the value implicitly converted into a string.
|
|
77
|
-
* Consider making a dedicated schema factory with a nested scope to avoid the enum members colliding with other schema.
|
|
89
|
+
* Consider making a dedicated schema factory with a nested scope (for example using {@link SchemaFactoryAlpha.scopedFactory}) to avoid the enum members colliding with other schema.
|
|
78
90
|
* @example
|
|
79
91
|
* ```typescript
|
|
80
92
|
* const schemaFactory = new SchemaFactory("com.myApp");
|
|
@@ -105,7 +117,8 @@ export function singletonSchema<TScope extends string, TName extends string | nu
|
|
|
105
117
|
* }
|
|
106
118
|
* ```
|
|
107
119
|
* @privateRemarks
|
|
108
|
-
*
|
|
120
|
+
* TODO: AB#43345: see TScope known issue above, and other references to this work item.
|
|
121
|
+
*
|
|
109
122
|
* @see {@link enumFromStrings} for a similar function that works on arrays of strings instead of an enum.
|
|
110
123
|
* @beta
|
|
111
124
|
*/
|
|
@@ -144,7 +157,7 @@ export function adaptEnum<
|
|
|
144
157
|
: never;
|
|
145
158
|
};
|
|
146
159
|
const out = factoryOut as typeof factoryOut & TOut & { readonly schema: SchemaArray };
|
|
147
|
-
for (const [key, value] of
|
|
160
|
+
for (const [key, value] of enumEntries(members)) {
|
|
148
161
|
const schema = singletonSchema(factory, value);
|
|
149
162
|
schemaArray.push(schema);
|
|
150
163
|
Object.defineProperty(out, key, {
|
|
@@ -165,6 +178,35 @@ export function adaptEnum<
|
|
|
165
178
|
return out;
|
|
166
179
|
}
|
|
167
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Returns en "entries" (like Object.entries) for an enum object, omitting the
|
|
183
|
+
* {@link https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings|reverse mappings}
|
|
184
|
+
*/
|
|
185
|
+
export function enumEntries(
|
|
186
|
+
enumObject: Record<string, string | number>,
|
|
187
|
+
): [string, string | number][] {
|
|
188
|
+
// Skip reverse mapping for numeric entries.
|
|
189
|
+
// For numeric entries, TypeScript defines an additional property keyed with the number implicitly converted to a string.
|
|
190
|
+
// Note TypeScript can overwrite its own enum entries in some edge cases (see https://github.com/microsoft/TypeScript/issues/48956), so it's not possible to handle all cases correctly.
|
|
191
|
+
return Object.entries(enumObject).filter(([key, value]) => {
|
|
192
|
+
// All reverse mapping must also have a inverse mapping (the regular forward mapping) to a number:
|
|
193
|
+
const inverse = enumObject[value];
|
|
194
|
+
if (typeof inverse !== "number") {
|
|
195
|
+
// Known not to be a reverse mapping, so keep it.
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
// At this point, it is expected that all remaining cases are reverse mappings,
|
|
199
|
+
// but do some asserts to ensure that the above logic is sufficient.
|
|
200
|
+
assert(typeof value === "string", "expected reverse mapping and thus a string value");
|
|
201
|
+
assert(
|
|
202
|
+
Number.parseFloat(key).toString() === key,
|
|
203
|
+
"expected reverse mapping and thus a key that is a normalized number",
|
|
204
|
+
);
|
|
205
|
+
// Discard the reverse mapping.
|
|
206
|
+
return false;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
168
210
|
/**
|
|
169
211
|
* Converts an array of distinct strings into a collection of schema which can be used like an enum style union.
|
|
170
212
|
* @remarks
|