@fluidframework/tree 2.51.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/.vscode/settings.json +0 -1
- package/CHANGELOG.md +43 -0
- package/api-report/tree.alpha.api.md +40 -30
- package/dist/alpha.d.ts +2 -1
- package/dist/codec/codec.d.ts +2 -1
- package/dist/codec/codec.d.ts.map +1 -1
- package/dist/codec/codec.js +4 -3
- package/dist/codec/codec.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/index.d.ts +1 -1
- package/dist/core/rebase/index.d.ts.map +1 -1
- package/dist/core/rebase/index.js +2 -1
- package/dist/core/rebase/index.js.map +1 -1
- package/dist/core/rebase/types.d.ts +3 -1
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js +2 -1
- package/dist/core/rebase/types.js.map +1 -1
- package/dist/core/schema-stored/schema.d.ts +1 -23
- package/dist/core/schema-stored/schema.d.ts.map +1 -1
- package/dist/core/schema-stored/schema.js +2 -2
- package/dist/core/schema-stored/schema.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +2 -3
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
- package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecCommon.js +68 -0
- package/dist/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
- package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecV1.js +55 -0
- package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
- package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecV2.js +49 -0
- package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
- package/dist/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
- package/dist/core/tree/detachedFieldIndexCodecs.js +26 -0
- package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -0
- package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
- package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
- package/dist/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +18 -13
- package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
- package/dist/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
- package/dist/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
- package/dist/core/tree/detachedFieldIndexFormatV1.js +12 -0
- package/dist/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
- package/dist/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
- package/dist/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
- package/dist/core/tree/detachedFieldIndexFormatV2.js +14 -0
- package/dist/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +21 -21
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
- package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
- package/dist/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +74 -61
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
- package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/format.js +18 -12
- package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
- package/{lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts → dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
- package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
- package/dist/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +23 -17
- package/dist/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +22 -22
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
- package/dist/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +15 -2
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultSchema.js +0 -2
- package/dist/feature-libraries/default-schema/defaultSchema.js.map +1 -1
- package/dist/feature-libraries/default-schema/index.d.ts +1 -1
- package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/index.js +2 -2
- package/dist/feature-libraries/default-schema/index.js.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
- package/dist/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.js +31 -26
- package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +1 -2
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +2 -4
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.d.ts +5 -6
- package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.js +15 -16
- package/dist/feature-libraries/modular-schema/comparison.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/modular-schema/modularChangeFormat.d.ts +9 -3
- package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +2 -3
- package/dist/feature-libraries/object-forest/objectForest.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 +6 -2
- 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/independentView.d.ts +8 -0
- package/dist/shared-tree/independentView.d.ts.map +1 -1
- package/dist/shared-tree/independentView.js +23 -11
- package/dist/shared-tree/independentView.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 +0 -1
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +9 -12
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +1 -29
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts +20 -6
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +18 -7
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +2 -1
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +32 -0
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +1 -1
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/simple-tree/api/conciseTree.d.ts +2 -2
- package/dist/simple-tree/api/conciseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/conciseTree.js +6 -6
- package/dist/simple-tree/api/conciseTree.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts +11 -2
- 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 +8 -7
- package/dist/simple-tree/api/create.d.ts.map +1 -1
- package/dist/simple-tree/api/create.js +33 -23
- package/dist/simple-tree/api/create.js.map +1 -1
- package/dist/simple-tree/api/customTree.d.ts +25 -4
- package/dist/simple-tree/api/customTree.d.ts.map +1 -1
- package/dist/simple-tree/api/customTree.js +42 -16
- package/dist/simple-tree/api/customTree.js.map +1 -1
- package/dist/simple-tree/api/discrepancies.d.ts +94 -0
- package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
- package/dist/simple-tree/api/discrepancies.js +256 -0
- package/dist/simple-tree/api/discrepancies.js.map +1 -0
- 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 +9 -7
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js +17 -117
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +16 -159
- 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 +9 -3
- package/dist/simple-tree/api/storedSchema.js.map +1 -1
- package/dist/simple-tree/api/treeBeta.d.ts +2 -2
- package/dist/simple-tree/api/treeBeta.d.ts.map +1 -1
- package/dist/simple-tree/api/treeBeta.js +16 -4
- package/dist/simple-tree/api/treeBeta.js.map +1 -1
- package/dist/simple-tree/api/verboseTree.d.ts +2 -2
- package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/verboseTree.js +15 -15
- package/dist/simple-tree/api/verboseTree.js.map +1 -1
- package/dist/simple-tree/core/allowedTypes.d.ts +43 -11
- package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/core/allowedTypes.js +51 -11
- package/dist/simple-tree/core/allowedTypes.js.map +1 -1
- package/dist/simple-tree/core/context.d.ts +13 -2
- package/dist/simple-tree/core/context.d.ts.map +1 -1
- package/dist/simple-tree/core/context.js +22 -9
- package/dist/simple-tree/core/context.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +6 -4
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +8 -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/treeNodeKernel.d.ts +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- 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 +7 -2
- package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeValid.js +19 -4
- package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
- package/dist/simple-tree/core/walkSchema.d.ts +22 -5
- package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/walkSchema.js +6 -2
- package/dist/simple-tree/core/walkSchema.js.map +1 -1
- package/dist/simple-tree/createContext.d.ts +2 -0
- package/dist/simple-tree/createContext.d.ts.map +1 -1
- package/dist/simple-tree/createContext.js +4 -2
- package/dist/simple-tree/createContext.js.map +1 -1
- package/dist/simple-tree/fieldSchema.d.ts +1 -0
- package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
- package/dist/simple-tree/fieldSchema.js +2 -1
- package/dist/simple-tree/fieldSchema.js.map +1 -1
- package/dist/simple-tree/index.d.ts +7 -7
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +13 -8
- 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 +18 -4
- package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/index.d.ts +1 -1
- package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/index.js +1 -2
- package/dist/simple-tree/node-kinds/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.js +9 -2
- package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/index.d.ts +1 -1
- package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/index.js +1 -2
- package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts +3 -8
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js +41 -44
- 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 +6 -6
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +19 -13
- 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 +38 -11
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +71 -33
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/dist/simple-tree/walkFieldSchema.d.ts +1 -0
- package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -1
- package/dist/simple-tree/walkFieldSchema.js +1 -0
- package/dist/simple-tree/walkFieldSchema.js.map +1 -1
- package/lib/alpha.d.ts +2 -1
- package/lib/codec/codec.d.ts +2 -1
- package/lib/codec/codec.d.ts.map +1 -1
- package/lib/codec/codec.js +4 -3
- package/lib/codec/codec.js.map +1 -1
- package/lib/core/index.d.ts +1 -1
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/index.js.map +1 -1
- package/lib/core/rebase/index.d.ts +1 -1
- package/lib/core/rebase/index.d.ts.map +1 -1
- package/lib/core/rebase/index.js +1 -1
- package/lib/core/rebase/index.js.map +1 -1
- package/lib/core/rebase/types.d.ts +3 -1
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js +1 -0
- package/lib/core/rebase/types.js.map +1 -1
- package/lib/core/schema-stored/schema.d.ts +1 -23
- package/lib/core/schema-stored/schema.d.ts.map +1 -1
- package/lib/core/schema-stored/schema.js +2 -2
- package/lib/core/schema-stored/schema.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +2 -3
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +17 -0
- package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecCommon.js +64 -0
- package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +11 -0
- package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecV1.js +51 -0
- package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +11 -0
- package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecV2.js +45 -0
- package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecs.d.ts +11 -0
- package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -0
- package/lib/core/tree/detachedFieldIndexCodecs.js +21 -0
- package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -0
- package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +37 -0
- package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -0
- package/lib/core/tree/{detachedFieldIndexFormat.js → detachedFieldIndexFormatCommon.js} +13 -10
- package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -0
- package/lib/core/tree/detachedFieldIndexFormatV1.d.ts +13 -0
- package/lib/core/tree/detachedFieldIndexFormatV1.d.ts.map +1 -0
- package/lib/core/tree/detachedFieldIndexFormatV1.js +9 -0
- package/lib/core/tree/detachedFieldIndexFormatV1.js.map +1 -0
- package/lib/core/tree/detachedFieldIndexFormatV2.d.ts +14 -0
- package/lib/core/tree/detachedFieldIndexFormatV2.d.ts.map +1 -0
- package/lib/core/tree/detachedFieldIndexFormatV2.js +11 -0
- package/lib/core/tree/detachedFieldIndexFormatV2.js.map +1 -0
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts +9 -9
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +19 -19
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts +4 -2
- package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js +4 -4
- package/lib/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +50 -31
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +70 -57
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/format.d.ts +20 -14
- package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/format.js +17 -11
- package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
- package/{dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts → lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts} +20 -14
- package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.d.ts.map +1 -0
- package/lib/feature-libraries/chunked-forest/codec/{nodeShape.js → nodeEncoder.js} +21 -15
- package/lib/feature-libraries/chunked-forest/codec/nodeEncoder.js.map +1 -0
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts +7 -7
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +19 -19
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js +2 -2
- package/lib/feature-libraries/chunked-forest/codec/uncompressedEncode.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +5 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +15 -2
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultSchema.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultSchema.js +0 -2
- package/lib/feature-libraries/default-schema/defaultSchema.js.map +1 -1
- package/lib/feature-libraries/default-schema/index.d.ts +1 -1
- package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/index.js +1 -1
- package/lib/feature-libraries/default-schema/index.js.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.d.ts +14 -4
- package/lib/feature-libraries/default-schema/schemaChecker.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.js +29 -24
- package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +1 -2
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +1 -2
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.d.ts +5 -6
- package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.js +14 -14
- package/lib/feature-libraries/modular-schema/comparison.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/modular-schema/modularChangeFormat.d.ts +9 -3
- package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +3 -4
- package/lib/feature-libraries/object-forest/objectForest.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 +2 -2
- 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/independentView.d.ts +8 -0
- package/lib/shared-tree/independentView.d.ts.map +1 -1
- package/lib/shared-tree/independentView.js +21 -10
- package/lib/shared-tree/independentView.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 +0 -1
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +10 -13
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +2 -30
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts +20 -6
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +19 -8
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +2 -1
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +33 -1
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +1 -1
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/simple-tree/api/conciseTree.d.ts +2 -2
- package/lib/simple-tree/api/conciseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/conciseTree.js +6 -6
- package/lib/simple-tree/api/conciseTree.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts +11 -2
- 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 +8 -7
- package/lib/simple-tree/api/create.d.ts.map +1 -1
- package/lib/simple-tree/api/create.js +35 -25
- package/lib/simple-tree/api/create.js.map +1 -1
- package/lib/simple-tree/api/customTree.d.ts +25 -4
- package/lib/simple-tree/api/customTree.d.ts.map +1 -1
- package/lib/simple-tree/api/customTree.js +43 -17
- package/lib/simple-tree/api/customTree.js.map +1 -1
- package/lib/simple-tree/api/discrepancies.d.ts +94 -0
- package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
- package/lib/simple-tree/api/discrepancies.js +251 -0
- package/lib/simple-tree/api/discrepancies.js.map +1 -0
- 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 +9 -7
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -119
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +16 -159
- 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 +12 -6
- package/lib/simple-tree/api/storedSchema.js.map +1 -1
- package/lib/simple-tree/api/treeBeta.d.ts +2 -2
- package/lib/simple-tree/api/treeBeta.d.ts.map +1 -1
- package/lib/simple-tree/api/treeBeta.js +14 -2
- package/lib/simple-tree/api/treeBeta.js.map +1 -1
- package/lib/simple-tree/api/verboseTree.d.ts +2 -2
- package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/verboseTree.js +9 -9
- package/lib/simple-tree/api/verboseTree.js.map +1 -1
- package/lib/simple-tree/core/allowedTypes.d.ts +43 -11
- package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/core/allowedTypes.js +52 -11
- package/lib/simple-tree/core/allowedTypes.js.map +1 -1
- package/lib/simple-tree/core/context.d.ts +13 -2
- package/lib/simple-tree/core/context.d.ts.map +1 -1
- package/lib/simple-tree/core/context.js +22 -9
- package/lib/simple-tree/core/context.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +6 -4
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +4 -3
- 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/treeNodeKernel.d.ts +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- 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 +7 -2
- package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeValid.js +17 -3
- package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
- package/lib/simple-tree/core/walkSchema.d.ts +22 -5
- package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/walkSchema.js +6 -2
- package/lib/simple-tree/core/walkSchema.js.map +1 -1
- package/lib/simple-tree/createContext.d.ts +2 -0
- package/lib/simple-tree/createContext.d.ts.map +1 -1
- package/lib/simple-tree/createContext.js +5 -3
- package/lib/simple-tree/createContext.js.map +1 -1
- package/lib/simple-tree/fieldSchema.d.ts +1 -0
- package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
- package/lib/simple-tree/fieldSchema.js +2 -1
- package/lib/simple-tree/fieldSchema.js.map +1 -1
- package/lib/simple-tree/index.d.ts +7 -7
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +5 -5
- 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 +21 -7
- package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/index.d.ts +1 -1
- package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/index.js +1 -1
- package/lib/simple-tree/node-kinds/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.js +12 -5
- package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/index.d.ts +1 -1
- package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/index.js +1 -1
- package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts +3 -8
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js +19 -21
- 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 +6 -6
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +21 -15
- 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 +38 -11
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +70 -34
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +2 -2
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/lib/simple-tree/walkFieldSchema.d.ts +1 -0
- package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -1
- package/lib/simple-tree/walkFieldSchema.js +1 -0
- package/lib/simple-tree/walkFieldSchema.js.map +1 -1
- package/package.json +23 -23
- package/src/codec/codec.ts +4 -3
- package/src/core/index.ts +2 -0
- package/src/core/rebase/index.ts +2 -0
- package/src/core/rebase/types.ts +4 -0
- package/src/core/schema-stored/schema.ts +2 -26
- package/src/core/tree/detachedFieldIndex.ts +4 -6
- package/src/core/tree/detachedFieldIndexCodecCommon.ts +87 -0
- package/src/core/tree/{detachedFieldIndexCodec.ts → detachedFieldIndexCodecV1.ts} +22 -68
- package/src/core/tree/detachedFieldIndexCodecV2.ts +72 -0
- package/src/core/tree/detachedFieldIndexCodecs.ts +44 -0
- package/src/core/tree/{detachedFieldIndexFormat.ts → detachedFieldIndexFormatCommon.ts} +32 -23
- package/src/core/tree/detachedFieldIndexFormatV1.ts +15 -0
- package/src/core/tree/detachedFieldIndexFormatV2.ts +17 -0
- package/src/feature-libraries/chunked-forest/codec/README.md +1 -1
- package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +25 -25
- package/src/feature-libraries/chunked-forest/codec/chunkDecodingGeneric.ts +10 -6
- package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +96 -73
- package/src/feature-libraries/chunked-forest/codec/format.ts +20 -14
- package/src/feature-libraries/chunked-forest/codec/{nodeShape.ts → nodeEncoder.ts} +23 -17
- package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +34 -34
- package/src/feature-libraries/chunked-forest/codec/uncompressedEncode.ts +5 -5
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +11 -0
- package/src/feature-libraries/default-schema/defaultSchema.ts +0 -2
- package/src/feature-libraries/default-schema/index.ts +1 -1
- package/src/feature-libraries/default-schema/schemaChecker.ts +47 -30
- package/src/feature-libraries/index.ts +1 -3
- package/src/feature-libraries/modular-schema/comparison.ts +14 -29
- 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/object-forest/objectForest.ts +10 -6
- package/src/feature-libraries/optional-field/optionalField.ts +4 -0
- package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +4 -0
- package/src/index.ts +7 -1
- package/src/jsonDomainSchema.ts +4 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/independentView.ts +45 -19
- package/src/shared-tree/schematizeTree.ts +2 -2
- package/src/shared-tree/schematizingTreeView.ts +24 -15
- package/src/shared-tree/sharedTree.ts +2 -42
- package/src/shared-tree/treeAlpha.ts +48 -22
- package/src/shared-tree/treeCheckout.ts +54 -10
- package/src/shared-tree-core/branch.ts +1 -6
- package/src/simple-tree/api/conciseTree.ts +9 -7
- package/src/simple-tree/api/configuration.ts +18 -4
- package/src/simple-tree/api/create.ts +44 -36
- package/src/simple-tree/api/customTree.ts +59 -20
- package/src/simple-tree/api/discrepancies.ts +474 -0
- package/src/simple-tree/api/index.ts +2 -3
- package/src/simple-tree/api/schemaCompatibilityTester.ts +23 -151
- package/src/simple-tree/api/schemaFactory.ts +13 -254
- 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 +18 -14
- package/src/simple-tree/api/treeBeta.ts +24 -4
- package/src/simple-tree/api/verboseTree.ts +17 -8
- package/src/simple-tree/core/allowedTypes.ts +87 -34
- package/src/simple-tree/core/context.ts +24 -22
- package/src/simple-tree/core/index.ts +11 -2
- package/src/simple-tree/core/simpleNodeSchemaBase.ts +30 -0
- package/src/simple-tree/core/toStored.ts +58 -0
- package/src/simple-tree/core/treeNodeKernel.ts +1 -1
- package/src/simple-tree/core/treeNodeSchema.ts +8 -2
- package/src/simple-tree/core/treeNodeValid.ts +23 -4
- package/src/simple-tree/core/walkSchema.ts +26 -6
- package/src/simple-tree/createContext.ts +11 -3
- package/src/simple-tree/fieldSchema.ts +3 -1
- package/src/simple-tree/index.ts +19 -13
- package/src/simple-tree/leafNodeSchema.ts +2 -1
- package/src/simple-tree/node-kinds/array/arrayNode.ts +64 -23
- package/src/simple-tree/node-kinds/index.ts +0 -1
- package/src/simple-tree/node-kinds/map/mapNode.ts +23 -2
- package/src/simple-tree/node-kinds/object/index.ts +0 -1
- package/src/simple-tree/node-kinds/object/objectNode.ts +42 -30
- package/src/simple-tree/node-kinds/record/recordNode.ts +20 -2
- package/src/simple-tree/prepareForInsertion.ts +28 -15
- package/src/simple-tree/simpleSchema.ts +6 -26
- package/src/simple-tree/toStoredSchema.ts +110 -44
- package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +6 -2
- package/src/simple-tree/walkFieldSchema.ts +1 -0
- package/dist/core/tree/detachedFieldIndexCodec.d.ts +0 -11
- package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
- package/dist/core/tree/detachedFieldIndexCodec.js +0 -100
- package/dist/core/tree/detachedFieldIndexCodec.js.map +0 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts +0 -33
- package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
- package/dist/core/tree/detachedFieldIndexFormat.js.map +0 -1
- package/dist/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
- package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
- package/dist/feature-libraries/initializeForest.d.ts +0 -18
- package/dist/feature-libraries/initializeForest.d.ts.map +0 -1
- package/dist/feature-libraries/initializeForest.js +0 -35
- package/dist/feature-libraries/initializeForest.js.map +0 -1
- package/dist/simple-tree/discrepancies.d.ts +0 -167
- package/dist/simple-tree/discrepancies.d.ts.map +0 -1
- package/dist/simple-tree/discrepancies.js +0 -382
- package/dist/simple-tree/discrepancies.js.map +0 -1
- package/lib/core/tree/detachedFieldIndexCodec.d.ts +0 -11
- package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +0 -1
- package/lib/core/tree/detachedFieldIndexCodec.js +0 -96
- package/lib/core/tree/detachedFieldIndexCodec.js.map +0 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts +0 -33
- package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +0 -1
- package/lib/core/tree/detachedFieldIndexFormat.js.map +0 -1
- package/lib/feature-libraries/chunked-forest/codec/nodeShape.d.ts.map +0 -1
- package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +0 -1
- package/lib/feature-libraries/initializeForest.d.ts +0 -18
- package/lib/feature-libraries/initializeForest.d.ts.map +0 -1
- package/lib/feature-libraries/initializeForest.js +0 -31
- package/lib/feature-libraries/initializeForest.js.map +0 -1
- package/lib/simple-tree/discrepancies.d.ts +0 -167
- package/lib/simple-tree/discrepancies.d.ts.map +0 -1
- package/lib/simple-tree/discrepancies.js +0 -376
- package/lib/simple-tree/discrepancies.js.map +0 -1
- package/src/feature-libraries/initializeForest.ts +0 -55
- package/src/simple-tree/discrepancies.ts +0 -648
|
@@ -36,7 +36,6 @@ import {
|
|
|
36
36
|
verboseFromCursor,
|
|
37
37
|
type TreeEncodingOptions,
|
|
38
38
|
type VerboseTree,
|
|
39
|
-
toStoredSchema,
|
|
40
39
|
extractPersistedSchema,
|
|
41
40
|
type TreeBranch,
|
|
42
41
|
TreeViewConfigurationAlpha,
|
|
@@ -51,6 +50,10 @@ import {
|
|
|
51
50
|
NodeKind,
|
|
52
51
|
tryGetTreeNodeForField,
|
|
53
52
|
isObjectNodeSchema,
|
|
53
|
+
isTreeNode,
|
|
54
|
+
toInitialSchema,
|
|
55
|
+
convertField,
|
|
56
|
+
toUnhydratedSchema,
|
|
54
57
|
} from "../simple-tree/index.js";
|
|
55
58
|
import { brand, extractFromOpaque, type JsonCompatible } from "../util/index.js";
|
|
56
59
|
import {
|
|
@@ -191,11 +194,19 @@ export interface TreeIdentifierUtils {
|
|
|
191
194
|
* Extensions to {@link (Tree:interface)} and {@link (TreeBeta:interface)} which are not yet stable.
|
|
192
195
|
* @remarks
|
|
193
196
|
* Use via the {@link (TreeAlpha:variable)} singleton.
|
|
197
|
+
*
|
|
198
|
+
* The unhydrated node creation APIs in this interface do not support {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}.
|
|
199
|
+
* This is because unknown optional fields still must have a schema: its just that the schema may come from the document's stored schema.
|
|
200
|
+
* Unhydrated nodes created via this interface are not associated with any document, so there is nowhere for them to get schema for unknown optional fields.
|
|
201
|
+
* Note that {@link (TreeBeta:interface).clone} can create an unhydrated node with unknown optional fields, as it uses the source node's stored schema (if any).
|
|
202
|
+
*
|
|
203
|
+
* Export APIs in this interface include {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}
|
|
204
|
+
* if they are using {@link TreeEncodingOptions.useStoredKeys | stored keys}.
|
|
205
|
+
*
|
|
194
206
|
* @privateRemarks
|
|
195
|
-
* TODO:
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* See also TreeBeta.clone with a similar issue.
|
|
207
|
+
* TODO:
|
|
208
|
+
* There should be a way to provide a source for defaulted identifiers for unhydrated node creation, either via these APIs or some way to add them to its output later.
|
|
209
|
+
* If an option were added to these APIs, it could also be used to enable unknown optional fields.
|
|
199
210
|
*
|
|
200
211
|
* @system @sealed @alpha
|
|
201
212
|
*/
|
|
@@ -219,8 +230,6 @@ export interface TreeAlpha {
|
|
|
219
230
|
* When providing a {@link TreeNodeSchemaClass}, this is the same as invoking its constructor except that an unhydrated node can also be provided.
|
|
220
231
|
* This function exists as a generalization that can be used in other cases as well,
|
|
221
232
|
* such as when `undefined` might be allowed (for an optional field), or when the type should be inferred from the data when more than one type is possible.
|
|
222
|
-
* @privateRemarks
|
|
223
|
-
* TODO: AB#43548: There should be a way to provide a source for defaulted identifiers, either via this API or some way to add them to its output later.
|
|
224
233
|
*/
|
|
225
234
|
create<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(
|
|
226
235
|
schema: UnsafeUnknownSchema extends TSchema
|
|
@@ -263,6 +272,14 @@ export interface TreeAlpha {
|
|
|
263
272
|
* Construct tree content compatible with a field defined by the provided `schema`.
|
|
264
273
|
* @param schema - The schema for what to construct. As this is an {@link ImplicitFieldSchema}, a {@link FieldSchema}, {@link TreeNodeSchema} or {@link AllowedTypes} array can be provided.
|
|
265
274
|
* @param data - The data used to construct the field content. See {@link (TreeAlpha:interface).(exportVerbose:1)}.
|
|
275
|
+
* @remarks
|
|
276
|
+
* This currently does not support input containing {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields| unknown optional fields}.
|
|
277
|
+
* @privateRemarks
|
|
278
|
+
* See TODOs in {@link TreeEncodingOptions}.
|
|
279
|
+
*
|
|
280
|
+
* TODO: clarify how this handles out of schema data.
|
|
281
|
+
* Does it robustly validate? How do you use it with schema evolution features like staged allowed types and allowUnknownOptionalFields? Which errors are deferred until insertion/hydration?
|
|
282
|
+
* Ensure whatever policy is chosen is documented, enforces, tested and applied consistently to all import code paths.
|
|
266
283
|
*/
|
|
267
284
|
importVerbose<const TSchema extends ImplicitFieldSchema>(
|
|
268
285
|
schema: TSchema,
|
|
@@ -478,20 +495,24 @@ export const TreeAlpha: TreeAlpha = {
|
|
|
478
495
|
return undefined as Unhydrated<TreeFieldFromImplicitField<TSchema>>;
|
|
479
496
|
}
|
|
480
497
|
const cursor = cursorFromVerbose(data, schemalessConfig);
|
|
481
|
-
return createFromCursor(
|
|
498
|
+
return createFromCursor(
|
|
499
|
+
schema,
|
|
500
|
+
cursor,
|
|
501
|
+
convertField(normalizeFieldSchema(schema), toUnhydratedSchema),
|
|
502
|
+
);
|
|
482
503
|
},
|
|
483
504
|
|
|
484
505
|
exportConcise,
|
|
485
506
|
|
|
486
507
|
exportVerbose(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): VerboseTree {
|
|
508
|
+
if (isTreeValue(node)) {
|
|
509
|
+
return node;
|
|
510
|
+
}
|
|
487
511
|
const config: TreeEncodingOptions = { ...options };
|
|
488
512
|
|
|
489
513
|
const cursor = borrowCursorFromTreeNodeOrValue(node);
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
tryGetSchema(node) ?? fail(0xace /* invalid input */),
|
|
493
|
-
config,
|
|
494
|
-
);
|
|
514
|
+
const kernel = getKernel(node);
|
|
515
|
+
return verboseFromCursor(cursor, kernel.context, config);
|
|
495
516
|
},
|
|
496
517
|
|
|
497
518
|
exportCompressed(
|
|
@@ -508,11 +529,18 @@ export const TreeAlpha: TreeAlpha = {
|
|
|
508
529
|
const batch: FieldBatch = [cursor];
|
|
509
530
|
// If none provided, create a compressor which will not compress anything.
|
|
510
531
|
const idCompressor = options.idCompressor ?? createIdCompressor();
|
|
532
|
+
|
|
533
|
+
// Grabbing an existing stored schema from the node is important to ensure that unknown optional fields can be preserved.
|
|
534
|
+
// Note that if the node is unhydrated, this can result in all staged allowed types being included in the schema, which might be undesired.
|
|
535
|
+
const storedSchema = isTreeNode(node)
|
|
536
|
+
? getKernel(node).context.flexContext.schema
|
|
537
|
+
: toInitialSchema(schema);
|
|
538
|
+
|
|
511
539
|
const context: FieldBatchEncodingContext = {
|
|
512
540
|
encodeType: TreeCompressionStrategy.Compressed,
|
|
513
541
|
idCompressor,
|
|
514
542
|
originatorId: idCompressor.localSessionId, // TODO: Why is this needed?
|
|
515
|
-
schema: { schema:
|
|
543
|
+
schema: { schema: storedSchema, policy: defaultSchemaPolicy },
|
|
516
544
|
};
|
|
517
545
|
const result = codec.encode(batch, context);
|
|
518
546
|
return result;
|
|
@@ -528,7 +556,8 @@ export const TreeAlpha: TreeAlpha = {
|
|
|
528
556
|
const config = new TreeViewConfigurationAlpha({ schema });
|
|
529
557
|
const content: ViewContent = {
|
|
530
558
|
// Always use a v1 schema codec for consistency.
|
|
531
|
-
|
|
559
|
+
// TODO: reevaluate how staged schema should behave in schema import/export APIs before stabilizing this.
|
|
560
|
+
schema: extractPersistedSchema(config.schema, FluidClientVersion.v2_0, () => true),
|
|
532
561
|
tree: compressedData,
|
|
533
562
|
idCompressor: options.idCompressor ?? createIdCompressor(),
|
|
534
563
|
};
|
|
@@ -701,17 +730,14 @@ function exportConcise(
|
|
|
701
730
|
node: TreeNode | TreeLeafValue | undefined,
|
|
702
731
|
options?: TreeEncodingOptions,
|
|
703
732
|
): ConciseTree | undefined {
|
|
704
|
-
if (node
|
|
705
|
-
return
|
|
733
|
+
if (!isTreeNode(node)) {
|
|
734
|
+
return node;
|
|
706
735
|
}
|
|
707
736
|
const config: TreeEncodingOptions = { ...options };
|
|
708
737
|
|
|
738
|
+
const kernel = getKernel(node);
|
|
709
739
|
const cursor = borrowCursorFromTreeNodeOrValue(node);
|
|
710
|
-
return conciseFromCursor(
|
|
711
|
-
cursor,
|
|
712
|
-
tryGetSchema(node) ?? fail(0xacd /* invalid input */),
|
|
713
|
-
config,
|
|
714
|
-
);
|
|
740
|
+
return conciseFromCursor(cursor, kernel.context, config);
|
|
715
741
|
}
|
|
716
742
|
|
|
717
743
|
/**
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { assert, unreachableCase, fail } from "@fluidframework/core-utils/internal";
|
|
7
|
-
import type { Listenable } from "@fluidframework/core-interfaces/internal";
|
|
7
|
+
import type { IFluidHandle, Listenable } from "@fluidframework/core-interfaces/internal";
|
|
8
8
|
import { createEmitter } from "@fluid-internal/client-utils";
|
|
9
9
|
import type { IIdCompressor } from "@fluidframework/id-compressor";
|
|
10
10
|
import {
|
|
@@ -42,6 +42,11 @@ import {
|
|
|
42
42
|
type RevertibleAlpha,
|
|
43
43
|
type GraphCommit,
|
|
44
44
|
isAncestor,
|
|
45
|
+
moveToDetachedField,
|
|
46
|
+
type ITreeCursor,
|
|
47
|
+
type TreeNodeSchemaIdentifier,
|
|
48
|
+
type TreeNodeStoredSchema,
|
|
49
|
+
LeafNodeStoredSchema,
|
|
45
50
|
} from "../core/index.js";
|
|
46
51
|
import {
|
|
47
52
|
type FieldBatchCodec,
|
|
@@ -68,15 +73,19 @@ import { SharedTreeChangeFamily, hasSchemaChange } from "./sharedTreeChangeFamil
|
|
|
68
73
|
import type { SharedTreeChange } from "./sharedTreeChangeTypes.js";
|
|
69
74
|
import type { ISharedTreeEditor, SharedTreeEditBuilder } from "./sharedTreeEditBuilder.js";
|
|
70
75
|
import type { IDisposable } from "@fluidframework/core-interfaces";
|
|
71
|
-
import
|
|
72
|
-
ImplicitFieldSchema,
|
|
73
|
-
ReadSchema,
|
|
74
|
-
TreeView,
|
|
75
|
-
TreeViewConfiguration,
|
|
76
|
-
UnsafeUnknownSchema,
|
|
77
|
-
ViewableTree,
|
|
78
|
-
TreeBranch,
|
|
79
|
-
TreeChangeEvents,
|
|
76
|
+
import {
|
|
77
|
+
type ImplicitFieldSchema,
|
|
78
|
+
type ReadSchema,
|
|
79
|
+
type TreeView,
|
|
80
|
+
type TreeViewConfiguration,
|
|
81
|
+
type UnsafeUnknownSchema,
|
|
82
|
+
type ViewableTree,
|
|
83
|
+
type TreeBranch,
|
|
84
|
+
type TreeChangeEvents,
|
|
85
|
+
type VerboseTree,
|
|
86
|
+
customFromCursorStored,
|
|
87
|
+
type CustomTreeValue,
|
|
88
|
+
type CustomTreeNode,
|
|
80
89
|
} from "../simple-tree/index.js";
|
|
81
90
|
import { getCheckout, SchematizingSimpleTreeView } from "./schematizingTreeView.js";
|
|
82
91
|
|
|
@@ -495,6 +504,24 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
495
504
|
this.#transaction.activeBranchEvents.on("ancestryTrimmed", this.onAncestryTrimmed);
|
|
496
505
|
}
|
|
497
506
|
|
|
507
|
+
public exportVerbose(): VerboseTree | undefined {
|
|
508
|
+
const cursor = this.forest.allocateCursor("contentSnapshot");
|
|
509
|
+
try {
|
|
510
|
+
moveToDetachedField(this.forest, cursor);
|
|
511
|
+
const length = cursor.getFieldLength();
|
|
512
|
+
if (length === 0) {
|
|
513
|
+
return undefined;
|
|
514
|
+
} else if (length === 1) {
|
|
515
|
+
cursor.enterNode(0);
|
|
516
|
+
return verboseFromCursor(cursor, this.storedSchema.nodeSchema);
|
|
517
|
+
} else {
|
|
518
|
+
fail(0xac8 /* Invalid document root length */);
|
|
519
|
+
}
|
|
520
|
+
} finally {
|
|
521
|
+
cursor.free();
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
498
525
|
private readonly onAfterChange = (event: SharedTreeBranchChange<SharedTreeChange>): void => {
|
|
499
526
|
this.editLock.lock();
|
|
500
527
|
this.#events.emit("beforeBatch", event);
|
|
@@ -1110,3 +1137,20 @@ function trackForksForDisposal(checkout: TreeCheckout): () => void {
|
|
|
1110
1137
|
disposed = true;
|
|
1111
1138
|
};
|
|
1112
1139
|
}
|
|
1140
|
+
|
|
1141
|
+
function verboseFromCursor(
|
|
1142
|
+
reader: ITreeCursor,
|
|
1143
|
+
schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>,
|
|
1144
|
+
): VerboseTree {
|
|
1145
|
+
const fields = customFromCursorStored(reader, schema, verboseFromCursor);
|
|
1146
|
+
const nodeSchema =
|
|
1147
|
+
schema.get(reader.type) ?? fail(0xac9 /* missing schema for type in cursor */);
|
|
1148
|
+
if (nodeSchema instanceof LeafNodeStoredSchema) {
|
|
1149
|
+
return fields as CustomTreeValue;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
return {
|
|
1153
|
+
type: reader.type,
|
|
1154
|
+
fields: fields as CustomTreeNode<IFluidHandle>,
|
|
1155
|
+
};
|
|
1156
|
+
}
|
|
@@ -251,12 +251,7 @@ export class SharedTreeBranch<TEditor extends ChangeFamilyEditor, TChange> {
|
|
|
251
251
|
// TODO: Pull this side effect out if/when more diverse ancestry walking helpers are available
|
|
252
252
|
if (c !== commit) {
|
|
253
253
|
const revision = this.mintRevisionTag();
|
|
254
|
-
const inverse = this.changeFamily.rebaser.
|
|
255
|
-
this.changeFamily.rebaser.invert(c, true, revision),
|
|
256
|
-
revision,
|
|
257
|
-
c.revision,
|
|
258
|
-
);
|
|
259
|
-
|
|
254
|
+
const inverse = this.changeFamily.rebaser.invert(c, true, revision);
|
|
260
255
|
inverses.push(tagRollbackInverse(inverse, revision, c.revision));
|
|
261
256
|
return false;
|
|
262
257
|
}
|
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
import type { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
7
7
|
|
|
8
|
-
import type { ITreeCursor } from "../../core/index.js";
|
|
9
|
-
import type { TreeNodeSchema, TreeLeafValue,
|
|
10
|
-
import { getUnhydratedContext } from "../createContext.js";
|
|
8
|
+
import type { ITreeCursor, TreeNodeStoredSchema } from "../../core/index.js";
|
|
9
|
+
import type { TreeNodeSchema, TreeLeafValue, Context } from "../core/index.js";
|
|
11
10
|
|
|
12
11
|
import {
|
|
13
12
|
customFromCursor,
|
|
@@ -43,7 +42,7 @@ export type ConciseTree<THandle = IFluidHandle> =
|
|
|
43
42
|
*/
|
|
44
43
|
export function conciseFromCursor(
|
|
45
44
|
reader: ITreeCursor,
|
|
46
|
-
|
|
45
|
+
context: Context,
|
|
47
46
|
options: TreeEncodingOptions,
|
|
48
47
|
): ConciseTree {
|
|
49
48
|
const config: Required<TreeEncodingOptions> = {
|
|
@@ -51,16 +50,19 @@ export function conciseFromCursor(
|
|
|
51
50
|
...options,
|
|
52
51
|
};
|
|
53
52
|
|
|
54
|
-
const
|
|
55
|
-
|
|
53
|
+
const storedSchemaMap = context.flexContext.schema.nodeSchema;
|
|
54
|
+
const schemaMap = context.schema;
|
|
55
|
+
|
|
56
|
+
return conciseFromCursorInner(reader, config, storedSchemaMap, schemaMap);
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
function conciseFromCursorInner(
|
|
59
60
|
reader: ITreeCursor,
|
|
60
61
|
options: Required<TreeEncodingOptions>,
|
|
62
|
+
storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
|
|
61
63
|
schema: ReadonlyMap<string, TreeNodeSchema>,
|
|
62
64
|
): ConciseTree {
|
|
63
|
-
return customFromCursor(reader, options, schema, conciseFromCursorInner);
|
|
65
|
+
return customFromCursor(reader, options, storedSchema, schema, conciseFromCursorInner);
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
/**
|
|
@@ -25,7 +25,11 @@ import {
|
|
|
25
25
|
evaluateLazySchema,
|
|
26
26
|
markSchemaMostDerived,
|
|
27
27
|
} from "../core/index.js";
|
|
28
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
permissiveStoredSchemaGenerationOptions,
|
|
30
|
+
restrictiveStoredSchemaGenerationOptions,
|
|
31
|
+
toStoredSchema,
|
|
32
|
+
} from "../toStoredSchema.js";
|
|
29
33
|
import {
|
|
30
34
|
isArrayNodeSchema,
|
|
31
35
|
isMapNodeSchema,
|
|
@@ -47,14 +51,20 @@ import type { SimpleNodeSchema, SimpleTreeSchema } from "../simpleSchema.js";
|
|
|
47
51
|
*/
|
|
48
52
|
export interface ITreeConfigurationOptions {
|
|
49
53
|
/**
|
|
50
|
-
* If `true`, the tree will
|
|
54
|
+
* If `true`, the tree will perform additional validation of content against its stored schema
|
|
51
55
|
* and throw an error if the new content doesn't match the expected schema.
|
|
52
56
|
*
|
|
53
57
|
* @defaultValue `false`.
|
|
54
58
|
*
|
|
55
|
-
* @remarks
|
|
59
|
+
* @remarks
|
|
60
|
+
* Currently most cases already have some schema validation, so this is mainly for additional validation which may be useful when debugging issues,
|
|
61
|
+
* working with untyped APIs, or when the small performance overhead is a non-issue.
|
|
62
|
+
*
|
|
63
|
+
* Enabling schema validation has a performance penalty when inserting new content into the tree because
|
|
56
64
|
* additional checks are done. Enable this option only in scenarios where you are ok with that operation being a
|
|
57
65
|
* bit slower.
|
|
66
|
+
*
|
|
67
|
+
* For additional validation in more cases, see {@link ForestTypeExpensiveDebug}.
|
|
58
68
|
*/
|
|
59
69
|
enableSchemaValidation?: boolean;
|
|
60
70
|
|
|
@@ -155,6 +165,9 @@ export interface ITreeViewConfiguration<
|
|
|
155
165
|
|
|
156
166
|
/**
|
|
157
167
|
* Configuration for {@link ViewableTree.viewWith}.
|
|
168
|
+
* @privateRemarks
|
|
169
|
+
* When `ImplicitAnnotatedFieldSchema` is stabilized, TSchema should be updated to use it.
|
|
170
|
+
* When doing this, the example for `staged` will need to be updated/simplified.
|
|
158
171
|
* @sealed @public
|
|
159
172
|
*/
|
|
160
173
|
export class TreeViewConfiguration<
|
|
@@ -207,7 +220,8 @@ export class TreeViewConfiguration<
|
|
|
207
220
|
|
|
208
221
|
// Eagerly perform this conversion to surface errors sooner.
|
|
209
222
|
// Includes detection of duplicate schema identifiers.
|
|
210
|
-
toStoredSchema(config.schema);
|
|
223
|
+
toStoredSchema(config.schema, restrictiveStoredSchemaGenerationOptions);
|
|
224
|
+
toStoredSchema(config.schema, permissiveStoredSchemaGenerationOptions);
|
|
211
225
|
|
|
212
226
|
const definitions = new Map<string, SimpleNodeSchema & TreeNodeSchema>();
|
|
213
227
|
|
|
@@ -4,65 +4,56 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
|
+
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
7
8
|
|
|
8
9
|
import {
|
|
9
10
|
CursorLocationType,
|
|
11
|
+
forbiddenFieldKindIdentifier,
|
|
10
12
|
mapCursorField,
|
|
11
13
|
mapCursorFields,
|
|
12
14
|
type ITreeCursorSynchronous,
|
|
13
15
|
type SchemaAndPolicy,
|
|
16
|
+
type TreeFieldStoredSchema,
|
|
14
17
|
} from "../../core/index.js";
|
|
15
18
|
import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../fieldSchema.js";
|
|
16
19
|
import {
|
|
17
20
|
type Context,
|
|
18
21
|
getOrCreateNodeFromInnerNode,
|
|
19
|
-
type NodeKind,
|
|
20
22
|
type Unhydrated,
|
|
21
23
|
UnhydratedFlexTreeNode,
|
|
22
24
|
createField,
|
|
23
25
|
} from "../core/index.js";
|
|
24
26
|
import {
|
|
25
27
|
defaultSchemaPolicy,
|
|
26
|
-
inSchemaOrThrow,
|
|
27
28
|
isFieldInSchema,
|
|
29
|
+
throwOutOfSchema,
|
|
28
30
|
} from "../../feature-libraries/index.js";
|
|
29
31
|
import { getUnhydratedContext } from "../createContext.js";
|
|
30
|
-
import { createUnknownOptionalFieldPolicy } from "../node-kinds/index.js";
|
|
31
|
-
import type { SimpleNodeSchema, SimpleNodeSchemaBase } from "../simpleSchema.js";
|
|
32
|
-
import { getStoredSchema } from "../toStoredSchema.js";
|
|
33
32
|
import { unknownTypeError } from "./customTree.js";
|
|
34
33
|
|
|
35
34
|
/**
|
|
36
35
|
* Creates an unhydrated simple-tree field from a cursor in nodes mode.
|
|
37
36
|
* @remarks
|
|
38
|
-
* Does not support defaults.
|
|
39
|
-
* Validates the field is in schema.
|
|
40
|
-
*
|
|
41
|
-
* TODO: AB#43548: How this handles unknown optional fields needs to be figured out, tested and documented.
|
|
37
|
+
* Does not support providing missing defaults values.
|
|
38
|
+
* Validates the field is in schema using `destinationSchema` the provided `contextForNewNodes` or the default unhydrated context if not provided.
|
|
42
39
|
*/
|
|
43
40
|
export function createFromCursor<const TSchema extends ImplicitFieldSchema>(
|
|
44
41
|
schema: TSchema,
|
|
45
42
|
cursor: ITreeCursorSynchronous | undefined,
|
|
43
|
+
destinationSchema: TreeFieldStoredSchema,
|
|
44
|
+
contextForNewNodes?: Context,
|
|
46
45
|
): Unhydrated<TreeFieldFromImplicitField<TSchema>> {
|
|
47
|
-
const context = getUnhydratedContext(schema);
|
|
46
|
+
const context = contextForNewNodes ?? getUnhydratedContext(schema);
|
|
47
|
+
assert(context.flexContext.isHydrated() === false, 0xbfe /* Expected unhydrated context */);
|
|
48
48
|
const mapTrees = cursor === undefined ? [] : [unhydratedFlexTreeFromCursor(context, cursor)];
|
|
49
49
|
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
const schemaValidationPolicy: SchemaAndPolicy = {
|
|
53
|
-
policy: {
|
|
54
|
-
...defaultSchemaPolicy,
|
|
55
|
-
allowUnknownOptionalFields: createUnknownOptionalFieldPolicy(schema),
|
|
56
|
-
},
|
|
50
|
+
const schemaAndPolicy: SchemaAndPolicy = {
|
|
51
|
+
policy: defaultSchemaPolicy,
|
|
57
52
|
schema: context.flexContext.schema,
|
|
58
53
|
};
|
|
59
54
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
flexSchema.rootFieldSchema,
|
|
63
|
-
schemaValidationPolicy,
|
|
64
|
-
);
|
|
65
|
-
inSchemaOrThrow(maybeError);
|
|
55
|
+
// Assuming the caller provides the correct `contextForNewNodes`, this should handle unknown optional fields.
|
|
56
|
+
isFieldInSchema(mapTrees, destinationSchema, schemaAndPolicy, throwOutOfSchema);
|
|
66
57
|
|
|
67
58
|
if (mapTrees.length === 0) {
|
|
68
59
|
return undefined as Unhydrated<TreeFieldFromImplicitField<TSchema>>;
|
|
@@ -80,27 +71,44 @@ export function createFromCursor<const TSchema extends ImplicitFieldSchema>(
|
|
|
80
71
|
/**
|
|
81
72
|
* Construct an {@link UnhydratedFlexTreeNode} from a cursor in Nodes mode.
|
|
82
73
|
* @remarks
|
|
83
|
-
* This does not validate the node is in schema.
|
|
74
|
+
* This does not fully validate the node is in schema, but does throw UsageErrors for some cases of out-of-schema content.
|
|
75
|
+
*
|
|
76
|
+
* Does not support unknown optional fields: will throw a UsageError if the field is not in schema.
|
|
77
|
+
* This cannot easily be fixed as this code requires a schema for each subtree to process, and none is available for unknown optional fields.
|
|
84
78
|
*/
|
|
85
79
|
export function unhydratedFlexTreeFromCursor(
|
|
86
80
|
context: Context,
|
|
87
81
|
cursor: ITreeCursorSynchronous,
|
|
88
82
|
): UnhydratedFlexTreeNode {
|
|
89
83
|
assert(cursor.mode === CursorLocationType.Nodes, 0xbb4 /* Expected nodes cursor */);
|
|
90
|
-
const
|
|
91
|
-
const storedSchema =
|
|
92
|
-
schema
|
|
93
|
-
|
|
84
|
+
const identifier = cursor.type;
|
|
85
|
+
const storedSchema =
|
|
86
|
+
context.flexContext.schema.nodeSchema.get(identifier) ?? unknownTypeError(identifier);
|
|
87
|
+
|
|
94
88
|
const fields = new Map(
|
|
95
|
-
mapCursorFields(cursor, () =>
|
|
96
|
-
cursor.getFieldKey()
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
89
|
+
mapCursorFields(cursor, () => {
|
|
90
|
+
const fieldSchema = storedSchema.getFieldSchema(cursor.getFieldKey());
|
|
91
|
+
if (fieldSchema.kind === forbiddenFieldKindIdentifier) {
|
|
92
|
+
// Check for unexpected fields before recursing into children:
|
|
93
|
+
// Code which hits this case is very likely to also use an unknown type in the unexpected field, which would give a more confusing error message.
|
|
94
|
+
// This case is detected here to improve error quality.
|
|
95
|
+
// Also note that if using the view schema from above to suppress this error for unknownOptionalFields, that would not provide a way to handle unknown types in those fields:
|
|
96
|
+
// they would still error, but with that more confusing message about unknown types.
|
|
97
|
+
throw new UsageError(
|
|
98
|
+
// Using JSON.stringify to handle quoting and escaping since both key and identifier can technically contain quotes themselves.
|
|
99
|
+
`Field ${JSON.stringify(cursor.getFieldKey())} is not defined in the schema ${JSON.stringify(identifier)}.`,
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return [
|
|
100
103
|
cursor.getFieldKey(),
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
createField(
|
|
105
|
+
context.flexContext,
|
|
106
|
+
fieldSchema.kind,
|
|
107
|
+
cursor.getFieldKey(),
|
|
108
|
+
mapCursorField(cursor, () => unhydratedFlexTreeFromCursor(context, cursor)),
|
|
109
|
+
),
|
|
110
|
+
];
|
|
111
|
+
}),
|
|
104
112
|
);
|
|
105
113
|
return new UnhydratedFlexTreeNode(
|
|
106
114
|
{ type: cursor.type, value: cursor.value },
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
type ITreeCursor,
|
|
20
20
|
type TreeNodeSchemaIdentifier,
|
|
21
21
|
type TreeNodeStoredSchema,
|
|
22
|
+
type TreeTypeSet,
|
|
22
23
|
} from "../../core/index.js";
|
|
23
24
|
import { FieldKinds, valueSchemaAllows } from "../../feature-libraries/index.js";
|
|
24
25
|
import { cloneWithReplacements } from "../../util/index.js";
|
|
@@ -30,7 +31,7 @@ import {
|
|
|
30
31
|
numberSchema,
|
|
31
32
|
stringSchema,
|
|
32
33
|
} from "../leafNodeSchema.js";
|
|
33
|
-
import {
|
|
34
|
+
import { isObjectNodeSchema } from "../node-kinds/index.js";
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
37
|
* Options for how to interpret or encode a tree when schema information is available.
|
|
@@ -42,7 +43,15 @@ export interface TreeEncodingOptions {
|
|
|
42
43
|
* If false, use the property keys.
|
|
43
44
|
* @remarks
|
|
44
45
|
* Has no effect on {@link NodeKind}s other than {@link NodeKind.Object}.
|
|
46
|
+
*
|
|
47
|
+
* {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields|Unknown optional field} will be omitted when using property keys.
|
|
45
48
|
* @defaultValue false.
|
|
49
|
+
* @privateRemarks
|
|
50
|
+
* TODO AB#43548:
|
|
51
|
+
* Replace this with an enum that provides three options:
|
|
52
|
+
* - `usePropertyKeys`: use property keys. Supported for import and export.
|
|
53
|
+
* - `allStoredKeys`: use stored keys, and include unknown optional fields. Supported for export only, at least for the short term.
|
|
54
|
+
* - `knownStoredKeys`: use stored keys but do not include unknown optional fields. Supported for import and export.
|
|
46
55
|
*/
|
|
47
56
|
readonly useStoredKeys?: boolean;
|
|
48
57
|
}
|
|
@@ -77,19 +86,31 @@ export type CustomTreeNode<TChild> = TChild[] | { [key: string]: TChild };
|
|
|
77
86
|
|
|
78
87
|
/**
|
|
79
88
|
* Builds an {@link CustomTree} from a cursor in Nodes mode.
|
|
89
|
+
*
|
|
90
|
+
* @param reader - The cursor to read from.
|
|
91
|
+
* @param options - Options for how to interpret the tree.
|
|
92
|
+
* @param storedSchema - Schema which the cursor must comply with.
|
|
93
|
+
* Must be be possible to map to a view schema (mainly that sequences can only occur in the special ArrayNode pattern).
|
|
94
|
+
* Must include even unknown optional fields.
|
|
95
|
+
* @param schema - View schema used to derive the property keys for fields when `options` selects them via {@link TreeEncodingOptions.useStoredKeys}.
|
|
96
|
+
* @param childHandler - Function to handle children of the cursor.
|
|
97
|
+
*
|
|
98
|
+
* @remarks
|
|
99
|
+
* This can handle unknown optional fields only because they are included in the `storedSchema` and `schema` is only needed when using property keys, which also skips unknown optional fields.
|
|
80
100
|
*/
|
|
81
101
|
export function customFromCursor<TChild>(
|
|
82
102
|
reader: ITreeCursor,
|
|
83
103
|
options: Required<TreeEncodingOptions>,
|
|
104
|
+
storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
|
|
84
105
|
schema: ReadonlyMap<string, TreeNodeSchema>,
|
|
85
106
|
childHandler: (
|
|
86
107
|
reader: ITreeCursor,
|
|
87
108
|
options: Required<TreeEncodingOptions>,
|
|
109
|
+
storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
|
|
88
110
|
schema: ReadonlyMap<string, TreeNodeSchema>,
|
|
89
111
|
) => TChild,
|
|
90
112
|
): CustomTree<TChild> {
|
|
91
113
|
const type = reader.type;
|
|
92
|
-
const nodeSchema = schema.get(type) ?? fail(0xb2e /* missing schema for type in cursor */);
|
|
93
114
|
|
|
94
115
|
switch (type) {
|
|
95
116
|
case numberSchema.identifier:
|
|
@@ -105,28 +126,44 @@ export function customFromCursor<TChild>(
|
|
|
105
126
|
return reader.value;
|
|
106
127
|
default: {
|
|
107
128
|
assert(reader.value === undefined, 0xa54 /* out of schema: unexpected value */);
|
|
108
|
-
|
|
129
|
+
const nodeSchema =
|
|
130
|
+
storedSchema.get(type) ?? fail(0xb2e /* missing schema for type in cursor */);
|
|
131
|
+
const arrayTypes = tryStoredSchemaAsArray(nodeSchema);
|
|
132
|
+
|
|
133
|
+
if (arrayTypes !== undefined) {
|
|
109
134
|
const fields = inCursorField(reader, EmptyKey, () =>
|
|
110
|
-
mapCursorField(reader, () => childHandler(reader, options, schema)),
|
|
135
|
+
mapCursorField(reader, () => childHandler(reader, options, storedSchema, schema)),
|
|
111
136
|
);
|
|
112
137
|
return fields;
|
|
113
138
|
} else {
|
|
114
139
|
const fields: Record<string, TChild> = {};
|
|
115
140
|
forEachField(reader, () => {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
141
|
+
assert(reader.getFieldLength() === 1, 0xa19 /* invalid children number */);
|
|
142
|
+
const storedKey = reader.getFieldKey();
|
|
143
|
+
let key: string;
|
|
144
|
+
if (!options.useStoredKeys) {
|
|
145
|
+
const viewSchema =
|
|
146
|
+
schema.get(type) ?? fail(0xbff /* missing schema for type in cursor */);
|
|
147
|
+
if (isObjectNodeSchema(viewSchema)) {
|
|
148
|
+
const propertyKey = viewSchema.storedKeyToPropertyKey.get(storedKey);
|
|
149
|
+
if (propertyKey === undefined) {
|
|
150
|
+
assert(
|
|
151
|
+
viewSchema.allowUnknownOptionalFields,
|
|
152
|
+
0xc00 /* found unknown field where not allowed */,
|
|
153
|
+
);
|
|
154
|
+
// Skip unknown optional fields when using property keys.
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
key = propertyKey;
|
|
158
|
+
} else {
|
|
159
|
+
key = storedKey;
|
|
160
|
+
}
|
|
127
161
|
} else {
|
|
128
|
-
|
|
162
|
+
key = storedKey;
|
|
129
163
|
}
|
|
164
|
+
reader.enterNode(0);
|
|
165
|
+
fields[key] = childHandler(reader, options, storedSchema, schema);
|
|
166
|
+
reader.exitNode();
|
|
130
167
|
});
|
|
131
168
|
return fields;
|
|
132
169
|
}
|
|
@@ -181,16 +218,18 @@ export function customFromCursorStored<TChild>(
|
|
|
181
218
|
}
|
|
182
219
|
|
|
183
220
|
/**
|
|
184
|
-
*
|
|
221
|
+
* Checks if `schema` could correspond to a simple-tree array node.
|
|
185
222
|
* If it is an array schema, returns the allowed types for the array field.
|
|
186
223
|
* Otherwise returns `undefined`.
|
|
224
|
+
* @remarks
|
|
225
|
+
* If the schema was defined by the public API, this will be accurate since there is no way to define an object node with a sequence field.
|
|
187
226
|
*/
|
|
188
|
-
export function tryStoredSchemaAsArray(
|
|
189
|
-
schema: TreeNodeStoredSchema,
|
|
190
|
-
): ReadonlySet<string> | undefined {
|
|
227
|
+
export function tryStoredSchemaAsArray(schema: TreeNodeStoredSchema): TreeTypeSet | undefined {
|
|
191
228
|
if (schema instanceof ObjectNodeStoredSchema) {
|
|
192
229
|
const empty = schema.getFieldSchema(EmptyKey);
|
|
193
230
|
if (empty.kind === FieldKinds.sequence.identifier) {
|
|
231
|
+
// This assert can only be hit by schema created not using the public API surface.
|
|
232
|
+
// If at some point this case needs to be tolerated, it can be replaced by "return undefined"
|
|
194
233
|
assert(schema.objectNodeFields.size === 1, 0xa9f /* invalid schema */);
|
|
195
234
|
return empty.types;
|
|
196
235
|
}
|