@fluidframework/tree 2.51.0-347100 → 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/.eslintrc.cjs +3 -2
- package/.vscode/settings.json +0 -1
- package/CHANGELOG.md +92 -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 +2 -3
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +3 -11
- 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 -19
- package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +0 -1
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +1 -8
- package/dist/feature-libraries/modular-schema/index.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.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 +1 -1
- package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
- package/dist/shared-tree/schematizeTree.js +5 -4
- 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/tree.js +1 -1
- package/dist/shared-tree/tree.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 +33 -1
- 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 +8 -21
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js +19 -169
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCreationUtilities.js +2 -2
- package/dist/simple-tree/api/schemaCreationUtilities.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 +5 -4
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +8 -3
- 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 +2 -3
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +2 -3
- 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 -17
- package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts +0 -1
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js +0 -1
- package/lib/feature-libraries/modular-schema/index.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.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 +1 -1
- package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
- package/lib/shared-tree/schematizeTree.js +3 -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 +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/tree.js +1 -1
- package/lib/shared-tree/tree.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 +34 -2
- 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/api/discrepancies.js +250 -0
- package/lib/simple-tree/api/discrepancies.js.map +1 -0
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +8 -21
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js +19 -169
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCreationUtilities.js +2 -2
- package/lib/simple-tree/api/schemaCreationUtilities.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 +5 -4
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +5 -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 -18
- package/src/feature-libraries/modular-schema/comparison.ts +14 -33
- package/src/feature-libraries/modular-schema/index.ts +0 -17
- 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 +3 -3
- package/src/shared-tree/schematizingTreeView.ts +17 -17
- package/src/shared-tree/sharedTree.ts +2 -42
- package/src/shared-tree/tree.ts +1 -1
- package/src/shared-tree/treeAlpha.ts +30 -18
- package/src/shared-tree/treeCheckout.ts +55 -11
- 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/api/discrepancies.ts +473 -0
- package/src/simple-tree/api/schemaCompatibilityTester.ts +28 -242
- package/src/simple-tree/api/schemaCreationUtilities.ts +5 -2
- package/src/simple-tree/api/schemaFactory.ts +7 -4
- package/src/simple-tree/api/storedSchema.ts +6 -10
- 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 +6 -3
- package/src/simple-tree/node-kinds/array/arrayNode.ts +32 -19
- package/src/simple-tree/node-kinds/index.ts +1 -1
- package/src/simple-tree/node-kinds/object/index.ts +1 -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/feature-libraries/modular-schema/discrepancies.d.ts +0 -174
- package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +0 -1
- package/dist/feature-libraries/modular-schema/discrepancies.js +0 -361
- package/dist/feature-libraries/modular-schema/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/feature-libraries/modular-schema/discrepancies.d.ts +0 -174
- package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +0 -1
- package/lib/feature-libraries/modular-schema/discrepancies.js +0 -354
- package/lib/feature-libraries/modular-schema/discrepancies.js.map +0 -1
- package/src/feature-libraries/initializeForest.ts +0 -55
- package/src/feature-libraries/modular-schema/discrepancies.ts +0 -567
|
@@ -3,52 +3,26 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
AdaptedViewSchema,
|
|
10
|
-
type TreeNodeStoredSchema,
|
|
11
|
-
type Adapters,
|
|
12
|
-
type TreeFieldStoredSchema,
|
|
13
|
-
type TreeNodeSchemaIdentifier,
|
|
14
|
-
type TreeStoredSchema,
|
|
15
|
-
} from "../../core/index.js";
|
|
16
|
-
import {
|
|
17
|
-
FieldKinds,
|
|
18
|
-
type FullSchemaPolicy,
|
|
19
|
-
type FieldDiscrepancy,
|
|
20
|
-
getAllowedContentDiscrepancies,
|
|
21
|
-
isNeverTree,
|
|
22
|
-
PosetComparisonResult,
|
|
23
|
-
fieldRealizer,
|
|
24
|
-
comparePosetElements,
|
|
25
|
-
} from "../../feature-libraries/index.js";
|
|
26
|
-
import type { FieldSchema } from "../fieldSchema.js";
|
|
27
|
-
import { toStoredSchema } from "../toStoredSchema.js";
|
|
6
|
+
import type { TreeStoredSchema } from "../../core/index.js";
|
|
7
|
+
import { allowsRepoSuperset, defaultSchemaPolicy } from "../../feature-libraries/index.js";
|
|
28
8
|
|
|
29
9
|
import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
10
|
+
import { getDiscrepanciesInAllowedContent } from "./discrepancies.js";
|
|
11
|
+
import { toStoredSchema } from "../toStoredSchema.js";
|
|
12
|
+
import type { TreeSchema } from "./configuration.js";
|
|
30
13
|
|
|
31
14
|
/**
|
|
32
|
-
* A collection of View information for schema
|
|
15
|
+
* A collection of View information for schema
|
|
33
16
|
* @remarks
|
|
34
17
|
* This contains everything needed to determine compatibility with a given stored schema.
|
|
35
18
|
*/
|
|
36
19
|
export class SchemaCompatibilityTester {
|
|
37
|
-
/**
|
|
38
|
-
* Cached conversion of the view schema in the stored schema format.
|
|
39
|
-
*/
|
|
40
|
-
public readonly viewSchemaAsStored: TreeStoredSchema;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @param viewSchemaRoot - Schema for the root field.
|
|
44
|
-
*/
|
|
45
20
|
public constructor(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
21
|
+
/**
|
|
22
|
+
* Schema for the view
|
|
23
|
+
*/
|
|
24
|
+
public readonly viewSchema: TreeSchema,
|
|
25
|
+
) {}
|
|
52
26
|
|
|
53
27
|
/**
|
|
54
28
|
* Determines the compatibility of a stored document
|
|
@@ -63,225 +37,37 @@ export class SchemaCompatibilityTester {
|
|
|
63
37
|
public checkCompatibility(
|
|
64
38
|
stored: TreeStoredSchema,
|
|
65
39
|
): Omit<SchemaCompatibilityStatus, "canInitialize"> {
|
|
66
|
-
//
|
|
67
|
-
|
|
40
|
+
// The public API surface assumes defaultSchemaPolicy
|
|
41
|
+
const policy = defaultSchemaPolicy;
|
|
68
42
|
|
|
69
43
|
// View schema allows a subset of documents that stored schema does, and the discrepancies are allowed by policy
|
|
70
44
|
// determined by the view schema (i.e. objects with extra optional fields in the stored schema have opted into allowing this.
|
|
71
45
|
// In the future, this would also include things like:
|
|
72
46
|
// - fields with more allowed types in the stored schema than in the view schema have out-of-schema "unknown content" adapters
|
|
73
47
|
let canView = true;
|
|
74
|
-
// View schema allows a superset of documents that stored schema does, hence the document could be upgraded to use a persisted version
|
|
75
|
-
// of this view schema as its stored schema.
|
|
76
|
-
let canUpgrade = true;
|
|
77
|
-
|
|
78
|
-
const updateCompatibilityFromFieldDiscrepancy = (discrepancy: FieldDiscrepancy): void => {
|
|
79
|
-
switch (discrepancy.mismatch) {
|
|
80
|
-
case "allowedTypes": {
|
|
81
|
-
// Since we only track the symmetric difference between the allowed types in the view and
|
|
82
|
-
// stored schemas, it's sufficient to check if any extra allowed types still exist in the
|
|
83
|
-
// stored schema.
|
|
84
|
-
if (
|
|
85
|
-
discrepancy.stored.some(
|
|
86
|
-
(identifier) =>
|
|
87
|
-
!isNeverTree(this.policy, stored, stored.nodeSchema.get(identifier)),
|
|
88
|
-
)
|
|
89
|
-
) {
|
|
90
|
-
// Stored schema has extra allowed types that the view schema does not.
|
|
91
|
-
canUpgrade = false;
|
|
92
|
-
canView = false;
|
|
93
|
-
}
|
|
94
48
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
this.policy,
|
|
100
|
-
this.viewSchemaAsStored,
|
|
101
|
-
this.viewSchemaAsStored.nodeSchema.get(identifier),
|
|
102
|
-
),
|
|
103
|
-
)
|
|
104
|
-
) {
|
|
105
|
-
// View schema has extra allowed types that the stored schema does not.
|
|
106
|
-
canView = false;
|
|
107
|
-
}
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
case "fieldKind": {
|
|
111
|
-
const result = comparePosetElements(
|
|
112
|
-
discrepancy.stored,
|
|
113
|
-
discrepancy.view,
|
|
114
|
-
fieldRealizer,
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
if (result === PosetComparisonResult.Greater) {
|
|
118
|
-
// Stored schema is more relaxed than view schema.
|
|
119
|
-
canUpgrade = false;
|
|
120
|
-
if (
|
|
121
|
-
discrepancy.view === FieldKinds.forbidden.identifier &&
|
|
122
|
-
discrepancy.identifier !== undefined &&
|
|
123
|
-
this.policy.allowUnknownOptionalFields(discrepancy.identifier)
|
|
124
|
-
) {
|
|
125
|
-
// When the application has opted into it, we allow viewing documents which have additional
|
|
126
|
-
// optional fields in the stored schema that are not present in the view schema.
|
|
127
|
-
} else {
|
|
128
|
-
canView = false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (result === PosetComparisonResult.Less) {
|
|
133
|
-
// View schema is more relaxed than stored schema.
|
|
134
|
-
canView = false;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (result === PosetComparisonResult.Incomparable) {
|
|
138
|
-
canUpgrade = false;
|
|
139
|
-
canView = false;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
case "valueSchema": {
|
|
145
|
-
canView = false;
|
|
146
|
-
canUpgrade = false;
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
default:
|
|
150
|
-
unreachableCase(discrepancy);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
49
|
+
for (const _discrepancy of getDiscrepanciesInAllowedContent(this.viewSchema, stored)) {
|
|
50
|
+
canView = false;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
153
53
|
|
|
154
|
-
|
|
155
|
-
|
|
54
|
+
const canUpgrade = allowsRepoSuperset(
|
|
55
|
+
policy,
|
|
156
56
|
stored,
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
57
|
+
toStoredSchema(this.viewSchema.root),
|
|
58
|
+
);
|
|
161
59
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
// We conservatively do not allow node types to change.
|
|
169
|
-
// The only time this might be valid in the sense that the data canonically converts is converting an object node
|
|
170
|
-
// to a map node over the union of all the object fields' types.
|
|
171
|
-
if (discrepancy.stored === undefined) {
|
|
172
|
-
const viewIsNever =
|
|
173
|
-
viewNodeSchema !== undefined
|
|
174
|
-
? isNeverTree(this.policy, this.viewSchemaAsStored, viewNodeSchema)
|
|
175
|
-
: true;
|
|
176
|
-
if (!viewIsNever) {
|
|
177
|
-
// View schema has added a node type that the stored schema doesn't know about.
|
|
178
|
-
canView = false;
|
|
179
|
-
}
|
|
180
|
-
} else if (discrepancy.view === undefined) {
|
|
181
|
-
const storedIsNever =
|
|
182
|
-
storedNodeSchema !== undefined
|
|
183
|
-
? isNeverTree(this.policy, stored, storedNodeSchema)
|
|
184
|
-
: true;
|
|
185
|
-
if (!storedIsNever) {
|
|
186
|
-
// Stored schema has a node type that the view schema doesn't know about.
|
|
187
|
-
canUpgrade = false;
|
|
188
|
-
}
|
|
189
|
-
} else {
|
|
190
|
-
// Node type exists in both schemas but has changed. We conservatively never allow this.
|
|
191
|
-
const storedIsNever =
|
|
192
|
-
storedNodeSchema !== undefined
|
|
193
|
-
? isNeverTree(this.policy, stored, storedNodeSchema)
|
|
194
|
-
: true;
|
|
195
|
-
const viewIsNever =
|
|
196
|
-
viewNodeSchema !== undefined
|
|
197
|
-
? isNeverTree(this.policy, this.viewSchemaAsStored, viewNodeSchema)
|
|
198
|
-
: true;
|
|
199
|
-
if (!storedIsNever || !viewIsNever) {
|
|
200
|
-
canView = false;
|
|
201
|
-
canUpgrade = false;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
break;
|
|
205
|
-
}
|
|
206
|
-
case "valueSchema":
|
|
207
|
-
case "allowedTypes":
|
|
208
|
-
case "fieldKind": {
|
|
209
|
-
updateCompatibilityFromFieldDiscrepancy(discrepancy);
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
case "fields": {
|
|
213
|
-
discrepancy.differences.forEach(updateCompatibilityFromFieldDiscrepancy);
|
|
214
|
-
break;
|
|
215
|
-
}
|
|
216
|
-
// No default
|
|
217
|
-
}
|
|
218
|
-
}
|
|
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);
|
|
219
66
|
|
|
220
67
|
return {
|
|
221
68
|
canView,
|
|
222
69
|
canUpgrade,
|
|
223
|
-
isEquivalent
|
|
70
|
+
isEquivalent,
|
|
224
71
|
};
|
|
225
72
|
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Compute a schema that `original` could be viewed as using adapters as needed.
|
|
229
|
-
*
|
|
230
|
-
* TODO: have a way for callers to get invalidated on schema updates.
|
|
231
|
-
*/
|
|
232
|
-
public adaptRepo(stored: TreeStoredSchema): AdaptedViewSchema {
|
|
233
|
-
// Sanity check on adapters:
|
|
234
|
-
// it's probably a bug if they use the never types,
|
|
235
|
-
// since there never is a reason to have a never type as an adapter input,
|
|
236
|
-
// and its impossible for an adapter to be correctly implemented if its output type is never
|
|
237
|
-
// (unless its input is also never).
|
|
238
|
-
|
|
239
|
-
for (const adapter of this.adapters?.tree ?? []) {
|
|
240
|
-
if (
|
|
241
|
-
isNeverTree(
|
|
242
|
-
this.policy,
|
|
243
|
-
this.viewSchemaAsStored,
|
|
244
|
-
this.viewSchemaAsStored.nodeSchema.get(adapter.output),
|
|
245
|
-
)
|
|
246
|
-
) {
|
|
247
|
-
fail(0xb3d /* tree adapter for stored adapter.output should not be never */);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const adapted = {
|
|
252
|
-
rootFieldSchema: this.adaptField(stored.rootFieldSchema),
|
|
253
|
-
nodeSchema: new Map<TreeNodeSchemaIdentifier, TreeNodeStoredSchema>(),
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
for (const [key, schema] of stored.nodeSchema) {
|
|
257
|
-
const adapatedTree = this.adaptTree(schema);
|
|
258
|
-
adapted.nodeSchema.set(key, adapatedTree);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// TODO: subset these adapters to the ones that were needed/used.
|
|
262
|
-
return new AdaptedViewSchema(this.adapters, adapted);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Adapt original such that it allows member types which can be adapted to its specified types.
|
|
267
|
-
*/
|
|
268
|
-
private adaptField(original: TreeFieldStoredSchema): TreeFieldStoredSchema {
|
|
269
|
-
if (original.types !== undefined) {
|
|
270
|
-
const types: Set<TreeNodeSchemaIdentifier> = new Set(original.types);
|
|
271
|
-
for (const treeAdapter of this.adapters?.tree ?? []) {
|
|
272
|
-
if (types.has(treeAdapter.input)) {
|
|
273
|
-
types.delete(treeAdapter.input);
|
|
274
|
-
types.add(treeAdapter.output);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return { kind: original.kind, types, persistedMetadata: undefined };
|
|
279
|
-
}
|
|
280
|
-
return original;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
private adaptTree(original: TreeNodeStoredSchema): TreeNodeStoredSchema {
|
|
284
|
-
// TODO: support adapters like missing field adapters.
|
|
285
|
-
return original;
|
|
286
|
-
}
|
|
287
73
|
}
|
|
@@ -197,10 +197,13 @@ export function enumEntries(
|
|
|
197
197
|
}
|
|
198
198
|
// At this point, it is expected that all remaining cases are reverse mappings,
|
|
199
199
|
// but do some asserts to ensure that the above logic is sufficient.
|
|
200
|
-
assert(
|
|
200
|
+
assert(
|
|
201
|
+
typeof value === "string",
|
|
202
|
+
0xbe4 /* expected reverse mapping and thus a string value */,
|
|
203
|
+
);
|
|
201
204
|
assert(
|
|
202
205
|
Number.parseFloat(key).toString() === key,
|
|
203
|
-
|
|
206
|
+
0xbe5 /* expected reverse mapping and thus a key that is a normalized number */,
|
|
204
207
|
);
|
|
205
208
|
// Discard the reverse mapping.
|
|
206
209
|
return false;
|
|
@@ -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,10 +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
|
-
|
|
108
|
-
);
|
|
101
|
+
const config = new TreeViewConfigurationAlpha({
|
|
102
|
+
schema: normalizeFieldSchema(view),
|
|
103
|
+
});
|
|
104
|
+
const viewSchema = new SchemaCompatibilityTester(config);
|
|
109
105
|
return viewSchema.checkCompatibility(stored);
|
|
110
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
|
/**
|