@fluidframework/tree 2.51.0 → 2.52.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/.vscode/settings.json +0 -1
- package/CHANGELOG.md +43 -0
- package/api-report/tree.alpha.api.md +3 -2
- 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 +14 -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/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/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/packageVersion.d.ts +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.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 +7 -10
- 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 +9 -4
- 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 +8 -2
- package/dist/simple-tree/api/configuration.d.ts.map +1 -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 +35 -22
- 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 +98 -0
- package/dist/simple-tree/api/discrepancies.d.ts.map +1 -0
- package/dist/simple-tree/api/discrepancies.js +255 -0
- package/dist/simple-tree/api/discrepancies.js.map +1 -0
- 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 +18 -117
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +7 -4
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/storedSchema.js +5 -1
- 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 +10 -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 +20 -4
- package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/core/allowedTypes.js +45 -13
- 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 +2 -2
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +3 -1
- package/dist/simple-tree/core/index.js.map +1 -1
- 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/treeNodeValid.d.ts +1 -1
- package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeValid.js +8 -1
- package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
- package/dist/simple-tree/core/walkSchema.d.ts +3 -0
- package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/walkSchema.js +2 -0
- 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 +3 -1
- 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 +1 -0
- package/dist/simple-tree/fieldSchema.js.map +1 -1
- package/dist/simple-tree/index.d.ts +4 -4
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +7 -8
- package/dist/simple-tree/index.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 +1 -1
- 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/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 +2 -7
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js +4 -18
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +5 -5
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +9 -3
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts +3 -0
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +3 -0
- 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/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 +14 -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/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/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/packageVersion.d.ts +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.js +1 -1
- 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 +8 -11
- 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 +10 -5
- 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 +8 -2
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- 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 +38 -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 +98 -0
- package/lib/simple-tree/api/discrepancies.d.ts.map +1 -0
- package/lib/simple-tree/{discrepancies.js → api/discrepancies.js} +80 -206
- package/lib/simple-tree/api/discrepancies.js.map +1 -0
- 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 -118
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +7 -4
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/storedSchema.js +6 -2
- 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 +8 -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 +20 -4
- package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/core/allowedTypes.js +42 -12
- 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 +2 -2
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +2 -2
- package/lib/simple-tree/core/index.js.map +1 -1
- 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/treeNodeValid.d.ts +1 -1
- package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeValid.js +8 -1
- package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
- package/lib/simple-tree/core/walkSchema.d.ts +3 -0
- package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/walkSchema.js +2 -0
- 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 +3 -1
- 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 +1 -0
- package/lib/simple-tree/fieldSchema.js.map +1 -1
- package/lib/simple-tree/index.d.ts +4 -4
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +4 -4
- package/lib/simple-tree/index.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 +1 -1
- 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/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 +2 -7
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js +3 -16
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +5 -5
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +11 -5
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts +3 -0
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +3 -0
- 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 +10 -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/object-forest/objectForest.ts +10 -6
- package/src/index.ts +5 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/independentView.ts +45 -19
- package/src/shared-tree/schematizeTree.ts +1 -1
- package/src/shared-tree/schematizingTreeView.ts +16 -13
- package/src/shared-tree/sharedTree.ts +2 -42
- package/src/shared-tree/treeAlpha.ts +30 -18
- 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 +8 -2
- package/src/simple-tree/api/create.ts +49 -36
- package/src/simple-tree/api/customTree.ts +59 -20
- package/src/simple-tree/{discrepancies.ts → api/discrepancies.ts} +128 -303
- package/src/simple-tree/api/schemaCompatibilityTester.ts +27 -151
- package/src/simple-tree/api/schemaFactory.ts +7 -4
- package/src/simple-tree/api/storedSchema.ts +6 -9
- package/src/simple-tree/api/treeBeta.ts +17 -4
- package/src/simple-tree/api/verboseTree.ts +17 -8
- package/src/simple-tree/core/allowedTypes.ts +54 -21
- package/src/simple-tree/core/context.ts +24 -22
- package/src/simple-tree/core/index.ts +2 -1
- package/src/simple-tree/core/treeNodeKernel.ts +1 -1
- package/src/simple-tree/core/treeNodeValid.ts +9 -2
- package/src/simple-tree/core/walkSchema.ts +3 -0
- package/src/simple-tree/createContext.ts +6 -1
- package/src/simple-tree/fieldSchema.ts +1 -0
- package/src/simple-tree/index.ts +5 -10
- package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -19
- package/src/simple-tree/node-kinds/index.ts +0 -1
- package/src/simple-tree/node-kinds/object/index.ts +0 -1
- package/src/simple-tree/node-kinds/object/objectNode.ts +9 -27
- package/src/simple-tree/prepareForInsertion.ts +17 -9
- package/src/simple-tree/toStoredSchema.ts +3 -0
- 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.map +0 -1
- package/src/feature-libraries/initializeForest.ts +0 -55
|
@@ -3,39 +3,25 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
|
|
7
|
-
|
|
8
6
|
import type { TreeStoredSchema } from "../../core/index.js";
|
|
9
|
-
import {
|
|
10
|
-
allowsRepoSuperset,
|
|
11
|
-
FieldKinds,
|
|
12
|
-
type FullSchemaPolicy,
|
|
13
|
-
isNeverTree,
|
|
14
|
-
} from "../../feature-libraries/index.js";
|
|
15
|
-
import type { FieldSchema } from "../fieldSchema.js";
|
|
7
|
+
import { allowsRepoSuperset, defaultSchemaPolicy } from "../../feature-libraries/index.js";
|
|
16
8
|
|
|
17
9
|
import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
18
|
-
import {
|
|
19
|
-
comparePosetElements,
|
|
20
|
-
fieldRealizer,
|
|
21
|
-
getAllowedContentDiscrepancies,
|
|
22
|
-
PosetComparisonResult,
|
|
23
|
-
type FieldDiscrepancy,
|
|
24
|
-
} from "../discrepancies.js";
|
|
10
|
+
import { getDiscrepanciesInAllowedContent } from "./discrepancies.js";
|
|
25
11
|
import { toStoredSchema } from "../toStoredSchema.js";
|
|
12
|
+
import type { TreeSchema } from "./configuration.js";
|
|
26
13
|
|
|
27
14
|
/**
|
|
28
|
-
* A collection of View information for schema
|
|
15
|
+
* A collection of View information for schema
|
|
29
16
|
* @remarks
|
|
30
17
|
* This contains everything needed to determine compatibility with a given stored schema.
|
|
31
18
|
*/
|
|
32
19
|
export class SchemaCompatibilityTester {
|
|
33
|
-
/**
|
|
34
|
-
* @param viewSchemaRoot - Schema for the root field.
|
|
35
|
-
*/
|
|
36
20
|
public constructor(
|
|
37
|
-
|
|
38
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Schema for the view
|
|
23
|
+
*/
|
|
24
|
+
public readonly viewSchema: TreeSchema,
|
|
39
25
|
) {}
|
|
40
26
|
|
|
41
27
|
/**
|
|
@@ -51,147 +37,37 @@ export class SchemaCompatibilityTester {
|
|
|
51
37
|
public checkCompatibility(
|
|
52
38
|
stored: TreeStoredSchema,
|
|
53
39
|
): Omit<SchemaCompatibilityStatus, "canInitialize"> {
|
|
40
|
+
// The public API surface assumes defaultSchemaPolicy
|
|
41
|
+
const policy = defaultSchemaPolicy;
|
|
42
|
+
|
|
54
43
|
// View schema allows a subset of documents that stored schema does, and the discrepancies are allowed by policy
|
|
55
44
|
// determined by the view schema (i.e. objects with extra optional fields in the stored schema have opted into allowing this.
|
|
56
45
|
// In the future, this would also include things like:
|
|
57
46
|
// - fields with more allowed types in the stored schema than in the view schema have out-of-schema "unknown content" adapters
|
|
58
47
|
let canView = true;
|
|
59
|
-
// View schema allows a superset of documents that stored schema does, hence the document could be upgraded to use a persisted version
|
|
60
|
-
// of this view schema as its stored schema.
|
|
61
|
-
let canUpgrade = true;
|
|
62
|
-
|
|
63
|
-
const updateCompatibilityFromFieldDiscrepancy = (discrepancy: FieldDiscrepancy): void => {
|
|
64
|
-
switch (discrepancy.mismatch) {
|
|
65
|
-
case "allowedTypes": {
|
|
66
|
-
// Since we only track the symmetric difference between the allowed types in the view and
|
|
67
|
-
// stored schemas, it's sufficient to check if any extra allowed types still exist in the
|
|
68
|
-
// stored schema.
|
|
69
|
-
if (
|
|
70
|
-
discrepancy.stored.some(
|
|
71
|
-
(identifier) =>
|
|
72
|
-
!isNeverTree(this.policy, stored, stored.nodeSchema.get(identifier)),
|
|
73
|
-
)
|
|
74
|
-
) {
|
|
75
|
-
// Stored schema has extra allowed types that the view schema does not.
|
|
76
|
-
canUpgrade = false;
|
|
77
|
-
canView = false;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (discrepancy.view.length > 0) {
|
|
81
|
-
// View schema has extra allowed types that the stored schema does not.
|
|
82
|
-
canView = false;
|
|
83
|
-
}
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
case "fieldKind": {
|
|
87
|
-
const result = comparePosetElements(
|
|
88
|
-
discrepancy.stored,
|
|
89
|
-
discrepancy.view,
|
|
90
|
-
fieldRealizer,
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
if (result === PosetComparisonResult.Greater) {
|
|
94
|
-
// Stored schema is more relaxed than view schema.
|
|
95
|
-
canUpgrade = false;
|
|
96
|
-
if (
|
|
97
|
-
discrepancy.view === FieldKinds.forbidden.identifier &&
|
|
98
|
-
discrepancy.identifier !== undefined &&
|
|
99
|
-
this.policy.allowUnknownOptionalFields(discrepancy.identifier)
|
|
100
|
-
) {
|
|
101
|
-
// When the application has opted into it, we allow viewing documents which have additional
|
|
102
|
-
// optional fields in the stored schema that are not present in the view schema.
|
|
103
|
-
} else {
|
|
104
|
-
canView = false;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
48
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (result === PosetComparisonResult.Incomparable) {
|
|
114
|
-
canUpgrade = false;
|
|
115
|
-
canView = false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
case "valueSchema": {
|
|
121
|
-
canView = false;
|
|
122
|
-
canUpgrade = false;
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
default:
|
|
126
|
-
unreachableCase(discrepancy);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
for (const discrepancy of getAllowedContentDiscrepancies(this.viewSchemaRoot, stored)) {
|
|
131
|
-
if (!canView && !canUpgrade) {
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
switch (discrepancy.mismatch) {
|
|
136
|
-
case "nodeKind": {
|
|
137
|
-
const storedNodeSchema = stored.nodeSchema.get(discrepancy.identifier);
|
|
138
|
-
// We conservatively do not allow node types to change.
|
|
139
|
-
// The only time this might be valid in the sense that the data canonically converts is converting an object node
|
|
140
|
-
// to a map node over the union of all the object fields' types.
|
|
141
|
-
if (discrepancy.stored === undefined) {
|
|
142
|
-
// View schema has added a node type that the stored schema doesn't know about.
|
|
143
|
-
// Note that all cases which trigger this should also trigger an AllowedTypeDiscrepancy (where the type is used).
|
|
144
|
-
// This means this case should be redundant and could be removed in the future if there is a reason to do so
|
|
145
|
-
// (like simplifying enablable type support).
|
|
146
|
-
// See the TODO in getAllowedContentDiscrepancies.
|
|
147
|
-
canView = false;
|
|
148
|
-
} else if (discrepancy.view === undefined) {
|
|
149
|
-
const storedIsNever =
|
|
150
|
-
storedNodeSchema !== undefined
|
|
151
|
-
? isNeverTree(this.policy, stored, storedNodeSchema)
|
|
152
|
-
: true;
|
|
153
|
-
if (!storedIsNever) {
|
|
154
|
-
// Stored schema has a node type that the view schema doesn't know about.
|
|
155
|
-
// The design of allowUnknownOptionalFields allows adding new optional content to types,
|
|
156
|
-
// and the new optional content can use new types.
|
|
157
|
-
// Therefore this case needs to be supported for viewing.
|
|
158
|
-
// However, it is not supported for upgrade as the stored document must be newer (or at least more general) than the view in this case.
|
|
159
|
-
// The fact that there might be removed trees with a root of this type which only appears in the stored schema is why this must set canUpgrade to false.
|
|
160
|
-
canUpgrade = false;
|
|
161
|
-
}
|
|
162
|
-
} else {
|
|
163
|
-
// Node type exists in both schemas but kind has changed. We conservatively never allow this.
|
|
164
|
-
// See note above about cases where this could be allowed if needed.
|
|
165
|
-
canView = false;
|
|
166
|
-
canUpgrade = false;
|
|
167
|
-
}
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
case "valueSchema":
|
|
171
|
-
case "allowedTypes":
|
|
172
|
-
case "fieldKind": {
|
|
173
|
-
updateCompatibilityFromFieldDiscrepancy(discrepancy);
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
case "fields": {
|
|
177
|
-
discrepancy.differences.forEach(updateCompatibilityFromFieldDiscrepancy);
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
// No default
|
|
181
|
-
}
|
|
49
|
+
for (const _discrepancy of getDiscrepanciesInAllowedContent(this.viewSchema, stored)) {
|
|
50
|
+
canView = false;
|
|
51
|
+
break;
|
|
182
52
|
}
|
|
183
53
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
54
|
+
const canUpgrade = allowsRepoSuperset(
|
|
55
|
+
policy,
|
|
56
|
+
stored,
|
|
57
|
+
toStoredSchema(this.viewSchema.root),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// If true, then upgrading has no effect on what can be stored in the document.
|
|
61
|
+
// TODO: This should likely be changed to indicate up a schema upgrade would be a no-op, including stored schema metadata.
|
|
62
|
+
const isEquivalent =
|
|
63
|
+
canView &&
|
|
64
|
+
canUpgrade &&
|
|
65
|
+
allowsRepoSuperset(policy, toStoredSchema(this.viewSchema.root), stored);
|
|
190
66
|
|
|
191
67
|
return {
|
|
192
68
|
canView,
|
|
193
69
|
canUpgrade,
|
|
194
|
-
isEquivalent
|
|
70
|
+
isEquivalent,
|
|
195
71
|
};
|
|
196
72
|
}
|
|
197
73
|
}
|
|
@@ -137,12 +137,15 @@ export interface SchemaFactoryObjectOptions<TCustomMetadata = unknown>
|
|
|
137
137
|
* // Then the alleged clone wouldn't actually clone the entire person in either case, it would drop the nickname.
|
|
138
138
|
* ```
|
|
139
139
|
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
140
|
+
* The existing import and export APIs have similar problems.
|
|
141
|
+
* For example currently the {@link (TreeAlpha:interface).exportVerbose|exportVerbose} API with stored keys preserves unknown optional fields,
|
|
142
|
+
* but {@link Unhydrated} nodes produced by {@link TreeNode} constructors, insertable content, and {@link (TreeAlpha:interface).importVerbose|importVerbose} do not.
|
|
143
|
+
* {@link (TreeBeta:interface).clone} however can be used to clone a node preserving unknown optional fields.
|
|
142
144
|
*
|
|
143
145
|
* Note that public API methods which operate on entire nodes (such as `moveTo`, `moveToEnd`, etc. on arrays) do not encounter
|
|
144
|
-
* this problem as SharedTree's implementation stores the entire node in its lower layers.
|
|
145
|
-
*
|
|
146
|
+
* this problem as SharedTree's implementation stores the entire node in its lower layers.
|
|
147
|
+
* It's only when application code reaches into a node
|
|
148
|
+
* (either by accessing its fields, spreading it, or some other means) that this problem arises.
|
|
146
149
|
*/
|
|
147
150
|
allowUnknownOptionalFields?: boolean;
|
|
148
151
|
}
|
|
@@ -5,11 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { FluidClientVersion, ICodecOptions } from "../../codec/index.js";
|
|
7
7
|
import { SchemaVersion } from "../../core/index.js";
|
|
8
|
-
import {
|
|
9
|
-
defaultSchemaPolicy,
|
|
10
|
-
encodeTreeSchema,
|
|
11
|
-
makeSchemaCodec,
|
|
12
|
-
} from "../../feature-libraries/index.js";
|
|
8
|
+
import { encodeTreeSchema, makeSchemaCodec } from "../../feature-libraries/index.js";
|
|
13
9
|
import {
|
|
14
10
|
clientVersionToSchemaVersion,
|
|
15
11
|
type FormatV1,
|
|
@@ -19,6 +15,7 @@ import type { JsonCompatible } from "../../util/index.js";
|
|
|
19
15
|
import { normalizeFieldSchema, type ImplicitFieldSchema } from "../fieldSchema.js";
|
|
20
16
|
import type { SimpleTreeSchema } from "../simpleSchema.js";
|
|
21
17
|
import { simpleToStoredSchema } from "../toStoredSchema.js";
|
|
18
|
+
import { TreeViewConfigurationAlpha } from "./configuration.js";
|
|
22
19
|
|
|
23
20
|
import { SchemaCompatibilityTester } from "./schemaCompatibilityTester.js";
|
|
24
21
|
import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
@@ -101,9 +98,9 @@ export function comparePersistedSchema(
|
|
|
101
98
|
// We only use the decode part, which always dispatches to the correct codec based on the version in the data, not the version passed to `makeSchemaCodec`.
|
|
102
99
|
const schemaCodec = makeSchemaCodec(options, SchemaVersion.v1);
|
|
103
100
|
const stored = schemaCodec.decode(persisted as FormatV1);
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
);
|
|
101
|
+
const config = new TreeViewConfigurationAlpha({
|
|
102
|
+
schema: normalizeFieldSchema(view),
|
|
103
|
+
});
|
|
104
|
+
const viewSchema = new SchemaCompatibilityTester(config);
|
|
108
105
|
return viewSchema.checkCompatibility(stored);
|
|
109
106
|
}
|
|
@@ -3,14 +3,18 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { defaultSchemaPolicy } from "../../feature-libraries/index.js";
|
|
6
7
|
import {
|
|
8
|
+
Context,
|
|
7
9
|
getKernel,
|
|
8
10
|
isTreeNode,
|
|
11
|
+
UnhydratedContext,
|
|
9
12
|
type NodeKind,
|
|
10
13
|
type TreeNode,
|
|
11
14
|
type Unhydrated,
|
|
12
15
|
type WithType,
|
|
13
16
|
} from "../core/index.js";
|
|
17
|
+
import { getUnhydratedContext } from "../createContext.js";
|
|
14
18
|
import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../fieldSchema.js";
|
|
15
19
|
|
|
16
20
|
import { createFromCursor } from "./create.js";
|
|
@@ -128,8 +132,8 @@ export interface TreeBeta {
|
|
|
128
132
|
*
|
|
129
133
|
* - The identifiers in the node's subtree will be preserved, i.e., they are not replaced with new values.
|
|
130
134
|
*
|
|
131
|
-
* @
|
|
132
|
-
*
|
|
135
|
+
* - If the node (or any node in its subtree) contains {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields|unknown optional fields},
|
|
136
|
+
* those fields will be cloned just like the known fields.
|
|
133
137
|
*/
|
|
134
138
|
clone<const TSchema extends ImplicitFieldSchema>(
|
|
135
139
|
node: TreeFieldFromImplicitField<TSchema>,
|
|
@@ -137,7 +141,7 @@ export interface TreeBeta {
|
|
|
137
141
|
|
|
138
142
|
// TODO: support more clone options
|
|
139
143
|
// /**
|
|
140
|
-
// * Like {@link TreeBeta.create}, except deeply clones existing nodes.
|
|
144
|
+
// * Like {@link (TreeBeta:interface).create}, except deeply clones existing nodes.
|
|
141
145
|
// * @remarks
|
|
142
146
|
// * This only clones the persisted data associated with a node.
|
|
143
147
|
// * Local state, such as properties added to customized schema classes, will not be cloned:
|
|
@@ -178,7 +182,16 @@ export const TreeBeta: TreeBeta = {
|
|
|
178
182
|
|
|
179
183
|
const kernel = getKernel(node);
|
|
180
184
|
const cursor = kernel.getOrCreateInnerNode().borrowCursor();
|
|
181
|
-
|
|
185
|
+
|
|
186
|
+
// To handle when the node transitively contains unknown optional fields,
|
|
187
|
+
// derive the context from the source node's stored schema which has stored schema for any such fields and their contents.
|
|
188
|
+
const flexContext = new UnhydratedContext(
|
|
189
|
+
defaultSchemaPolicy,
|
|
190
|
+
kernel.context.flexContext.schema,
|
|
191
|
+
);
|
|
192
|
+
const context = new Context(flexContext, getUnhydratedContext(kernel.schema).schema);
|
|
193
|
+
|
|
194
|
+
return createFromCursor(kernel.schema, cursor, context) as Unhydrated<
|
|
182
195
|
TreeFieldFromImplicitField<TSchema>
|
|
183
196
|
>;
|
|
184
197
|
},
|
|
@@ -12,14 +12,15 @@ import {
|
|
|
12
12
|
aboveRootPlaceholder,
|
|
13
13
|
EmptyKey,
|
|
14
14
|
keyAsDetachedField,
|
|
15
|
+
LeafNodeStoredSchema,
|
|
15
16
|
type FieldKey,
|
|
16
17
|
type ITreeCursor,
|
|
17
18
|
type ITreeCursorSynchronous,
|
|
19
|
+
type TreeNodeStoredSchema,
|
|
18
20
|
} from "../../core/index.js";
|
|
19
21
|
import { brand } from "../../util/index.js";
|
|
20
22
|
import type { ImplicitFieldSchema } from "../fieldSchema.js";
|
|
21
|
-
import {
|
|
22
|
-
import type { TreeNodeSchema, ImplicitAllowedTypes, TreeLeafValue } from "../core/index.js";
|
|
23
|
+
import type { Context, TreeLeafValue, TreeNodeSchema } from "../core/index.js";
|
|
23
24
|
import {
|
|
24
25
|
isTreeValue,
|
|
25
26
|
stackTreeFieldCursor,
|
|
@@ -279,7 +280,7 @@ function verboseTreeAdapter(options: SchemalessParseOptions): CursorAdapter<Verb
|
|
|
279
280
|
*/
|
|
280
281
|
export function verboseFromCursor(
|
|
281
282
|
reader: ITreeCursor,
|
|
282
|
-
|
|
283
|
+
context: Context,
|
|
283
284
|
options: TreeEncodingOptions,
|
|
284
285
|
): VerboseTree {
|
|
285
286
|
const config: Required<TreeEncodingOptions> = {
|
|
@@ -287,20 +288,28 @@ export function verboseFromCursor(
|
|
|
287
288
|
...options,
|
|
288
289
|
};
|
|
289
290
|
|
|
290
|
-
const
|
|
291
|
+
const storedSchemaMap = context.flexContext.schema.nodeSchema;
|
|
292
|
+
const schemaMap = context.schema;
|
|
291
293
|
|
|
292
|
-
return verboseFromCursorInner(reader, config, schemaMap);
|
|
294
|
+
return verboseFromCursorInner(reader, config, storedSchemaMap, schemaMap);
|
|
293
295
|
}
|
|
294
296
|
|
|
295
297
|
function verboseFromCursorInner(
|
|
296
298
|
reader: ITreeCursor,
|
|
297
299
|
options: Required<TreeEncodingOptions>,
|
|
300
|
+
storedSchema: ReadonlyMap<string, TreeNodeStoredSchema>,
|
|
298
301
|
schema: ReadonlyMap<string, TreeNodeSchema>,
|
|
299
302
|
): VerboseTree {
|
|
300
|
-
const fields = customFromCursor(
|
|
303
|
+
const fields = customFromCursor(
|
|
304
|
+
reader,
|
|
305
|
+
options,
|
|
306
|
+
storedSchema,
|
|
307
|
+
schema,
|
|
308
|
+
verboseFromCursorInner,
|
|
309
|
+
);
|
|
301
310
|
const nodeSchema =
|
|
302
|
-
|
|
303
|
-
if (nodeSchema
|
|
311
|
+
storedSchema.get(reader.type) ?? fail(0xb3c /* missing schema for type in cursor */);
|
|
312
|
+
if (nodeSchema instanceof LeafNodeStoredSchema) {
|
|
304
313
|
return fields as TreeLeafValue;
|
|
305
314
|
}
|
|
306
315
|
|
|
@@ -76,6 +76,7 @@ export interface NormalizedAnnotatedAllowedTypes {
|
|
|
76
76
|
export function isAnnotatedAllowedTypes(
|
|
77
77
|
allowedTypes: ImplicitAnnotatedAllowedTypes,
|
|
78
78
|
): allowedTypes is AnnotatedAllowedTypes {
|
|
79
|
+
checkForUninitializedSchema(allowedTypes);
|
|
79
80
|
return (
|
|
80
81
|
// Class based schema, and lazy schema references report type "function": filtering them out with typeof makes narrowing based on members mostly safe
|
|
81
82
|
typeof allowedTypes === "object" && "metadata" in allowedTypes && "types" in allowedTypes
|
|
@@ -116,7 +117,9 @@ export interface AllowedTypesMetadata {
|
|
|
116
117
|
export function isAnnotatedAllowedType(
|
|
117
118
|
allowedType: AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
|
|
118
119
|
): allowedType is AnnotatedAllowedType {
|
|
119
|
-
|
|
120
|
+
checkForUninitializedSchema(allowedType);
|
|
121
|
+
// Class based schema, and lazy schema references report type "function": filtering them out with typeof makes narrowing based on members mostly safe
|
|
122
|
+
return typeof allowedType === "object" && "metadata" in allowedType && "type" in allowedType;
|
|
120
123
|
}
|
|
121
124
|
|
|
122
125
|
/**
|
|
@@ -224,7 +227,7 @@ export type UnannotateAllowedTypes<T extends AnnotatedAllowedTypes> =
|
|
|
224
227
|
* Removes annotations from an allowed type.
|
|
225
228
|
* @system @alpha
|
|
226
229
|
*/
|
|
227
|
-
export type UnannotateAllowedType<T extends AnnotatedAllowedType
|
|
230
|
+
export type UnannotateAllowedType<T extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>> =
|
|
228
231
|
T extends AnnotatedAllowedType<infer X> ? [X] : T;
|
|
229
232
|
|
|
230
233
|
/**
|
|
@@ -237,29 +240,40 @@ export type UnannotateAllowedType<T extends AnnotatedAllowedType> =
|
|
|
237
240
|
* @internal
|
|
238
241
|
*/
|
|
239
242
|
export function normalizeAllowedTypes(
|
|
240
|
-
types:
|
|
243
|
+
types: ImplicitAnnotatedAllowedTypes,
|
|
241
244
|
): ReadonlySet<TreeNodeSchema> {
|
|
245
|
+
// remove annotations before normalizing
|
|
246
|
+
const unannotated = unannotateImplicitAllowedTypes(types);
|
|
242
247
|
const normalized = new Set<TreeNodeSchema>();
|
|
243
|
-
if (isReadonlyArray(
|
|
248
|
+
if (isReadonlyArray(unannotated)) {
|
|
244
249
|
// Types array must not be modified after it is normalized since that would result in the user of the normalized data having wrong (out of date) content.
|
|
245
|
-
Object.freeze(
|
|
246
|
-
for (const lazyType of
|
|
250
|
+
Object.freeze(unannotated);
|
|
251
|
+
for (const lazyType of unannotated) {
|
|
247
252
|
normalized.add(evaluateLazySchema(lazyType));
|
|
248
253
|
}
|
|
249
254
|
} else {
|
|
250
|
-
normalized.add(evaluateLazySchema(
|
|
255
|
+
normalized.add(evaluateLazySchema(unannotated));
|
|
251
256
|
}
|
|
252
257
|
return normalized;
|
|
253
258
|
}
|
|
254
259
|
|
|
255
260
|
/**
|
|
256
|
-
* Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist
|
|
261
|
+
* Normalizes an allowed type to an {@link AnnotatedAllowedType}, by adding empty annotations if they don't already exist
|
|
262
|
+
* and eagerly evaluating any lazy schema declarations.
|
|
263
|
+
*
|
|
264
|
+
* @remarks
|
|
265
|
+
* Note: this must only be called after all required schemas have been declared, otherwise evaluation of
|
|
266
|
+
* recursive schemas may fail.
|
|
267
|
+
* type is frozen and should not be modified after being passed in.
|
|
257
268
|
*/
|
|
258
269
|
export function normalizeToAnnotatedAllowedType<T extends TreeNodeSchema>(
|
|
259
270
|
type: T | AnnotatedAllowedType<T> | AnnotatedAllowedType<LazyItem<T>>,
|
|
260
|
-
): AnnotatedAllowedType<T>
|
|
271
|
+
): AnnotatedAllowedType<T> {
|
|
261
272
|
return isAnnotatedAllowedType(type)
|
|
262
|
-
?
|
|
273
|
+
? {
|
|
274
|
+
metadata: type.metadata,
|
|
275
|
+
type: evaluateLazySchema(type.type),
|
|
276
|
+
}
|
|
263
277
|
: {
|
|
264
278
|
metadata: {},
|
|
265
279
|
type,
|
|
@@ -317,19 +331,28 @@ export function unannotateImplicitAllowedTypes<Types extends ImplicitAnnotatedAl
|
|
|
317
331
|
): UnannotateImplicitAllowedTypes<Types> {
|
|
318
332
|
return (
|
|
319
333
|
isAnnotatedAllowedTypes(types)
|
|
320
|
-
? types.types.map(
|
|
321
|
-
isAnnotatedAllowedType(allowedType) ? allowedType.type : allowedType,
|
|
322
|
-
)
|
|
334
|
+
? types.types.map(unannotateAllowedType)
|
|
323
335
|
: isReadonlyArray(types)
|
|
324
|
-
? types.map(
|
|
325
|
-
isAnnotatedAllowedType(allowedType) ? allowedType.type : allowedType,
|
|
326
|
-
)
|
|
336
|
+
? types.map(unannotateAllowedType)
|
|
327
337
|
: isAnnotatedAllowedType(types)
|
|
328
|
-
?
|
|
338
|
+
? types.type
|
|
329
339
|
: types
|
|
330
340
|
) as UnannotateImplicitAllowedTypes<Types>;
|
|
331
341
|
}
|
|
332
342
|
|
|
343
|
+
/**
|
|
344
|
+
* Converts an {@link AnnotatedAllowedType} to an {@link LazyItem} by removing any annotations.
|
|
345
|
+
* @remarks
|
|
346
|
+
* This does not evaluate any lazy schemas.
|
|
347
|
+
*/
|
|
348
|
+
export function unannotateAllowedType<
|
|
349
|
+
Type extends AnnotatedAllowedType | LazyItem<TreeNodeSchema>,
|
|
350
|
+
>(allowedType: Type): UnannotateAllowedType<Type> {
|
|
351
|
+
return isAnnotatedAllowedType(allowedType)
|
|
352
|
+
? (allowedType.type as UnannotateAllowedType<Type>)
|
|
353
|
+
: (allowedType as UnannotateAllowedType<Type>);
|
|
354
|
+
}
|
|
355
|
+
|
|
333
356
|
const cachedLazyItem = new WeakMap<() => unknown, unknown>();
|
|
334
357
|
|
|
335
358
|
/**
|
|
@@ -342,13 +365,23 @@ export function evaluateLazySchema<T extends TreeNodeSchema>(value: LazyItem<T>)
|
|
|
342
365
|
const evaluatedSchema = isLazy(value)
|
|
343
366
|
? (getOrCreate(cachedLazyItem, value, value) as T)
|
|
344
367
|
: value;
|
|
345
|
-
|
|
368
|
+
|
|
369
|
+
checkForUninitializedSchema(evaluatedSchema);
|
|
370
|
+
markSchemaMostDerived(evaluatedSchema);
|
|
371
|
+
return evaluatedSchema;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Throws a UsageError if the provided schema is undefined, most likely due to being used before it was initialized.
|
|
376
|
+
*/
|
|
377
|
+
export function checkForUninitializedSchema(
|
|
378
|
+
schema: ImplicitAnnotatedAllowedTypes | LazyItem<TreeNodeSchema>,
|
|
379
|
+
): void {
|
|
380
|
+
if (schema === undefined) {
|
|
346
381
|
throw new UsageError(
|
|
347
|
-
`Encountered an undefined schema. This could indicate that some referenced schema has not yet been instantiated.`,
|
|
382
|
+
`Encountered an undefined schema. This could indicate that some referenced schema has not yet been instantiated. Consider using a lazy schema reference (like "() => schema") or delaying the evaluation of the lazy reference if one is already being used.`,
|
|
348
383
|
);
|
|
349
384
|
}
|
|
350
|
-
markSchemaMostDerived(evaluatedSchema);
|
|
351
|
-
return evaluatedSchema;
|
|
352
385
|
}
|
|
353
386
|
|
|
354
387
|
/**
|
|
@@ -28,34 +28,36 @@ import { walkAllowedTypes } from "./walkSchema.js";
|
|
|
28
28
|
* This design is the same as {@link FlexTreeContext} with its base type and {@link FlexTreeHydratedContext} extending it.
|
|
29
29
|
*/
|
|
30
30
|
export class Context {
|
|
31
|
-
|
|
32
|
-
* All schema which could transitively be used under the associated node.
|
|
33
|
-
* @remarks
|
|
34
|
-
* While generally {@link TreeNodeSchema} are referenced as objects and thus do not need to be looked up by identifier,
|
|
35
|
-
* there are a few cases (mainly constructing new TreeNodes from existing tree data) where such a lookup is useful.
|
|
36
|
-
* Having this map in the context addresses this use-case.
|
|
37
|
-
* @privateRemarks
|
|
38
|
-
* This design mirrors how {@link FlexTreeSchema} are accessed off the {@link FlexTreeContext}, making the migration away from them simpler.
|
|
39
|
-
*/
|
|
40
|
-
public readonly schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema>;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Builds the context.
|
|
44
|
-
* @remarks
|
|
45
|
-
* Since this walks the schema, it must not be invoked during schema declaration or schema forward references could fail to be resolved.
|
|
46
|
-
*/
|
|
47
|
-
public constructor(
|
|
31
|
+
public static schemaMapFromRootSchema(
|
|
48
32
|
rootSchema: NormalizedAnnotatedAllowedTypes,
|
|
49
|
-
|
|
50
|
-
) {
|
|
33
|
+
): ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema> {
|
|
51
34
|
const schema: Map<TreeNodeSchemaIdentifier, TreeNodeSchema> = new Map();
|
|
52
35
|
walkAllowedTypes(rootSchema, {
|
|
53
36
|
node(nodeSchema) {
|
|
54
37
|
schema.set(brand(nodeSchema.identifier), nodeSchema);
|
|
55
38
|
},
|
|
56
39
|
});
|
|
57
|
-
|
|
40
|
+
return schema;
|
|
58
41
|
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Builds the context.
|
|
45
|
+
* @remarks
|
|
46
|
+
* Since this walks the schema, it must not be invoked during schema declaration or schema forward references could fail to be resolved.
|
|
47
|
+
*/
|
|
48
|
+
public constructor(
|
|
49
|
+
public readonly flexContext: FlexTreeContext,
|
|
50
|
+
/**
|
|
51
|
+
* All schema which could transitively be used under the associated node.
|
|
52
|
+
* @remarks
|
|
53
|
+
* While generally {@link TreeNodeSchema} are referenced as objects and thus do not need to be looked up by identifier,
|
|
54
|
+
* there are a few cases (mainly constructing new TreeNodes from existing tree data) where such a lookup is useful.
|
|
55
|
+
* Having this map in the context addresses this use-case.
|
|
56
|
+
* @privateRemarks
|
|
57
|
+
* This design mirrors how {@link FlexTreeSchema} are accessed off the {@link FlexTreeContext}, making the migration away from them simpler.
|
|
58
|
+
*/
|
|
59
|
+
public readonly schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema>,
|
|
60
|
+
) {}
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
/**
|
|
@@ -64,9 +66,9 @@ export class Context {
|
|
|
64
66
|
*/
|
|
65
67
|
export class HydratedContext extends Context {
|
|
66
68
|
public constructor(
|
|
67
|
-
rootSchema: NormalizedAnnotatedAllowedTypes,
|
|
68
69
|
public override readonly flexContext: FlexTreeHydratedContext,
|
|
70
|
+
schema: ReadonlyMap<TreeNodeSchemaIdentifier, TreeNodeSchema>,
|
|
69
71
|
) {
|
|
70
|
-
super(
|
|
72
|
+
super(flexContext, schema);
|
|
71
73
|
}
|
|
72
74
|
}
|
|
@@ -53,6 +53,7 @@ export {
|
|
|
53
53
|
isAnnotatedAllowedType,
|
|
54
54
|
normalizeAllowedTypes,
|
|
55
55
|
normalizeAnnotatedAllowedTypes,
|
|
56
|
+
normalizeToAnnotatedAllowedType,
|
|
56
57
|
unannotateImplicitAllowedTypes,
|
|
57
58
|
markSchemaMostDerived,
|
|
58
59
|
evaluateLazySchema,
|
|
@@ -76,7 +77,7 @@ export type {
|
|
|
76
77
|
AllowedTypeMetadata,
|
|
77
78
|
AnnotatedAllowedTypes,
|
|
78
79
|
} from "./allowedTypes.js";
|
|
79
|
-
export { walkAllowedTypes, type SchemaVisitor } from "./walkSchema.js";
|
|
80
|
+
export { walkAllowedTypes, walkNodeSchema, type SchemaVisitor } from "./walkSchema.js";
|
|
80
81
|
export { Context, HydratedContext } from "./context.js";
|
|
81
82
|
export {
|
|
82
83
|
getOrCreateNodeFromInnerNode,
|
|
@@ -131,7 +131,7 @@ export class TreeNodeKernel {
|
|
|
131
131
|
/**
|
|
132
132
|
* Create a TreeNodeKernel which can be looked up with {@link getKernel}.
|
|
133
133
|
*
|
|
134
|
-
* @param initialContext - context from when this node was originally
|
|
134
|
+
* @param initialContext - context from when this node was originally created. Only used when unhydrated.
|
|
135
135
|
* @param innerNode - When unhydrated/raw or marinated the MapTreeNode. FlexTreeNode when cooked.
|
|
136
136
|
* @remarks
|
|
137
137
|
* Exactly one kernel per TreeNode should be created.
|
|
@@ -10,7 +10,7 @@ import { type FlexTreeNode, isFlexTreeNode } from "../../feature-libraries/index
|
|
|
10
10
|
|
|
11
11
|
import { markEager } from "./flexList.js";
|
|
12
12
|
import { inPrototypeChain, privateToken, TreeNode } from "./treeNode.js";
|
|
13
|
-
import
|
|
13
|
+
import { UnhydratedFlexTreeNode } from "./unhydratedFlexTree.js";
|
|
14
14
|
import {
|
|
15
15
|
NodeKind,
|
|
16
16
|
type TreeNodeSchema,
|
|
@@ -193,10 +193,17 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
|
|
|
193
193
|
);
|
|
194
194
|
|
|
195
195
|
const result = schema.prepareInstance(this, node);
|
|
196
|
+
// For unhydrated nodes, grab the context from the `simpleContext` (which likely is from cache.oneTimeInitialized.context,
|
|
197
|
+
// but might be customized for better schema evolution support like unknown optional fields like in clone)
|
|
198
|
+
// For hydrated nodes, this context is unused, so using the default from cache.oneTimeInitialized.context is always fine.
|
|
199
|
+
const context =
|
|
200
|
+
node instanceof UnhydratedFlexTreeNode
|
|
201
|
+
? node.simpleContext
|
|
202
|
+
: cache.oneTimeInitialized.context;
|
|
196
203
|
// The TreeNodeKernel associates itself the TreeNode (result here, not node) so it can be looked up later via getKernel.
|
|
197
204
|
// If desired this could be put in a non-enumerable symbol property for lookup instead, but that gets messy going through proxies,
|
|
198
205
|
// so just relying on the WeakMap seems like the cleanest approach.
|
|
199
|
-
new TreeNodeKernel(result, schema, node,
|
|
206
|
+
new TreeNodeKernel(result, schema, node, context);
|
|
200
207
|
|
|
201
208
|
return result;
|
|
202
209
|
}
|