@fluidframework/tree 2.43.0 → 2.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +100 -0
- package/api-report/tree.alpha.api.md +73 -16
- package/api-report/tree.beta.api.md +9 -3
- package/api-report/tree.legacy.alpha.api.md +8 -2
- package/api-report/tree.legacy.public.api.md +8 -2
- package/api-report/tree.public.api.md +8 -2
- package/dist/alpha.d.ts +9 -0
- package/dist/core/forest/editableForest.d.ts +0 -2
- package/dist/core/forest/editableForest.d.ts.map +1 -1
- package/dist/core/forest/editableForest.js.map +1 -1
- package/dist/core/forest/forest.d.ts +0 -4
- package/dist/core/forest/forest.d.ts.map +1 -1
- package/dist/core/forest/forest.js +0 -4
- package/dist/core/forest/forest.js.map +1 -1
- package/dist/core/rebase/changeRebaser.d.ts +0 -6
- package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
- package/dist/core/rebase/changeRebaser.js.map +1 -1
- package/dist/core/rebase/types.d.ts +0 -2
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js.map +1 -1
- package/dist/core/schema-stored/schema.d.ts +0 -8
- package/dist/core/schema-stored/schema.d.ts.map +1 -1
- package/dist/core/schema-stored/schema.js +0 -8
- package/dist/core/schema-stored/schema.js.map +1 -1
- package/dist/core/schema-view/view.d.ts +0 -2
- package/dist/core/schema-view/view.d.ts.map +1 -1
- package/dist/core/schema-view/view.js.map +1 -1
- package/dist/core/tree/cursor.d.ts +0 -2
- package/dist/core/tree/cursor.d.ts.map +1 -1
- package/dist/core/tree/cursor.js +0 -2
- package/dist/core/tree/cursor.js.map +1 -1
- package/dist/core/tree/delta.d.ts +0 -2
- package/dist/core/tree/delta.d.ts.map +1 -1
- package/dist/core/tree/delta.js.map +1 -1
- package/dist/core/tree/types.d.ts +0 -4
- package/dist/core/tree/types.d.ts.map +1 -1
- package/dist/core/tree/types.js +0 -2
- package/dist/core/tree/types.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +0 -10
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +0 -2
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/dist/feature-libraries/sequence-field/types.d.ts +0 -2
- package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/jsonDomainSchema.d.ts +2 -6
- package/dist/jsonDomainSchema.d.ts.map +1 -1
- package/dist/jsonDomainSchema.js +2 -2
- package/dist/jsonDomainSchema.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +3 -1
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.d.ts +8 -12
- package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/dist/shared-tree-core/defaultResubmitMachine.js +54 -46
- package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
- package/dist/shared-tree-core/resubmitMachine.d.ts +6 -0
- package/dist/shared-tree-core/resubmitMachine.d.ts.map +1 -1
- package/dist/shared-tree-core/resubmitMachine.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +1 -0
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +16 -3
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts.map +1 -1
- package/dist/simple-tree/api/configuration.js +49 -17
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/customTree.d.ts +1 -1
- package/dist/simple-tree/api/customTree.d.ts.map +1 -1
- package/dist/simple-tree/api/customTree.js +3 -4
- package/dist/simple-tree/api/customTree.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +2 -2
- 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/jsonSchema.d.ts +32 -8
- package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/jsonSchema.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +2 -2
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +1 -1
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.js +75 -0
- package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/dist/simple-tree/api/schemaFromSimple.js +2 -0
- package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +4 -4
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/treeBeta.d.ts +1 -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.js +1 -1
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/api/typesUnsafe.d.ts +12 -0
- 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/viewSchemaToSimpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +5 -3
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +1 -1
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +2 -1
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.d.ts +5 -1
- package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.js +4 -0
- package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/dist/simple-tree/index.d.ts +3 -3
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +3 -1
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/index.d.ts +2 -1
- package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/index.js +5 -1
- package/dist/simple-tree/node-kinds/index.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.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
- 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/index.d.ts +7 -0
- package/dist/simple-tree/node-kinds/record/index.d.ts.map +1 -0
- package/dist/simple-tree/node-kinds/record/index.js +13 -0
- package/dist/simple-tree/node-kinds/record/index.js.map +1 -0
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
- package/dist/simple-tree/node-kinds/record/recordNode.js +234 -0
- package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -0
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.js +30 -0
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
- package/dist/simple-tree/simpleSchema.d.ts +16 -1
- 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.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +4 -2
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +56 -32
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/dist/tableSchema.d.ts +7 -2
- package/dist/tableSchema.d.ts.map +1 -1
- package/dist/tableSchema.js +21 -7
- package/dist/tableSchema.js.map +1 -1
- package/dist/util/brandedMap.d.ts +0 -2
- package/dist/util/brandedMap.d.ts.map +1 -1
- package/dist/util/brandedMap.js.map +1 -1
- package/docs/main/compatibility.md +15 -1
- package/lib/alpha.d.ts +9 -0
- package/lib/core/forest/editableForest.d.ts +0 -2
- package/lib/core/forest/editableForest.d.ts.map +1 -1
- package/lib/core/forest/editableForest.js.map +1 -1
- package/lib/core/forest/forest.d.ts +0 -4
- package/lib/core/forest/forest.d.ts.map +1 -1
- package/lib/core/forest/forest.js +0 -4
- package/lib/core/forest/forest.js.map +1 -1
- package/lib/core/rebase/changeRebaser.d.ts +0 -6
- package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
- package/lib/core/rebase/changeRebaser.js.map +1 -1
- package/lib/core/rebase/types.d.ts +0 -2
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js.map +1 -1
- package/lib/core/schema-stored/schema.d.ts +0 -8
- package/lib/core/schema-stored/schema.d.ts.map +1 -1
- package/lib/core/schema-stored/schema.js +0 -8
- package/lib/core/schema-stored/schema.js.map +1 -1
- package/lib/core/schema-view/view.d.ts +0 -2
- package/lib/core/schema-view/view.d.ts.map +1 -1
- package/lib/core/schema-view/view.js.map +1 -1
- package/lib/core/tree/cursor.d.ts +0 -2
- package/lib/core/tree/cursor.d.ts.map +1 -1
- package/lib/core/tree/cursor.js +0 -2
- package/lib/core/tree/cursor.js.map +1 -1
- package/lib/core/tree/delta.d.ts +0 -2
- package/lib/core/tree/delta.d.ts.map +1 -1
- package/lib/core/tree/delta.js.map +1 -1
- package/lib/core/tree/types.d.ts +0 -4
- package/lib/core/tree/types.d.ts.map +1 -1
- package/lib/core/tree/types.js +0 -2
- package/lib/core/tree/types.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +0 -4
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +0 -10
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +0 -2
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +0 -2
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js +0 -2
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +0 -10
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +0 -2
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +0 -6
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +0 -12
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/lib/feature-libraries/sequence-field/types.d.ts +0 -2
- package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/types.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/jsonDomainSchema.d.ts +2 -6
- package/lib/jsonDomainSchema.d.ts.map +1 -1
- package/lib/jsonDomainSchema.js +3 -3
- package/lib/jsonDomainSchema.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +3 -1
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree-core/defaultResubmitMachine.d.ts +8 -12
- package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
- package/lib/shared-tree-core/defaultResubmitMachine.js +55 -47
- package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
- package/lib/shared-tree-core/resubmitMachine.d.ts +6 -0
- package/lib/shared-tree-core/resubmitMachine.d.ts.map +1 -1
- package/lib/shared-tree-core/resubmitMachine.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +1 -0
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +16 -3
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- package/lib/simple-tree/api/configuration.js +51 -19
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/customTree.d.ts +1 -1
- package/lib/simple-tree/api/customTree.d.ts.map +1 -1
- package/lib/simple-tree/api/customTree.js +2 -3
- package/lib/simple-tree/api/customTree.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +2 -2
- 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/jsonSchema.d.ts +32 -8
- package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/jsonSchema.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +2 -2
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +1 -1
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +97 -3
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.js +77 -2
- package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +5 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/lib/simple-tree/api/schemaFromSimple.js +2 -0
- package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +5 -5
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/treeBeta.d.ts +1 -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.js +2 -2
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/typesUnsafe.d.ts +12 -0
- 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/viewSchemaToSimpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +6 -4
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +1 -1
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +1 -1
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.d.ts +5 -1
- package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.js +4 -0
- package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/lib/simple-tree/index.d.ts +3 -3
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +1 -1
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/index.d.ts +2 -1
- package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/index.js +1 -0
- package/lib/simple-tree/node-kinds/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
- package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/index.js +1 -1
- package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +5 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/index.d.ts +7 -0
- package/lib/simple-tree/node-kinds/record/index.d.ts.map +1 -0
- package/lib/simple-tree/node-kinds/record/index.js +7 -0
- package/lib/simple-tree/node-kinds/record/index.js.map +1 -0
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts +39 -0
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -0
- package/lib/simple-tree/node-kinds/record/recordNode.js +232 -0
- package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -0
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +70 -0
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -0
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.js +26 -0
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -0
- package/lib/simple-tree/simpleSchema.d.ts +16 -1
- 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.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +4 -2
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +58 -34
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/lib/tableSchema.d.ts +7 -2
- package/lib/tableSchema.d.ts.map +1 -1
- package/lib/tableSchema.js +22 -8
- package/lib/tableSchema.js.map +1 -1
- package/lib/util/brandedMap.d.ts +0 -2
- package/lib/util/brandedMap.d.ts.map +1 -1
- package/lib/util/brandedMap.js.map +1 -1
- package/package.json +34 -22
- package/src/core/forest/editableForest.ts +0 -2
- package/src/core/forest/forest.ts +0 -4
- package/src/core/rebase/changeRebaser.ts +0 -6
- package/src/core/rebase/types.ts +0 -2
- package/src/core/schema-stored/schema.ts +0 -8
- package/src/core/schema-view/view.ts +0 -2
- package/src/core/tree/cursor.ts +0 -2
- package/src/core/tree/delta.ts +0 -2
- package/src/core/tree/types.ts +0 -4
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +0 -4
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +0 -10
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -2
- package/src/feature-libraries/modular-schema/crossFieldQueries.ts +0 -2
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +0 -10
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +0 -8
- package/src/feature-libraries/modular-schema/modularChangeTypes.ts +0 -12
- package/src/feature-libraries/sequence-field/types.ts +0 -2
- package/src/index.ts +9 -0
- package/src/jsonDomainSchema.ts +3 -3
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/treeAlpha.ts +3 -1
- package/src/shared-tree-core/defaultResubmitMachine.ts +99 -52
- package/src/shared-tree-core/resubmitMachine.ts +7 -0
- package/src/shared-tree-core/sharedTreeCore.ts +18 -6
- package/src/simple-tree/api/configuration.ts +73 -19
- package/src/simple-tree/api/customTree.ts +3 -3
- package/src/simple-tree/api/index.ts +3 -0
- package/src/simple-tree/api/jsonSchema.ts +35 -8
- package/src/simple-tree/api/schemaFactory.ts +5 -13
- package/src/simple-tree/api/schemaFactoryAlpha.ts +268 -1
- package/src/simple-tree/api/schemaFactoryRecursive.ts +5 -1
- package/src/simple-tree/api/schemaFromSimple.ts +6 -0
- package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +16 -7
- package/src/simple-tree/api/treeBeta.ts +2 -2
- package/src/simple-tree/api/treeNodeApi.ts +2 -2
- package/src/simple-tree/api/typesUnsafe.ts +15 -0
- package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +14 -6
- package/src/simple-tree/core/index.ts +1 -0
- package/src/simple-tree/core/treeNodeSchema.ts +8 -4
- package/src/simple-tree/index.ts +11 -0
- package/src/simple-tree/node-kinds/index.ts +11 -0
- package/src/simple-tree/node-kinds/object/index.ts +5 -1
- package/src/simple-tree/node-kinds/object/objectNode.ts +3 -2
- package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +6 -3
- package/src/simple-tree/node-kinds/record/index.ts +14 -0
- package/src/simple-tree/node-kinds/record/recordNode.ts +410 -0
- package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +136 -0
- package/src/simple-tree/simpleSchema.ts +19 -1
- package/src/simple-tree/toStoredSchema.ts +4 -2
- package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +83 -40
- package/src/tableSchema.ts +27 -8
- package/src/util/brandedMap.ts +0 -2
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
assert,
|
|
8
|
+
debugAssert,
|
|
9
|
+
fail,
|
|
10
|
+
oob,
|
|
11
|
+
unreachableCase,
|
|
12
|
+
} from "@fluidframework/core-utils/internal";
|
|
7
13
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
8
14
|
|
|
9
15
|
import {
|
|
@@ -17,8 +23,16 @@ import {
|
|
|
17
23
|
} from "../schemaTypes.js";
|
|
18
24
|
import { NodeKind, type TreeNodeSchema } from "../core/index.js";
|
|
19
25
|
import { toStoredSchema } from "../toStoredSchema.js";
|
|
20
|
-
import {
|
|
21
|
-
|
|
26
|
+
import {
|
|
27
|
+
isArrayNodeSchema,
|
|
28
|
+
isMapNodeSchema,
|
|
29
|
+
isObjectNodeSchema,
|
|
30
|
+
isRecordNodeSchema,
|
|
31
|
+
type ArrayNodeSchema,
|
|
32
|
+
type MapNodeSchema,
|
|
33
|
+
type ObjectNodeSchema,
|
|
34
|
+
type RecordNodeSchema,
|
|
35
|
+
} from "../node-kinds/index.js";
|
|
22
36
|
import { getOrCreate } from "../../util/index.js";
|
|
23
37
|
import type { MakeNominal } from "../../util/index.js";
|
|
24
38
|
import { walkFieldSchema } from "../walkFieldSchema.js";
|
|
@@ -293,10 +307,11 @@ export function checkUnion(
|
|
|
293
307
|
ambiguityErrors: string[],
|
|
294
308
|
): void {
|
|
295
309
|
const checked: Set<TreeNodeSchema> = new Set();
|
|
296
|
-
const maps:
|
|
297
|
-
const arrays:
|
|
298
|
-
|
|
310
|
+
const maps: MapNodeSchema[] = [];
|
|
311
|
+
const arrays: ArrayNodeSchema[] = [];
|
|
312
|
+
const records: RecordNodeSchema[] = [];
|
|
299
313
|
const objects: ObjectNodeSchema[] = [];
|
|
314
|
+
|
|
300
315
|
// Map from key to schema using that key
|
|
301
316
|
const allObjectKeys: Map<string, Set<TreeNodeSchema>> = new Map();
|
|
302
317
|
|
|
@@ -306,18 +321,37 @@ export function checkUnion(
|
|
|
306
321
|
}
|
|
307
322
|
checked.add(schema);
|
|
308
323
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
324
|
+
switch (schema.kind) {
|
|
325
|
+
case NodeKind.Leaf: {
|
|
326
|
+
// nothing to do
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
case NodeKind.Object: {
|
|
330
|
+
assert(isObjectNodeSchema(schema), 0xbde /* Expected object schema. */);
|
|
331
|
+
objects.push(schema);
|
|
332
|
+
for (const key of schema.fields.keys()) {
|
|
333
|
+
getOrCreate(allObjectKeys, key, () => new Set()).add(schema);
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case NodeKind.Array: {
|
|
338
|
+
assert(isArrayNodeSchema(schema), 0xbdf /* Expected array schema. */);
|
|
339
|
+
arrays.push(schema);
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
case NodeKind.Map: {
|
|
343
|
+
assert(isMapNodeSchema(schema), 0xbe0 /* Expected map schema. */);
|
|
344
|
+
maps.push(schema);
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
case NodeKind.Record: {
|
|
348
|
+
assert(isRecordNodeSchema(schema), 0xbe1 /* Expected record schema. */);
|
|
349
|
+
records.push(schema);
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
default: {
|
|
353
|
+
unreachableCase(schema.kind);
|
|
315
354
|
}
|
|
316
|
-
} else if (schema.kind === NodeKind.Array) {
|
|
317
|
-
arrays.push(schema);
|
|
318
|
-
} else {
|
|
319
|
-
assert(schema.kind === NodeKind.Map, 0x9e7 /* invalid schema */);
|
|
320
|
-
maps.push(schema);
|
|
321
355
|
}
|
|
322
356
|
}
|
|
323
357
|
|
|
@@ -338,15 +372,35 @@ export function checkUnion(
|
|
|
338
372
|
);
|
|
339
373
|
}
|
|
340
374
|
|
|
375
|
+
if (records.length > 1) {
|
|
376
|
+
ambiguityErrors.push(
|
|
377
|
+
`More than one kind of record allowed within union (${formatTypes(records)}). This would require type disambiguation which is not supported by records during import or export.`,
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
341
381
|
if (maps.length > 0 && arrays.length > 0) {
|
|
342
382
|
ambiguityErrors.push(
|
|
343
383
|
`Both a map and an array allowed within union (${formatTypes([...arrays, ...maps])}). Both can be implicitly constructed from iterables like arrays, which are ambiguous when the array is empty.`,
|
|
344
384
|
);
|
|
345
385
|
}
|
|
346
386
|
|
|
347
|
-
|
|
387
|
+
const nodeKindListEntries = [];
|
|
388
|
+
if (objects.length > 0) {
|
|
389
|
+
nodeKindListEntries.push("objects");
|
|
390
|
+
}
|
|
391
|
+
if (maps.length > 0) {
|
|
392
|
+
nodeKindListEntries.push("maps");
|
|
393
|
+
}
|
|
394
|
+
if (records.length > 0) {
|
|
395
|
+
nodeKindListEntries.push("records");
|
|
396
|
+
}
|
|
397
|
+
if (nodeKindListEntries.length > 1) {
|
|
398
|
+
const nodeKindListString =
|
|
399
|
+
nodeKindListEntries.length === 2
|
|
400
|
+
? `${nodeKindListEntries[0] ?? oob()} and ${nodeKindListEntries[1] ?? oob()}`
|
|
401
|
+
: `${nodeKindListEntries.slice(0, -1).join(", ")}, and ${nodeKindListEntries[nodeKindListEntries.length - 1]}`;
|
|
348
402
|
ambiguityErrors.push(
|
|
349
|
-
`
|
|
403
|
+
`A combination of ${nodeKindListString} is allowed within union (${formatTypes([...objects, ...maps, ...records])}). These can be constructed from objects and can be ambiguous.`,
|
|
350
404
|
);
|
|
351
405
|
}
|
|
352
406
|
|
|
@@ -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 {
|
|
25
|
+
import type { TreeNodeSchema } from "../core/index.js";
|
|
26
26
|
import {
|
|
27
27
|
booleanSchema,
|
|
28
28
|
handleSchema,
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
numberSchema,
|
|
31
31
|
stringSchema,
|
|
32
32
|
} from "../leafNodeSchema.js";
|
|
33
|
-
import { isObjectNodeSchema } from "../node-kinds/index.js";
|
|
33
|
+
import { isArrayNodeSchema, isObjectNodeSchema } from "../node-kinds/index.js";
|
|
34
34
|
import type { TreeLeafValue } from "../schemaTypes.js";
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -106,7 +106,7 @@ export function customFromCursor<TChild>(
|
|
|
106
106
|
return reader.value;
|
|
107
107
|
default: {
|
|
108
108
|
assert(reader.value === undefined, 0xa54 /* out of schema: unexpected value */);
|
|
109
|
-
if (nodeSchema
|
|
109
|
+
if (isArrayNodeSchema(nodeSchema)) {
|
|
110
110
|
const fields = inCursorField(reader, EmptyKey, () =>
|
|
111
111
|
mapCursorField(reader, () => childHandler(reader, options, schema)),
|
|
112
112
|
);
|
|
@@ -67,6 +67,8 @@ export {
|
|
|
67
67
|
type JsonTreeSchema,
|
|
68
68
|
type JsonFieldSchema,
|
|
69
69
|
type JsonLeafSchemaType,
|
|
70
|
+
type JsonRecordNodeSchema,
|
|
71
|
+
type JsonStringKeyPatternProperties,
|
|
70
72
|
} from "./jsonSchema.js";
|
|
71
73
|
export type { TreeSchemaEncodingOptions } from "./getJsonSchema.js";
|
|
72
74
|
export { getJsonSchema } from "./getJsonSchema.js";
|
|
@@ -78,6 +80,7 @@ export type {
|
|
|
78
80
|
ArrayNodeCustomizableSchemaUnsafe,
|
|
79
81
|
MapNodeCustomizableSchemaUnsafe,
|
|
80
82
|
System_Unsafe,
|
|
83
|
+
TreeRecordNodeUnsafe,
|
|
81
84
|
} from "./typesUnsafe.js";
|
|
82
85
|
|
|
83
86
|
export {
|
|
@@ -116,6 +116,22 @@ export interface JsonArrayNodeSchema extends JsonNodeSchemaBase<NodeKind.Array,
|
|
|
116
116
|
readonly items: JsonFieldSchema;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
/**
|
|
120
|
+
* Types allowed in map / record nodes.
|
|
121
|
+
*
|
|
122
|
+
* @see {@link https://json-schema.org/draft/2020-12/json-schema-core#name-patternproperties}.
|
|
123
|
+
*
|
|
124
|
+
* @sealed
|
|
125
|
+
* @alpha
|
|
126
|
+
*/
|
|
127
|
+
export interface JsonStringKeyPatternProperties {
|
|
128
|
+
/**
|
|
129
|
+
* This format allows for any string key that can appear in tree schema in a way that is JSON schema compatible,
|
|
130
|
+
* but restricts the value to the specified allowed types of the value to only those specified.
|
|
131
|
+
*/
|
|
132
|
+
"^.*$": JsonFieldSchema;
|
|
133
|
+
}
|
|
134
|
+
|
|
119
135
|
/**
|
|
120
136
|
* JSON Schema for a map node.
|
|
121
137
|
*
|
|
@@ -131,13 +147,23 @@ export interface JsonMapNodeSchema extends JsonNodeSchemaBase<NodeKind.Map, "obj
|
|
|
131
147
|
* Used to control the types of properties that can appear in the "object" representation of the map.
|
|
132
148
|
* @see {@link https://json-schema.org/draft/2020-12/json-schema-core#name-patternproperties}.
|
|
133
149
|
*/
|
|
134
|
-
readonly patternProperties:
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
150
|
+
readonly patternProperties: JsonStringKeyPatternProperties;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* JSON Schema for a record node.
|
|
155
|
+
*
|
|
156
|
+
* @see {@link https://json-schema.org/draft/2020-12/json-schema-core#name-instance-data-model}.
|
|
157
|
+
*
|
|
158
|
+
* @sealed
|
|
159
|
+
* @alpha
|
|
160
|
+
*/
|
|
161
|
+
export interface JsonRecordNodeSchema extends JsonNodeSchemaBase<NodeKind.Record, "object"> {
|
|
162
|
+
/**
|
|
163
|
+
* Used to control the types of properties that can appear in the "object" representation of the record.
|
|
164
|
+
* @see {@link https://json-schema.org/draft/2020-12/json-schema-core#name-patternproperties}.
|
|
165
|
+
*/
|
|
166
|
+
readonly patternProperties: JsonStringKeyPatternProperties;
|
|
141
167
|
}
|
|
142
168
|
|
|
143
169
|
/**
|
|
@@ -182,7 +208,8 @@ export type JsonNodeSchema =
|
|
|
182
208
|
| JsonLeafNodeSchema
|
|
183
209
|
| JsonMapNodeSchema
|
|
184
210
|
| JsonArrayNodeSchema
|
|
185
|
-
| JsonObjectNodeSchema
|
|
211
|
+
| JsonObjectNodeSchema
|
|
212
|
+
| JsonRecordNodeSchema;
|
|
186
213
|
|
|
187
214
|
/**
|
|
188
215
|
*{@link https://json-schema.org/draft/2020-12/json-schema-core | JSON Schema} representation of a {@link FieldSchema}.
|
|
@@ -776,16 +776,8 @@ export class SchemaFactory<
|
|
|
776
776
|
if (allowedTypes === undefined) {
|
|
777
777
|
const types = nameOrAllowedTypes as (T & TreeNodeSchema) | readonly TreeNodeSchema[];
|
|
778
778
|
const fullName = structuralName("Map", types);
|
|
779
|
-
return this.getStructuralType(
|
|
780
|
-
fullName,
|
|
781
|
-
types,
|
|
782
|
-
() =>
|
|
783
|
-
this.namedMap(
|
|
784
|
-
fullName as TName,
|
|
785
|
-
nameOrAllowedTypes as T,
|
|
786
|
-
false,
|
|
787
|
-
true,
|
|
788
|
-
) as TreeNodeSchema,
|
|
779
|
+
return this.getStructuralType(fullName, types, () =>
|
|
780
|
+
this.namedMap(fullName, nameOrAllowedTypes as T, false, true),
|
|
789
781
|
) as TreeNodeSchemaBoth<
|
|
790
782
|
string,
|
|
791
783
|
NodeKind.Map,
|
|
@@ -796,7 +788,7 @@ export class SchemaFactory<
|
|
|
796
788
|
undefined
|
|
797
789
|
>;
|
|
798
790
|
}
|
|
799
|
-
// To actually have type safety, assign to the type this method should return before implicitly
|
|
791
|
+
// To actually have type safety, assign to the type this method should return before implicitly up-casting when returning.
|
|
800
792
|
const out: TreeNodeSchemaBoth<
|
|
801
793
|
string,
|
|
802
794
|
NodeKind.Map,
|
|
@@ -895,7 +887,7 @@ export class SchemaFactory<
|
|
|
895
887
|
* ```
|
|
896
888
|
* @privateRemarks
|
|
897
889
|
* The name produced at the type level here is not as specific as it could be, however doing type level sorting and escaping is a real mess.
|
|
898
|
-
* There are cases where not having this full type provided will be less than ideal since TypeScript's structural types.
|
|
890
|
+
* There are cases where not having this full type provided will be less than ideal, since TypeScript's structural types will allow assignment between runtime incompatible types at compile time.
|
|
899
891
|
* For example attempts to narrow unions of structural arrays by name won't work.
|
|
900
892
|
* Planned future changes to move to a class based schema system as well as factor function based node construction should mostly avoid these issues,
|
|
901
893
|
* though there may still be some problematic cases even after that work is done.
|
|
@@ -997,7 +989,7 @@ export class SchemaFactory<
|
|
|
997
989
|
* @returns The structural {@link TreeNodeSchema} associated with the given name and types.
|
|
998
990
|
* @throws `UsageError` if a schema structurally named schema with the same name is cached in `structuralTypes` but had different input types.
|
|
999
991
|
*/
|
|
1000
|
-
|
|
992
|
+
protected getStructuralType(
|
|
1001
993
|
fullName: string,
|
|
1002
994
|
types: TreeNodeSchema | readonly TreeNodeSchema[],
|
|
1003
995
|
builder: () => TreeNodeSchema,
|
|
@@ -10,11 +10,16 @@ import {
|
|
|
10
10
|
mapSchema,
|
|
11
11
|
type ObjectNodeSchema,
|
|
12
12
|
objectSchema,
|
|
13
|
+
type RecordNodeCustomizableSchema,
|
|
14
|
+
type RecordNodeInsertableData,
|
|
15
|
+
recordSchema,
|
|
16
|
+
type TreeRecordNode,
|
|
13
17
|
} from "../node-kinds/index.js";
|
|
14
18
|
import {
|
|
15
19
|
defaultSchemaFactoryObjectOptions,
|
|
16
20
|
SchemaFactory,
|
|
17
21
|
schemaStatics,
|
|
22
|
+
structuralName,
|
|
18
23
|
type SchemaFactoryObjectOptions,
|
|
19
24
|
type ScopedSchemaName,
|
|
20
25
|
} from "./schemaFactory.js";
|
|
@@ -26,11 +31,19 @@ import type {
|
|
|
26
31
|
NodeSchemaOptionsAlpha,
|
|
27
32
|
} from "../schemaTypes.js";
|
|
28
33
|
import type { RestrictiveStringRecord } from "../../util/index.js";
|
|
29
|
-
import type {
|
|
34
|
+
import type {
|
|
35
|
+
NodeKind,
|
|
36
|
+
TreeNodeSchema,
|
|
37
|
+
TreeNodeSchemaBoth,
|
|
38
|
+
TreeNodeSchemaClass,
|
|
39
|
+
TreeNodeSchemaNonClass,
|
|
40
|
+
WithType,
|
|
41
|
+
} from "../core/index.js";
|
|
30
42
|
import type {
|
|
31
43
|
ArrayNodeCustomizableSchemaUnsafe,
|
|
32
44
|
MapNodeCustomizableSchemaUnsafe,
|
|
33
45
|
System_Unsafe,
|
|
46
|
+
TreeRecordNodeUnsafe,
|
|
34
47
|
} from "./typesUnsafe.js";
|
|
35
48
|
import type { SimpleObjectNodeSchema } from "../simpleSchema.js";
|
|
36
49
|
|
|
@@ -307,6 +320,260 @@ export class SchemaFactoryAlpha<
|
|
|
307
320
|
>;
|
|
308
321
|
}
|
|
309
322
|
|
|
323
|
+
/**
|
|
324
|
+
* Define a structurally typed {@link TreeNodeSchema} for a {@link (TreeRecordNode:interface)}.
|
|
325
|
+
*
|
|
326
|
+
* @param allowedTypes - The types that may appear in the record.
|
|
327
|
+
*
|
|
328
|
+
* @remarks
|
|
329
|
+
* The identifier for this record is defined as a function of the provided types.
|
|
330
|
+
* It is still scoped to this `SchemaFactory`, but multiple calls with the same arguments will return the same
|
|
331
|
+
* schema object, providing somewhat structural typing.
|
|
332
|
+
* This does not support recursive types.
|
|
333
|
+
*
|
|
334
|
+
* If using these structurally named records, other types in this schema builder should avoid names of the form `Record<${string}>`.
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* The returned schema should be used as a schema directly:
|
|
338
|
+
* ```typescript
|
|
339
|
+
* const MyRecord = factory.record(factory.number);
|
|
340
|
+
* type MyRecord = NodeFromSchema<typeof Record>;
|
|
341
|
+
* ```
|
|
342
|
+
* Or inline:
|
|
343
|
+
* ```typescript
|
|
344
|
+
* factory.object("Foo", { myRecord: factory.record(factory.number) });
|
|
345
|
+
* ```
|
|
346
|
+
*
|
|
347
|
+
* @privateRemarks
|
|
348
|
+
* The name produced at the type-level here is not as specific as it could be; however, doing type-level sorting and escaping is a real mess.
|
|
349
|
+
* There are cases where not having this full type provided will be less than ideal, since TypeScript's structural types will allow assignment between runtime incompatible types at compile time.
|
|
350
|
+
* For example, attempts to narrow unions of structural records by name won't work.
|
|
351
|
+
* Planned future changes to move to a class based schema system as well as factor function based node construction should mostly avoid these issues,
|
|
352
|
+
* though there may still be some problematic cases even after that work is done.
|
|
353
|
+
*
|
|
354
|
+
* The return value is a class, but its type is intentionally not specific enough to indicate it is a class.
|
|
355
|
+
* This prevents callers of this from sub-classing it, which is unlikely to work well (due to the ease of accidentally giving two different calls to this different subclasses)
|
|
356
|
+
* when working with structural typing.
|
|
357
|
+
*
|
|
358
|
+
* {@label STRUCTURAL}
|
|
359
|
+
*/
|
|
360
|
+
public record<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(
|
|
361
|
+
allowedTypes: T,
|
|
362
|
+
): TreeNodeSchemaNonClass<
|
|
363
|
+
/* Name */ ScopedSchemaName<TScope, `Record<${string}>`>,
|
|
364
|
+
/* Kind */ NodeKind.Record,
|
|
365
|
+
/* TNode */ TreeRecordNode<T> &
|
|
366
|
+
WithType<ScopedSchemaName<TScope, `Record<${string}>`>, NodeKind.Record>,
|
|
367
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
368
|
+
/* ImplicitlyConstructable */ true,
|
|
369
|
+
/* Info */ T,
|
|
370
|
+
/* TConstructorExtra */ undefined
|
|
371
|
+
>;
|
|
372
|
+
/**
|
|
373
|
+
* Define (and add to this library) a {@link TreeNodeSchemaClass} for a {@link (TreeRecordNode:interface)}.
|
|
374
|
+
*
|
|
375
|
+
* @param name - Unique identifier for this schema within this factory's scope.
|
|
376
|
+
* @param allowedTypes - The types that may appear in the record.
|
|
377
|
+
*
|
|
378
|
+
* @remarks
|
|
379
|
+
* Like TypeScript `Record`s, record nodes have some potential pitfalls.
|
|
380
|
+
* For example: TypeScript makes assumptions about built-in keys being present (e.g. `toString`, `hasOwnProperty`, etc.).
|
|
381
|
+
* Since these are otherwise valid keys in a record, this can lead to unexpected behavior.
|
|
382
|
+
* To prevent inconsistent behavior, these built-ins are hidden by record nodes.
|
|
383
|
+
* This means that if you try to call these built-ins (e.g. `toString()`) on a record node, you will get an error.
|
|
384
|
+
*
|
|
385
|
+
* In most cases, it is probably preferable to use {@link SchemaFactory.(map:2)} instead.
|
|
386
|
+
*
|
|
387
|
+
* @example
|
|
388
|
+
* ```typescript
|
|
389
|
+
* class NamedRecord extends factory.record("name", factory.number) {}
|
|
390
|
+
* ```
|
|
391
|
+
*
|
|
392
|
+
* {@label NAMED}
|
|
393
|
+
*/
|
|
394
|
+
public record<const Name extends TName, const T extends ImplicitAllowedTypes>(
|
|
395
|
+
name: Name,
|
|
396
|
+
allowedTypes: T,
|
|
397
|
+
): TreeNodeSchemaClass<
|
|
398
|
+
/* Name */ ScopedSchemaName<TScope, Name>,
|
|
399
|
+
/* Kind */ NodeKind.Record,
|
|
400
|
+
/* TNode */ TreeRecordNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Record>,
|
|
401
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
402
|
+
/* ImplicitlyConstructable */ true,
|
|
403
|
+
/* Info */ T,
|
|
404
|
+
/* TConstructorExtra */ undefined
|
|
405
|
+
>;
|
|
406
|
+
/**
|
|
407
|
+
* {@link SchemaFactory.array} implementation.
|
|
408
|
+
*
|
|
409
|
+
* @privateRemarks
|
|
410
|
+
* This should return TreeNodeSchemaBoth: see note on "map" implementation for details.
|
|
411
|
+
*/
|
|
412
|
+
public record<const T extends ImplicitAllowedTypes>(
|
|
413
|
+
nameOrAllowedTypes: TName | ((T & TreeNodeSchema) | readonly TreeNodeSchema[]),
|
|
414
|
+
maybeAllowedTypes?: T,
|
|
415
|
+
): TreeNodeSchema<
|
|
416
|
+
/* Name */ ScopedSchemaName<TScope, string>,
|
|
417
|
+
/* Kind */ NodeKind.Record,
|
|
418
|
+
/* TNode */ TreeRecordNode<T>,
|
|
419
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
420
|
+
/* ImplicitlyConstructable */ true,
|
|
421
|
+
/* Info */ T
|
|
422
|
+
> {
|
|
423
|
+
if (maybeAllowedTypes === undefined) {
|
|
424
|
+
const types = nameOrAllowedTypes as (T & TreeNodeSchema) | readonly TreeNodeSchema[];
|
|
425
|
+
const fullName = structuralName("Record", types);
|
|
426
|
+
return this.getStructuralType(fullName, types, () =>
|
|
427
|
+
this.namedRecord(
|
|
428
|
+
fullName,
|
|
429
|
+
nameOrAllowedTypes as T,
|
|
430
|
+
/* customizable */ false,
|
|
431
|
+
/* implicitlyConstructable */ true,
|
|
432
|
+
),
|
|
433
|
+
) as TreeNodeSchemaClass<
|
|
434
|
+
/* Name */ ScopedSchemaName<TScope, string>,
|
|
435
|
+
/* Kind */ NodeKind.Record,
|
|
436
|
+
/* TNode */ TreeRecordNode<T>,
|
|
437
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
438
|
+
/* ImplicitlyConstructable */ true,
|
|
439
|
+
/* Info */ T,
|
|
440
|
+
/* TConstructorExtra */ undefined
|
|
441
|
+
>;
|
|
442
|
+
}
|
|
443
|
+
const out: TreeNodeSchemaBoth<
|
|
444
|
+
/* Name */ ScopedSchemaName<TScope, string>,
|
|
445
|
+
/* Kind */ NodeKind.Record,
|
|
446
|
+
/* TNode */ TreeRecordNode<T>,
|
|
447
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
448
|
+
/* ImplicitlyConstructable */ true,
|
|
449
|
+
/* Info */ T,
|
|
450
|
+
/* TConstructorExtra */ undefined
|
|
451
|
+
> = this.namedRecord(
|
|
452
|
+
nameOrAllowedTypes as TName,
|
|
453
|
+
maybeAllowedTypes,
|
|
454
|
+
/* customizable */ true,
|
|
455
|
+
/* implicitlyConstructable */ true,
|
|
456
|
+
);
|
|
457
|
+
return out;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Define a {@link TreeNodeSchema} for a {@link (TreeArrayNode:interface)}.
|
|
462
|
+
*
|
|
463
|
+
* @param name - Unique identifier for this schema within this factory's scope.
|
|
464
|
+
*
|
|
465
|
+
* @remarks
|
|
466
|
+
* This is not intended to be used directly, use the overload of `array` which takes a name instead.
|
|
467
|
+
* This is only public to work around a compiler limitation.
|
|
468
|
+
*/
|
|
469
|
+
private namedRecord<
|
|
470
|
+
Name extends TName | string,
|
|
471
|
+
const T extends ImplicitAllowedTypes,
|
|
472
|
+
const ImplicitlyConstructable extends boolean,
|
|
473
|
+
>(
|
|
474
|
+
name: Name,
|
|
475
|
+
allowedTypes: T,
|
|
476
|
+
customizable: boolean,
|
|
477
|
+
implicitlyConstructable: ImplicitlyConstructable,
|
|
478
|
+
): TreeNodeSchemaBoth<
|
|
479
|
+
/* Name */ ScopedSchemaName<TScope, Name>,
|
|
480
|
+
/* Kind */ NodeKind.Record,
|
|
481
|
+
/* TNode */ TreeRecordNode<T> &
|
|
482
|
+
WithType<ScopedSchemaName<TScope, string>, NodeKind.Record>,
|
|
483
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
484
|
+
/* ImplicitlyConstructable */ ImplicitlyConstructable,
|
|
485
|
+
/* Info */ T,
|
|
486
|
+
/* TConstructorExtra */ undefined
|
|
487
|
+
> {
|
|
488
|
+
const record = recordSchema({
|
|
489
|
+
identifier: this.scoped2(name),
|
|
490
|
+
info: allowedTypes,
|
|
491
|
+
customizable,
|
|
492
|
+
implicitlyConstructable,
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
return record as TreeNodeSchemaBoth<
|
|
496
|
+
/* Name */ ScopedSchemaName<TScope, Name>,
|
|
497
|
+
/* Kind */ NodeKind.Record,
|
|
498
|
+
/* TNode */ TreeRecordNode<T> &
|
|
499
|
+
WithType<ScopedSchemaName<TScope, string>, NodeKind.Record>,
|
|
500
|
+
/* TInsertable */ RecordNodeInsertableData<T>,
|
|
501
|
+
/* ImplicitlyConstructable */ ImplicitlyConstructable,
|
|
502
|
+
/* Info */ T,
|
|
503
|
+
/* TConstructorExtra */ undefined
|
|
504
|
+
>;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Define (and add to this library) a {@link TreeNodeSchemaClass} for a {@link (TreeRecordNode:interface)}.
|
|
509
|
+
*
|
|
510
|
+
* @param name - Unique identifier for this schema within this factory's scope.
|
|
511
|
+
* @param allowedTypes - The types that may appear in the record.
|
|
512
|
+
* @param options - Additional options for the schema.
|
|
513
|
+
*
|
|
514
|
+
* @example
|
|
515
|
+
* ```typescript
|
|
516
|
+
* class NamedRecord extends factory.recordAlpha("name", factory.number) {}
|
|
517
|
+
* ```
|
|
518
|
+
*/
|
|
519
|
+
public recordAlpha<
|
|
520
|
+
const Name extends TName,
|
|
521
|
+
const T extends ImplicitAnnotatedAllowedTypes,
|
|
522
|
+
const TCustomMetadata = unknown,
|
|
523
|
+
>(
|
|
524
|
+
name: Name,
|
|
525
|
+
allowedTypes: T,
|
|
526
|
+
options?: NodeSchemaOptionsAlpha<TCustomMetadata>,
|
|
527
|
+
): RecordNodeCustomizableSchema<ScopedSchemaName<TScope, Name>, T, true, TCustomMetadata> {
|
|
528
|
+
return recordSchema({
|
|
529
|
+
identifier: this.scoped2(name),
|
|
530
|
+
info: allowedTypes,
|
|
531
|
+
customizable: true,
|
|
532
|
+
implicitlyConstructable: true,
|
|
533
|
+
metadata: options?.metadata,
|
|
534
|
+
persistedMetadata: options?.persistedMetadata,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* {@link SchemaFactoryAlpha.(record:2)} except tweaked to work better for recursive types.
|
|
540
|
+
* Use with {@link ValidateRecursiveSchema} for improved type safety.
|
|
541
|
+
* @remarks
|
|
542
|
+
* This version of `SchemaFactory.record` uses the same workarounds as {@link SchemaFactory.objectRecursive}.
|
|
543
|
+
* See {@link ValidateRecursiveSchema} for additional information about using recursive schema.
|
|
544
|
+
*/
|
|
545
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
546
|
+
public recordRecursive<
|
|
547
|
+
Name extends TName,
|
|
548
|
+
const T extends System_Unsafe.ImplicitAllowedTypesUnsafe,
|
|
549
|
+
>(name: Name, allowedTypes: T) {
|
|
550
|
+
const RecordSchema = this.namedRecord(
|
|
551
|
+
name,
|
|
552
|
+
allowedTypes as T & ImplicitAllowedTypes,
|
|
553
|
+
/* customizable */ true,
|
|
554
|
+
// Setting this to true seems to work ok currently, but not for other node kinds.
|
|
555
|
+
// Supporting this could be fragile and might break other future changes, so it's being kept as false for now.
|
|
556
|
+
/* implicitlyConstructable */ false,
|
|
557
|
+
);
|
|
558
|
+
|
|
559
|
+
return RecordSchema as TreeNodeSchemaClass<
|
|
560
|
+
/* Name */ ScopedSchemaName<TScope, Name>,
|
|
561
|
+
/* Kind */ NodeKind.Record,
|
|
562
|
+
/* TNode */ TreeRecordNodeUnsafe<T> &
|
|
563
|
+
WithType<ScopedSchemaName<TScope, Name>, NodeKind.Record>,
|
|
564
|
+
/* TInsertable */ {
|
|
565
|
+
// Ideally this would be
|
|
566
|
+
// RestrictiveStringRecord<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>>,
|
|
567
|
+
// but doing so breaks recursive types.
|
|
568
|
+
// Instead we do a less nice version:
|
|
569
|
+
readonly [P in string]: System_Unsafe.InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>;
|
|
570
|
+
},
|
|
571
|
+
/* ImplicitlyConstructable */ false,
|
|
572
|
+
/* Info */ T,
|
|
573
|
+
/* TConstructorExtra */ undefined
|
|
574
|
+
>;
|
|
575
|
+
}
|
|
576
|
+
|
|
310
577
|
/**
|
|
311
578
|
* Create a {@link SchemaFactory} with a {@link SchemaFactory.scope|scope} which is a combination of this factory's scope and the provided name.
|
|
312
579
|
* @remarks
|
|
@@ -168,7 +168,7 @@ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNode
|
|
|
168
168
|
// Name: This validator places no restrictions on the name other than that it's a string (as required by TreeNodeSchemaClass).
|
|
169
169
|
string,
|
|
170
170
|
// NodeKind: These are the NodeKinds which currently can be used recursively.
|
|
171
|
-
NodeKind.Array | NodeKind.Map | NodeKind.Object,
|
|
171
|
+
NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record,
|
|
172
172
|
// TNode: The produced node API. This is pretty minimal validation: more could be added if similar to how TInsertable works below if needed.
|
|
173
173
|
TreeNode & WithType<T["identifier"], T["kind"]>,
|
|
174
174
|
// TInsertable: What can be passed to the constructor. This should be enough to catch most issues with incorrect schema.
|
|
@@ -183,6 +183,9 @@ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNode
|
|
|
183
183
|
[NodeKind.Map]: T["info"] extends ImplicitAllowedTypes
|
|
184
184
|
? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]>
|
|
185
185
|
: unknown;
|
|
186
|
+
[NodeKind.Record]: {
|
|
187
|
+
readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
|
|
188
|
+
};
|
|
186
189
|
[NodeKind.Leaf]: unknown;
|
|
187
190
|
}[T["kind"]],
|
|
188
191
|
// ImplicitlyConstructable: recursive types are currently not implicitly constructable.
|
|
@@ -192,6 +195,7 @@ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNode
|
|
|
192
195
|
[NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
|
|
193
196
|
[NodeKind.Array]: ImplicitAllowedTypes;
|
|
194
197
|
[NodeKind.Map]: ImplicitAllowedTypes;
|
|
198
|
+
[NodeKind.Record]: ImplicitAllowedTypes;
|
|
195
199
|
[NodeKind.Leaf]: unknown;
|
|
196
200
|
}[T["kind"]]
|
|
197
201
|
>;
|
|
@@ -116,6 +116,12 @@ function generateNode(
|
|
|
116
116
|
generateAllowedTypes(schema.allowedTypesIdentifiers, context),
|
|
117
117
|
{ metadata: schema.metadata },
|
|
118
118
|
);
|
|
119
|
+
case NodeKind.Record:
|
|
120
|
+
return factory.recordAlpha(
|
|
121
|
+
id,
|
|
122
|
+
generateAllowedTypes(schema.allowedTypesIdentifiers, context),
|
|
123
|
+
{ metadata: schema.metadata },
|
|
124
|
+
);
|
|
119
125
|
case NodeKind.Leaf:
|
|
120
126
|
return (
|
|
121
127
|
SchemaFactoryAlpha.leaves.find((leaf) => leaf.identifier === id) ??
|