@fluidframework/tree 2.52.0 → 2.53.0-350190
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/api-report/tree.alpha.api.md +38 -29
- package/dist/alpha.d.ts +2 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js +1 -0
- package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +49 -20
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.js +3 -0
- package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.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/jsonDomainSchema.d.ts +5 -3
- package/dist/jsonDomainSchema.d.ts.map +1 -1
- package/dist/jsonDomainSchema.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/schematizeTree.d.ts.map +1 -1
- package/dist/shared-tree/schematizeTree.js +1 -1
- package/dist/shared-tree/schematizeTree.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +3 -3
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +9 -3
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts +3 -0
- package/dist/simple-tree/api/configuration.d.ts.map +1 -1
- package/dist/simple-tree/api/configuration.js +5 -1
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/create.d.ts +4 -4
- package/dist/simple-tree/api/create.d.ts.map +1 -1
- package/dist/simple-tree/api/create.js +3 -6
- package/dist/simple-tree/api/create.js.map +1 -1
- package/dist/simple-tree/api/discrepancies.d.ts +5 -9
- package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/dist/simple-tree/api/discrepancies.js +11 -10
- package/dist/simple-tree/api/discrepancies.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +3 -2
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +3 -2
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js +3 -4
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +9 -155
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +4 -47
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.js +33 -11
- package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js +1 -7
- package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/dist/simple-tree/api/schemaStatics.d.ts +158 -0
- package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -0
- package/dist/simple-tree/api/schemaStatics.js +59 -0
- package/dist/simple-tree/api/schemaStatics.js.map +1 -0
- package/dist/simple-tree/api/storedSchema.d.ts +5 -3
- package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/storedSchema.js +4 -2
- package/dist/simple-tree/api/storedSchema.js.map +1 -1
- package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
- package/dist/simple-tree/api/treeBeta.js +12 -6
- package/dist/simple-tree/api/treeBeta.js.map +1 -1
- package/dist/simple-tree/core/allowedTypes.d.ts +33 -17
- package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/core/allowedTypes.js +20 -12
- package/dist/simple-tree/core/allowedTypes.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +5 -3
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +6 -1
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
- package/dist/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
- package/dist/simple-tree/core/simpleNodeSchemaBase.js +7 -0
- package/dist/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
- package/dist/simple-tree/core/toStored.d.ts +32 -0
- package/dist/simple-tree/core/toStored.d.ts.map +1 -0
- package/dist/simple-tree/core/toStored.js +37 -0
- package/dist/simple-tree/core/toStored.js.map +1 -0
- package/dist/simple-tree/core/treeNodeSchema.d.ts +7 -2
- package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/dist/simple-tree/core/treeNodeValid.d.ts +6 -1
- package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeValid.js +11 -3
- package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
- package/dist/simple-tree/core/walkSchema.d.ts +19 -5
- package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/walkSchema.js +4 -2
- package/dist/simple-tree/core/walkSchema.js.map +1 -1
- package/dist/simple-tree/createContext.d.ts.map +1 -1
- package/dist/simple-tree/createContext.js +1 -1
- package/dist/simple-tree/createContext.js.map +1 -1
- package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
- package/dist/simple-tree/fieldSchema.js +1 -1
- package/dist/simple-tree/fieldSchema.js.map +1 -1
- package/dist/simple-tree/index.d.ts +4 -4
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +7 -1
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/leafNodeSchema.js +1 -0
- package/dist/simple-tree/leafNodeSchema.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.js +17 -3
- package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.js +9 -2
- package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts +2 -2
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js +37 -26
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.js +9 -2
- package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +10 -10
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/simpleSchema.d.ts +6 -21
- 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 +35 -11
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +68 -33
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/alpha.d.ts +2 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -0
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +7 -0
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +1 -0
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js +1 -0
- package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +9 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +50 -21
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.js +3 -0
- package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +1 -0
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +4 -0
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.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/jsonDomainSchema.d.ts +5 -3
- package/lib/jsonDomainSchema.d.ts.map +1 -1
- package/lib/jsonDomainSchema.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/schematizeTree.d.ts.map +1 -1
- package/lib/shared-tree/schematizeTree.js +2 -2
- package/lib/shared-tree/schematizeTree.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +4 -4
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +10 -4
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts +3 -0
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- package/lib/simple-tree/api/configuration.js +6 -2
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/create.d.ts +4 -4
- package/lib/simple-tree/api/create.d.ts.map +1 -1
- package/lib/simple-tree/api/create.js +3 -6
- package/lib/simple-tree/api/create.js.map +1 -1
- package/lib/simple-tree/api/discrepancies.d.ts +5 -9
- package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/lib/simple-tree/api/discrepancies.js +11 -10
- package/lib/simple-tree/api/discrepancies.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +3 -2
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +2 -1
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js +4 -5
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +9 -155
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +2 -45
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +157 -16
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.js +23 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -3
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js +0 -5
- package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/lib/simple-tree/api/schemaStatics.d.ts +158 -0
- package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -0
- package/lib/simple-tree/api/schemaStatics.js +56 -0
- package/lib/simple-tree/api/schemaStatics.js.map +1 -0
- package/lib/simple-tree/api/storedSchema.d.ts +5 -3
- package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/storedSchema.js +6 -4
- package/lib/simple-tree/api/storedSchema.js.map +1 -1
- package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
- package/lib/simple-tree/api/treeBeta.js +8 -2
- package/lib/simple-tree/api/treeBeta.js.map +1 -1
- package/lib/simple-tree/core/allowedTypes.d.ts +33 -17
- package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/core/allowedTypes.js +23 -12
- package/lib/simple-tree/core/allowedTypes.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +5 -3
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +3 -2
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts +25 -0
- package/lib/simple-tree/core/simpleNodeSchemaBase.d.ts.map +1 -0
- package/lib/simple-tree/core/simpleNodeSchemaBase.js +6 -0
- package/lib/simple-tree/core/simpleNodeSchemaBase.js.map +1 -0
- package/lib/simple-tree/core/toStored.d.ts +32 -0
- package/lib/simple-tree/core/toStored.d.ts.map +1 -0
- package/lib/simple-tree/core/toStored.js +32 -0
- package/lib/simple-tree/core/toStored.js.map +1 -0
- package/lib/simple-tree/core/treeNodeSchema.d.ts +7 -2
- package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/lib/simple-tree/core/treeNodeValid.d.ts +6 -1
- package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeValid.js +9 -2
- package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
- package/lib/simple-tree/core/walkSchema.d.ts +19 -5
- package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/walkSchema.js +4 -2
- package/lib/simple-tree/core/walkSchema.js.map +1 -1
- package/lib/simple-tree/createContext.d.ts.map +1 -1
- package/lib/simple-tree/createContext.js +2 -2
- package/lib/simple-tree/createContext.js.map +1 -1
- package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
- package/lib/simple-tree/fieldSchema.js +1 -1
- package/lib/simple-tree/fieldSchema.js.map +1 -1
- package/lib/simple-tree/index.d.ts +4 -4
- 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/leafNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/leafNodeSchema.js +2 -1
- package/lib/simple-tree/leafNodeSchema.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.js +20 -6
- package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.js +12 -5
- package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts +2 -2
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js +16 -5
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.js +12 -5
- package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +10 -10
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/simpleSchema.d.ts +6 -21
- 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 +35 -11
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +67 -34
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/package.json +21 -21
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -0
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +9 -0
- package/src/feature-libraries/modular-schema/genericFieldKind.ts +1 -0
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +61 -19
- package/src/feature-libraries/optional-field/optionalField.ts +4 -0
- package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +4 -0
- package/src/index.ts +2 -1
- package/src/jsonDomainSchema.ts +4 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/schematizeTree.ts +2 -2
- package/src/shared-tree/schematizingTreeView.ts +9 -3
- package/src/shared-tree/treeAlpha.ts +18 -4
- package/src/simple-tree/api/configuration.ts +10 -2
- package/src/simple-tree/api/create.ts +5 -10
- package/src/simple-tree/api/discrepancies.ts +18 -17
- package/src/simple-tree/api/index.ts +2 -3
- package/src/simple-tree/api/schemaCompatibilityTester.ts +5 -9
- package/src/simple-tree/api/schemaFactory.ts +6 -250
- package/src/simple-tree/api/schemaFactoryAlpha.ts +174 -1
- package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -25
- package/src/simple-tree/api/schemaStatics.ts +291 -0
- package/src/simple-tree/api/storedSchema.ts +12 -5
- package/src/simple-tree/api/treeBeta.ts +9 -2
- package/src/simple-tree/core/allowedTypes.ts +46 -26
- package/src/simple-tree/core/index.ts +9 -1
- package/src/simple-tree/core/simpleNodeSchemaBase.ts +30 -0
- package/src/simple-tree/core/toStored.ts +58 -0
- package/src/simple-tree/core/treeNodeSchema.ts +8 -2
- package/src/simple-tree/core/treeNodeValid.ts +14 -2
- package/src/simple-tree/core/walkSchema.ts +23 -6
- package/src/simple-tree/createContext.ts +5 -2
- package/src/simple-tree/fieldSchema.ts +2 -1
- package/src/simple-tree/index.ts +14 -3
- package/src/simple-tree/leafNodeSchema.ts +2 -1
- package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -4
- package/src/simple-tree/node-kinds/map/mapNode.ts +23 -2
- package/src/simple-tree/node-kinds/object/objectNode.ts +34 -4
- package/src/simple-tree/node-kinds/record/recordNode.ts +20 -2
- package/src/simple-tree/prepareForInsertion.ts +12 -7
- package/src/simple-tree/simpleSchema.ts +6 -26
- package/src/simple-tree/toStoredSchema.ts +107 -44
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
7
|
+
import type {
|
|
8
|
+
ImplicitAllowedTypes,
|
|
9
|
+
ImplicitAnnotatedAllowedTypes,
|
|
10
|
+
UnannotateImplicitAllowedTypes,
|
|
11
|
+
} from "../core/index.js";
|
|
12
|
+
import { FieldKind, getDefaultProvider, createFieldSchema } from "../fieldSchema.js";
|
|
13
|
+
import type {
|
|
14
|
+
FieldProps,
|
|
15
|
+
FieldSchema,
|
|
16
|
+
DefaultProvider,
|
|
17
|
+
FieldPropsAlpha,
|
|
18
|
+
FieldSchemaAlpha,
|
|
19
|
+
} from "../fieldSchema.js";
|
|
20
|
+
import type { LeafSchema } from "../leafNodeSchema.js";
|
|
21
|
+
import {
|
|
22
|
+
stringSchema,
|
|
23
|
+
numberSchema,
|
|
24
|
+
booleanSchema,
|
|
25
|
+
nullSchema,
|
|
26
|
+
handleSchema,
|
|
27
|
+
} from "../leafNodeSchema.js";
|
|
28
|
+
import type { System_Unsafe, FieldSchemaAlphaUnsafe } from "./typesUnsafe.js";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Stateless APIs exposed via {@link SchemaFactory} as both instance properties and as statics.
|
|
32
|
+
* @privateRemarks
|
|
33
|
+
* We have no way to make linkable members which exist both as statics and instance properties since API-Extractor does not support this.
|
|
34
|
+
* As a workaround, we have this type as a third place which can be linked.
|
|
35
|
+
* @system @sealed @public
|
|
36
|
+
*/
|
|
37
|
+
export interface SchemaStatics {
|
|
38
|
+
/**
|
|
39
|
+
* {@link TreeNodeSchema} for holding a JavaScript `string`.
|
|
40
|
+
*
|
|
41
|
+
* @remarks
|
|
42
|
+
* Strings containing unpaired UTF-16 surrogate pair code units may not be handled correctly.
|
|
43
|
+
*
|
|
44
|
+
* These limitations come from the use of UTF-8 encoding of the strings, which requires them to be valid unicode.
|
|
45
|
+
* JavaScript does not make this requirement for its strings so not all possible JavaScript strings are supported.
|
|
46
|
+
* @privateRemarks
|
|
47
|
+
* TODO:
|
|
48
|
+
* We should be much more clear about what happens if you use problematic values.
|
|
49
|
+
* We should validate and/or normalize them when inserting content.
|
|
50
|
+
*/
|
|
51
|
+
readonly string: LeafSchema<"string", string>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* {@link TreeNodeSchema} for holding a JavaScript `number`.
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* The number is a {@link https://en.wikipedia.org/wiki/Double-precision_floating-point_format | double-precision 64-bit binary format IEEE 754} value, however there are some exceptions:
|
|
58
|
+
*
|
|
59
|
+
* - `NaN`, and the infinities are converted to `null` (and may therefore only be used where `null` is allowed by the schema).
|
|
60
|
+
*
|
|
61
|
+
* - `-0` may be converted to `0` in some cases.
|
|
62
|
+
*
|
|
63
|
+
* These limitations match the limitations of JSON.
|
|
64
|
+
* @privateRemarks
|
|
65
|
+
* TODO:
|
|
66
|
+
* We should be much more clear about what happens if you use problematic values.
|
|
67
|
+
* We should validate and/or normalize them when inserting content.
|
|
68
|
+
*/
|
|
69
|
+
readonly number: LeafSchema<"number", number>;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* {@link TreeNodeSchema} for holding a boolean.
|
|
73
|
+
*/
|
|
74
|
+
readonly boolean: LeafSchema<"boolean", boolean>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* {@link TreeNodeSchema} for JavaScript `null`.
|
|
78
|
+
*
|
|
79
|
+
* @remarks
|
|
80
|
+
* There are good {@link https://www.npmjs.com/package/%40rushstack/eslint-plugin#rushstackno-new-null | reasons to avoid using null} in JavaScript, however sometimes it is desired.
|
|
81
|
+
* This {@link TreeNodeSchema} node provides the option to include nulls in trees when desired.
|
|
82
|
+
* Unless directly inter-operating with existing data using null, consider other approaches, like wrapping the value in an optional field, or using a more specifically named empty object node.
|
|
83
|
+
*/
|
|
84
|
+
// eslint-disable-next-line @rushstack/no-new-null
|
|
85
|
+
readonly null: LeafSchema<"null", null>;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* {@link TreeNodeSchema} for holding an {@link @fluidframework/core-interfaces#(IFluidHandle:interface)}.
|
|
89
|
+
*/
|
|
90
|
+
readonly handle: LeafSchema<"handle", IFluidHandle>;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* {@link AllowedTypes} for holding any of the leaf types.
|
|
94
|
+
*/
|
|
95
|
+
readonly leaves: readonly [
|
|
96
|
+
SchemaStatics["string"],
|
|
97
|
+
SchemaStatics["number"],
|
|
98
|
+
SchemaStatics["boolean"],
|
|
99
|
+
SchemaStatics["null"],
|
|
100
|
+
SchemaStatics["handle"],
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Make a field optional instead of the default, which is required.
|
|
105
|
+
*
|
|
106
|
+
* @param t - The types allowed under the field.
|
|
107
|
+
* @param props - Optional properties to associate with the field.
|
|
108
|
+
*
|
|
109
|
+
* @typeParam TCustomMetadata - Custom metadata properties to associate with the field.
|
|
110
|
+
* See {@link FieldSchemaMetadata.custom}.
|
|
111
|
+
*/
|
|
112
|
+
readonly optional: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
|
|
113
|
+
t: T,
|
|
114
|
+
props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
|
|
115
|
+
) => FieldSchema<FieldKind.Optional, T, TCustomMetadata>;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Make a field explicitly required.
|
|
119
|
+
*
|
|
120
|
+
* @param t - The types allowed under the field.
|
|
121
|
+
* @param props - Optional properties to associate with the field.
|
|
122
|
+
*
|
|
123
|
+
* @remarks
|
|
124
|
+
* Fields are required by default, but this API can be used to make the required nature explicit in the schema,
|
|
125
|
+
* and allows associating custom {@link FieldProps | properties} with the field.
|
|
126
|
+
*
|
|
127
|
+
* @typeParam TCustomMetadata - Custom metadata properties to associate with the field.
|
|
128
|
+
* See {@link FieldSchemaMetadata.custom}.
|
|
129
|
+
*/
|
|
130
|
+
readonly required: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
|
|
131
|
+
t: T,
|
|
132
|
+
props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
|
|
133
|
+
) => FieldSchema<FieldKind.Required, T, TCustomMetadata>;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* {@link SchemaStatics.optional} except tweaked to work better for recursive types.
|
|
137
|
+
* Use with {@link ValidateRecursiveSchema} for improved type safety.
|
|
138
|
+
* @remarks
|
|
139
|
+
* This version of {@link SchemaStatics.optional} has fewer type constraints to work around TypeScript limitations, see {@link Unenforced}.
|
|
140
|
+
* See {@link ValidateRecursiveSchema} for additional information about using recursive schema.
|
|
141
|
+
*/
|
|
142
|
+
readonly optionalRecursive: <
|
|
143
|
+
const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
|
|
144
|
+
const TCustomMetadata = unknown,
|
|
145
|
+
>(
|
|
146
|
+
t: T,
|
|
147
|
+
props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
|
|
148
|
+
) => System_Unsafe.FieldSchemaUnsafe<FieldKind.Optional, T, TCustomMetadata>;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* {@link SchemaStatics.required} except tweaked to work better for recursive types.
|
|
152
|
+
* Use with {@link ValidateRecursiveSchema} for improved type safety.
|
|
153
|
+
* @remarks
|
|
154
|
+
* This version of {@link SchemaStatics.required} has fewer type constraints to work around TypeScript limitations, see {@link Unenforced}.
|
|
155
|
+
* See {@link ValidateRecursiveSchema} for additional information about using recursive schema.
|
|
156
|
+
*/
|
|
157
|
+
readonly requiredRecursive: <
|
|
158
|
+
const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
|
|
159
|
+
const TCustomMetadata = unknown,
|
|
160
|
+
>(
|
|
161
|
+
t: T,
|
|
162
|
+
props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
|
|
163
|
+
) => System_Unsafe.FieldSchemaUnsafe<FieldKind.Required, T, TCustomMetadata>;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const defaultOptionalProvider: DefaultProvider = getDefaultProvider(() => []);
|
|
167
|
+
|
|
168
|
+
// The following overloads for optional and required are used to get around the fact that
|
|
169
|
+
// the compiler can't infer that UnannotateImplicitAllowedTypes<T> is equal to T when T is known to extend ImplicitAllowedTypes
|
|
170
|
+
|
|
171
|
+
// #region Overloads for optional and required
|
|
172
|
+
function optional<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
|
|
173
|
+
t: T,
|
|
174
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
175
|
+
): FieldSchemaAlpha<FieldKind.Optional, T, TCustomMetadata>;
|
|
176
|
+
|
|
177
|
+
function optional<
|
|
178
|
+
const T extends ImplicitAnnotatedAllowedTypes,
|
|
179
|
+
const TCustomMetadata = unknown,
|
|
180
|
+
>(
|
|
181
|
+
t: T,
|
|
182
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
183
|
+
): FieldSchemaAlpha<FieldKind.Optional, UnannotateImplicitAllowedTypes<T>, TCustomMetadata>;
|
|
184
|
+
|
|
185
|
+
function optional<
|
|
186
|
+
const T extends ImplicitAnnotatedAllowedTypes,
|
|
187
|
+
const TCustomMetadata = unknown,
|
|
188
|
+
>(
|
|
189
|
+
t: T,
|
|
190
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
191
|
+
): FieldSchemaAlpha<FieldKind.Optional, UnannotateImplicitAllowedTypes<T>, TCustomMetadata> {
|
|
192
|
+
return createFieldSchema(FieldKind.Optional, t, {
|
|
193
|
+
defaultProvider: defaultOptionalProvider,
|
|
194
|
+
...props,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function required<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
|
|
199
|
+
t: T,
|
|
200
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
201
|
+
): FieldSchemaAlpha<FieldKind.Required, T, TCustomMetadata>;
|
|
202
|
+
|
|
203
|
+
function required<
|
|
204
|
+
const T extends ImplicitAnnotatedAllowedTypes,
|
|
205
|
+
const TCustomMetadata = unknown,
|
|
206
|
+
>(
|
|
207
|
+
t: T,
|
|
208
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
209
|
+
): FieldSchemaAlpha<FieldKind.Required, UnannotateImplicitAllowedTypes<T>, TCustomMetadata>;
|
|
210
|
+
|
|
211
|
+
function required<
|
|
212
|
+
const T extends ImplicitAnnotatedAllowedTypes,
|
|
213
|
+
const TCustomMetadata = unknown,
|
|
214
|
+
>(
|
|
215
|
+
t: T,
|
|
216
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
217
|
+
): FieldSchemaAlpha<FieldKind.Required, UnannotateImplicitAllowedTypes<T>, TCustomMetadata> {
|
|
218
|
+
return createFieldSchema(FieldKind.Required, t, props);
|
|
219
|
+
}
|
|
220
|
+
// #endregion
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Implementation of {@link SchemaStatics}.
|
|
224
|
+
* @remarks
|
|
225
|
+
* Entries can use more specific types than {@link SchemaStatics} requires to be more useful for non-public consumers.
|
|
226
|
+
* Additional non-public members are in {@link schemaStatics}.
|
|
227
|
+
*/
|
|
228
|
+
export const schemaStaticsStable = {
|
|
229
|
+
string: stringSchema,
|
|
230
|
+
number: numberSchema,
|
|
231
|
+
boolean: booleanSchema,
|
|
232
|
+
null: nullSchema,
|
|
233
|
+
handle: handleSchema,
|
|
234
|
+
leaves: [stringSchema, numberSchema, booleanSchema, nullSchema, handleSchema],
|
|
235
|
+
|
|
236
|
+
optional,
|
|
237
|
+
|
|
238
|
+
required,
|
|
239
|
+
|
|
240
|
+
optionalRecursive: <
|
|
241
|
+
const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
|
|
242
|
+
const TCustomMetadata = unknown,
|
|
243
|
+
>(
|
|
244
|
+
t: T,
|
|
245
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
246
|
+
): FieldSchemaAlphaUnsafe<FieldKind.Optional, T, TCustomMetadata> => {
|
|
247
|
+
return createFieldSchemaUnsafe(FieldKind.Optional, t, {
|
|
248
|
+
defaultProvider: defaultOptionalProvider,
|
|
249
|
+
...props,
|
|
250
|
+
});
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
requiredRecursive: <
|
|
254
|
+
const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
|
|
255
|
+
const TCustomMetadata = unknown,
|
|
256
|
+
>(
|
|
257
|
+
t: T,
|
|
258
|
+
props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
|
|
259
|
+
): FieldSchemaAlphaUnsafe<FieldKind.Required, T, TCustomMetadata> => {
|
|
260
|
+
return createFieldSchemaUnsafe(FieldKind.Required, t, props);
|
|
261
|
+
},
|
|
262
|
+
} as const satisfies SchemaStatics;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Unstable extensions to {@link schemaStaticsStable}.
|
|
266
|
+
*/
|
|
267
|
+
export const schemaStatics = {
|
|
268
|
+
...schemaStaticsStable,
|
|
269
|
+
identifier: <const TCustomMetadata = unknown>(
|
|
270
|
+
props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
|
|
271
|
+
): FieldSchemaAlpha<FieldKind.Identifier, typeof stringSchema, TCustomMetadata> => {
|
|
272
|
+
return createFieldSchema(FieldKind.Identifier, stringSchema, props);
|
|
273
|
+
},
|
|
274
|
+
} as const;
|
|
275
|
+
|
|
276
|
+
function createFieldSchemaUnsafe<
|
|
277
|
+
Kind extends FieldKind,
|
|
278
|
+
Types extends System_Unsafe.ImplicitAllowedTypesUnsafe,
|
|
279
|
+
TCustomMetadata = unknown,
|
|
280
|
+
>(
|
|
281
|
+
kind: Kind,
|
|
282
|
+
allowedTypes: Types,
|
|
283
|
+
props?: FieldProps<TCustomMetadata>,
|
|
284
|
+
): FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata> {
|
|
285
|
+
// At runtime, we still want this to be a FieldSchema instance, but we can't satisfy its extends clause, so just return it as an FieldSchemaUnsafe
|
|
286
|
+
return createFieldSchema(
|
|
287
|
+
kind,
|
|
288
|
+
allowedTypes as ImplicitAllowedTypes & Types,
|
|
289
|
+
props,
|
|
290
|
+
) as FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata>;
|
|
291
|
+
}
|
|
@@ -12,9 +12,13 @@ import {
|
|
|
12
12
|
// eslint-disable-next-line import/no-internal-modules
|
|
13
13
|
} from "../../feature-libraries/schema-index/index.js";
|
|
14
14
|
import type { JsonCompatible } from "../../util/index.js";
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
17
|
-
|
|
15
|
+
import type { SchemaUpgrade } from "../core/index.js";
|
|
16
|
+
import {
|
|
17
|
+
normalizeFieldSchema,
|
|
18
|
+
type ImplicitAnnotatedFieldSchema,
|
|
19
|
+
type ImplicitFieldSchema,
|
|
20
|
+
} from "../fieldSchema.js";
|
|
21
|
+
import { toStoredSchema } from "../toStoredSchema.js";
|
|
18
22
|
import { TreeViewConfigurationAlpha } from "./configuration.js";
|
|
19
23
|
|
|
20
24
|
import { SchemaCompatibilityTester } from "./schemaCompatibilityTester.js";
|
|
@@ -24,6 +28,8 @@ import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
|
24
28
|
* Dumps the "persisted" schema subset of the provided `schema` into a deterministic JSON-compatible, semi-human-readable format.
|
|
25
29
|
*
|
|
26
30
|
* @param schema - The schema to dump.
|
|
31
|
+
* @param oldestCompatibleClient - The oldest client version which can read the schema: impacts the format used.
|
|
32
|
+
* @param includeStaged - filter for selecting which staged allowed types to include in the output.
|
|
27
33
|
*
|
|
28
34
|
* @remarks
|
|
29
35
|
* This can be used to help inspect schema for debugging, and to save a snapshot of schema to help detect and review changes to an applications schema.
|
|
@@ -51,10 +57,11 @@ import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
|
51
57
|
* @alpha
|
|
52
58
|
*/
|
|
53
59
|
export function extractPersistedSchema(
|
|
54
|
-
schema:
|
|
60
|
+
schema: ImplicitAnnotatedFieldSchema,
|
|
55
61
|
oldestCompatibleClient: FluidClientVersion,
|
|
62
|
+
includeStaged: (upgrade: SchemaUpgrade) => boolean,
|
|
56
63
|
): JsonCompatible {
|
|
57
|
-
const stored =
|
|
64
|
+
const stored = toStoredSchema(schema, { includeStaged });
|
|
58
65
|
const schemaWriteVersion = clientVersionToSchemaVersion(oldestCompatibleClient);
|
|
59
66
|
return encodeTreeSchema(stored, schemaWriteVersion);
|
|
60
67
|
}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import type { TreeFieldStoredSchema } from "../../core/index.js";
|
|
7
|
+
import { defaultSchemaPolicy, FieldKinds } from "../../feature-libraries/index.js";
|
|
8
|
+
import { brand } from "../../util/index.js";
|
|
7
9
|
import {
|
|
8
10
|
Context,
|
|
9
11
|
getKernel,
|
|
@@ -191,7 +193,12 @@ export const TreeBeta: TreeBeta = {
|
|
|
191
193
|
);
|
|
192
194
|
const context = new Context(flexContext, getUnhydratedContext(kernel.schema).schema);
|
|
193
195
|
|
|
194
|
-
|
|
196
|
+
const fieldSchema: TreeFieldStoredSchema = {
|
|
197
|
+
kind: FieldKinds.required.identifier,
|
|
198
|
+
types: new Set([brand(kernel.schema.identifier)]),
|
|
199
|
+
persistedMetadata: undefined,
|
|
200
|
+
};
|
|
201
|
+
return createFromCursor(kernel.schema, cursor, fieldSchema, context) as Unhydrated<
|
|
195
202
|
TreeFieldFromImplicitField<TSchema>
|
|
196
203
|
>;
|
|
197
204
|
},
|
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
|
|
6
6
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
getOrCreate,
|
|
10
|
+
isReadonlyArray,
|
|
11
|
+
type IsUnion,
|
|
12
|
+
type MakeNominal,
|
|
13
|
+
} from "../../util/index.js";
|
|
9
14
|
import { isLazy, type FlexListToUnion, type LazyItem } from "./flexList.js";
|
|
10
15
|
import {
|
|
11
16
|
NodeKind,
|
|
@@ -134,7 +139,34 @@ export interface AllowedTypeMetadata {
|
|
|
134
139
|
*/
|
|
135
140
|
readonly custom?: unknown;
|
|
136
141
|
|
|
137
|
-
|
|
142
|
+
/**
|
|
143
|
+
* If defined, indicates that an allowed type is {@link SchemaStaticsAlpha.staged | staged}.
|
|
144
|
+
*/
|
|
145
|
+
readonly stagedSchemaUpgrade?: SchemaUpgrade;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Package internal {@link SchemaUpgrade} construction API.
|
|
150
|
+
*/
|
|
151
|
+
export let createSchemaUpgrade: () => SchemaUpgrade;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Unique token used to upgrade schemas and determine if a particular upgrade has been completed.
|
|
155
|
+
* @remarks
|
|
156
|
+
* Create using {@link SchemaStaticsAlpha.staged}.
|
|
157
|
+
* @privateRemarks
|
|
158
|
+
* TODO:#38722 implement runtime schema upgrades.
|
|
159
|
+
* Until then, the class purely behaves mostly as a placeholder.
|
|
160
|
+
* TODO: Consider allowing users to store a name for the upgrade to use in error messages.
|
|
161
|
+
* @sealed @alpha
|
|
162
|
+
*/
|
|
163
|
+
export class SchemaUpgrade {
|
|
164
|
+
protected _typeCheck!: MakeNominal;
|
|
165
|
+
static {
|
|
166
|
+
createSchemaUpgrade = () => new SchemaUpgrade();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private constructor() {}
|
|
138
170
|
}
|
|
139
171
|
|
|
140
172
|
/**
|
|
@@ -191,7 +223,7 @@ export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTyp
|
|
|
191
223
|
T extends AnnotatedAllowedTypes
|
|
192
224
|
? UnannotateAllowedTypes<T>
|
|
193
225
|
: T extends AnnotatedAllowedType
|
|
194
|
-
?
|
|
226
|
+
? UnannotateAllowedTypesList<[T]>
|
|
195
227
|
: T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[]
|
|
196
228
|
? UnannotateAllowedTypesList<T>
|
|
197
229
|
: T extends TreeNodeSchema
|
|
@@ -205,17 +237,9 @@ export type UnannotateImplicitAllowedTypes<T extends ImplicitAnnotatedAllowedTyp
|
|
|
205
237
|
export type UnannotateAllowedTypesList<
|
|
206
238
|
T extends readonly (AnnotatedAllowedType | LazyItem<TreeNodeSchema>)[],
|
|
207
239
|
> = {
|
|
208
|
-
[I in keyof T]:
|
|
240
|
+
[I in keyof T]: UnannotateAllowedType<T[I]>;
|
|
209
241
|
};
|
|
210
242
|
|
|
211
|
-
/**
|
|
212
|
-
* Removes annotations from an allowed type that may contain annotations.
|
|
213
|
-
* @system @alpha
|
|
214
|
-
*/
|
|
215
|
-
export type UnannotateAllowedTypeOrLazyItem<
|
|
216
|
-
T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
|
|
217
|
-
> = T extends AnnotatedAllowedType<infer X> ? X : T;
|
|
218
|
-
|
|
219
243
|
/**
|
|
220
244
|
* Removes all annotations from a set of allowed types.
|
|
221
245
|
* @system @alpha
|
|
@@ -225,10 +249,15 @@ export type UnannotateAllowedTypes<T extends AnnotatedAllowedTypes> =
|
|
|
225
249
|
|
|
226
250
|
/**
|
|
227
251
|
* Removes annotations from an allowed type.
|
|
252
|
+
* @remarks
|
|
253
|
+
* If the input could be lazy
|
|
254
|
+
* (is a LazyItem or AnnotatedAllowedType<LazyItem> instead of just a TreeNodeSchema | AnnotatedAllowedType<TreeNodeSchema>)
|
|
255
|
+
* then the output of this will be a LazyItem and thus is not valid as an ImplicitAllowedTypes without wrapping it in an array.
|
|
256
|
+
* This can however be used on items within an AllowedTypes array.
|
|
228
257
|
* @system @alpha
|
|
229
258
|
*/
|
|
230
259
|
export type UnannotateAllowedType<T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>> =
|
|
231
|
-
T extends AnnotatedAllowedType<infer X> ?
|
|
260
|
+
T extends AnnotatedAllowedType<infer X> ? X : T;
|
|
232
261
|
|
|
233
262
|
/**
|
|
234
263
|
* Normalizes a {@link ImplicitAllowedTypes} to a set of {@link TreeNodeSchema}s, by eagerly evaluating any
|
|
@@ -258,22 +287,13 @@ export function normalizeAllowedTypes(
|
|
|
258
287
|
}
|
|
259
288
|
|
|
260
289
|
/**
|
|
261
|
-
* Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist
|
|
262
|
-
* and eagerly evaluating any lazy schema declarations.
|
|
263
|
-
*
|
|
264
|
-
* @remarks
|
|
265
|
-
* Note: this must only be called after all required schemas have been declared, otherwise evaluation of
|
|
266
|
-
* recursive schemas may fail.
|
|
267
|
-
* type is frozen and should not be modified after being passed in.
|
|
290
|
+
* Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist.
|
|
268
291
|
*/
|
|
269
|
-
export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema
|
|
270
|
-
type: T | AnnotatedAllowedType<T
|
|
292
|
+
export function normalizeToAnnotatedAllowedType<T extends LazyItem<TreeNodeSchema>>(
|
|
293
|
+
type: T | AnnotatedAllowedType<T>,
|
|
271
294
|
): AnnotatedAllowedType<T> {
|
|
272
295
|
return isAnnotatedAllowedType(type)
|
|
273
|
-
?
|
|
274
|
-
metadata: type.metadata,
|
|
275
|
-
type: evaluateLazySchema(type.type),
|
|
276
|
-
}
|
|
296
|
+
? type
|
|
277
297
|
: {
|
|
278
298
|
metadata: {},
|
|
279
299
|
type,
|
|
@@ -57,6 +57,8 @@ export {
|
|
|
57
57
|
unannotateImplicitAllowedTypes,
|
|
58
58
|
markSchemaMostDerived,
|
|
59
59
|
evaluateLazySchema,
|
|
60
|
+
createSchemaUpgrade,
|
|
61
|
+
type SchemaUpgrade,
|
|
60
62
|
} from "./allowedTypes.js";
|
|
61
63
|
export type {
|
|
62
64
|
AnnotatedAllowedType,
|
|
@@ -73,7 +75,6 @@ export type {
|
|
|
73
75
|
UnannotateAllowedTypes,
|
|
74
76
|
UnannotateAllowedType,
|
|
75
77
|
UnannotateAllowedTypesList,
|
|
76
|
-
UnannotateAllowedTypeOrLazyItem,
|
|
77
78
|
AllowedTypeMetadata,
|
|
78
79
|
AnnotatedAllowedTypes,
|
|
79
80
|
} from "./allowedTypes.js";
|
|
@@ -101,4 +102,11 @@ export {
|
|
|
101
102
|
TreeNodeValid,
|
|
102
103
|
type MostDerivedData,
|
|
103
104
|
createTreeNodeSchemaPrivateData,
|
|
105
|
+
isClassBasedSchema,
|
|
104
106
|
} from "./treeNodeValid.js";
|
|
107
|
+
export type { SimpleNodeSchemaBase } from "./simpleNodeSchemaBase.js";
|
|
108
|
+
export {
|
|
109
|
+
type StoredSchemaGenerationOptions,
|
|
110
|
+
convertAllowedTypes,
|
|
111
|
+
allowedTypeFilter,
|
|
112
|
+
} from "./toStored.js";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { NodeKind, NodeSchemaMetadata } from "./treeNodeSchema.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base interface for {@link TreeNodeSchema} and {@link SimpleNodeSchema} types.
|
|
10
|
+
* Once simple schema is stable this doesn't have a reason to be kept `@system`, but it could be.
|
|
11
|
+
* @system
|
|
12
|
+
* @public
|
|
13
|
+
* @sealed
|
|
14
|
+
*/
|
|
15
|
+
export interface SimpleNodeSchemaBase<
|
|
16
|
+
out TNodeKind extends NodeKind,
|
|
17
|
+
out TCustomMetadata = unknown,
|
|
18
|
+
> {
|
|
19
|
+
/**
|
|
20
|
+
* The {@link NodeKind}.
|
|
21
|
+
*
|
|
22
|
+
* @remarks can be used to type-switch between implementations.
|
|
23
|
+
*/
|
|
24
|
+
readonly kind: TNodeKind;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* User-provided {@link NodeSchemaMetadata} for this schema.
|
|
28
|
+
*/
|
|
29
|
+
readonly metadata: NodeSchemaMetadata<TCustomMetadata>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { brand } from "../../util/index.js";
|
|
7
|
+
import {
|
|
8
|
+
normalizeAnnotatedAllowedTypes,
|
|
9
|
+
type AnnotatedAllowedType,
|
|
10
|
+
type ImplicitAnnotatedAllowedTypes,
|
|
11
|
+
type SchemaUpgrade,
|
|
12
|
+
} from "./allowedTypes.js";
|
|
13
|
+
import type { TreeNodeSchemaIdentifier, TreeTypeSet } from "../../core/index.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Options for generating a {@link TreeStoredSchema} from view schema.
|
|
17
|
+
*/
|
|
18
|
+
export interface StoredSchemaGenerationOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Determines whether to include staged schema in the resulting stored schema.
|
|
21
|
+
* @remarks
|
|
22
|
+
* Due to caching, the behavior of this function must be pure.
|
|
23
|
+
*/
|
|
24
|
+
includeStaged(upgrade: SchemaUpgrade): boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Filters an allowed type based on the provided options.
|
|
29
|
+
* @param allowedType - The allowed type to filter.
|
|
30
|
+
* @param options - The options to use for filtering.
|
|
31
|
+
* @returns Whether the allowed type passes the filter.
|
|
32
|
+
*/
|
|
33
|
+
export function allowedTypeFilter(
|
|
34
|
+
allowedType: AnnotatedAllowedType,
|
|
35
|
+
options: StoredSchemaGenerationOptions,
|
|
36
|
+
): boolean {
|
|
37
|
+
// If the allowed type is staged, only include it if the options allow it.
|
|
38
|
+
if (allowedType.metadata.stagedSchemaUpgrade !== undefined) {
|
|
39
|
+
return options.includeStaged(allowedType.metadata.stagedSchemaUpgrade);
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Converts an ImplicitAnnotatedAllowedTypes to a stored schema.
|
|
46
|
+
* @param schema - The schema to convert.
|
|
47
|
+
* @param options - The options to use for filtering.
|
|
48
|
+
* @returns The converted stored schema.
|
|
49
|
+
*/
|
|
50
|
+
export function convertAllowedTypes(
|
|
51
|
+
schema: ImplicitAnnotatedAllowedTypes,
|
|
52
|
+
options: StoredSchemaGenerationOptions,
|
|
53
|
+
): TreeTypeSet {
|
|
54
|
+
const filtered: TreeNodeSchemaIdentifier[] = normalizeAnnotatedAllowedTypes(schema)
|
|
55
|
+
.types.filter((allowedType) => allowedTypeFilter(allowedType, options))
|
|
56
|
+
.map((a) => brand(a.type.identifier));
|
|
57
|
+
return new Set(filtered);
|
|
58
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
import type { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
8
8
|
|
|
9
|
-
import type { SimpleNodeSchemaBase } from "
|
|
9
|
+
import type { SimpleNodeSchemaBase } from "./simpleNodeSchemaBase.js";
|
|
10
10
|
import type { TreeNode } from "./treeNode.js";
|
|
11
11
|
import type { InternalTreeNode, Unhydrated } from "./types.js";
|
|
12
12
|
import type { UnionToIntersection } from "../../util/index.js";
|
|
@@ -15,9 +15,10 @@ import type {
|
|
|
15
15
|
NormalizedAnnotatedAllowedTypes,
|
|
16
16
|
} from "./allowedTypes.js";
|
|
17
17
|
import type { Context } from "./context.js";
|
|
18
|
-
import type { FieldKey, NodeData } from "../../core/index.js";
|
|
18
|
+
import type { FieldKey, NodeData, TreeNodeStoredSchema } from "../../core/index.js";
|
|
19
19
|
import type { UnhydratedFlexTreeField } from "./unhydratedFlexTree.js";
|
|
20
20
|
import type { FactoryContent } from "../unhydratedFlexTreeFromInsertable.js";
|
|
21
|
+
import type { StoredSchemaGenerationOptions } from "./toStored.js";
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Schema for a {@link TreeNode} or {@link TreeLeafValue}.
|
|
@@ -396,6 +397,11 @@ export interface TreeNodeSchemaPrivateData {
|
|
|
396
397
|
* Idempotent initialization function that pre-caches data and can dereference lazy schema references.
|
|
397
398
|
*/
|
|
398
399
|
idempotentInitialize(): TreeNodeSchemaInitializedData;
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Converts a the schema into a {@link TreeNodeStoredSchema}.
|
|
403
|
+
*/
|
|
404
|
+
toStored(options: StoredSchemaGenerationOptions): TreeNodeStoredSchema;
|
|
399
405
|
}
|
|
400
406
|
|
|
401
407
|
/**
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
import type { InternalTreeNode } from "./types.js";
|
|
28
28
|
import { typeSchemaSymbol } from "./withType.js";
|
|
29
29
|
import type { ImplicitAnnotatedAllowedTypes } from "./allowedTypes.js";
|
|
30
|
+
import type { SimpleNodeSchemaBase } from "./simpleNodeSchemaBase.js";
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
33
|
* Class which all {@link TreeNode}s must extend.
|
|
@@ -233,7 +234,7 @@ export interface MostDerivedData {
|
|
|
233
234
|
export function schemaAsTreeNodeValid(
|
|
234
235
|
schema: TreeNodeSchemaCore<string, NodeKind, boolean>,
|
|
235
236
|
): typeof TreeNodeValid & TreeNodeSchema {
|
|
236
|
-
if (!
|
|
237
|
+
if (!isClassBasedSchema(schema)) {
|
|
237
238
|
// Use JSON.stringify to quote and escape identifier string.
|
|
238
239
|
throw new UsageError(
|
|
239
240
|
`Schema for ${JSON.stringify(
|
|
@@ -242,7 +243,16 @@ export function schemaAsTreeNodeValid(
|
|
|
242
243
|
);
|
|
243
244
|
}
|
|
244
245
|
|
|
245
|
-
return schema
|
|
246
|
+
return schema;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Check if a schema is a {@link TreeNodeValid}.
|
|
251
|
+
*/
|
|
252
|
+
export function isClassBasedSchema(
|
|
253
|
+
schema: SimpleNodeSchemaBase<NodeKind>,
|
|
254
|
+
): schema is typeof TreeNodeValid & TreeNodeSchema {
|
|
255
|
+
return inPrototypeChain(schema, TreeNodeValid);
|
|
246
256
|
}
|
|
247
257
|
|
|
248
258
|
/**
|
|
@@ -253,6 +263,7 @@ export function schemaAsTreeNodeValid(
|
|
|
253
263
|
export function createTreeNodeSchemaPrivateData(
|
|
254
264
|
schema: TreeNodeSchemaCore<string, NodeKind, boolean>,
|
|
255
265
|
childAnnotatedAllowedTypes: readonly ImplicitAnnotatedAllowedTypes[],
|
|
266
|
+
toStored: TreeNodeSchemaPrivateData["toStored"],
|
|
256
267
|
): TreeNodeSchemaPrivateData {
|
|
257
268
|
const schemaValid = schemaAsTreeNodeValid(schema);
|
|
258
269
|
// Since this closes over the schema, ensure this schema is marked as most derived
|
|
@@ -262,6 +273,7 @@ export function createTreeNodeSchemaPrivateData(
|
|
|
262
273
|
return {
|
|
263
274
|
idempotentInitialize: () => schemaValid.oneTimeInitialize().oneTimeInitialized,
|
|
264
275
|
childAnnotatedAllowedTypes,
|
|
276
|
+
toStored,
|
|
265
277
|
};
|
|
266
278
|
}
|
|
267
279
|
|