@fluidframework/tree 2.73.0 → 2.74.0-368706
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 +2 -2
- package/api-report/tree.alpha.api.md +133 -85
- package/api-report/tree.beta.api.md +0 -1
- package/api-report/tree.legacy.beta.api.md +0 -1
- package/api-report/tree.legacy.public.api.md +0 -1
- package/api-report/tree.public.api.md +0 -1
- package/dist/alpha.d.ts +7 -2
- package/dist/codec/codec.d.ts +14 -1
- package/dist/codec/codec.d.ts.map +1 -1
- package/dist/codec/codec.js +11 -0
- package/dist/codec/codec.js.map +1 -1
- package/dist/codec/versioned/codec.d.ts +1 -1
- package/dist/codec/versioned/codec.d.ts.map +1 -1
- package/dist/codec/versioned/codec.js.map +1 -1
- package/dist/codec/versioned/format.d.ts +4 -1
- package/dist/codec/versioned/format.d.ts.map +1 -1
- package/dist/codec/versioned/format.js +4 -1
- package/dist/codec/versioned/format.js.map +1 -1
- package/dist/core/change-family/changeFamily.d.ts +4 -1
- package/dist/core/change-family/changeFamily.d.ts.map +1 -1
- package/dist/core/change-family/changeFamily.js.map +1 -1
- package/dist/core/change-family/index.d.ts +1 -1
- package/dist/core/change-family/index.d.ts.map +1 -1
- package/dist/core/change-family/index.js.map +1 -1
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/changeRebaser.d.ts +6 -1
- package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
- package/dist/core/rebase/changeRebaser.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 +2 -1
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js +5 -1
- package/dist/core/rebase/types.js.map +1 -1
- package/dist/core/rebase/utils.d.ts.map +1 -1
- package/dist/core/rebase/utils.js +25 -7
- package/dist/core/rebase/utils.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts +40 -13
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +21 -12
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/index.d.ts +4 -3
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js +6 -2
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/pathTree.d.ts +11 -3
- package/dist/core/tree/pathTree.d.ts.map +1 -1
- package/dist/core/tree/pathTree.js +14 -2
- package/dist/core/tree/pathTree.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/basicChunk.js +7 -0
- package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkTree.js +4 -1
- package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -2
- package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.js +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +15 -7
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +7 -2
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +90 -42
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js +234 -69
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -4
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +33 -28
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/default-schema/index.d.ts +2 -1
- package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/index.js +4 -2
- package/dist/feature-libraries/default-schema/index.js.map +1 -1
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +36 -0
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js +126 -0
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
- package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
- package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
- package/dist/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
- package/dist/feature-libraries/deltaUtils.d.ts +1 -0
- package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
- package/dist/feature-libraries/deltaUtils.js +6 -1
- package/dist/feature-libraries/deltaUtils.js.map +1 -1
- package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts +30 -8
- package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/detachedFieldIndexSummarizer.js +41 -11
- package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts +9 -0
- package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/context.js +6 -0
- package/dist/feature-libraries/flex-tree/context.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts +8 -7
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +37 -8
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/forest-summary/codec.d.ts +2 -2
- package/dist/feature-libraries/forest-summary/codec.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/codec.js +4 -4
- package/dist/feature-libraries/forest-summary/codec.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +9 -13
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +22 -27
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/forest-summary/format.d.ts +41 -5
- package/dist/feature-libraries/forest-summary/format.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/format.js +7 -7
- package/dist/feature-libraries/forest-summary/format.js.map +1 -1
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +11 -9
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +16 -29
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
- package/dist/feature-libraries/forest-summary/index.d.ts +2 -1
- package/dist/feature-libraries/forest-summary/index.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/index.js +3 -2
- package/dist/feature-libraries/forest-summary/index.js.map +1 -1
- package/dist/feature-libraries/forest-summary/summaryTypes.d.ts +47 -0
- package/dist/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryTypes.js +57 -0
- package/dist/feature-libraries/forest-summary/summaryTypes.js.map +1 -0
- package/dist/feature-libraries/index.d.ts +5 -5
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +7 -4
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/mapTreeCursor.d.ts.map +1 -1
- package/dist/feature-libraries/mapTreeCursor.js +1 -0
- package/dist/feature-libraries/mapTreeCursor.js.map +1 -1
- package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/mitigatedChangeFamily.js +2 -2
- package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.d.ts +18 -2
- package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.js +54 -3
- package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +97 -21
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js +4 -7
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +20 -52
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldKind.d.ts +25 -13
- package/dist/feature-libraries/modular-schema/fieldKind.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldKind.js +0 -21
- package/dist/feature-libraries/modular-schema/fieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js +7 -10
- package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.js +2 -2
- package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +5 -5
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +12 -8
- package/dist/feature-libraries/modular-schema/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +17 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +388 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +17 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js +413 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +4 -4
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -284
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +48 -15
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +1298 -465
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/{modularChangeFormat.d.ts → modularChangeFormatV1.d.ts} +2 -2
- package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -0
- package/dist/feature-libraries/modular-schema/{modularChangeFormat.js → modularChangeFormatV1.js} +5 -5
- package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +146 -0
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +32 -0
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +50 -10
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js +24 -3
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/dist/feature-libraries/optional-field/index.d.ts +2 -2
- package/dist/feature-libraries/optional-field/index.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/index.js +1 -2
- package/dist/feature-libraries/optional-field/index.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.d.ts +5 -26
- package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.js +217 -451
- package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +24 -33
- package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js +57 -28
- package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
- package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts +27 -8
- package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/schema-index/schemaSummarizer.js +42 -16
- package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.d.ts +6 -7
- package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.js +80 -256
- package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
- package/dist/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/formatV2.js +1 -0
- package/dist/feature-libraries/sequence-field/formatV2.js.map +1 -1
- package/dist/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
- package/dist/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/helperTypes.js.map +1 -1
- package/dist/feature-libraries/sequence-field/index.d.ts +2 -3
- package/dist/feature-libraries/sequence-field/index.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/index.js +1 -3
- package/dist/feature-libraries/sequence-field/index.js.map +1 -1
- package/dist/feature-libraries/sequence-field/invert.d.ts +3 -3
- package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/invert.js +65 -167
- package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
- package/dist/feature-libraries/sequence-field/markQueue.d.ts +2 -2
- package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.js +7 -86
- package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
- package/dist/feature-libraries/sequence-field/rebase.d.ts +3 -3
- package/dist/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/rebase.js +106 -112
- package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/replaceRevisions.js +16 -33
- package/dist/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +0 -2
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +358 -179
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js +20 -60
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
- package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +10 -10
- package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +14 -109
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/dist/feature-libraries/sequence-field/types.d.ts +30 -59
- package/dist/feature-libraries/sequence-field/types.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/types.js.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.d.ts +15 -24
- package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +111 -299
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/feature-libraries/treeCompressionUtils.d.ts +2 -12
- package/dist/feature-libraries/treeCompressionUtils.d.ts.map +1 -1
- package/dist/feature-libraries/treeCompressionUtils.js +4 -14
- package/dist/feature-libraries/treeCompressionUtils.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- 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 +1 -1
- package/dist/shared-tree/independentView.d.ts.map +1 -1
- package/dist/shared-tree/independentView.js.map +1 -1
- package/dist/shared-tree/index.d.ts +1 -1
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/schematizeTree.d.ts +4 -4
- package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
- package/dist/shared-tree/schematizeTree.js +2 -1
- package/dist/shared-tree/schematizeTree.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +1 -5
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +32 -33
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +18 -15
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +15 -4
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeCodecs.js +1 -0
- package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.d.ts +20 -8
- package/dist/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +25 -11
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts +6 -6
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js +2 -2
- package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/dist/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
- package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeEditBuilder.js +13 -6
- package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +1 -1
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +14 -12
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +66 -17
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +3 -2
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +4 -3
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/shared-tree-core/editManager.d.ts +2 -2
- package/dist/shared-tree-core/editManager.d.ts.map +1 -1
- package/dist/shared-tree-core/editManager.js +9 -9
- package/dist/shared-tree-core/editManager.js.map +1 -1
- package/dist/shared-tree-core/editManagerCodecs.d.ts +4 -0
- package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerCodecs.js +16 -6
- package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
- package/{lib/shared-tree-core/editManagerCodecsV5.d.ts → dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts} +3 -3
- package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -0
- package/dist/shared-tree-core/{editManagerCodecsV5.js → editManagerCodecsVSharedBranches.js} +7 -7
- package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -0
- package/dist/shared-tree-core/editManagerFormatCommons.d.ts +20 -6
- package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerFormatCommons.js +22 -7
- package/dist/shared-tree-core/editManagerFormatCommons.js.map +1 -1
- package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
- package/dist/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerFormatV1toV4.js +1 -0
- package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
- package/dist/shared-tree-core/{editManagerFormatV5.d.ts → editManagerFormatVSharedBranches.d.ts} +3 -3
- package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -0
- package/dist/shared-tree-core/{editManagerFormatV5.js → editManagerFormatVSharedBranches.js} +2 -2
- package/dist/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -0
- package/dist/shared-tree-core/editManagerSummarizer.d.ts +29 -9
- package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerSummarizer.js +41 -13
- package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
- package/dist/shared-tree-core/index.d.ts +5 -3
- package/dist/shared-tree-core/index.d.ts.map +1 -1
- package/dist/shared-tree-core/index.js +8 -1
- package/dist/shared-tree-core/index.js.map +1 -1
- package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
- package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
- package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
- package/{lib/shared-tree-core/messageCodecV5.d.ts → dist/shared-tree-core/messageCodecVSharedBranches.d.ts} +2 -2
- package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -0
- package/dist/shared-tree-core/{messageCodecV5.js → messageCodecVSharedBranches.js} +6 -6
- package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -0
- package/dist/shared-tree-core/messageCodecs.d.ts +4 -0
- package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
- package/dist/shared-tree-core/messageCodecs.js +16 -6
- package/dist/shared-tree-core/messageCodecs.js.map +1 -1
- package/dist/shared-tree-core/messageFormat.d.ts +20 -6
- package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
- package/dist/shared-tree-core/messageFormat.js +22 -7
- package/dist/shared-tree-core/messageFormat.js.map +1 -1
- package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +3 -2
- package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
- package/dist/shared-tree-core/messageFormatV1ToV4.js +8 -1
- package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
- package/dist/shared-tree-core/{messageFormatV5.d.ts → messageFormatVSharedBranches.d.ts} +5 -7
- package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -0
- package/dist/shared-tree-core/{messageFormatV5.js → messageFormatVSharedBranches.js} +3 -2
- package/dist/shared-tree-core/messageFormatVSharedBranches.js.map +1 -0
- package/dist/shared-tree-core/sharedTreeCore.d.ts +14 -47
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +30 -18
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/shared-tree-core/summaryTypes.d.ts +94 -0
- package/dist/shared-tree-core/summaryTypes.d.ts.map +1 -0
- package/dist/shared-tree-core/summaryTypes.js +47 -0
- package/dist/shared-tree-core/summaryTypes.js.map +1 -0
- package/dist/shared-tree-core/versionedSummarizer.d.ts +67 -0
- package/dist/shared-tree-core/versionedSummarizer.d.ts.map +1 -0
- package/dist/shared-tree-core/versionedSummarizer.js +63 -0
- package/dist/shared-tree-core/versionedSummarizer.js.map +1 -0
- package/dist/simple-tree/api/configuration.d.ts +3 -26
- package/dist/simple-tree/api/configuration.d.ts.map +1 -1
- package/dist/simple-tree/api/configuration.js +10 -21
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/dirtyIndex.d.ts +11 -0
- package/dist/simple-tree/api/dirtyIndex.d.ts.map +1 -1
- package/dist/simple-tree/api/dirtyIndex.js +7 -0
- package/dist/simple-tree/api/dirtyIndex.js.map +1 -1
- package/dist/simple-tree/api/discrepancies.d.ts +1 -1
- package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/dist/simple-tree/api/discrepancies.js.map +1 -1
- package/dist/simple-tree/api/getSimpleSchema.d.ts +3 -3
- package/dist/simple-tree/api/getSimpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/getSimpleSchema.js +9 -3
- package/dist/simple-tree/api/getSimpleSchema.js.map +1 -1
- package/dist/simple-tree/api/incrementalAllowedTypes.d.ts +16 -13
- package/dist/simple-tree/api/incrementalAllowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/api/incrementalAllowedTypes.js +24 -14
- package/dist/simple-tree/api/incrementalAllowedTypes.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +4 -5
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +5 -6
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +5 -5
- package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js +0 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/dist/simple-tree/api/schemaFromSimple.d.ts +6 -1
- package/dist/simple-tree/api/schemaFromSimple.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFromSimple.js +5 -0
- package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/dist/simple-tree/api/schemaStatics.d.ts +12 -12
- package/dist/simple-tree/api/simpleSchemaCodec.d.ts +15 -3
- package/dist/simple-tree/api/simpleSchemaCodec.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleSchemaCodec.js +18 -6
- package/dist/simple-tree/api/simpleSchemaCodec.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts +8 -1
- package/dist/simple-tree/api/snapshotCompatibilityChecker.d.ts.map +1 -1
- package/dist/simple-tree/api/snapshotCompatibilityChecker.js +13 -8
- package/dist/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/api/typesUnsafe.d.ts +3 -3
- package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
- package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
- package/dist/simple-tree/core/allowedTypes.d.ts +2 -2
- package/dist/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/core/allowedTypes.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +1 -1
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +2 -3
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/toStored.d.ts +17 -15
- package/dist/simple-tree/core/toStored.d.ts.map +1 -1
- package/dist/simple-tree/core/toStored.js +5 -40
- package/dist/simple-tree/core/toStored.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +1 -0
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts +15 -15
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.js +59 -8
- package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/dist/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/walkSchema.js +4 -0
- package/dist/simple-tree/core/walkSchema.js.map +1 -1
- package/dist/simple-tree/createContext.d.ts.map +1 -1
- package/dist/simple-tree/createContext.js +20 -5
- package/dist/simple-tree/createContext.js.map +1 -1
- package/dist/simple-tree/fieldSchema.d.ts +7 -7
- package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
- package/dist/simple-tree/fieldSchema.js.map +1 -1
- package/dist/simple-tree/index.d.ts +8 -7
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +16 -13
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/leafNodeSchema.d.ts +5 -5
- package/dist/simple-tree/leafNodeSchema.d.ts.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 +6 -3
- package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
- package/dist/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
- package/dist/simple-tree/node-kinds/common.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/common.js +1 -1
- package/dist/simple-tree/node-kinds/common.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNode.js +2 -2
- package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
- package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNode.js +19 -18
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +2 -2
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.js +4 -2
- package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts +3 -3
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +54 -47
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +183 -125
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/simpleSchema.d.ts +55 -23
- package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/simpleSchema.js +17 -0
- package/dist/simple-tree/simpleSchema.js.map +1 -1
- package/dist/simple-tree/simpleSchemaFormatV1.d.ts +1 -1
- package/dist/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
- package/dist/simple-tree/simpleSchemaFormatV1.js +8 -1
- package/dist/simple-tree/simpleSchemaFormatV1.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts +58 -11
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +205 -30
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/treeSchema.d.ts +23 -0
- package/dist/simple-tree/treeSchema.d.ts.map +1 -0
- package/dist/simple-tree/treeSchema.js +25 -0
- package/dist/simple-tree/treeSchema.js.map +1 -0
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +13 -4
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +29 -11
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/dist/tableSchema.d.ts +117 -63
- package/dist/tableSchema.d.ts.map +1 -1
- package/dist/tableSchema.js +159 -58
- package/dist/tableSchema.js.map +1 -1
- package/dist/treeFactory.d.ts +5 -0
- package/dist/treeFactory.d.ts.map +1 -1
- package/dist/treeFactory.js +29 -8
- package/dist/treeFactory.js.map +1 -1
- package/dist/util/breakable.js +3 -3
- package/dist/util/breakable.js.map +1 -1
- package/dist/util/index.d.ts +2 -1
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +4 -1
- package/dist/util/index.js.map +1 -1
- package/dist/util/rangeMap.d.ts +24 -12
- package/dist/util/rangeMap.d.ts.map +1 -1
- package/dist/util/rangeMap.js +46 -6
- package/dist/util/rangeMap.js.map +1 -1
- package/dist/util/readSnapshotBlob.d.ts +13 -0
- package/dist/util/readSnapshotBlob.d.ts.map +1 -0
- package/dist/util/readSnapshotBlob.js +18 -0
- package/dist/util/readSnapshotBlob.js.map +1 -0
- package/dist/util/typeCheckTests.d.ts.map +1 -1
- package/dist/util/typeCheckTests.js.map +1 -1
- package/lib/alpha.d.ts +7 -2
- package/lib/codec/codec.d.ts +14 -1
- package/lib/codec/codec.d.ts.map +1 -1
- package/lib/codec/codec.js +11 -0
- package/lib/codec/codec.js.map +1 -1
- package/lib/codec/versioned/codec.d.ts +1 -1
- package/lib/codec/versioned/codec.d.ts.map +1 -1
- package/lib/codec/versioned/codec.js.map +1 -1
- package/lib/codec/versioned/format.d.ts +4 -1
- package/lib/codec/versioned/format.d.ts.map +1 -1
- package/lib/codec/versioned/format.js +4 -1
- package/lib/codec/versioned/format.js.map +1 -1
- package/lib/core/change-family/changeFamily.d.ts +4 -1
- package/lib/core/change-family/changeFamily.d.ts.map +1 -1
- package/lib/core/change-family/changeFamily.js.map +1 -1
- package/lib/core/change-family/index.d.ts +1 -1
- package/lib/core/change-family/index.d.ts.map +1 -1
- package/lib/core/change-family/index.js.map +1 -1
- package/lib/core/index.d.ts +3 -3
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +2 -2
- package/lib/core/index.js.map +1 -1
- package/lib/core/rebase/changeRebaser.d.ts +6 -1
- package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
- package/lib/core/rebase/changeRebaser.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 +2 -1
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js +3 -0
- package/lib/core/rebase/types.js.map +1 -1
- package/lib/core/rebase/utils.d.ts.map +1 -1
- package/lib/core/rebase/utils.js +25 -7
- package/lib/core/rebase/utils.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts +40 -13
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +22 -13
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/index.d.ts +4 -3
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js +3 -2
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/pathTree.d.ts +11 -3
- package/lib/core/tree/pathTree.d.ts.map +1 -1
- package/lib/core/tree/pathTree.js +12 -1
- package/lib/core/tree/pathTree.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/basicChunk.js +8 -1
- package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkTree.js +4 -1
- package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +2 -2
- package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/codecs.js +2 -2
- package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts +15 -7
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +7 -2
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +90 -42
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js +232 -69
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -4
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +34 -29
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/default-schema/index.d.ts +2 -1
- package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/index.js +2 -1
- package/lib/feature-libraries/default-schema/index.js.map +1 -1
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +36 -0
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +1 -0
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js +122 -0
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js.map +1 -0
- package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts +7 -6
- package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/mappedEditBuilder.js +15 -0
- package/lib/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
- package/lib/feature-libraries/deltaUtils.d.ts +1 -0
- package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
- package/lib/feature-libraries/deltaUtils.js +5 -1
- package/lib/feature-libraries/deltaUtils.js.map +1 -1
- package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts +30 -8
- package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/detachedFieldIndexSummarizer.js +38 -8
- package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts +9 -0
- package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/context.js +6 -0
- package/lib/feature-libraries/flex-tree/context.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +6 -6
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts +8 -7
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +38 -9
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/forest-summary/codec.d.ts +2 -2
- package/lib/feature-libraries/forest-summary/codec.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/codec.js +5 -5
- package/lib/feature-libraries/forest-summary/codec.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +9 -13
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +19 -24
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/forest-summary/format.d.ts +41 -5
- package/lib/feature-libraries/forest-summary/format.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/format.js +3 -3
- package/lib/feature-libraries/forest-summary/format.js.map +1 -1
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +11 -9
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +13 -26
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
- package/lib/feature-libraries/forest-summary/index.d.ts +2 -1
- package/lib/feature-libraries/forest-summary/index.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/index.js +2 -1
- package/lib/feature-libraries/forest-summary/index.js.map +1 -1
- package/lib/feature-libraries/forest-summary/summaryTypes.d.ts +47 -0
- package/lib/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryTypes.js +53 -0
- package/lib/feature-libraries/forest-summary/summaryTypes.js.map +1 -0
- package/lib/feature-libraries/index.d.ts +5 -5
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +4 -4
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/mapTreeCursor.d.ts.map +1 -1
- package/lib/feature-libraries/mapTreeCursor.js +2 -1
- package/lib/feature-libraries/mapTreeCursor.js.map +1 -1
- package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/mitigatedChangeFamily.js +2 -2
- package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.d.ts +18 -2
- package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.js +55 -5
- package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +97 -21
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js +3 -5
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +20 -52
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldKind.d.ts +25 -13
- package/lib/feature-libraries/modular-schema/fieldKind.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldKind.js +0 -21
- package/lib/feature-libraries/modular-schema/fieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js +7 -10
- package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.js +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts +5 -5
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js +4 -3
- package/lib/feature-libraries/modular-schema/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +17 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +384 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +17 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js +409 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +4 -4
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +10 -286
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +48 -15
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +1284 -458
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/{modularChangeFormat.d.ts → modularChangeFormatV1.d.ts} +2 -2
- package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -0
- package/lib/feature-libraries/modular-schema/{modularChangeFormat.js → modularChangeFormatV1.js} +2 -2
- package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +146 -0
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +29 -0
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +50 -10
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js +20 -2
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/lib/feature-libraries/optional-field/index.d.ts +2 -2
- package/lib/feature-libraries/optional-field/index.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/index.js +1 -1
- package/lib/feature-libraries/optional-field/index.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.d.ts +5 -26
- package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.js +217 -449
- package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +24 -33
- package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js +55 -26
- package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
- package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts +27 -8
- package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/schema-index/schemaSummarizer.js +38 -12
- package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.d.ts +6 -7
- package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.js +82 -258
- package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
- package/lib/feature-libraries/sequence-field/formatV2.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/formatV2.js +1 -0
- package/lib/feature-libraries/sequence-field/formatV2.js.map +1 -1
- package/lib/feature-libraries/sequence-field/helperTypes.d.ts +14 -10
- package/lib/feature-libraries/sequence-field/helperTypes.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/helperTypes.js.map +1 -1
- package/lib/feature-libraries/sequence-field/index.d.ts +2 -3
- package/lib/feature-libraries/sequence-field/index.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/index.js +0 -1
- package/lib/feature-libraries/sequence-field/index.js.map +1 -1
- package/lib/feature-libraries/sequence-field/invert.d.ts +3 -3
- package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/invert.js +67 -169
- package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
- package/lib/feature-libraries/sequence-field/markQueue.d.ts +2 -2
- package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +4 -56
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.js +6 -80
- package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
- package/lib/feature-libraries/sequence-field/rebase.d.ts +3 -3
- package/lib/feature-libraries/sequence-field/rebase.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/rebase.js +108 -114
- package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/replaceRevisions.js +16 -33
- package/lib/feature-libraries/sequence-field/replaceRevisions.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js +0 -2
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +22 -4
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +350 -175
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js +21 -61
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +2 -2
- package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +10 -10
- package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +3 -2
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +14 -109
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/lib/feature-libraries/sequence-field/types.d.ts +30 -59
- package/lib/feature-libraries/sequence-field/types.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/types.js.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.d.ts +15 -24
- package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +107 -292
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/feature-libraries/treeCompressionUtils.d.ts +2 -12
- package/lib/feature-libraries/treeCompressionUtils.d.ts.map +1 -1
- package/lib/feature-libraries/treeCompressionUtils.js +3 -13
- package/lib/feature-libraries/treeCompressionUtils.js.map +1 -1
- package/lib/index.d.ts +3 -3
- 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 +1 -1
- package/lib/shared-tree/independentView.d.ts.map +1 -1
- package/lib/shared-tree/independentView.js.map +1 -1
- package/lib/shared-tree/index.d.ts +1 -1
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/schematizeTree.d.ts +4 -4
- 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 +1 -5
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +35 -36
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +18 -15
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +15 -4
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeCodecs.js +1 -0
- package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.d.ts +20 -8
- package/lib/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +25 -11
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts +6 -6
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js +3 -3
- package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/lib/shared-tree/sharedTreeEditBuilder.d.ts +16 -6
- package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeEditBuilder.js +11 -5
- package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +2 -2
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +14 -12
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +69 -20
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +3 -2
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +4 -3
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/shared-tree-core/editManager.d.ts +2 -2
- package/lib/shared-tree-core/editManager.d.ts.map +1 -1
- package/lib/shared-tree-core/editManager.js +9 -9
- package/lib/shared-tree-core/editManager.js.map +1 -1
- package/lib/shared-tree-core/editManagerCodecs.d.ts +4 -0
- package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerCodecs.js +14 -5
- package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
- package/{dist/shared-tree-core/editManagerCodecsV5.d.ts → lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts} +3 -3
- package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -0
- package/lib/shared-tree-core/{editManagerCodecsV5.js → editManagerCodecsVSharedBranches.js} +4 -4
- package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -0
- package/lib/shared-tree-core/editManagerFormatCommons.d.ts +20 -6
- package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerFormatCommons.js +22 -7
- package/lib/shared-tree-core/editManagerFormatCommons.js.map +1 -1
- package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts +2 -2
- package/lib/shared-tree-core/editManagerFormatV1toV4.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerFormatV1toV4.js +1 -0
- package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
- package/lib/shared-tree-core/{editManagerFormatV5.d.ts → editManagerFormatVSharedBranches.d.ts} +3 -3
- package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts.map +1 -0
- package/lib/shared-tree-core/{editManagerFormatV5.js → editManagerFormatVSharedBranches.js} +2 -2
- package/lib/shared-tree-core/editManagerFormatVSharedBranches.js.map +1 -0
- package/lib/shared-tree-core/editManagerSummarizer.d.ts +29 -9
- package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerSummarizer.js +39 -11
- package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
- package/lib/shared-tree-core/index.d.ts +5 -3
- package/lib/shared-tree-core/index.d.ts.map +1 -1
- package/lib/shared-tree-core/index.js +4 -2
- package/lib/shared-tree-core/index.js.map +1 -1
- package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +1 -1
- package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
- package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
- package/{dist/shared-tree-core/messageCodecV5.d.ts → lib/shared-tree-core/messageCodecVSharedBranches.d.ts} +2 -2
- package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -0
- package/lib/shared-tree-core/{messageCodecV5.js → messageCodecVSharedBranches.js} +3 -3
- package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -0
- package/lib/shared-tree-core/messageCodecs.d.ts +4 -0
- package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
- package/lib/shared-tree-core/messageCodecs.js +14 -5
- package/lib/shared-tree-core/messageCodecs.js.map +1 -1
- package/lib/shared-tree-core/messageFormat.d.ts +20 -6
- package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
- package/lib/shared-tree-core/messageFormat.js +22 -7
- package/lib/shared-tree-core/messageFormat.js.map +1 -1
- package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +3 -2
- package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
- package/lib/shared-tree-core/messageFormatV1ToV4.js +8 -1
- package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
- package/lib/shared-tree-core/{messageFormatV5.d.ts → messageFormatVSharedBranches.d.ts} +5 -7
- package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts.map +1 -0
- package/lib/shared-tree-core/{messageFormatV5.js → messageFormatVSharedBranches.js} +3 -2
- package/lib/shared-tree-core/messageFormatVSharedBranches.js.map +1 -0
- package/lib/shared-tree-core/sharedTreeCore.d.ts +14 -47
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +28 -16
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/shared-tree-core/summaryTypes.d.ts +94 -0
- package/lib/shared-tree-core/summaryTypes.d.ts.map +1 -0
- package/lib/shared-tree-core/summaryTypes.js +43 -0
- package/lib/shared-tree-core/summaryTypes.js.map +1 -0
- package/lib/shared-tree-core/versionedSummarizer.d.ts +67 -0
- package/lib/shared-tree-core/versionedSummarizer.d.ts.map +1 -0
- package/lib/shared-tree-core/versionedSummarizer.js +59 -0
- package/lib/shared-tree-core/versionedSummarizer.js.map +1 -0
- package/lib/simple-tree/api/configuration.d.ts +3 -26
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- package/lib/simple-tree/api/configuration.js +14 -25
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/dirtyIndex.d.ts +11 -0
- package/lib/simple-tree/api/dirtyIndex.d.ts.map +1 -1
- package/lib/simple-tree/api/dirtyIndex.js +7 -0
- package/lib/simple-tree/api/dirtyIndex.js.map +1 -1
- package/lib/simple-tree/api/discrepancies.d.ts +1 -1
- package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/lib/simple-tree/api/discrepancies.js.map +1 -1
- package/lib/simple-tree/api/getSimpleSchema.d.ts +3 -3
- package/lib/simple-tree/api/getSimpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/getSimpleSchema.js +9 -3
- package/lib/simple-tree/api/getSimpleSchema.js.map +1 -1
- package/lib/simple-tree/api/incrementalAllowedTypes.d.ts +16 -13
- package/lib/simple-tree/api/incrementalAllowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/api/incrementalAllowedTypes.js +23 -13
- package/lib/simple-tree/api/incrementalAllowedTypes.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +4 -5
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +3 -4
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +5 -5
- package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js +0 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/lib/simple-tree/api/schemaFromSimple.d.ts +6 -1
- package/lib/simple-tree/api/schemaFromSimple.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFromSimple.js +5 -0
- package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/lib/simple-tree/api/schemaStatics.d.ts +12 -12
- package/lib/simple-tree/api/simpleSchemaCodec.d.ts +15 -3
- package/lib/simple-tree/api/simpleSchemaCodec.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleSchemaCodec.js +15 -3
- package/lib/simple-tree/api/simpleSchemaCodec.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts +8 -1
- package/lib/simple-tree/api/snapshotCompatibilityChecker.d.ts.map +1 -1
- package/lib/simple-tree/api/snapshotCompatibilityChecker.js +15 -10
- package/lib/simple-tree/api/snapshotCompatibilityChecker.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/api/typesUnsafe.d.ts +3 -3
- package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
- package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
- package/lib/simple-tree/core/allowedTypes.d.ts +2 -2
- package/lib/simple-tree/core/allowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/core/allowedTypes.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +1 -1
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +1 -1
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/toStored.d.ts +17 -15
- package/lib/simple-tree/core/toStored.d.ts.map +1 -1
- package/lib/simple-tree/core/toStored.js +4 -37
- package/lib/simple-tree/core/toStored.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +1 -0
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts +15 -15
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js +58 -8
- package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/lib/simple-tree/core/walkSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/walkSchema.js +5 -1
- package/lib/simple-tree/core/walkSchema.js.map +1 -1
- package/lib/simple-tree/createContext.d.ts.map +1 -1
- package/lib/simple-tree/createContext.js +20 -5
- package/lib/simple-tree/createContext.js.map +1 -1
- package/lib/simple-tree/fieldSchema.d.ts +7 -7
- package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
- package/lib/simple-tree/fieldSchema.js.map +1 -1
- package/lib/simple-tree/index.d.ts +8 -7
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +6 -5
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/leafNodeSchema.d.ts +5 -5
- package/lib/simple-tree/leafNodeSchema.d.ts.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 +7 -4
- package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts +3 -3
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNodeTypes.js.map +1 -1
- package/lib/simple-tree/node-kinds/common.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/common.js +2 -2
- package/lib/simple-tree/node-kinds/common.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNode.js +2 -2
- package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts +3 -3
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNode.js +20 -19
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +2 -2
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.js +4 -2
- package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts +3 -3
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNodeTypes.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +54 -47
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +183 -124
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/simpleSchema.d.ts +55 -23
- package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/simpleSchema.js +16 -1
- package/lib/simple-tree/simpleSchema.js.map +1 -1
- package/lib/simple-tree/simpleSchemaFormatV1.d.ts +1 -1
- package/lib/simple-tree/simpleSchemaFormatV1.d.ts.map +1 -1
- package/lib/simple-tree/simpleSchemaFormatV1.js +8 -1
- package/lib/simple-tree/simpleSchemaFormatV1.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts +58 -11
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +204 -31
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/treeSchema.d.ts +23 -0
- package/lib/simple-tree/treeSchema.d.ts.map +1 -0
- package/lib/simple-tree/treeSchema.js +21 -0
- package/lib/simple-tree/treeSchema.js.map +1 -0
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +13 -4
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +26 -9
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/lib/tableSchema.d.ts +117 -63
- package/lib/tableSchema.d.ts.map +1 -1
- package/lib/tableSchema.js +160 -59
- package/lib/tableSchema.js.map +1 -1
- package/lib/treeFactory.d.ts +5 -0
- package/lib/treeFactory.d.ts.map +1 -1
- package/lib/treeFactory.js +28 -8
- package/lib/treeFactory.js.map +1 -1
- package/lib/util/breakable.js +3 -3
- package/lib/util/breakable.js.map +1 -1
- package/lib/util/index.d.ts +2 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +2 -1
- package/lib/util/index.js.map +1 -1
- package/lib/util/rangeMap.d.ts +24 -12
- package/lib/util/rangeMap.d.ts.map +1 -1
- package/lib/util/rangeMap.js +44 -5
- package/lib/util/rangeMap.js.map +1 -1
- package/lib/util/readSnapshotBlob.d.ts +13 -0
- package/lib/util/readSnapshotBlob.d.ts.map +1 -0
- package/lib/util/readSnapshotBlob.js +14 -0
- package/lib/util/readSnapshotBlob.js.map +1 -0
- package/lib/util/typeCheckTests.d.ts.map +1 -1
- package/lib/util/typeCheckTests.js.map +1 -1
- package/package.json +22 -22
- package/src/codec/codec.ts +15 -1
- package/src/codec/versioned/codec.ts +1 -1
- package/src/codec/versioned/format.ts +4 -1
- package/src/core/change-family/changeFamily.ts +5 -0
- package/src/core/change-family/index.ts +1 -0
- package/src/core/index.ts +7 -2
- package/src/core/rebase/changeRebaser.ts +6 -1
- package/src/core/rebase/index.ts +1 -0
- package/src/core/rebase/types.ts +8 -1
- package/src/core/rebase/utils.ts +31 -7
- package/src/core/tree/detachedFieldIndex.ts +71 -14
- package/src/core/tree/index.ts +9 -3
- package/src/core/tree/pathTree.ts +16 -4
- package/src/feature-libraries/chunked-forest/basicChunk.ts +7 -1
- package/src/feature-libraries/chunked-forest/chunkTree.ts +6 -1
- package/src/feature-libraries/chunked-forest/codec/codecs.ts +3 -7
- package/src/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.ts +18 -11
- package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +9 -9
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +393 -127
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +35 -38
- package/src/feature-libraries/default-schema/index.ts +16 -5
- package/src/feature-libraries/default-schema/locationBasedEditBuilder.ts +180 -0
- package/src/feature-libraries/default-schema/mappedEditBuilder.ts +35 -9
- package/src/feature-libraries/deltaUtils.ts +6 -1
- package/src/feature-libraries/detachedFieldIndexSummarizer.ts +62 -15
- package/src/feature-libraries/flex-tree/context.ts +17 -0
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +7 -8
- package/src/feature-libraries/flex-tree/lazyField.ts +66 -24
- package/src/feature-libraries/forest-summary/codec.ts +8 -8
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +47 -39
- package/src/feature-libraries/forest-summary/format.ts +4 -4
- package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +23 -39
- package/src/feature-libraries/forest-summary/index.ts +2 -1
- package/src/feature-libraries/forest-summary/summaryTypes.ts +61 -0
- package/src/feature-libraries/index.ts +23 -14
- package/src/feature-libraries/mapTreeCursor.ts +2 -1
- package/src/feature-libraries/mitigatedChangeFamily.ts +3 -1
- package/src/feature-libraries/modular-schema/comparison.ts +63 -5
- package/src/feature-libraries/modular-schema/crossFieldQueries.ts +142 -44
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +36 -57
- package/src/feature-libraries/modular-schema/fieldKind.ts +24 -40
- package/src/feature-libraries/modular-schema/genericFieldKind.ts +10 -19
- package/src/feature-libraries/modular-schema/genericFieldKindCodecs.ts +1 -1
- package/src/feature-libraries/modular-schema/index.ts +21 -15
- package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +732 -0
- package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +790 -0
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +32 -505
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +2542 -742
- package/src/feature-libraries/modular-schema/{modularChangeFormat.ts → modularChangeFormatV1.ts} +2 -1
- package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +62 -0
- package/src/feature-libraries/modular-schema/modularChangeTypes.ts +98 -10
- package/src/feature-libraries/optional-field/index.ts +1 -3
- package/src/feature-libraries/optional-field/optionalField.ts +317 -574
- package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +24 -38
- package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +89 -35
- package/src/feature-libraries/schema-index/schemaSummarizer.ts +59 -18
- package/src/feature-libraries/sequence-field/compose.ts +134 -519
- package/src/feature-libraries/sequence-field/formatV2.ts +1 -0
- package/src/feature-libraries/sequence-field/helperTypes.ts +34 -19
- package/src/feature-libraries/sequence-field/index.ts +0 -9
- package/src/feature-libraries/sequence-field/invert.ts +103 -228
- package/src/feature-libraries/sequence-field/markQueue.ts +2 -2
- package/src/feature-libraries/sequence-field/moveEffectTable.ts +8 -191
- package/src/feature-libraries/sequence-field/rebase.ts +168 -203
- package/src/feature-libraries/sequence-field/replaceRevisions.ts +31 -52
- package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +0 -2
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +643 -220
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +56 -68
- package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +25 -27
- package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +19 -129
- package/src/feature-libraries/sequence-field/types.ts +34 -64
- package/src/feature-libraries/sequence-field/utils.ts +133 -346
- package/src/feature-libraries/treeCompressionUtils.ts +1 -15
- package/src/index.ts +7 -2
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/independentView.ts +1 -1
- package/src/shared-tree/index.ts +3 -2
- package/src/shared-tree/schematizeTree.ts +21 -8
- package/src/shared-tree/schematizingTreeView.ts +50 -68
- package/src/shared-tree/sharedTree.ts +51 -30
- package/src/shared-tree/sharedTreeChangeCodecs.ts +5 -1
- package/src/shared-tree/sharedTreeChangeEnricher.ts +31 -11
- package/src/shared-tree/sharedTreeChangeFamily.ts +9 -6
- package/src/shared-tree/sharedTreeEditBuilder.ts +46 -12
- package/src/shared-tree/treeAlpha.ts +2 -3
- package/src/shared-tree/treeCheckout.ts +106 -33
- package/src/shared-tree-core/branch.ts +8 -2
- package/src/shared-tree-core/editManager.ts +16 -2
- package/src/shared-tree-core/editManagerCodecs.ts +17 -5
- package/src/shared-tree-core/{editManagerCodecsV5.ts → editManagerCodecsVSharedBranches.ts} +3 -3
- package/src/shared-tree-core/editManagerFormatCommons.ts +22 -7
- package/src/shared-tree-core/editManagerFormatV1toV4.ts +3 -1
- package/src/shared-tree-core/{editManagerFormatV5.ts → editManagerFormatVSharedBranches.ts} +2 -2
- package/src/shared-tree-core/editManagerSummarizer.ts +58 -16
- package/src/shared-tree-core/index.ts +11 -3
- package/src/shared-tree-core/messageCodecV1ToV4.ts +2 -1
- package/src/shared-tree-core/{messageCodecV5.ts → messageCodecVSharedBranches.ts} +3 -3
- package/src/shared-tree-core/messageCodecs.ts +17 -5
- package/src/shared-tree-core/messageFormat.ts +22 -7
- package/src/shared-tree-core/messageFormatV1ToV4.ts +16 -2
- package/src/shared-tree-core/{messageFormatV5.ts → messageFormatVSharedBranches.ts} +4 -6
- package/src/shared-tree-core/sharedTreeCore.ts +67 -76
- package/src/shared-tree-core/summaryTypes.ts +122 -0
- package/src/shared-tree-core/versionedSummarizer.ts +107 -0
- package/src/simple-tree/api/configuration.ts +21 -68
- package/src/simple-tree/api/dirtyIndex.ts +11 -0
- package/src/simple-tree/api/discrepancies.ts +1 -1
- package/src/simple-tree/api/getSimpleSchema.ts +13 -6
- package/src/simple-tree/api/incrementalAllowedTypes.ts +34 -20
- package/src/simple-tree/api/index.ts +4 -5
- package/src/simple-tree/api/schemaCompatibilityTester.ts +1 -1
- package/src/simple-tree/api/schemaFactoryAlpha.ts +2 -2
- package/src/simple-tree/api/schemaFactoryRecursive.ts +0 -2
- package/src/simple-tree/api/schemaFromSimple.ts +11 -5
- package/src/simple-tree/api/simpleSchemaCodec.ts +17 -3
- package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +1 -1
- package/src/simple-tree/api/snapshotCompatibilityChecker.ts +18 -10
- package/src/simple-tree/api/tree.ts +1 -1
- package/src/simple-tree/api/typesUnsafe.ts +7 -3
- package/src/simple-tree/core/allowedTypes.ts +3 -3
- package/src/simple-tree/core/index.ts +2 -2
- package/src/simple-tree/core/toStored.ts +22 -55
- package/src/simple-tree/core/treeNodeKernel.ts +1 -0
- package/src/simple-tree/core/unhydratedFlexTree.ts +87 -36
- package/src/simple-tree/core/walkSchema.ts +6 -0
- package/src/simple-tree/createContext.ts +26 -11
- package/src/simple-tree/fieldSchema.ts +16 -7
- package/src/simple-tree/index.ts +13 -12
- package/src/simple-tree/node-kinds/array/arrayNode.ts +14 -7
- package/src/simple-tree/node-kinds/array/arrayNodeTypes.ts +3 -3
- package/src/simple-tree/node-kinds/common.ts +2 -5
- package/src/simple-tree/node-kinds/map/mapNode.ts +9 -6
- package/src/simple-tree/node-kinds/map/mapNodeTypes.ts +3 -3
- package/src/simple-tree/node-kinds/object/objectNode.ts +28 -27
- package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +6 -2
- package/src/simple-tree/node-kinds/record/recordNode.ts +15 -11
- package/src/simple-tree/node-kinds/record/recordNodeTypes.ts +3 -3
- package/src/simple-tree/prepareForInsertion.ts +343 -200
- package/src/simple-tree/simpleSchema.ts +79 -32
- package/src/simple-tree/simpleSchemaFormatV1.ts +9 -1
- package/src/simple-tree/toStoredSchema.ts +319 -61
- package/src/simple-tree/treeSchema.ts +54 -0
- package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +42 -14
- package/src/tableSchema.ts +485 -166
- package/src/treeFactory.ts +32 -9
- package/src/util/breakable.ts +4 -4
- package/src/util/index.ts +5 -0
- package/src/util/rangeMap.ts +72 -18
- package/src/util/readSnapshotBlob.ts +23 -0
- package/src/util/typeCheckTests.ts +0 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +0 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormat.js.map +0 -1
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -50
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
- package/dist/shared-tree-core/editManagerCodecsV5.d.ts.map +0 -1
- package/dist/shared-tree-core/editManagerCodecsV5.js.map +0 -1
- package/dist/shared-tree-core/editManagerFormatV5.d.ts.map +0 -1
- package/dist/shared-tree-core/editManagerFormatV5.js.map +0 -1
- package/dist/shared-tree-core/messageCodecV5.d.ts.map +0 -1
- package/dist/shared-tree-core/messageCodecV5.js.map +0 -1
- package/dist/shared-tree-core/messageFormatV5.d.ts.map +0 -1
- package/dist/shared-tree-core/messageFormatV5.js.map +0 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts +0 -40
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +0 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +0 -177
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +0 -1
- package/docs/main/sequence-field/move-composition.md +0 -46
- package/lib/feature-libraries/modular-schema/modularChangeFormat.d.ts.map +0 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormat.js.map +0 -1
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +0 -9
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +0 -1
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js +0 -46
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js.map +0 -1
- package/lib/shared-tree-core/editManagerCodecsV5.d.ts.map +0 -1
- package/lib/shared-tree-core/editManagerCodecsV5.js.map +0 -1
- package/lib/shared-tree-core/editManagerFormatV5.d.ts.map +0 -1
- package/lib/shared-tree-core/editManagerFormatV5.js.map +0 -1
- package/lib/shared-tree-core/messageCodecV5.d.ts.map +0 -1
- package/lib/shared-tree-core/messageCodecV5.js.map +0 -1
- package/lib/shared-tree-core/messageFormatV5.d.ts.map +0 -1
- package/lib/shared-tree-core/messageFormatV5.js.map +0 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts +0 -40
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +0 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +0 -171
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +0 -1
- package/src/feature-libraries/sequence-field/relevantRemovedRoots.ts +0 -57
- package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +0 -209
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.normalizeFieldId = exports.
|
|
7
|
+
exports.addNodeRename = exports.getFirstAttachField = exports.getFirstDetachField = exports.cloneRootTable = exports.newRootTable = exports.normalizeNodeId = exports.normalizeFieldId = exports.getNodeParent = exports.buildModularChangesetFromField = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
9
|
const sorted_btree_es6_1 = require("@tylerbu/sorted-btree-es6");
|
|
10
10
|
const index_js_1 = require("../../core/index.js");
|
|
@@ -67,18 +67,19 @@ class ModularChangeFamily {
|
|
|
67
67
|
return convertedChange;
|
|
68
68
|
}
|
|
69
69
|
compose(changes) {
|
|
70
|
-
const {
|
|
70
|
+
const { maxId } = getRevInfoFromTaggedChanges(changes);
|
|
71
71
|
const idState = { maxId };
|
|
72
72
|
const pairwiseDelegate = (left, right) => {
|
|
73
|
-
return this.composePair(left, right,
|
|
73
|
+
return this.composePair(left, right, idState);
|
|
74
74
|
};
|
|
75
75
|
const innerChanges = changes.map((change) => change.change);
|
|
76
76
|
return (0, index_js_2.balancedReduce)(innerChanges, pairwiseDelegate, makeModularChangeset);
|
|
77
77
|
}
|
|
78
|
-
composePair(change1, change2,
|
|
79
|
-
const
|
|
78
|
+
composePair(change1, change2, idState) {
|
|
79
|
+
const revInfos = composeRevInfos(change1.revisions, change2.revisions);
|
|
80
|
+
const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, rootNodes } = this.composeAllFields(change1, change2, revInfos, idState);
|
|
80
81
|
const { allBuilds, allDestroys, allRefreshers } = composeBuildsDestroysAndRefreshers(change1, change2);
|
|
81
|
-
|
|
82
|
+
const composed = makeModularChangeset({
|
|
82
83
|
fieldChanges,
|
|
83
84
|
nodeChanges,
|
|
84
85
|
nodeToParent,
|
|
@@ -86,10 +87,14 @@ class ModularChangeFamily {
|
|
|
86
87
|
crossFieldKeys,
|
|
87
88
|
maxId: idState.maxId,
|
|
88
89
|
revisions: revInfos,
|
|
90
|
+
rootNodes,
|
|
89
91
|
builds: allBuilds,
|
|
90
92
|
destroys: allDestroys,
|
|
91
93
|
refreshers: allRefreshers,
|
|
92
94
|
});
|
|
95
|
+
// XXX: This is an expensive assert which should be disabled before merging.
|
|
96
|
+
this.validateChangeset(composed);
|
|
97
|
+
return composed;
|
|
93
98
|
}
|
|
94
99
|
composeAllFields(potentiallyConflictedChange1, potentiallyConflictedChange2, revInfos, idState) {
|
|
95
100
|
// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.
|
|
@@ -110,34 +115,50 @@ class ModularChangeFamily {
|
|
|
110
115
|
const composedNodeChanges = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeChanges, change2.nodeChanges));
|
|
111
116
|
const composedNodeToParent = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeToParent, change2.nodeToParent));
|
|
112
117
|
const composedNodeAliases = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeAliases, change2.nodeAliases));
|
|
113
|
-
const
|
|
118
|
+
const pendingCompositions = {
|
|
119
|
+
nodeIdsToCompose: [],
|
|
120
|
+
affectedBaseFields: (0, index_js_2.newTupleBTree)(),
|
|
121
|
+
};
|
|
122
|
+
const movedCrossFieldKeys = (0, modularChangeTypes_js_1.newCrossFieldRangeTable)();
|
|
123
|
+
const removedCrossFieldKeys = (0, modularChangeTypes_js_1.newCrossFieldRangeTable)();
|
|
124
|
+
const composedRoots = composeRootTables(change1, change2, composedNodeToParent, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
|
|
125
|
+
const crossFieldTable = newComposeTable(change1, change2, composedRoots, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
|
|
114
126
|
const composedFields = this.composeFieldMaps(change1.fieldChanges, change2.fieldChanges, undefined, genId, crossFieldTable, revisionMetadata);
|
|
115
127
|
this.composeInvalidatedElements(crossFieldTable, composedFields, composedNodeChanges, composedNodeToParent, composedNodeAliases, genId, revisionMetadata);
|
|
116
|
-
|
|
117
|
-
|
|
128
|
+
for (const entry of crossFieldTable.renamesToDelete.entries()) {
|
|
129
|
+
deleteNodeRenameFrom(crossFieldTable.composedRootNodes, entry.start, entry.length);
|
|
130
|
+
}
|
|
131
|
+
for (const [nodeId, location] of crossFieldTable.movedNodeToParent.entries()) {
|
|
132
|
+
// Moved nodes are from change2.
|
|
133
|
+
// If there is a corresponding node in change1, then composedNodeToParent will already have the correct entry,
|
|
134
|
+
// because the location of the node is the same in change1 and the composed change
|
|
135
|
+
// (since they have the same input context).
|
|
136
|
+
if (crossFieldTable.newToBaseNodeId.get(nodeId) === undefined) {
|
|
137
|
+
composedNodeToParent.set(nodeId, location);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
118
140
|
return {
|
|
119
141
|
fieldChanges: composedFields,
|
|
120
142
|
nodeChanges: composedNodeChanges,
|
|
121
143
|
nodeToParent: composedNodeToParent,
|
|
122
144
|
nodeAliases: composedNodeAliases,
|
|
123
|
-
crossFieldKeys:
|
|
145
|
+
crossFieldKeys: composeCrossFieldKeyTables(change1.crossFieldKeys, change2.crossFieldKeys, crossFieldTable.movedCrossFieldKeys, crossFieldTable.removedCrossFieldKeys),
|
|
146
|
+
rootNodes: composedRoots,
|
|
124
147
|
};
|
|
125
148
|
}
|
|
126
149
|
composeInvalidatedField(fieldChange, crossFieldTable, genId, revisionMetadata) {
|
|
127
150
|
const context = crossFieldTable.fieldToContext.get(fieldChange);
|
|
128
151
|
(0, internal_1.assert)(context !== undefined, 0x8cc /* Should have context for every invalidated field */);
|
|
129
|
-
const {
|
|
152
|
+
const { change1: fieldChange1, change2: fieldChange2, composedChange } = context;
|
|
153
|
+
crossFieldTable.pendingCompositions.affectedBaseFields.delete(fieldIdKeyFromFieldId(context.fieldId));
|
|
130
154
|
const rebaser = getChangeHandler(this.fieldKinds, composedChange.fieldKind).rebaser;
|
|
131
155
|
const composeNodes = (child1, child2) => {
|
|
132
|
-
if (child1 !== undefined &&
|
|
133
|
-
|
|
134
|
-
getFromChangeAtomIdMap(crossFieldTable.newToBaseNodeId, child2) === undefined) {
|
|
135
|
-
setInChangeAtomIdMap(crossFieldTable.newToBaseNodeId, child2, child1);
|
|
136
|
-
crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
|
|
156
|
+
if (child1 !== undefined && child2 !== undefined) {
|
|
157
|
+
addNodesToCompose(crossFieldTable, child1, child2);
|
|
137
158
|
}
|
|
138
159
|
return child1 ?? child2 ?? (0, internal_1.fail)(0xb22 /* Should not compose two undefined nodes */);
|
|
139
160
|
};
|
|
140
|
-
const amendedChange = rebaser.compose(fieldChange1, fieldChange2, composeNodes, genId, new
|
|
161
|
+
const amendedChange = rebaser.compose(fieldChange1, fieldChange2, composeNodes, genId, new ComposeNodeManagerI(crossFieldTable, context.fieldId, false), revisionMetadata);
|
|
141
162
|
composedChange.change = (0, index_js_2.brand)(amendedChange);
|
|
142
163
|
}
|
|
143
164
|
/**
|
|
@@ -146,32 +167,23 @@ class ModularChangeFamily {
|
|
|
146
167
|
* - discovering that two node changesets refer to the same node (`nodeIdsToCompose`)
|
|
147
168
|
* - a previously composed field being invalidated by a cross field effect (`invalidatedFields`)
|
|
148
169
|
* - a field which was copied directly from an input changeset being invalidated by a cross field effect
|
|
149
|
-
* (`affectedBaseFields`
|
|
170
|
+
* (`affectedBaseFields`)
|
|
150
171
|
*
|
|
151
172
|
* Updating an element may invalidate further elements. This function runs until there is no more invalidation.
|
|
152
173
|
*/
|
|
153
174
|
composeInvalidatedElements(table, composedFields, composedNodes, composedNodeToParent, nodeAliases, genId, metadata) {
|
|
154
175
|
const pending = table.pendingCompositions;
|
|
155
|
-
while (
|
|
156
|
-
|
|
157
|
-
pending.affectedBaseFields
|
|
158
|
-
pending.affectedNewFields.length > 0) {
|
|
159
|
-
// Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.
|
|
160
|
-
for (const [id1, id2] of pending.nodeIdsToCompose) {
|
|
161
|
-
this.composeNodesById(table.baseChange.nodeChanges, table.newChange.nodeChanges, composedNodes, composedNodeToParent, nodeAliases, id1, id2, genId, table, metadata);
|
|
162
|
-
}
|
|
163
|
-
pending.nodeIdsToCompose.length = 0;
|
|
164
|
-
this.composeAffectedFields(table, table.baseChange, true, pending.affectedBaseFields, composedFields, composedNodes, genId, metadata);
|
|
165
|
-
this.composeAffectedFields(table, table.newChange, false, pending.affectedNewFields, composedFields, composedNodes, genId, metadata);
|
|
166
|
-
this.processInvalidatedCompositions(table, genId, metadata);
|
|
176
|
+
while (pending.nodeIdsToCompose.length > 0 || pending.affectedBaseFields.length > 0) {
|
|
177
|
+
this.processPendingNodeCompositions(table, composedNodes, composedNodeToParent, nodeAliases, genId, metadata);
|
|
178
|
+
this.composeAffectedFields(table, table.baseChange, pending.affectedBaseFields, composedFields, composedNodes, genId, metadata);
|
|
167
179
|
}
|
|
168
180
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.composeInvalidatedField(fieldChange, table, genId, metadata);
|
|
181
|
+
processPendingNodeCompositions(table, composedNodes, composedNodeToParent, nodeAliases, genId, metadata) {
|
|
182
|
+
// Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.
|
|
183
|
+
for (const [id1, id2] of table.pendingCompositions.nodeIdsToCompose) {
|
|
184
|
+
this.composeNodesById(table.baseChange, table.newChange, composedNodes, composedNodeToParent, nodeAliases, id1, id2, genId, table, metadata);
|
|
174
185
|
}
|
|
186
|
+
table.pendingCompositions.nodeIdsToCompose.length = 0;
|
|
175
187
|
}
|
|
176
188
|
/**
|
|
177
189
|
* Ensures that each field in `affectedFields` has been updated in the composition output.
|
|
@@ -184,38 +196,36 @@ class ModularChangeFamily {
|
|
|
184
196
|
* If not, they are assumed to be part of the new changeset.
|
|
185
197
|
* @param affectedFields - The set of fields to process.
|
|
186
198
|
*/
|
|
187
|
-
composeAffectedFields(table, change,
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
199
|
+
composeAffectedFields(table, change, affectedFields, composedFields, composedNodes, genId, metadata) {
|
|
200
|
+
const fieldsToProcess = affectedFields.clone();
|
|
201
|
+
affectedFields.clear();
|
|
202
|
+
for (const fieldIdKey of fieldsToProcess.keys()) {
|
|
203
|
+
const fieldId = fieldIdFromFieldIdKey(fieldIdKey);
|
|
204
|
+
const fieldChange = fieldChangeFromId(change, fieldId);
|
|
191
205
|
if (table.fieldToContext.has(fieldChange) ||
|
|
192
206
|
table.newFieldToBaseField.has(fieldChange)) {
|
|
193
|
-
|
|
194
|
-
// If we've already processed this field then either it is up to date
|
|
195
|
-
// or there is pending inval which will be handled in processInvalidatedCompositions.
|
|
196
|
-
continue;
|
|
207
|
+
this.composeInvalidatedField(fieldChange, table, genId, metadata);
|
|
197
208
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
? [fieldChange, emptyChange]
|
|
201
|
-
: [emptyChange, fieldChange];
|
|
202
|
-
const composedField = this.composeFieldChanges(fieldId, change1, change2, genId, table, metadata);
|
|
203
|
-
if (fieldId.nodeId === undefined) {
|
|
204
|
-
composedFields.set(fieldId.field, composedField);
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
const nodeId = getFromChangeAtomIdMap(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId;
|
|
208
|
-
let nodeChangeset = nodeChangeFromId(composedNodes, nodeId);
|
|
209
|
-
if (!table.composedNodes.has(nodeChangeset)) {
|
|
210
|
-
nodeChangeset = cloneNodeChangeset(nodeChangeset);
|
|
211
|
-
setInChangeAtomIdMap(composedNodes, nodeId, nodeChangeset);
|
|
212
|
-
}
|
|
213
|
-
if (nodeChangeset.fieldChanges === undefined) {
|
|
214
|
-
nodeChangeset.fieldChanges = new Map();
|
|
209
|
+
else {
|
|
210
|
+
this.composeFieldWithNoNewChange(table, fieldChange, fieldId, composedFields, composedNodes, genId, metadata);
|
|
215
211
|
}
|
|
216
|
-
nodeChangeset.fieldChanges.set(fieldId.field, composedField);
|
|
217
212
|
}
|
|
218
|
-
|
|
213
|
+
}
|
|
214
|
+
composeFieldWithNoNewChange(table, baseFieldChange, fieldId, composedFields, composedNodes, genId, metadata) {
|
|
215
|
+
const emptyChange = this.createEmptyFieldChange(baseFieldChange.fieldKind);
|
|
216
|
+
const composedField = this.composeFieldChanges(fieldId, baseFieldChange, emptyChange, genId, table, metadata);
|
|
217
|
+
if (fieldId.nodeId === undefined) {
|
|
218
|
+
composedFields.set(fieldId.field, composedField);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const nodeId = normalizeNodeId((0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId, table.baseChange.nodeAliases);
|
|
222
|
+
// We clone the node changeset before mutating it, as it may be from one of the input changesets.
|
|
223
|
+
const nodeChangeset = cloneNodeChangeset(nodeChangeFromId(composedNodes, table.baseChange.nodeAliases, nodeId));
|
|
224
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(composedNodes, nodeId, nodeChangeset);
|
|
225
|
+
if (nodeChangeset.fieldChanges === undefined) {
|
|
226
|
+
nodeChangeset.fieldChanges = new Map();
|
|
227
|
+
}
|
|
228
|
+
nodeChangeset.fieldChanges.set(fieldId.field, composedField);
|
|
219
229
|
}
|
|
220
230
|
composeFieldMaps(change1, change2, parentId, genId, crossFieldTable, revisionMetadata) {
|
|
221
231
|
const composedFields = new Map();
|
|
@@ -225,6 +235,14 @@ class ModularChangeFamily {
|
|
|
225
235
|
for (const [field, fieldChange1] of change1) {
|
|
226
236
|
const fieldId = { nodeId: parentId, field };
|
|
227
237
|
const fieldChange2 = change2.get(field);
|
|
238
|
+
const cachedComposedFieldChange = crossFieldTable.fieldToContext.get(fieldChange1)?.composedChange;
|
|
239
|
+
if (fieldChange2 === undefined && cachedComposedFieldChange !== undefined) {
|
|
240
|
+
// This can happen if the field was previous processed in `composeFieldWithNoNewChange`.
|
|
241
|
+
// If `change2` does not have a change for this field, then without this check we would
|
|
242
|
+
// lose the composed field change and instead simply have `change1`'s change.
|
|
243
|
+
composedFields.set(field, cachedComposedFieldChange);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
228
246
|
const composedField = fieldChange2 !== undefined
|
|
229
247
|
? this.composeFieldChanges(fieldId, fieldChange1, fieldChange2, genId, crossFieldTable, revisionMetadata)
|
|
230
248
|
: fieldChange1;
|
|
@@ -244,17 +262,16 @@ class ModularChangeFamily {
|
|
|
244
262
|
* will be added to `crossFieldTable.pendingCompositions.nodeIdsToCompose`.
|
|
245
263
|
*
|
|
246
264
|
* Any fields which had cross-field information sent to them as part of this field composition
|
|
247
|
-
* will be added to
|
|
265
|
+
* will be added to `affectedBaseFields` in `crossFieldTable.pendingCompositions`.
|
|
248
266
|
*
|
|
249
267
|
* Any composed `FieldChange` which is invalidated by new cross-field information will be added to `crossFieldTable.invalidatedFields`.
|
|
250
268
|
*/
|
|
251
269
|
composeFieldChanges(fieldId, change1, change2, idAllocator, crossFieldTable, revisionMetadata) {
|
|
252
270
|
const { fieldKind, changeHandler, change1: change1Normalized, change2: change2Normalized, } = this.normalizeFieldChanges(change1, change2);
|
|
253
|
-
const manager = new
|
|
271
|
+
const manager = new ComposeNodeManagerI(crossFieldTable, fieldId);
|
|
254
272
|
const composedChange = changeHandler.rebaser.compose(change1Normalized, change2Normalized, (child1, child2) => {
|
|
255
273
|
if (child1 !== undefined && child2 !== undefined) {
|
|
256
|
-
|
|
257
|
-
crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
|
|
274
|
+
addNodesToCompose(crossFieldTable, child1, child2);
|
|
258
275
|
}
|
|
259
276
|
return child1 ?? child2 ?? (0, internal_1.fail)(0xb23 /* Should not compose two undefined nodes */);
|
|
260
277
|
}, idAllocator, manager, revisionMetadata);
|
|
@@ -271,19 +288,18 @@ class ModularChangeFamily {
|
|
|
271
288
|
crossFieldTable.newFieldToBaseField.set(change2, change1);
|
|
272
289
|
return composedField;
|
|
273
290
|
}
|
|
274
|
-
composeNodesById(
|
|
275
|
-
const nodeChangeset1 = nodeChangeFromId(
|
|
276
|
-
const nodeChangeset2 = nodeChangeFromId(
|
|
291
|
+
composeNodesById(change1, change2, composedNodes, composedNodeToParent, composedAliases, id1, id2, idAllocator, crossFieldTable, revisionMetadata) {
|
|
292
|
+
const nodeChangeset1 = nodeChangeFromId(change1.nodeChanges, change1.nodeAliases, id1);
|
|
293
|
+
const nodeChangeset2 = nodeChangeFromId(change2.nodeChanges, change2.nodeAliases, id2);
|
|
277
294
|
const composedNodeChangeset = this.composeNodeChanges(id1, nodeChangeset1, nodeChangeset2, idAllocator, crossFieldTable, revisionMetadata);
|
|
278
|
-
setInChangeAtomIdMap(composedNodes, id1, composedNodeChangeset);
|
|
295
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(composedNodes, id1, composedNodeChangeset);
|
|
279
296
|
if (!(0, index_js_1.areEqualChangeAtomIds)(id1, id2)) {
|
|
280
297
|
composedNodes.delete([id2.revision, id2.localId]);
|
|
281
298
|
composedNodeToParent.delete([id2.revision, id2.localId]);
|
|
282
|
-
setInChangeAtomIdMap(
|
|
299
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(composedAliases, id2, id1);
|
|
283
300
|
// We need to delete id1 to avoid forming a cycle in case id1 already had an alias.
|
|
284
|
-
|
|
301
|
+
composedAliases.delete([id1.revision, id1.localId]);
|
|
285
302
|
}
|
|
286
|
-
crossFieldTable.composedNodes.add(composedNodeChangeset);
|
|
287
303
|
}
|
|
288
304
|
composeNodeChanges(nodeId, change1, change2, genId, crossFieldTable, revisionMetadata) {
|
|
289
305
|
// WARNING: this composition logic assumes that we never make compositions of the following form:
|
|
@@ -334,9 +350,14 @@ class ModularChangeFamily {
|
|
|
334
350
|
}
|
|
335
351
|
const genId = (0, index_js_2.idAllocatorFromMaxId)(change.change.maxId ?? -1);
|
|
336
352
|
const crossFieldTable = {
|
|
337
|
-
|
|
353
|
+
change: change.change,
|
|
354
|
+
entries: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
338
355
|
originalFieldToContext: new Map(),
|
|
356
|
+
invertRevision: revisionForInvert,
|
|
339
357
|
invertedNodeToParent: (0, index_js_2.brand)(change.change.nodeToParent.clone()),
|
|
358
|
+
invalidatedFields: new Set(),
|
|
359
|
+
invertedRoots: invertRootTable(change.change, isRollback),
|
|
360
|
+
attachToDetachId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
340
361
|
};
|
|
341
362
|
const { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);
|
|
342
363
|
const revisionMetadata = (0, index_js_1.revisionMetadataSourceFromInfo)(oldRevInfos);
|
|
@@ -352,16 +373,18 @@ class ModularChangeFamily {
|
|
|
352
373
|
const originalFieldChange = fieldChange.change;
|
|
353
374
|
const context = crossFieldTable.originalFieldToContext.get(fieldChange);
|
|
354
375
|
(0, internal_1.assert)(context !== undefined, 0x851 /* Should have context for every invalidated field */);
|
|
355
|
-
const { invertedField
|
|
356
|
-
const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new
|
|
376
|
+
const { invertedField } = context;
|
|
377
|
+
const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new InvertNodeManagerI(crossFieldTable, context.fieldId), revisionMetadata);
|
|
357
378
|
invertedField.change = (0, index_js_2.brand)(amendedChange);
|
|
358
379
|
}
|
|
359
380
|
}
|
|
360
381
|
const crossFieldKeys = this.makeCrossFieldKeyTable(invertedFields, invertedNodes);
|
|
382
|
+
this.processInvertRenames(crossFieldTable);
|
|
361
383
|
return makeModularChangeset({
|
|
362
384
|
fieldChanges: invertedFields,
|
|
363
385
|
nodeChanges: invertedNodes,
|
|
364
386
|
nodeToParent: crossFieldTable.invertedNodeToParent,
|
|
387
|
+
rootNodes: crossFieldTable.invertedRoots,
|
|
365
388
|
nodeAliases: change.change.nodeAliases,
|
|
366
389
|
crossFieldKeys,
|
|
367
390
|
maxId: genId.getMaxId(),
|
|
@@ -375,7 +398,7 @@ class ModularChangeFamily {
|
|
|
375
398
|
const invertedFields = new Map();
|
|
376
399
|
for (const [field, fieldChange] of changes) {
|
|
377
400
|
const fieldId = { nodeId: parentId, field };
|
|
378
|
-
const manager = new
|
|
401
|
+
const manager = new InvertNodeManagerI(crossFieldTable, fieldId);
|
|
379
402
|
const invertedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(fieldChange.change, isRollback, genId, revisionForInvert, manager, revisionMetadata);
|
|
380
403
|
const invertedFieldChange = {
|
|
381
404
|
...fieldChange,
|
|
@@ -407,6 +430,12 @@ class ModularChangeFamily {
|
|
|
407
430
|
}
|
|
408
431
|
return inverse;
|
|
409
432
|
}
|
|
433
|
+
processInvertRenames(table) {
|
|
434
|
+
for (const { start: newAttachId, value: originalDetachId, length, } of table.attachToDetachId.entries()) {
|
|
435
|
+
// Note that the detach location is already set in `invertDetach`.
|
|
436
|
+
addNodeRename(table.invertedRoots, originalDetachId, newAttachId, length, undefined);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
410
439
|
rebase(taggedChange, potentiallyConflictedOver, revisionMetadata) {
|
|
411
440
|
// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.
|
|
412
441
|
// This means that we must rebase over a muted version of the conflicted changeset.
|
|
@@ -417,17 +446,26 @@ class ModularChangeFamily {
|
|
|
417
446
|
const maxId = Math.max(change.maxId ?? -1, over.change.maxId ?? -1);
|
|
418
447
|
const idState = { maxId };
|
|
419
448
|
const genId = (0, index_js_2.idAllocatorFromState)(idState);
|
|
449
|
+
const affectedBaseFields = (0, index_js_2.newTupleBTree)();
|
|
450
|
+
const nodesToRebase = [];
|
|
451
|
+
const rebasedNodeToParent = (0, index_js_2.brand)(change.nodeToParent.clone());
|
|
452
|
+
const rebaseVersion = Math.max(change.rebaseVersion, over.change.rebaseVersion);
|
|
453
|
+
const rebasedRootNodes = rebaseRoots(change, over.change, affectedBaseFields, nodesToRebase, rebasedNodeToParent, rebaseVersion);
|
|
420
454
|
const crossFieldTable = {
|
|
421
|
-
|
|
455
|
+
rebaseVersion,
|
|
456
|
+
entries: newDetachedEntryMap(),
|
|
422
457
|
newChange: change,
|
|
423
458
|
baseChange: over.change,
|
|
424
459
|
baseFieldToContext: new Map(),
|
|
460
|
+
baseRoots: over.change.rootNodes,
|
|
461
|
+
rebasedRootNodes,
|
|
425
462
|
baseToRebasedNodeId: (0, index_js_2.newTupleBTree)(),
|
|
426
463
|
rebasedFields: new Set(),
|
|
427
|
-
rebasedNodeToParent
|
|
428
|
-
|
|
464
|
+
rebasedNodeToParent,
|
|
465
|
+
rebasedDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
466
|
+
movedDetaches: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
429
467
|
nodeIdPairs: [],
|
|
430
|
-
affectedBaseFields
|
|
468
|
+
affectedBaseFields,
|
|
431
469
|
fieldsWithUnattachedChild: new Set(),
|
|
432
470
|
};
|
|
433
471
|
const getBaseRevisions = () => revisionInfoFromTaggedChange(over).map((info) => info.revision);
|
|
@@ -437,17 +475,22 @@ class ModularChangeFamily {
|
|
|
437
475
|
getBaseRevisions,
|
|
438
476
|
};
|
|
439
477
|
const rebasedNodes = (0, index_js_2.brand)(change.nodeChanges.clone());
|
|
440
|
-
const rebasedFields = this.rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, rebaseMetadata);
|
|
441
|
-
this.
|
|
478
|
+
const rebasedFields = this.rebaseIntersectingFields(nodesToRebase, crossFieldTable, rebasedNodes, genId, rebaseMetadata);
|
|
479
|
+
this.rebaseInvalidatedFields(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId);
|
|
480
|
+
fixupRebasedDetachLocations(crossFieldTable);
|
|
442
481
|
const constraintState = newConstraintState(change.constraintViolationCount ?? 0);
|
|
443
482
|
const revertConstraintState = newConstraintState(change.constraintViolationCountOnRevert ?? 0);
|
|
444
|
-
this.
|
|
483
|
+
this.updateConstraints(rebasedFields, rebasedNodes, rebasedRootNodes, constraintState, revertConstraintState);
|
|
484
|
+
const fieldsWithRootMoves = getFieldsWithRootMoves(crossFieldTable.rebasedRootNodes, change.nodeAliases);
|
|
485
|
+
const fieldToRootChanges = getFieldToRootChanges(crossFieldTable.rebasedRootNodes, change.nodeAliases);
|
|
445
486
|
const rebased = makeModularChangeset({
|
|
446
|
-
fieldChanges: this.pruneFieldMap(rebasedFields, rebasedNodes),
|
|
487
|
+
fieldChanges: this.pruneFieldMap(rebasedFields, undefined, rebasedNodes, crossFieldTable.rebasedNodeToParent, change.nodeAliases, crossFieldTable.rebasedRootNodes, fieldsWithRootMoves, fieldToRootChanges),
|
|
447
488
|
nodeChanges: rebasedNodes,
|
|
448
489
|
nodeToParent: crossFieldTable.rebasedNodeToParent,
|
|
490
|
+
rootNodes: this.pruneRoots(crossFieldTable.rebasedRootNodes, rebasedNodes, crossFieldTable.rebasedNodeToParent, change.nodeAliases, fieldsWithRootMoves, fieldToRootChanges),
|
|
491
|
+
// TODO: Do we need to include aliases for node changesets added during rebasing?
|
|
449
492
|
nodeAliases: change.nodeAliases,
|
|
450
|
-
crossFieldKeys: crossFieldTable.
|
|
493
|
+
crossFieldKeys: rebaseCrossFieldKeys(change.crossFieldKeys, crossFieldTable.movedDetaches, crossFieldTable.rebasedDetachLocations),
|
|
451
494
|
maxId: idState.maxId,
|
|
452
495
|
revisions: change.revisions,
|
|
453
496
|
constraintViolationCount: constraintState.violationCount,
|
|
@@ -455,158 +498,177 @@ class ModularChangeFamily {
|
|
|
455
498
|
builds: change.builds,
|
|
456
499
|
destroys: change.destroys,
|
|
457
500
|
refreshers: change.refreshers,
|
|
501
|
+
rebaseVersion,
|
|
458
502
|
});
|
|
503
|
+
// XXX: This is an expensive assert which should be disabled before merging.
|
|
504
|
+
this.validateChangeset(rebased);
|
|
459
505
|
return rebased;
|
|
460
506
|
}
|
|
461
507
|
// This performs a first pass on all fields which have both new and base changes.
|
|
462
508
|
// TODO: Can we also handle additional passes in this method?
|
|
463
|
-
rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, metadata) {
|
|
509
|
+
rebaseIntersectingFields(rootChanges, crossFieldTable, rebasedNodes, genId, metadata) {
|
|
464
510
|
const change = crossFieldTable.newChange;
|
|
465
511
|
const baseChange = crossFieldTable.baseChange;
|
|
466
512
|
const rebasedFields = this.rebaseFieldMap(change.fieldChanges, baseChange.fieldChanges, undefined, genId, crossFieldTable, metadata);
|
|
513
|
+
for (const [newChildChange, baseChildChange] of rootChanges) {
|
|
514
|
+
const rebasedNode = this.rebaseNodeChange(newChildChange, baseChildChange, genId, crossFieldTable, metadata);
|
|
515
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, newChildChange, rebasedNode);
|
|
516
|
+
}
|
|
467
517
|
// This loop processes all fields which have both base and new changes.
|
|
468
518
|
// Note that the call to `rebaseNodeChange` can add entries to `crossFieldTable.nodeIdPairs`.
|
|
469
519
|
for (const [newId, baseId, _attachState] of crossFieldTable.nodeIdPairs) {
|
|
470
520
|
const rebasedNode = this.rebaseNodeChange(newId, baseId, genId, crossFieldTable, metadata);
|
|
471
|
-
setInChangeAtomIdMap(rebasedNodes, newId, rebasedNode);
|
|
521
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, newId, rebasedNode);
|
|
472
522
|
}
|
|
473
523
|
return rebasedFields;
|
|
474
524
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
(0, internal_1.assert)(
|
|
484
|
-
if (
|
|
485
|
-
// This field has already been processed because there were changes to rebase.
|
|
486
|
-
continue;
|
|
487
|
-
}
|
|
488
|
-
// This field has no changes in the new changeset, otherwise it would have been added to
|
|
489
|
-
// `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.
|
|
490
|
-
const rebaseChild = (child, baseChild, stateChange) => {
|
|
491
|
-
(0, internal_1.assert)(child === undefined, 0x9c3 /* There should be no new changes in this field */);
|
|
525
|
+
rebaseFieldWithoutNewChanges(baseFieldChange, baseFieldId, crossFieldTable, rebasedFields, rebasedNodes, genId, metadata,
|
|
526
|
+
/**
|
|
527
|
+
* The ID of a node in `baseFieldChange` which should be included in the rebased field change.
|
|
528
|
+
*/
|
|
529
|
+
baseNodeId) {
|
|
530
|
+
// This field has no changes in the new changeset, otherwise it would have been added to
|
|
531
|
+
// `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.
|
|
532
|
+
const rebaseChild = (child, baseChild, stateChange) => {
|
|
533
|
+
(0, internal_1.assert)(child === undefined, 0x9c3 /* There should be no new changes in this field */);
|
|
534
|
+
if (baseChild === undefined || baseNodeId === undefined) {
|
|
492
535
|
return undefined;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
...baseFieldChange,
|
|
497
|
-
change: (0, index_js_2.brand)(handler.createEmpty()),
|
|
498
|
-
};
|
|
499
|
-
const rebasedNodeId = baseNodeId !== undefined
|
|
500
|
-
? rebasedNodeIdFromBaseNodeId(crossFieldTable, baseNodeId)
|
|
536
|
+
}
|
|
537
|
+
return (0, index_js_1.areEqualChangeAtomIds)(normalizeNodeId(baseChild, crossFieldTable.baseChange.nodeAliases), baseNodeId)
|
|
538
|
+
? baseNodeId
|
|
501
539
|
: undefined;
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
crossFieldTable
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
crossFieldTable.
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
540
|
+
};
|
|
541
|
+
const handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);
|
|
542
|
+
const fieldChange = {
|
|
543
|
+
...baseFieldChange,
|
|
544
|
+
change: (0, index_js_2.brand)(handler.createEmpty()),
|
|
545
|
+
};
|
|
546
|
+
const rebasedNodeId = baseFieldId.nodeId !== undefined
|
|
547
|
+
? rebasedNodeIdFromBaseNodeId(crossFieldTable, baseFieldId.nodeId)
|
|
548
|
+
: undefined;
|
|
549
|
+
const fieldId = { nodeId: rebasedNodeId, field: baseFieldId.field };
|
|
550
|
+
const rebasedField = handler.rebaser.rebase(fieldChange.change, baseFieldChange.change, rebaseChild, genId, new RebaseNodeManagerI(crossFieldTable, fieldId), metadata, crossFieldTable.rebaseVersion);
|
|
551
|
+
const rebasedFieldChange = {
|
|
552
|
+
...baseFieldChange,
|
|
553
|
+
change: (0, index_js_2.brand)(rebasedField),
|
|
554
|
+
};
|
|
555
|
+
const context = {
|
|
556
|
+
newChange: fieldChange,
|
|
557
|
+
baseChange: baseFieldChange,
|
|
558
|
+
rebasedChange: rebasedFieldChange,
|
|
559
|
+
fieldId,
|
|
560
|
+
baseNodeIds: (0, index_js_2.newTupleBTree)(),
|
|
561
|
+
};
|
|
562
|
+
if (baseNodeId !== undefined) {
|
|
563
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(context.baseNodeIds, baseNodeId, true);
|
|
564
|
+
}
|
|
565
|
+
crossFieldTable.baseFieldToContext.set(baseFieldChange, context);
|
|
566
|
+
crossFieldTable.rebasedFields.add(rebasedFieldChange);
|
|
567
|
+
this.attachRebasedField(rebasedFields, rebasedNodes, crossFieldTable, rebasedFieldChange, fieldId, genId, metadata);
|
|
568
|
+
}
|
|
569
|
+
rebaseInvalidatedFields(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId) {
|
|
570
|
+
while (crossFieldTable.affectedBaseFields.size > 0) {
|
|
571
|
+
const baseFields = crossFieldTable.affectedBaseFields.clone();
|
|
572
|
+
crossFieldTable.affectedBaseFields.clear();
|
|
573
|
+
for (const baseFieldIdKey of baseFields.keys()) {
|
|
574
|
+
const baseFieldId = normalizeFieldId(fieldIdFromFieldIdKey(baseFieldIdKey), crossFieldTable.baseChange.nodeAliases);
|
|
575
|
+
const baseField = fieldChangeFromId(crossFieldTable.baseChange, baseFieldId);
|
|
576
|
+
(0, internal_1.assert)(baseField !== undefined, 0x9c2 /* Cross field key registered for empty field */);
|
|
577
|
+
const context = crossFieldTable.baseFieldToContext.get(baseField);
|
|
578
|
+
if (context === undefined) {
|
|
579
|
+
this.rebaseFieldWithoutNewChanges(baseField, baseFieldId, crossFieldTable, rebasedFields, rebasedNodes, genId, rebaseMetadata);
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
this.rebaseInvalidatedField(baseField, crossFieldTable, context, rebaseMetadata, genId);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
536
585
|
}
|
|
537
586
|
}
|
|
538
|
-
rebaseInvalidatedField(baseField, crossFieldTable, rebaseMetadata, genId
|
|
539
|
-
const context = crossFieldTable.baseFieldToContext.get(baseField);
|
|
540
|
-
(0, internal_1.assert)(context !== undefined, 0x852 /* Every field should have a context */);
|
|
587
|
+
rebaseInvalidatedField(baseField, crossFieldTable, context, rebaseMetadata, genId) {
|
|
541
588
|
const { changeHandler, change1: fieldChangeset, change2: baseChangeset, } = this.normalizeFieldChanges(context.newChange, context.baseChange);
|
|
542
589
|
const rebaseChild = (curr, base) => {
|
|
543
590
|
if (curr !== undefined) {
|
|
544
591
|
return curr;
|
|
545
592
|
}
|
|
546
|
-
if (base !== undefined) {
|
|
547
|
-
|
|
548
|
-
if ((0, index_js_1.areEqualChangeAtomIds)(base, id)) {
|
|
549
|
-
return base;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
593
|
+
if (base !== undefined && (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(context.baseNodeIds, base) === true) {
|
|
594
|
+
return base;
|
|
552
595
|
}
|
|
553
596
|
return undefined;
|
|
554
597
|
};
|
|
555
|
-
|
|
598
|
+
let allowInval = false;
|
|
599
|
+
if (crossFieldTable.fieldsWithUnattachedChild.has(baseField)) {
|
|
600
|
+
crossFieldTable.fieldsWithUnattachedChild.delete(baseField);
|
|
601
|
+
allowInval = true;
|
|
602
|
+
}
|
|
603
|
+
context.rebasedChange.change = (0, index_js_2.brand)(changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, new RebaseNodeManagerI(crossFieldTable, context.fieldId, allowInval), rebaseMetadata, crossFieldTable.rebaseVersion));
|
|
556
604
|
}
|
|
557
605
|
attachRebasedField(rebasedFields, rebasedNodes, table, rebasedField, { nodeId, field: fieldKey }, idAllocator, metadata) {
|
|
558
606
|
if (nodeId === undefined) {
|
|
559
607
|
rebasedFields.set(fieldKey, rebasedField);
|
|
560
608
|
return;
|
|
561
609
|
}
|
|
562
|
-
const rebasedNode = getFromChangeAtomIdMap(rebasedNodes, nodeId);
|
|
610
|
+
const rebasedNode = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(rebasedNodes, nodeId);
|
|
563
611
|
if (rebasedNode !== undefined) {
|
|
564
|
-
|
|
565
|
-
|
|
612
|
+
const updatedRebasedNode = cloneNodeChangeset(rebasedNode);
|
|
613
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, nodeId, updatedRebasedNode);
|
|
614
|
+
if (updatedRebasedNode.fieldChanges === undefined) {
|
|
615
|
+
updatedRebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);
|
|
566
616
|
return;
|
|
567
617
|
}
|
|
568
|
-
(0, internal_1.assert)(!
|
|
569
|
-
|
|
618
|
+
(0, internal_1.assert)(!updatedRebasedNode.fieldChanges.has(fieldKey), 0x9c4 /* Expected an empty field */);
|
|
619
|
+
updatedRebasedNode.fieldChanges.set(fieldKey, rebasedField);
|
|
570
620
|
return;
|
|
571
621
|
}
|
|
572
622
|
const newNode = {
|
|
573
623
|
fieldChanges: new Map([[fieldKey, rebasedField]]),
|
|
574
624
|
};
|
|
575
|
-
setInChangeAtomIdMap(rebasedNodes, nodeId, newNode);
|
|
576
|
-
setInChangeAtomIdMap(table.baseToRebasedNodeId, nodeId, nodeId);
|
|
577
|
-
const
|
|
578
|
-
this.attachRebasedNode(rebasedFields, rebasedNodes, table, nodeId,
|
|
579
|
-
}
|
|
580
|
-
attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId,
|
|
581
|
-
|
|
625
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(rebasedNodes, nodeId, newNode);
|
|
626
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.baseToRebasedNodeId, nodeId, nodeId);
|
|
627
|
+
const parentBase = getNodeParent(table.baseChange, nodeId);
|
|
628
|
+
this.attachRebasedNode(rebasedFields, rebasedNodes, table, nodeId, parentBase, idAllocator, metadata);
|
|
629
|
+
}
|
|
630
|
+
attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId, parentBase, idAllocator, metadata) {
|
|
631
|
+
if (parentBase.root !== undefined) {
|
|
632
|
+
const renamedRoot = firstAttachIdFromDetachId(table.baseChange.rootNodes, parentBase.root, 1).value;
|
|
633
|
+
const attachField = table.baseChange.crossFieldKeys.getFirst({ ...renamedRoot, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, 1).value;
|
|
634
|
+
if (attachField !== undefined) {
|
|
635
|
+
// The base change inserts this node into `attachField`, so the rebased change should represent this node there.
|
|
636
|
+
const normalizedAttachField = normalizeFieldId(attachField, table.baseChange.nodeAliases);
|
|
637
|
+
const entry = table.entries.getFirst(renamedRoot, 1).value ?? {};
|
|
638
|
+
table.entries.set(renamedRoot, 1, { ...entry, nodeChange: baseNodeId });
|
|
639
|
+
table.affectedBaseFields.set(fieldIdKeyFromFieldId(normalizedAttachField), true);
|
|
640
|
+
this.attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId, { field: normalizedAttachField }, idAllocator, metadata);
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
const baseDetachLocation = table.baseChange.rootNodes.detachLocations.getFirst(parentBase.root, 1).value;
|
|
644
|
+
assignRootChange(table.rebasedRootNodes, table.rebasedNodeToParent, renamedRoot, baseNodeId, baseDetachLocation, table.rebaseVersion);
|
|
645
|
+
// We need to make sure the rebased changeset includes the detach location,
|
|
646
|
+
// so we add that field to `affectedBaseFields` unless it's already been processed.
|
|
647
|
+
if (baseDetachLocation !== undefined &&
|
|
648
|
+
!table.baseFieldToContext.has(fieldChangeFromId(table.baseChange, baseDetachLocation))) {
|
|
649
|
+
table.affectedBaseFields.set(fieldIdKeyFromFieldId(baseDetachLocation), true);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
const parentFieldIdBase = parentBase.field;
|
|
655
|
+
const baseFieldChange = fieldChangeFromId(table.baseChange, parentFieldIdBase);
|
|
582
656
|
const rebasedFieldId = rebasedFieldIdFromBaseId(table, parentFieldIdBase);
|
|
583
|
-
setInChangeAtomIdMap(table.rebasedNodeToParent, baseNodeId, rebasedFieldId);
|
|
657
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.rebasedNodeToParent, baseNodeId, { field: rebasedFieldId });
|
|
584
658
|
const context = table.baseFieldToContext.get(baseFieldChange);
|
|
585
659
|
if (context !== undefined) {
|
|
586
660
|
// We've already processed this field.
|
|
587
|
-
// The new child node will be attached in
|
|
588
|
-
|
|
589
|
-
|
|
661
|
+
// The new child node will be attached in the next pass.
|
|
662
|
+
// Note that adding to `fieldsWithUnattachedChild` allows that field to generate new invalidations,
|
|
663
|
+
// so to avoid invalidation cycles we make sure we only add to it once per new unattached child.
|
|
664
|
+
// This is done by checking whether `context.baseNodeIds` already contained `baseNodeId`.
|
|
665
|
+
if ((0, modularChangeTypes_js_1.setInChangeAtomIdMap)(context.baseNodeIds, baseNodeId, true)) {
|
|
666
|
+
table.fieldsWithUnattachedChild.add(baseFieldChange);
|
|
667
|
+
table.affectedBaseFields.set(fieldIdKeyFromFieldId(parentFieldIdBase), true);
|
|
668
|
+
}
|
|
590
669
|
return;
|
|
591
670
|
}
|
|
592
|
-
|
|
593
|
-
const fieldChange = {
|
|
594
|
-
...baseFieldChange,
|
|
595
|
-
change: (0, index_js_2.brand)(handler.createEmpty()),
|
|
596
|
-
};
|
|
597
|
-
const rebasedChangeset = handler.rebaser.rebase(handler.createEmpty(), baseFieldChange.change, (_idNew, idBase) => idBase !== undefined && (0, index_js_1.areEqualChangeAtomIds)(idBase, baseNodeId)
|
|
598
|
-
? baseNodeId
|
|
599
|
-
: undefined, idAllocator, new RebaseManager(table, baseFieldChange, rebasedFieldId), metadata);
|
|
600
|
-
const rebasedField = { ...baseFieldChange, change: (0, index_js_2.brand)(rebasedChangeset) };
|
|
601
|
-
table.rebasedFields.add(rebasedField);
|
|
602
|
-
table.baseFieldToContext.set(baseFieldChange, {
|
|
603
|
-
newChange: fieldChange,
|
|
604
|
-
baseChange: baseFieldChange,
|
|
605
|
-
rebasedChange: rebasedField,
|
|
606
|
-
fieldId: rebasedFieldId,
|
|
607
|
-
baseNodeIds: [],
|
|
608
|
-
});
|
|
609
|
-
this.attachRebasedField(rebasedFields, rebasedNodes, table, rebasedField, rebasedFieldId, idAllocator, metadata);
|
|
671
|
+
this.rebaseFieldWithoutNewChanges(baseFieldChange, parentFieldIdBase, table, rebasedFields, rebasedNodes, idAllocator, metadata, baseNodeId);
|
|
610
672
|
}
|
|
611
673
|
rebaseFieldMap(change, over, parentId, genId, crossFieldTable, revisionMetadata) {
|
|
612
674
|
const rebasedFields = new Map();
|
|
@@ -624,8 +686,8 @@ class ModularChangeFamily {
|
|
|
624
686
|
continue;
|
|
625
687
|
}
|
|
626
688
|
const { fieldKind, changeHandler, change1: fieldChangeset, change2: baseChangeset, } = this.normalizeFieldChanges(fieldChange, baseChange);
|
|
627
|
-
const manager = new
|
|
628
|
-
const rebasedField = changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, manager, revisionMetadata);
|
|
689
|
+
const manager = new RebaseNodeManagerI(crossFieldTable, fieldId);
|
|
690
|
+
const rebasedField = changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, manager, revisionMetadata, crossFieldTable.rebaseVersion);
|
|
629
691
|
const rebasedFieldChange = {
|
|
630
692
|
fieldKind,
|
|
631
693
|
change: (0, index_js_2.brand)(rebasedField),
|
|
@@ -636,15 +698,15 @@ class ModularChangeFamily {
|
|
|
636
698
|
newChange: fieldChange,
|
|
637
699
|
rebasedChange: rebasedFieldChange,
|
|
638
700
|
fieldId,
|
|
639
|
-
baseNodeIds:
|
|
701
|
+
baseNodeIds: (0, index_js_2.newTupleBTree)(),
|
|
640
702
|
});
|
|
641
703
|
crossFieldTable.rebasedFields.add(rebasedFieldChange);
|
|
642
704
|
}
|
|
643
705
|
return rebasedFields;
|
|
644
706
|
}
|
|
645
707
|
rebaseNodeChange(newId, baseId, genId, crossFieldTable, revisionMetadata) {
|
|
646
|
-
const change = nodeChangeFromId(crossFieldTable.newChange.nodeChanges, newId);
|
|
647
|
-
const over = nodeChangeFromId(crossFieldTable.baseChange.nodeChanges, baseId);
|
|
708
|
+
const change = nodeChangeFromId(crossFieldTable.newChange.nodeChanges, crossFieldTable.newChange.nodeAliases, newId);
|
|
709
|
+
const over = nodeChangeFromId(crossFieldTable.baseChange.nodeChanges, crossFieldTable.baseChange.nodeAliases, baseId);
|
|
648
710
|
const baseMap = over?.fieldChanges ?? new Map();
|
|
649
711
|
const fieldChanges = change.fieldChanges !== undefined && over.fieldChanges !== undefined
|
|
650
712
|
? this.rebaseFieldMap(change?.fieldChanges ?? new Map(), baseMap, newId, genId, crossFieldTable, revisionMetadata)
|
|
@@ -659,31 +721,40 @@ class ModularChangeFamily {
|
|
|
659
721
|
if (change?.nodeExistsConstraintOnRevert !== undefined) {
|
|
660
722
|
rebasedChange.nodeExistsConstraintOnRevert = change.nodeExistsConstraintOnRevert;
|
|
661
723
|
}
|
|
662
|
-
setInChangeAtomIdMap(crossFieldTable.baseToRebasedNodeId, baseId, newId);
|
|
724
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(crossFieldTable.baseToRebasedNodeId, baseId, newId);
|
|
663
725
|
return rebasedChange;
|
|
664
726
|
}
|
|
727
|
+
updateConstraints(rebasedFields, rebasedNodes, rebasedRoots, constraintState, revertConstraintState) {
|
|
728
|
+
this.updateConstraintsForFields(rebasedFields, fieldChangeHandler_js_1.NodeAttachState.Attached, fieldChangeHandler_js_1.NodeAttachState.Attached, constraintState, revertConstraintState, rebasedNodes);
|
|
729
|
+
for (const [_detachId, nodeId] of rebasedRoots.nodeChanges.entries()) {
|
|
730
|
+
// XXX: This is incorrect if the rebased changeset attaches the node.
|
|
731
|
+
// Efficiently computing whether the changeset attaches the node would require maintaining a mapping from node ID to attach ID.
|
|
732
|
+
const detachedInOutput = true;
|
|
733
|
+
this.updateConstraintsForNode(nodeId, fieldChangeHandler_js_1.NodeAttachState.Detached, detachedInOutput ? fieldChangeHandler_js_1.NodeAttachState.Detached : fieldChangeHandler_js_1.NodeAttachState.Attached, rebasedNodes, constraintState, revertConstraintState);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
665
736
|
updateConstraintsForFields(fields, parentInputAttachState, parentOutputAttachState, constraintState, revertConstraintState, nodes) {
|
|
666
737
|
for (const field of fields.values()) {
|
|
667
738
|
const handler = getChangeHandler(this.fieldKinds, field.fieldKind);
|
|
668
|
-
for (const [nodeId
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
: fieldChangeHandler_js_1.NodeAttachState.Attached;
|
|
673
|
-
const isOutputDetached = outputIndex === undefined;
|
|
739
|
+
for (const [nodeId] of handler.getNestedChanges(field.change)) {
|
|
740
|
+
// XXX: This is incorrect if the rebased changeset detaches this node.
|
|
741
|
+
// Efficiently computing whether the changeset detaches the node would require maintaining a mapping from node ID to detach ID.
|
|
742
|
+
const isOutputDetached = false;
|
|
674
743
|
const outputAttachState = parentOutputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached || isOutputDetached
|
|
675
744
|
? fieldChangeHandler_js_1.NodeAttachState.Detached
|
|
676
745
|
: fieldChangeHandler_js_1.NodeAttachState.Attached;
|
|
677
|
-
this.updateConstraintsForNode(nodeId,
|
|
746
|
+
this.updateConstraintsForNode(nodeId, parentInputAttachState, outputAttachState, nodes, constraintState, revertConstraintState);
|
|
678
747
|
}
|
|
679
748
|
}
|
|
680
749
|
}
|
|
681
750
|
updateConstraintsForNode(nodeId, inputAttachState, outputAttachState, nodes, constraintState, revertConstraintState) {
|
|
682
|
-
const node =
|
|
751
|
+
const node = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodes, nodeId) ?? (0, internal_1.fail)(0xb24 /* Unknown node ID */);
|
|
752
|
+
const updatedNode = { ...node };
|
|
753
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodes, nodeId, updatedNode);
|
|
683
754
|
if (node.nodeExistsConstraint !== undefined) {
|
|
684
755
|
const isNowViolated = inputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached;
|
|
685
756
|
if (node.nodeExistsConstraint.violated !== isNowViolated) {
|
|
686
|
-
|
|
757
|
+
updatedNode.nodeExistsConstraint = {
|
|
687
758
|
...node.nodeExistsConstraint,
|
|
688
759
|
violated: isNowViolated,
|
|
689
760
|
};
|
|
@@ -693,7 +764,7 @@ class ModularChangeFamily {
|
|
|
693
764
|
if (node.nodeExistsConstraintOnRevert !== undefined) {
|
|
694
765
|
const isNowViolated = outputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached;
|
|
695
766
|
if (node.nodeExistsConstraintOnRevert.violated !== isNowViolated) {
|
|
696
|
-
|
|
767
|
+
updatedNode.nodeExistsConstraintOnRevert = {
|
|
697
768
|
...node.nodeExistsConstraintOnRevert,
|
|
698
769
|
violated: isNowViolated,
|
|
699
770
|
};
|
|
@@ -704,35 +775,70 @@ class ModularChangeFamily {
|
|
|
704
775
|
this.updateConstraintsForFields(node.fieldChanges, inputAttachState, outputAttachState, constraintState, revertConstraintState, nodes);
|
|
705
776
|
}
|
|
706
777
|
}
|
|
707
|
-
pruneFieldMap(changeset, nodeMap) {
|
|
778
|
+
pruneFieldMap(changeset, parentId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges) {
|
|
708
779
|
if (changeset === undefined) {
|
|
709
780
|
return undefined;
|
|
710
781
|
}
|
|
711
782
|
const prunedChangeset = new Map();
|
|
712
783
|
for (const [field, fieldChange] of changeset) {
|
|
713
784
|
const handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);
|
|
714
|
-
const prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) => this.pruneNodeChange(nodeId, nodeMap));
|
|
715
|
-
|
|
785
|
+
const prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) => this.pruneNodeChange(nodeId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges));
|
|
786
|
+
const fieldId = { nodeId: parentId, field };
|
|
787
|
+
const fieldIdKey = fieldIdKeyFromFieldId(fieldId);
|
|
788
|
+
const rootsWithChanges = fieldsToRootChanges.get(fieldIdKey) ?? [];
|
|
789
|
+
let hasRootWithNodeChange = false;
|
|
790
|
+
for (const rootId of rootsWithChanges) {
|
|
791
|
+
const nodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(roots.nodeChanges, rootId) ?? (0, internal_1.fail)("No root change found");
|
|
792
|
+
const isRootChangeEmpty = this.pruneNodeChange(nodeId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges) === undefined;
|
|
793
|
+
if (isRootChangeEmpty) {
|
|
794
|
+
roots.nodeChanges.delete([rootId.revision, rootId.localId]);
|
|
795
|
+
tryRemoveDetachLocation(roots, rootId, 1);
|
|
796
|
+
}
|
|
797
|
+
else {
|
|
798
|
+
hasRootWithNodeChange = true;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
const hasRootChanges = hasRootWithNodeChange || fieldsWithRootMoves.get(fieldIdKey) === true;
|
|
802
|
+
if (!handler.isEmpty(prunedFieldChangeset) || hasRootChanges) {
|
|
716
803
|
prunedChangeset.set(field, { ...fieldChange, change: (0, index_js_2.brand)(prunedFieldChangeset) });
|
|
717
804
|
}
|
|
718
805
|
}
|
|
719
806
|
return prunedChangeset.size > 0 ? prunedChangeset : undefined;
|
|
720
807
|
}
|
|
721
|
-
|
|
722
|
-
const
|
|
808
|
+
pruneRoots(roots, nodeMap, nodeToParent, aliases, fieldsWithRootMoves, fieldsToRootChanges) {
|
|
809
|
+
const pruned = { ...roots, nodeChanges: (0, index_js_2.newTupleBTree)() };
|
|
810
|
+
for (const [rootIdKey, nodeId] of roots.nodeChanges.entries()) {
|
|
811
|
+
const rootId = { revision: rootIdKey[0], localId: rootIdKey[1] };
|
|
812
|
+
const hasDetachLocation = roots.detachLocations.getFirst(rootId, 1).value !== undefined;
|
|
813
|
+
// If the root has a detach location it should be pruned by recursion when pruning the field it was detached from.
|
|
814
|
+
const prunedId = hasDetachLocation
|
|
815
|
+
? nodeId
|
|
816
|
+
: this.pruneNodeChange(nodeId, nodeMap, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges);
|
|
817
|
+
if (prunedId !== undefined) {
|
|
818
|
+
pruned.nodeChanges.set(rootIdKey, prunedId);
|
|
819
|
+
}
|
|
820
|
+
tryRemoveDetachLocation(pruned, rootId, 1);
|
|
821
|
+
}
|
|
822
|
+
return pruned;
|
|
823
|
+
}
|
|
824
|
+
pruneNodeChange(nodeId, nodes, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges) {
|
|
825
|
+
const changeset = nodeChangeFromId(nodes, aliases, nodeId);
|
|
723
826
|
const prunedFields = changeset.fieldChanges !== undefined
|
|
724
|
-
? this.pruneFieldMap(changeset.fieldChanges,
|
|
827
|
+
? this.pruneFieldMap(changeset.fieldChanges, nodeId, nodes, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges)
|
|
725
828
|
: undefined;
|
|
726
829
|
const prunedChange = { ...changeset, fieldChanges: prunedFields };
|
|
727
830
|
if (prunedChange.fieldChanges === undefined) {
|
|
728
831
|
delete prunedChange.fieldChanges;
|
|
729
832
|
}
|
|
730
833
|
if (isEmptyNodeChangeset(prunedChange)) {
|
|
731
|
-
|
|
834
|
+
const nodeIdKey = [nodeId.revision, nodeId.localId];
|
|
835
|
+
// TODO: Shouldn't we also delete all aliases associated with this node?
|
|
836
|
+
nodes.delete(nodeIdKey);
|
|
837
|
+
nodeToParent.delete(nodeIdKey);
|
|
732
838
|
return undefined;
|
|
733
839
|
}
|
|
734
840
|
else {
|
|
735
|
-
setInChangeAtomIdMap(
|
|
841
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodes, nodeId, prunedChange);
|
|
736
842
|
return nodeId;
|
|
737
843
|
}
|
|
738
844
|
}
|
|
@@ -746,17 +852,18 @@ class ModularChangeFamily {
|
|
|
746
852
|
updatedNodes.set([replaceRevision(revision, oldRevisions, newRevision), id], this.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision));
|
|
747
853
|
}
|
|
748
854
|
const updatedNodeToParent = (0, index_js_2.newTupleBTree)();
|
|
749
|
-
for (const [[revision, id],
|
|
750
|
-
updatedNodeToParent.set([replaceRevision(revision, oldRevisions, newRevision), id],
|
|
855
|
+
for (const [[revision, id], location] of change.nodeToParent.entries()) {
|
|
856
|
+
updatedNodeToParent.set([replaceRevision(revision, oldRevisions, newRevision), id], replaceNodeLocationRevision(normalizeNodeLocation(location, change.nodeAliases), oldRevisions, newRevision));
|
|
751
857
|
}
|
|
752
858
|
const updated = {
|
|
753
859
|
...change,
|
|
754
860
|
fieldChanges: updatedFields,
|
|
755
861
|
nodeChanges: updatedNodes,
|
|
756
862
|
nodeToParent: updatedNodeToParent,
|
|
863
|
+
rootNodes: replaceRootTableRevision(change.rootNodes, oldRevisions, newRevision, change.nodeAliases),
|
|
757
864
|
// We've updated all references to old node IDs, so we no longer need an alias table.
|
|
758
865
|
nodeAliases: (0, index_js_2.newTupleBTree)(),
|
|
759
|
-
crossFieldKeys:
|
|
866
|
+
crossFieldKeys: change.crossFieldKeys.mapEntries((key) => replaceCrossFieldKeyRevision(key, oldRevisions, newRevision), (id) => replaceFieldIdRevision(normalizeFieldId(id, change.nodeAliases), oldRevisions, newRevision)),
|
|
760
867
|
};
|
|
761
868
|
if (change.builds !== undefined) {
|
|
762
869
|
updated.builds = replaceIdMapRevisions(change.builds, oldRevisions, newRevision);
|
|
@@ -795,7 +902,7 @@ class ModularChangeFamily {
|
|
|
795
902
|
return updatedFields;
|
|
796
903
|
}
|
|
797
904
|
makeCrossFieldKeyTable(fields, nodes) {
|
|
798
|
-
const keys = (0, modularChangeTypes_js_1.
|
|
905
|
+
const keys = (0, modularChangeTypes_js_1.newCrossFieldRangeTable)();
|
|
799
906
|
this.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);
|
|
800
907
|
nodes.forEachPair(([revision, localId], node) => {
|
|
801
908
|
if (node.fieldChanges !== undefined) {
|
|
@@ -823,40 +930,53 @@ class ModularChangeFamily {
|
|
|
823
930
|
return { fieldKind, change: (0, index_js_2.brand)(emptyChange) };
|
|
824
931
|
}
|
|
825
932
|
validateChangeset(change) {
|
|
826
|
-
|
|
933
|
+
const unreachableNodes = (0, index_js_2.brand)(change.nodeToParent.clone());
|
|
934
|
+
const unreachableCFKs = change.crossFieldKeys.clone();
|
|
935
|
+
this.validateFieldChanges(change, change.fieldChanges, undefined, unreachableNodes, unreachableCFKs);
|
|
827
936
|
for (const [[revision, localId], node] of change.nodeChanges.entries()) {
|
|
828
937
|
if (node.fieldChanges === undefined) {
|
|
829
938
|
continue;
|
|
830
939
|
}
|
|
831
|
-
const nodeId = { revision, localId };
|
|
832
|
-
|
|
833
|
-
|
|
940
|
+
const nodeId = normalizeNodeId({ revision, localId }, change.nodeAliases);
|
|
941
|
+
this.validateFieldChanges(change, node.fieldChanges, nodeId, unreachableNodes, unreachableCFKs);
|
|
942
|
+
}
|
|
943
|
+
for (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
944
|
+
const detachId = { revision: detachIdKey[0], localId: detachIdKey[1] };
|
|
945
|
+
const location = getNodeParent(change, nodeId);
|
|
946
|
+
(0, internal_1.assert)((0, index_js_1.areEqualChangeAtomIdOpts)(location.root, detachId), "Inconsistent node location");
|
|
947
|
+
const normalizedNodeId = normalizeNodeId(nodeId, change.nodeAliases);
|
|
948
|
+
unreachableNodes.delete([normalizedNodeId.revision, normalizedNodeId.localId]);
|
|
949
|
+
const fieldChanges = nodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId).fieldChanges;
|
|
950
|
+
if (fieldChanges !== undefined) {
|
|
951
|
+
this.validateFieldChanges(change, fieldChanges, normalizedNodeId, unreachableNodes, unreachableCFKs);
|
|
952
|
+
}
|
|
834
953
|
}
|
|
835
|
-
(0, internal_1.assert)(
|
|
954
|
+
(0, internal_1.assert)(unreachableNodes.size === 0, "Unreachable nodes found");
|
|
955
|
+
(0, internal_1.assert)(unreachableCFKs.entries().length === 0, "Unreachable cross-field keys found");
|
|
836
956
|
}
|
|
837
957
|
/**
|
|
838
|
-
* Asserts that each
|
|
839
|
-
*
|
|
958
|
+
* Asserts that each node has a correct entry in `change.nodeToParent`,
|
|
959
|
+
* and each cross field key has a correct entry in `change.crossFieldKeys`.
|
|
840
960
|
* @returns the number of children found.
|
|
841
961
|
*/
|
|
842
|
-
validateFieldChanges(change, fieldChanges, nodeParent) {
|
|
843
|
-
let numChildren = 0;
|
|
962
|
+
validateFieldChanges(change, fieldChanges, nodeParent, unreachableNodes, unreachableCFKs) {
|
|
844
963
|
for (const [field, fieldChange] of fieldChanges.entries()) {
|
|
845
964
|
const fieldId = { nodeId: nodeParent, field };
|
|
846
965
|
const handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);
|
|
847
966
|
for (const [child, _index] of handler.getNestedChanges(fieldChange.change)) {
|
|
848
|
-
const parentFieldId =
|
|
849
|
-
(0, internal_1.assert)(areEqualFieldIds(parentFieldId, fieldId), 0xa4e /* Inconsistent node parentage */);
|
|
850
|
-
|
|
967
|
+
const parentFieldId = getNodeParent(change, child);
|
|
968
|
+
(0, internal_1.assert)(parentFieldId.field !== undefined && areEqualFieldIds(parentFieldId.field, fieldId), 0xa4e /* Inconsistent node parentage */);
|
|
969
|
+
unreachableNodes.delete([child.revision, child.localId]);
|
|
851
970
|
}
|
|
852
971
|
for (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {
|
|
853
972
|
const fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);
|
|
854
|
-
(0, internal_1.assert)(fields.length
|
|
855
|
-
|
|
856
|
-
|
|
973
|
+
(0, internal_1.assert)(fields.length > 0, "Unregistered cross-field key");
|
|
974
|
+
for (const fieldFromLookup of fields) {
|
|
975
|
+
(0, internal_1.assert)(areEqualFieldIds(fieldFromLookup, fieldId), 0xa4f /* Inconsistent cross field keys */);
|
|
976
|
+
}
|
|
977
|
+
unreachableCFKs.delete(keyRange.key, keyRange.count);
|
|
857
978
|
}
|
|
858
979
|
}
|
|
859
|
-
return numChildren;
|
|
860
980
|
}
|
|
861
981
|
getEffectiveChange(change) {
|
|
862
982
|
if (hasConflicts(change)) {
|
|
@@ -870,7 +990,8 @@ class ModularChangeFamily {
|
|
|
870
990
|
muteChange(change) {
|
|
871
991
|
const muted = {
|
|
872
992
|
...change,
|
|
873
|
-
|
|
993
|
+
rootNodes: muteRootChanges(change.rootNodes),
|
|
994
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
874
995
|
fieldChanges: this.muteFieldChanges(change.fieldChanges),
|
|
875
996
|
nodeChanges: (0, index_js_2.brand)(change.nodeChanges.mapValues((v) => this.muteNodeChange(v))),
|
|
876
997
|
};
|
|
@@ -898,27 +1019,12 @@ class ModularChangeFamily {
|
|
|
898
1019
|
}
|
|
899
1020
|
exports.ModularChangeFamily = ModularChangeFamily;
|
|
900
1021
|
ModularChangeFamily.emptyChange = makeModularChangeset();
|
|
901
|
-
function
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
revision: replaceRevision(key.revision, oldRevisions, newRevision),
|
|
908
|
-
localId: key.localId,
|
|
909
|
-
};
|
|
910
|
-
const field = entry.value;
|
|
911
|
-
const normalizedFieldId = normalizeFieldId(field, nodeAliases);
|
|
912
|
-
const updatedNodeId = normalizedFieldId.nodeId !== undefined
|
|
913
|
-
? (0, index_js_1.replaceAtomRevisions)(normalizedFieldId.nodeId, oldRevisions, newRevision)
|
|
914
|
-
: undefined;
|
|
915
|
-
const updatedValue = {
|
|
916
|
-
...normalizedFieldId,
|
|
917
|
-
nodeId: updatedNodeId,
|
|
918
|
-
};
|
|
919
|
-
updated.set(updatedKey, entry.length, updatedValue);
|
|
920
|
-
}
|
|
921
|
-
return updated;
|
|
1022
|
+
function replaceCrossFieldKeyRevision(key, oldRevisions, newRevision) {
|
|
1023
|
+
return {
|
|
1024
|
+
target: key.target,
|
|
1025
|
+
revision: replaceRevision(key.revision, oldRevisions, newRevision),
|
|
1026
|
+
localId: key.localId,
|
|
1027
|
+
};
|
|
922
1028
|
}
|
|
923
1029
|
function replaceRevision(revision, oldRevisions, newRevision) {
|
|
924
1030
|
return oldRevisions.has(revision) ? newRevision : revision;
|
|
@@ -964,6 +1070,19 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
|
|
|
964
1070
|
}
|
|
965
1071
|
}
|
|
966
1072
|
}
|
|
1073
|
+
// It's possible to have a build and a refresher for the same root because an attach operation need not be performed in the same changeset as the corresponding build.
|
|
1074
|
+
if (change1.builds !== undefined && change2.refreshers !== undefined) {
|
|
1075
|
+
for (const [key, chunk] of change2.refreshers.entries()) {
|
|
1076
|
+
(0, internal_1.assert)(chunk.topLevelLength === 1, "Expected refresher chunk to have length 1");
|
|
1077
|
+
const match = change1.builds.getPairOrNextLower(key);
|
|
1078
|
+
if (match !== undefined) {
|
|
1079
|
+
const [buildKey, buildChunk] = match;
|
|
1080
|
+
if (buildKey[0] === key[0] && buildKey[1] + buildChunk.topLevelLength > key[1]) {
|
|
1081
|
+
allRefreshers.delete(key);
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
967
1086
|
return { allBuilds, allDestroys, allRefreshers };
|
|
968
1087
|
}
|
|
969
1088
|
function invertBuilds(builds) {
|
|
@@ -988,19 +1107,45 @@ function invertBuilds(builds) {
|
|
|
988
1107
|
* @param fieldKinds - The field kinds to delegate to.
|
|
989
1108
|
*/
|
|
990
1109
|
function* relevantRemovedRoots(change, fieldKinds) {
|
|
991
|
-
|
|
1110
|
+
const rootIds = (0, index_js_1.newChangeAtomIdRangeMap)();
|
|
1111
|
+
addAttachesToSet(change, rootIds);
|
|
1112
|
+
addRenamesToSet(change, rootIds);
|
|
1113
|
+
for (const [[revision, localId]] of change.rootNodes.nodeChanges.entries()) {
|
|
1114
|
+
rootIds.set({ revision, localId }, 1, true);
|
|
1115
|
+
}
|
|
1116
|
+
for (const entry of rootIds.entries()) {
|
|
1117
|
+
for (let offset = 0; offset < entry.length; offset++) {
|
|
1118
|
+
const detachId = (0, index_js_1.offsetChangeAtomId)(entry.start, offset);
|
|
1119
|
+
yield (0, index_js_1.makeDetachedNodeId)(detachId.revision, detachId.localId);
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
992
1122
|
}
|
|
993
1123
|
exports.relevantRemovedRoots = relevantRemovedRoots;
|
|
994
|
-
function
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1124
|
+
function addAttachesToSet(change, rootIds) {
|
|
1125
|
+
// This includes each attach which does not have a corresponding detach.
|
|
1126
|
+
for (const entry of change.crossFieldKeys.entries()) {
|
|
1127
|
+
if (entry.start.target !== crossFieldQueries_js_1.CrossFieldTarget.Destination) {
|
|
1128
|
+
continue;
|
|
1129
|
+
}
|
|
1130
|
+
for (const detachIdEntry of change.rootNodes.newToOldId.getAll2(entry.start, entry.length)) {
|
|
1131
|
+
const detachId = detachIdEntry.value ?? (0, index_js_1.offsetChangeAtomId)(entry.start, detachIdEntry.offset);
|
|
1132
|
+
for (const detachEntry of change.crossFieldKeys.getAll2({ ...detachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, detachIdEntry.length)) {
|
|
1133
|
+
if (detachEntry.value === undefined) {
|
|
1134
|
+
rootIds.set((0, index_js_1.offsetChangeAtomId)(detachId, detachEntry.offset), detachEntry.length, true);
|
|
1135
|
+
}
|
|
1001
1136
|
}
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
function addRenamesToSet(change, rootIds) {
|
|
1141
|
+
for (const renameEntry of change.rootNodes.oldToNewId.entries()) {
|
|
1142
|
+
for (const detachEntry of change.crossFieldKeys.getAll2({ ...renameEntry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, renameEntry.length)) {
|
|
1143
|
+
// We only want to include renames of nodes which are detached in the input context of the changeset.
|
|
1144
|
+
// So if there is a detach for the node, the rename is not relevant.
|
|
1145
|
+
if (detachEntry.value === undefined) {
|
|
1146
|
+
rootIds.set(renameEntry.start, renameEntry.length, true);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1004
1149
|
}
|
|
1005
1150
|
}
|
|
1006
1151
|
/**
|
|
@@ -1052,6 +1197,7 @@ function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshe
|
|
|
1052
1197
|
nodeChanges,
|
|
1053
1198
|
nodeToParent: change.nodeToParent,
|
|
1054
1199
|
nodeAliases: change.nodeAliases,
|
|
1200
|
+
rootNodes: change.rootNodes,
|
|
1055
1201
|
crossFieldKeys: change.crossFieldKeys,
|
|
1056
1202
|
maxId: maxId,
|
|
1057
1203
|
revisions,
|
|
@@ -1072,11 +1218,24 @@ exports.updateRefreshers = updateRefreshers;
|
|
|
1072
1218
|
function intoDelta(taggedChange, fieldKinds) {
|
|
1073
1219
|
const change = taggedChange.change;
|
|
1074
1220
|
const rootDelta = {};
|
|
1075
|
-
const global = [];
|
|
1076
|
-
const rename = [];
|
|
1077
1221
|
if (!hasConflicts(change)) {
|
|
1078
1222
|
// If there are no constraint violations, then tree changes apply.
|
|
1079
|
-
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges,
|
|
1223
|
+
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldKinds);
|
|
1224
|
+
const global = [];
|
|
1225
|
+
for (const [[major, minor], nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
1226
|
+
global.push({
|
|
1227
|
+
id: { major, minor },
|
|
1228
|
+
fields: deltaFromNodeChange(nodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId), change.nodeChanges, change.nodeAliases, fieldKinds),
|
|
1229
|
+
});
|
|
1230
|
+
}
|
|
1231
|
+
const rename = [];
|
|
1232
|
+
for (const { start: oldId, value: newId, length, } of change.rootNodes.oldToNewId.entries()) {
|
|
1233
|
+
rename.push({
|
|
1234
|
+
count: length,
|
|
1235
|
+
oldId: (0, index_js_1.makeDetachedNodeId)(oldId.revision, oldId.localId),
|
|
1236
|
+
newId: (0, index_js_1.makeDetachedNodeId)(newId.revision, newId.localId),
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1080
1239
|
if (fieldDeltas.size > 0) {
|
|
1081
1240
|
rootDelta.fields = fieldDeltas;
|
|
1082
1241
|
}
|
|
@@ -1123,24 +1282,22 @@ function copyDetachedNodes(detachedNodes) {
|
|
|
1123
1282
|
/**
|
|
1124
1283
|
* @param change - The change to convert into a delta.
|
|
1125
1284
|
*/
|
|
1126
|
-
function intoDeltaImpl(change, nodeChanges,
|
|
1285
|
+
function intoDeltaImpl(change, nodeChanges, nodeAliases, fieldKinds) {
|
|
1127
1286
|
const delta = new Map();
|
|
1128
1287
|
for (const [field, fieldChange] of change) {
|
|
1129
|
-
const
|
|
1130
|
-
const nodeChange = nodeChangeFromId(nodeChanges, childChange);
|
|
1131
|
-
return deltaFromNodeChange(nodeChange, nodeChanges,
|
|
1288
|
+
const fieldDelta = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
|
|
1289
|
+
const nodeChange = nodeChangeFromId(nodeChanges, nodeAliases, childChange);
|
|
1290
|
+
return deltaFromNodeChange(nodeChange, nodeChanges, nodeAliases, fieldKinds);
|
|
1132
1291
|
});
|
|
1133
|
-
if (
|
|
1134
|
-
delta.set(field,
|
|
1292
|
+
if (fieldDelta !== undefined && fieldDelta.length > 0) {
|
|
1293
|
+
delta.set(field, fieldDelta);
|
|
1135
1294
|
}
|
|
1136
|
-
fieldGlobal?.forEach((c) => global.push(c));
|
|
1137
|
-
fieldRename?.forEach((r) => rename.push(r));
|
|
1138
1295
|
}
|
|
1139
1296
|
return delta;
|
|
1140
1297
|
}
|
|
1141
|
-
function deltaFromNodeChange(change, nodeChanges,
|
|
1298
|
+
function deltaFromNodeChange(change, nodeChanges, nodeAliases, fieldKinds) {
|
|
1142
1299
|
if (change.fieldChanges !== undefined) {
|
|
1143
|
-
return intoDeltaImpl(change.fieldChanges, nodeChanges,
|
|
1300
|
+
return intoDeltaImpl(change.fieldChanges, nodeChanges, nodeAliases, fieldKinds);
|
|
1144
1301
|
}
|
|
1145
1302
|
// TODO: update the API to allow undefined to be returned here
|
|
1146
1303
|
return new Map();
|
|
@@ -1190,30 +1347,22 @@ function getChangeHandler(fieldKinds, kind) {
|
|
|
1190
1347
|
return getFieldKind(fieldKinds, kind).changeHandler;
|
|
1191
1348
|
}
|
|
1192
1349
|
exports.getChangeHandler = getChangeHandler;
|
|
1193
|
-
function newComposeTable(baseChange, newChange,
|
|
1350
|
+
function newComposeTable(baseChange, newChange, composedRootNodes, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
|
|
1194
1351
|
return {
|
|
1195
|
-
|
|
1352
|
+
rebaseVersion: Math.max(baseChange.rebaseVersion, newChange.rebaseVersion),
|
|
1353
|
+
entries: newDetachedEntryMap(),
|
|
1196
1354
|
baseChange,
|
|
1197
1355
|
newChange,
|
|
1198
1356
|
fieldToContext: new Map(),
|
|
1199
1357
|
newFieldToBaseField: new Map(),
|
|
1200
1358
|
newToBaseNodeId: (0, index_js_2.newTupleBTree)(),
|
|
1201
1359
|
composedNodes: new Set(),
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
};
|
|
1209
|
-
}
|
|
1210
|
-
function newCrossFieldTable() {
|
|
1211
|
-
return {
|
|
1212
|
-
srcTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1213
|
-
dstTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1214
|
-
srcDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1215
|
-
dstDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1216
|
-
invalidatedFields: new Set(),
|
|
1360
|
+
movedNodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1361
|
+
composedRootNodes,
|
|
1362
|
+
movedCrossFieldKeys,
|
|
1363
|
+
removedCrossFieldKeys,
|
|
1364
|
+
renamesToDelete: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1365
|
+
pendingCompositions,
|
|
1217
1366
|
};
|
|
1218
1367
|
}
|
|
1219
1368
|
function newConstraintState(violationCount) {
|
|
@@ -1221,147 +1370,354 @@ function newConstraintState(violationCount) {
|
|
|
1221
1370
|
violationCount,
|
|
1222
1371
|
};
|
|
1223
1372
|
}
|
|
1224
|
-
class
|
|
1225
|
-
constructor(
|
|
1226
|
-
this.
|
|
1227
|
-
this.
|
|
1228
|
-
this.allowInval = allowInval;
|
|
1373
|
+
class InvertNodeManagerI {
|
|
1374
|
+
constructor(table, fieldId) {
|
|
1375
|
+
this.table = table;
|
|
1376
|
+
this.fieldId = fieldId;
|
|
1229
1377
|
}
|
|
1230
|
-
|
|
1231
|
-
if (
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1378
|
+
invertDetach(detachId, count, nodeChange, newAttachId) {
|
|
1379
|
+
if (nodeChange !== undefined) {
|
|
1380
|
+
(0, internal_1.assert)(count === 1, "A node change should only affect one node");
|
|
1381
|
+
const attachEntry = firstAttachIdFromDetachId(this.table.change.rootNodes, detachId, count);
|
|
1382
|
+
const attachFieldEntry = this.table.change.crossFieldKeys.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...attachEntry.value }, count);
|
|
1383
|
+
if (attachFieldEntry.value !== undefined) {
|
|
1384
|
+
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.table.entries, attachEntry.value, count, nodeChange);
|
|
1385
|
+
this.table.invalidatedFields.add(fieldChangeFromId(this.table.change, attachFieldEntry.value));
|
|
1386
|
+
}
|
|
1387
|
+
else {
|
|
1388
|
+
assignRootChange(this.table.invertedRoots, this.table.invertedNodeToParent, attachEntry.value, nodeChange, this.fieldId, this.table.change.rebaseVersion);
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(detachId, newAttachId)) {
|
|
1392
|
+
for (const entry of doesChangeAttachNodes(this.table.change.crossFieldKeys, detachId, count)) {
|
|
1393
|
+
if (!entry.value) {
|
|
1394
|
+
this.table.attachToDetachId.set(newAttachId, count, detachId);
|
|
1395
|
+
this.table.invertedRoots.detachLocations.set(detachId, count, this.fieldId);
|
|
1238
1396
|
}
|
|
1239
|
-
firstId = (0, index_js_2.brand)(firstId + dependentEntry.length);
|
|
1240
1397
|
}
|
|
1241
1398
|
}
|
|
1242
|
-
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.getMap(target), revision, id, count, newValue);
|
|
1243
1399
|
}
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1400
|
+
invertAttach(attachId, count) {
|
|
1401
|
+
let countToProcess = count;
|
|
1402
|
+
const detachIdEntry = firstDetachIdFromAttachId(this.table.change.rootNodes, attachId, countToProcess);
|
|
1403
|
+
countToProcess = detachIdEntry.length;
|
|
1404
|
+
const detachEntry = getFirstFieldForCrossFieldKey(this.table.change, { target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...detachIdEntry.value }, countToProcess);
|
|
1405
|
+
countToProcess = detachEntry.length;
|
|
1406
|
+
let result;
|
|
1407
|
+
if (detachEntry.value !== undefined) {
|
|
1408
|
+
const moveEntry = this.table.entries.getFirst(attachId, countToProcess);
|
|
1409
|
+
result = { ...moveEntry, value: { nodeChange: moveEntry.value } };
|
|
1250
1410
|
}
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
}
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
super(table, field, allowInval);
|
|
1267
|
-
this.fieldId = fieldId;
|
|
1268
|
-
}
|
|
1269
|
-
onMoveIn(id) {
|
|
1270
|
-
setInChangeAtomIdMap(this.table.invertedNodeToParent, id, this.fieldId);
|
|
1271
|
-
}
|
|
1272
|
-
moveKey(target, revision, id, count) {
|
|
1273
|
-
(0, internal_1.assert)(false, 0x9c5 /* Keys should not be moved manually during invert */);
|
|
1274
|
-
}
|
|
1275
|
-
get table() {
|
|
1276
|
-
return this.crossFieldTable;
|
|
1411
|
+
else {
|
|
1412
|
+
// This node is detached in the input context of the original change.
|
|
1413
|
+
const nodeIdEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.change.rootNodes.nodeChanges, detachIdEntry.value, countToProcess);
|
|
1414
|
+
countToProcess = nodeIdEntry.length;
|
|
1415
|
+
result = {
|
|
1416
|
+
value: { nodeChange: nodeIdEntry.value, detachId: detachIdEntry.value },
|
|
1417
|
+
length: countToProcess,
|
|
1418
|
+
};
|
|
1419
|
+
}
|
|
1420
|
+
if (result.value?.nodeChange !== undefined) {
|
|
1421
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.invertedNodeToParent, result.value.nodeChange, {
|
|
1422
|
+
field: this.fieldId,
|
|
1423
|
+
});
|
|
1424
|
+
}
|
|
1425
|
+
return result;
|
|
1277
1426
|
}
|
|
1278
1427
|
}
|
|
1279
|
-
class
|
|
1280
|
-
constructor(table,
|
|
1281
|
-
|
|
1428
|
+
class RebaseNodeManagerI {
|
|
1429
|
+
constructor(table, fieldId, allowInval = true) {
|
|
1430
|
+
this.table = table;
|
|
1282
1431
|
this.fieldId = fieldId;
|
|
1432
|
+
this.allowInval = allowInval;
|
|
1283
1433
|
}
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1434
|
+
getNewChangesForBaseAttach(baseAttachId, count) {
|
|
1435
|
+
let countToProcess = count;
|
|
1436
|
+
const detachEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, countToProcess);
|
|
1437
|
+
countToProcess = detachEntry.length;
|
|
1438
|
+
const nodeEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.newChange.rootNodes.nodeChanges, detachEntry.value, countToProcess);
|
|
1439
|
+
countToProcess = nodeEntry.length;
|
|
1440
|
+
const newNodeId = nodeEntry.value;
|
|
1441
|
+
const newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(detachEntry.value, countToProcess);
|
|
1442
|
+
countToProcess = newRenameEntry.length;
|
|
1443
|
+
let result;
|
|
1444
|
+
// eslint-disable-next-line unicorn/prefer-ternary
|
|
1445
|
+
if (newNodeId !== undefined || newRenameEntry.value !== undefined) {
|
|
1446
|
+
result = {
|
|
1447
|
+
...newRenameEntry,
|
|
1448
|
+
value: { detachId: newRenameEntry.value, nodeChange: newNodeId },
|
|
1449
|
+
};
|
|
1450
|
+
}
|
|
1451
|
+
else {
|
|
1452
|
+
// This handles the case where the base changeset has moved these nodes,
|
|
1453
|
+
// meaning they were attached in the input context of the base changeset.
|
|
1454
|
+
result = this.table.entries.getFirst(baseAttachId, countToProcess);
|
|
1455
|
+
}
|
|
1456
|
+
// TODO: Consider moving these two checks into a separate method so that this function has no side effects.
|
|
1457
|
+
if (result.value?.detachId !== undefined) {
|
|
1458
|
+
this.table.rebasedDetachLocations.set(result.value.detachId, result.length, this.fieldId);
|
|
1459
|
+
}
|
|
1460
|
+
if (result.value?.nodeChange !== undefined) {
|
|
1461
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.rebasedNodeToParent, result.value.nodeChange, {
|
|
1462
|
+
field: this.fieldId,
|
|
1463
|
+
});
|
|
1464
|
+
}
|
|
1465
|
+
return result;
|
|
1466
|
+
}
|
|
1467
|
+
rebaseOverDetach(baseDetachId, count, newDetachId, nodeChange, cellRename) {
|
|
1468
|
+
let countToProcess = count;
|
|
1469
|
+
const attachIdEntry = firstAttachIdFromDetachId(this.table.baseRoots, baseDetachId, countToProcess);
|
|
1470
|
+
const baseAttachId = attachIdEntry.value;
|
|
1471
|
+
countToProcess = attachIdEntry.length;
|
|
1472
|
+
const attachFieldEntry = getFirstFieldForCrossFieldKey(this.table.baseChange, { ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, countToProcess);
|
|
1473
|
+
countToProcess = attachFieldEntry.length;
|
|
1474
|
+
const detachedMoveEntry = this.table.baseChange.rootNodes.outputDetachLocations.getFirst(baseDetachId, countToProcess);
|
|
1475
|
+
countToProcess = detachedMoveEntry.length;
|
|
1476
|
+
const destinationField = attachFieldEntry.value ?? detachedMoveEntry.value;
|
|
1477
|
+
if (destinationField !== undefined) {
|
|
1478
|
+
// The base detach is part of a move (or move of detach location) in the base changeset.
|
|
1479
|
+
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.table.entries, baseAttachId, countToProcess, {
|
|
1480
|
+
nodeChange,
|
|
1481
|
+
detachId: newDetachId,
|
|
1482
|
+
cellRename,
|
|
1483
|
+
});
|
|
1484
|
+
if (nodeChange !== undefined || newDetachId !== undefined) {
|
|
1485
|
+
this.invalidateBaseFields([destinationField]);
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
if (attachFieldEntry.value === undefined) {
|
|
1489
|
+
// These nodes are detached in the output context of the base changeset.
|
|
1490
|
+
if (nodeChange !== undefined) {
|
|
1491
|
+
assignRootChange(this.table.rebasedRootNodes, this.table.rebasedNodeToParent, baseAttachId, nodeChange, this.fieldId, this.table.rebaseVersion);
|
|
1492
|
+
}
|
|
1493
|
+
if (newDetachId !== undefined) {
|
|
1494
|
+
addNodeRename(this.table.rebasedRootNodes, baseAttachId, newDetachId, countToProcess, this.fieldId);
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
if (newDetachId !== undefined) {
|
|
1498
|
+
this.table.movedDetaches.set(newDetachId, countToProcess, true);
|
|
1499
|
+
}
|
|
1500
|
+
if (countToProcess < count) {
|
|
1501
|
+
const remainingCount = count - countToProcess;
|
|
1502
|
+
const nextDetachId = newDetachId !== undefined
|
|
1503
|
+
? (0, index_js_1.offsetChangeAtomId)(newDetachId, countToProcess)
|
|
1504
|
+
: undefined;
|
|
1505
|
+
this.rebaseOverDetach((0, index_js_1.offsetChangeAtomId)(baseDetachId, countToProcess), remainingCount, nextDetachId, nodeChange);
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
addDetach(id, count) {
|
|
1509
|
+
this.table.rebasedDetachLocations.set(id, count, this.fieldId);
|
|
1510
|
+
}
|
|
1511
|
+
removeDetach(id, count) {
|
|
1512
|
+
this.table.movedDetaches.set(id, count, true);
|
|
1513
|
+
}
|
|
1514
|
+
doesBaseAttachNodes(id, count) {
|
|
1515
|
+
let countToProcess = count;
|
|
1516
|
+
const attachEntry = getFirstAttachField(this.table.baseChange.crossFieldKeys, id, countToProcess);
|
|
1517
|
+
countToProcess = attachEntry.length;
|
|
1518
|
+
return { start: id, value: attachEntry.value !== undefined, length: countToProcess };
|
|
1519
|
+
}
|
|
1520
|
+
getBaseRename(id, count) {
|
|
1521
|
+
return this.table.baseChange.rootNodes.oldToNewId.getFirst(id, count);
|
|
1522
|
+
}
|
|
1523
|
+
getNewRenameForBaseRename(baseRenameTo, count) {
|
|
1524
|
+
let countToProcess = count;
|
|
1525
|
+
const inputEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseRenameTo, countToProcess);
|
|
1526
|
+
const attachEntry = getFirstAttachField(this.table.baseChange.crossFieldKeys, baseRenameTo, countToProcess);
|
|
1527
|
+
countToProcess = attachEntry.length;
|
|
1528
|
+
if (attachEntry.value !== undefined) {
|
|
1529
|
+
// These nodes are attached in the output context of the base changeset.
|
|
1530
|
+
return { value: undefined, length: countToProcess };
|
|
1531
|
+
}
|
|
1532
|
+
countToProcess = inputEntry.length;
|
|
1533
|
+
const inputId = inputEntry.value;
|
|
1534
|
+
const moveEntry = this.table.entries.getFirst(inputId, countToProcess);
|
|
1535
|
+
countToProcess = moveEntry.length;
|
|
1536
|
+
if (moveEntry.value !== undefined) {
|
|
1537
|
+
return { ...moveEntry, value: moveEntry.value.cellRename ?? moveEntry.value.detachId };
|
|
1538
|
+
}
|
|
1539
|
+
return this.table.newChange.rootNodes.oldToNewId.getFirst(inputId, countToProcess);
|
|
1540
|
+
}
|
|
1541
|
+
invalidateBaseFields(fields) {
|
|
1542
|
+
if (this.allowInval) {
|
|
1543
|
+
for (const fieldId of fields) {
|
|
1544
|
+
this.table.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);
|
|
1300
1545
|
}
|
|
1301
1546
|
}
|
|
1302
|
-
super.set(target, revision, id, count, newValue, invalidateDependents);
|
|
1303
|
-
}
|
|
1304
|
-
onMoveIn(id) {
|
|
1305
|
-
setInChangeAtomIdMap(this.table.rebasedNodeToParent, id, this.fieldId);
|
|
1306
|
-
}
|
|
1307
|
-
moveKey(target, revision, id, count) {
|
|
1308
|
-
this.table.rebasedCrossFieldKeys.set({ target, revision, localId: id }, count, this.fieldId);
|
|
1309
1547
|
}
|
|
1310
|
-
|
|
1311
|
-
|
|
1548
|
+
}
|
|
1549
|
+
function assignRootChange(table, nodeToParent, detachId, nodeId, detachLocation, rebaseVersion) {
|
|
1550
|
+
(0, internal_1.assert)(rebaseVersion >= 2 || detachLocation !== undefined, "All root changes need a detach location to support compatibility with older client versions");
|
|
1551
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.nodeChanges, detachId, nodeId);
|
|
1552
|
+
if (nodeToParent !== undefined) {
|
|
1553
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, nodeId, { root: detachId });
|
|
1312
1554
|
}
|
|
1555
|
+
table.detachLocations.set(detachId, 1, detachLocation);
|
|
1313
1556
|
}
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
super(table, currentField, allowInval);
|
|
1557
|
+
class ComposeNodeManagerI {
|
|
1558
|
+
constructor(table, fieldId, allowInval = true) {
|
|
1559
|
+
this.table = table;
|
|
1318
1560
|
this.fieldId = fieldId;
|
|
1561
|
+
this.allowInval = allowInval;
|
|
1319
1562
|
}
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
if
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1563
|
+
getNewChangesForBaseDetach(baseDetachId, count) {
|
|
1564
|
+
let countToProcess = count;
|
|
1565
|
+
const baseAttachEntry = getFirstFieldForCrossFieldKey(this.table.baseChange, { target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...baseDetachId }, countToProcess);
|
|
1566
|
+
countToProcess = baseAttachEntry.length;
|
|
1567
|
+
let result;
|
|
1568
|
+
if (baseAttachEntry.value !== undefined) {
|
|
1569
|
+
// The base detach was part of a move.
|
|
1570
|
+
// We check if we've previously seen a node change at the move destination.
|
|
1571
|
+
const entry = this.table.entries.getFirst(baseDetachId, countToProcess);
|
|
1572
|
+
result = { value: entry.value, length: entry.length };
|
|
1573
|
+
}
|
|
1574
|
+
else {
|
|
1575
|
+
// The detached nodes are still detached in the new change's input context.
|
|
1576
|
+
const rootEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.newChange.rootNodes.nodeChanges, baseDetachId, countToProcess);
|
|
1577
|
+
countToProcess = rootEntry.length;
|
|
1578
|
+
const newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(baseDetachId, countToProcess);
|
|
1579
|
+
countToProcess = newRenameEntry.length;
|
|
1580
|
+
result = {
|
|
1581
|
+
value: { nodeChange: rootEntry.value, detachId: newRenameEntry.value },
|
|
1582
|
+
length: countToProcess,
|
|
1583
|
+
};
|
|
1584
|
+
}
|
|
1585
|
+
// TODO: Consider moving this to a separate method so that this method can be side-effect free.
|
|
1586
|
+
if (result.value?.nodeChange !== undefined) {
|
|
1587
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.movedNodeToParent, result.value.nodeChange, {
|
|
1588
|
+
field: this.fieldId,
|
|
1589
|
+
});
|
|
1590
|
+
}
|
|
1591
|
+
return result;
|
|
1592
|
+
}
|
|
1593
|
+
composeAttachDetach(baseAttachId, newDetachId, count) {
|
|
1594
|
+
let countToProcess = count;
|
|
1595
|
+
const newAttachEntry = getFirstAttachField(this.table.newChange.crossFieldKeys, newDetachId, countToProcess);
|
|
1596
|
+
countToProcess = newAttachEntry.length;
|
|
1597
|
+
// Both changes can have the same ID if they came from inverse changesets.
|
|
1598
|
+
// If the new detach is part of a move,
|
|
1599
|
+
// then both input changesets contain the attach cross-field key for this ID.
|
|
1600
|
+
// The new attach may still exist in the composed changeset so we do not remove it here.
|
|
1601
|
+
// The new attach will typically cancel with a base detach,
|
|
1602
|
+
// in which case the cross-field key will be removed in `composeDetachAttach`.
|
|
1603
|
+
const hasNewAttachWithBaseAttachId = (0, index_js_1.areEqualChangeAtomIds)(baseAttachId, newDetachId) && newAttachEntry.value !== undefined;
|
|
1604
|
+
if (!hasNewAttachWithBaseAttachId) {
|
|
1605
|
+
this.table.removedCrossFieldKeys.set({ ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, countToProcess, true);
|
|
1606
|
+
}
|
|
1607
|
+
const baseDetachEntry = getFirstDetachField(this.table.baseChange.crossFieldKeys, baseAttachId, countToProcess);
|
|
1608
|
+
countToProcess = baseDetachEntry.length;
|
|
1609
|
+
const baseRootIdEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, countToProcess);
|
|
1610
|
+
countToProcess = baseRootIdEntry.length;
|
|
1611
|
+
const baseDetachId = baseRootIdEntry.value;
|
|
1612
|
+
if (baseDetachEntry.value !== undefined) {
|
|
1613
|
+
// The base change moves these nodes.
|
|
1614
|
+
const prevEntry = this.table.entries.getFirst(baseAttachId, baseDetachEntry.length).value ?? {};
|
|
1615
|
+
this.table.entries.set(baseAttachId, baseDetachEntry.length, {
|
|
1616
|
+
...prevEntry,
|
|
1617
|
+
detachId: newDetachId,
|
|
1618
|
+
});
|
|
1619
|
+
// The new detach will replace the base detach, so we remove the key for the base detach, unless they have the same ID.
|
|
1620
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(baseAttachId, newDetachId)) {
|
|
1621
|
+
this.table.removedCrossFieldKeys.set({ ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
|
|
1622
|
+
}
|
|
1623
|
+
this.table.movedCrossFieldKeys.set({ ...newDetachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, baseDetachEntry.value);
|
|
1624
|
+
this.invalidateBaseFields([baseDetachEntry.value]);
|
|
1625
|
+
}
|
|
1626
|
+
else {
|
|
1627
|
+
const baseDetachLocationEntry = this.table.baseChange.rootNodes.detachLocations.getFirst(baseDetachId, countToProcess);
|
|
1628
|
+
countToProcess = baseDetachLocationEntry.length;
|
|
1629
|
+
// These nodes were detached in the base change's input context,
|
|
1630
|
+
// so the net effect of the two changes is a rename.
|
|
1631
|
+
appendNodeRename(this.table.composedRootNodes, baseAttachId, newDetachId, baseDetachEntry.length, this.table.baseChange.rootNodes, baseDetachLocationEntry.value ?? this.fieldId);
|
|
1632
|
+
this.table.removedCrossFieldKeys.set({ ...newDetachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
|
|
1633
|
+
}
|
|
1634
|
+
if (newAttachEntry.value === undefined) {
|
|
1635
|
+
const newOutputDetachLocationEntry = this.table.newChange.rootNodes.outputDetachLocations.getFirst(newDetachId, countToProcess);
|
|
1636
|
+
countToProcess = newOutputDetachLocationEntry.length;
|
|
1637
|
+
this.table.composedRootNodes.outputDetachLocations.set(newDetachId, countToProcess, newOutputDetachLocationEntry.value ?? this.fieldId);
|
|
1638
|
+
}
|
|
1639
|
+
if (countToProcess < count) {
|
|
1640
|
+
const remainingCount = count - countToProcess;
|
|
1641
|
+
this.composeAttachDetach((0, index_js_1.offsetChangeAtomId)(baseAttachId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newDetachId, countToProcess), remainingCount);
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
sendNewChangesToBaseSourceLocation(baseAttachId, newChanges) {
|
|
1645
|
+
const { value: baseDetachId } = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, 1);
|
|
1646
|
+
const detachFields = getFieldsForCrossFieldKey(this.table.baseChange, {
|
|
1647
|
+
...baseDetachId,
|
|
1648
|
+
target: crossFieldQueries_js_1.CrossFieldTarget.Source,
|
|
1649
|
+
}, 1);
|
|
1650
|
+
if (detachFields.length > 0) {
|
|
1651
|
+
// The base attach is part of a move in the base changeset.
|
|
1652
|
+
const prevEntry = this.table.entries.getFirst(baseDetachId, 1).value ?? {};
|
|
1653
|
+
this.table.entries.set(baseDetachId, 1, { ...prevEntry, nodeChange: newChanges });
|
|
1654
|
+
if (newChanges !== undefined) {
|
|
1655
|
+
this.invalidateBaseFields(detachFields);
|
|
1656
|
+
}
|
|
1657
|
+
}
|
|
1658
|
+
else {
|
|
1659
|
+
const baseNodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(this.table.baseChange.rootNodes.nodeChanges, baseDetachId);
|
|
1660
|
+
if (baseNodeId !== undefined) {
|
|
1661
|
+
addNodesToCompose(this.table, baseNodeId, newChanges);
|
|
1331
1662
|
}
|
|
1332
1663
|
else {
|
|
1333
|
-
|
|
1334
|
-
target,
|
|
1335
|
-
revision,
|
|
1336
|
-
localId: id,
|
|
1337
|
-
}, count);
|
|
1338
|
-
(0, internal_1.assert)(baseFieldIds.length > 0, 0x9c8 /* Cross field key not registered in base or new change */);
|
|
1339
|
-
for (const baseFieldId of baseFieldIds) {
|
|
1340
|
-
this.table.pendingCompositions.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
|
|
1341
|
-
}
|
|
1664
|
+
assignRootChange(this.table.composedRootNodes, this.table.movedNodeToParent, baseDetachId, newChanges, this.fieldId, this.table.rebaseVersion);
|
|
1342
1665
|
}
|
|
1343
1666
|
}
|
|
1344
|
-
super.set(target, revision, id, count, newValue, invalidateDependents);
|
|
1345
|
-
}
|
|
1346
|
-
onMoveIn(id) {
|
|
1347
|
-
setInChangeAtomIdMap(this.table.composedNodeToParent, id, this.fieldId);
|
|
1348
1667
|
}
|
|
1349
|
-
|
|
1350
|
-
|
|
1668
|
+
areSameNodes(baseDetachId, newAttachId, count) {
|
|
1669
|
+
const renamedDetachEntry = firstAttachIdFromDetachId(this.table.composedRootNodes, baseDetachId, count);
|
|
1670
|
+
const isReattachOfSameNodes = (0, index_js_1.areEqualChangeAtomIds)(renamedDetachEntry.value, newAttachId);
|
|
1671
|
+
return { ...renamedDetachEntry, value: isReattachOfSameNodes };
|
|
1672
|
+
}
|
|
1673
|
+
composeDetachAttach(baseDetachId, newAttachId, count, composeToPin) {
|
|
1674
|
+
const areSameEntry = this.areSameNodes(baseDetachId, newAttachId, count);
|
|
1675
|
+
const countToProcess = areSameEntry.length;
|
|
1676
|
+
if (areSameEntry.value) {
|
|
1677
|
+
// These nodes have been moved back to their original location, so the composed changeset should not have any renames for them.
|
|
1678
|
+
// Note that deleting the rename from `this.table.composedRootNodes` would change the result of this method
|
|
1679
|
+
// if it were rerun due to the field being invalidated, so we instead record that the rename should be deleted later.
|
|
1680
|
+
this.table.renamesToDelete.set(baseDetachId, countToProcess, true);
|
|
1681
|
+
}
|
|
1682
|
+
if (composeToPin) {
|
|
1683
|
+
this.table.movedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...newAttachId }, countToProcess, this.fieldId);
|
|
1684
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(baseDetachId, newAttachId)) {
|
|
1685
|
+
// The pin will have `newAttachId` as both its detach and attach ID.
|
|
1686
|
+
// So we remove `baseDetachId` unless that is equal to the pin's detach ID.
|
|
1687
|
+
this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...baseDetachId }, countToProcess, true);
|
|
1688
|
+
}
|
|
1689
|
+
// Note that while change2 should already have this key, change1 may have a rollback for the same ID in a different location.
|
|
1690
|
+
// In that case, change1's attach should be canceled out by a detach from change2.
|
|
1691
|
+
// Here we make sure that the composed change has the correct location (this field) for the attach ID.
|
|
1692
|
+
this.table.movedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...newAttachId }, countToProcess, this.fieldId);
|
|
1693
|
+
}
|
|
1694
|
+
else {
|
|
1695
|
+
this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...baseDetachId }, countToProcess, true);
|
|
1696
|
+
this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...newAttachId }, countToProcess, true);
|
|
1697
|
+
}
|
|
1698
|
+
if (countToProcess < count) {
|
|
1699
|
+
this.composeAttachDetach((0, index_js_1.offsetChangeAtomId)(baseDetachId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newAttachId, countToProcess), count - countToProcess);
|
|
1700
|
+
}
|
|
1351
1701
|
}
|
|
1352
|
-
|
|
1353
|
-
|
|
1702
|
+
invalidateBaseFields(fields) {
|
|
1703
|
+
if (this.allowInval) {
|
|
1704
|
+
for (const fieldId of fields) {
|
|
1705
|
+
this.table.pendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1354
1708
|
}
|
|
1355
1709
|
}
|
|
1356
1710
|
function makeModularChangeset(props = {
|
|
1357
1711
|
maxId: -1,
|
|
1358
1712
|
}) {
|
|
1359
1713
|
const changeset = {
|
|
1714
|
+
rebaseVersion: props.rebaseVersion ?? 1,
|
|
1360
1715
|
fieldChanges: props.fieldChanges ?? new Map(),
|
|
1361
1716
|
nodeChanges: props.nodeChanges ?? (0, index_js_2.newTupleBTree)(),
|
|
1717
|
+
rootNodes: props.rootNodes ?? newRootTable(),
|
|
1362
1718
|
nodeToParent: props.nodeToParent ?? (0, index_js_2.newTupleBTree)(),
|
|
1363
1719
|
nodeAliases: props.nodeAliases ?? (0, index_js_2.newTupleBTree)(),
|
|
1364
|
-
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.
|
|
1720
|
+
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1365
1721
|
};
|
|
1366
1722
|
if (props.revisions !== undefined && props.revisions.length > 0) {
|
|
1367
1723
|
changeset.revisions = props.revisions;
|
|
@@ -1394,6 +1750,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1394
1750
|
this.transactionDepth = 0;
|
|
1395
1751
|
this.idAllocator = (0, index_js_2.idAllocatorFromMaxId)();
|
|
1396
1752
|
}
|
|
1753
|
+
isInTransaction() {
|
|
1754
|
+
return this.transactionDepth > 0;
|
|
1755
|
+
}
|
|
1397
1756
|
enterTransaction() {
|
|
1398
1757
|
this.transactionDepth += 1;
|
|
1399
1758
|
if (this.transactionDepth === 1) {
|
|
@@ -1444,7 +1803,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1444
1803
|
fieldChange: { fieldKind, change },
|
|
1445
1804
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1446
1805
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1447
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1806
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1807
|
+
rootNodes: newRootTable(),
|
|
1448
1808
|
idAllocator: this.idAllocator,
|
|
1449
1809
|
localCrossFieldKeys,
|
|
1450
1810
|
revision,
|
|
@@ -1463,6 +1823,7 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1463
1823
|
? makeModularChangeset({
|
|
1464
1824
|
maxId: this.idAllocator.getMaxId(),
|
|
1465
1825
|
builds: change.builds,
|
|
1826
|
+
rootNodes: renameTableFromRenameDescriptions(change.renames ?? []),
|
|
1466
1827
|
revisions: [{ revision: change.revision }],
|
|
1467
1828
|
})
|
|
1468
1829
|
: buildModularChangesetFromField({
|
|
@@ -1473,7 +1834,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1473
1834
|
},
|
|
1474
1835
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1475
1836
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1476
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1837
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1838
|
+
rootNodes: newRootTable(),
|
|
1477
1839
|
idAllocator: this.idAllocator,
|
|
1478
1840
|
localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
|
|
1479
1841
|
revision: change.revision,
|
|
@@ -1502,7 +1864,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1502
1864
|
nodeChange,
|
|
1503
1865
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1504
1866
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1505
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1867
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1868
|
+
rootNodes: newRootTable(),
|
|
1506
1869
|
idAllocator: this.idAllocator,
|
|
1507
1870
|
revision,
|
|
1508
1871
|
}), revision));
|
|
@@ -1516,7 +1879,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1516
1879
|
nodeChange,
|
|
1517
1880
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1518
1881
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1519
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1882
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1883
|
+
rootNodes: newRootTable(),
|
|
1520
1884
|
idAllocator: this.idAllocator,
|
|
1521
1885
|
revision,
|
|
1522
1886
|
}), revision));
|
|
@@ -1524,16 +1888,19 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1524
1888
|
}
|
|
1525
1889
|
exports.ModularEditBuilder = ModularEditBuilder;
|
|
1526
1890
|
function buildModularChangesetFromField(props) {
|
|
1527
|
-
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
|
|
1891
|
+
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, rootNodes, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
|
|
1528
1892
|
const fieldChanges = new Map([[path.field, fieldChange]]);
|
|
1529
1893
|
if (path.parent === undefined) {
|
|
1894
|
+
const field = { nodeId: undefined, field: path.field };
|
|
1530
1895
|
for (const { key, count } of localCrossFieldKeys) {
|
|
1531
|
-
crossFieldKeys.set(key, count,
|
|
1896
|
+
crossFieldKeys.set(key, count, field);
|
|
1532
1897
|
}
|
|
1533
1898
|
if (childId !== undefined) {
|
|
1534
|
-
setInChangeAtomIdMap(nodeToParent, childId, {
|
|
1535
|
-
|
|
1536
|
-
|
|
1899
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
|
|
1900
|
+
field: {
|
|
1901
|
+
nodeId: undefined,
|
|
1902
|
+
field: path.field,
|
|
1903
|
+
},
|
|
1537
1904
|
});
|
|
1538
1905
|
}
|
|
1539
1906
|
return makeModularChangeset({
|
|
@@ -1541,6 +1908,7 @@ function buildModularChangesetFromField(props) {
|
|
|
1541
1908
|
nodeChanges,
|
|
1542
1909
|
nodeToParent,
|
|
1543
1910
|
crossFieldKeys,
|
|
1911
|
+
rootNodes,
|
|
1544
1912
|
maxId: idAllocator.getMaxId(),
|
|
1545
1913
|
revisions: [{ revision }],
|
|
1546
1914
|
});
|
|
@@ -1549,13 +1917,13 @@ function buildModularChangesetFromField(props) {
|
|
|
1549
1917
|
fieldChanges,
|
|
1550
1918
|
};
|
|
1551
1919
|
const parentId = { localId: (0, index_js_2.brand)(idAllocator.allocate()), revision };
|
|
1920
|
+
const fieldId = { nodeId: parentId, field: path.field };
|
|
1552
1921
|
for (const { key, count } of localCrossFieldKeys) {
|
|
1553
1922
|
crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
|
|
1554
1923
|
}
|
|
1555
1924
|
if (childId !== undefined) {
|
|
1556
|
-
setInChangeAtomIdMap(nodeToParent, childId, {
|
|
1557
|
-
|
|
1558
|
-
field: path.field,
|
|
1925
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
|
|
1926
|
+
field: fieldId,
|
|
1559
1927
|
});
|
|
1560
1928
|
}
|
|
1561
1929
|
return buildModularChangesetFromNode({
|
|
@@ -1564,28 +1932,50 @@ function buildModularChangesetFromField(props) {
|
|
|
1564
1932
|
nodeChanges,
|
|
1565
1933
|
nodeToParent,
|
|
1566
1934
|
crossFieldKeys,
|
|
1935
|
+
rootNodes,
|
|
1567
1936
|
idAllocator,
|
|
1568
1937
|
revision,
|
|
1569
1938
|
nodeId: parentId,
|
|
1570
1939
|
});
|
|
1571
1940
|
}
|
|
1941
|
+
exports.buildModularChangesetFromField = buildModularChangesetFromField;
|
|
1572
1942
|
function buildModularChangesetFromNode(props) {
|
|
1573
1943
|
const { path, nodeId = { localId: (0, index_js_2.brand)(props.idAllocator.allocate()), revision: props.revision }, } = props;
|
|
1574
|
-
setInChangeAtomIdMap(props.nodeChanges, nodeId, props.nodeChange);
|
|
1575
|
-
|
|
1576
|
-
[path.
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1944
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(props.nodeChanges, nodeId, props.nodeChange);
|
|
1945
|
+
if ((0, index_js_1.isDetachedUpPathRoot)(path)) {
|
|
1946
|
+
props.rootNodes.nodeChanges.set([path.detachedNodeId.major, (0, index_js_2.brand)(path.detachedNodeId.minor)], nodeId);
|
|
1947
|
+
return makeModularChangeset({
|
|
1948
|
+
rootNodes: props.rootNodes,
|
|
1949
|
+
nodeChanges: props.nodeChanges,
|
|
1950
|
+
nodeToParent: props.nodeToParent,
|
|
1951
|
+
crossFieldKeys: props.crossFieldKeys,
|
|
1952
|
+
maxId: props.idAllocator.getMaxId(),
|
|
1953
|
+
revisions: [{ revision: props.revision }],
|
|
1954
|
+
});
|
|
1955
|
+
}
|
|
1956
|
+
else {
|
|
1957
|
+
const fieldChangeset = genericFieldKind_js_1.genericFieldKind.changeHandler.editor.buildChildChanges([
|
|
1958
|
+
[path.parentIndex, nodeId],
|
|
1959
|
+
]);
|
|
1960
|
+
const fieldChange = {
|
|
1961
|
+
fieldKind: genericFieldKind_js_1.genericFieldKind.identifier,
|
|
1962
|
+
change: fieldChangeset,
|
|
1963
|
+
};
|
|
1964
|
+
return buildModularChangesetFromField({
|
|
1965
|
+
...props,
|
|
1966
|
+
path: { parent: path.parent, field: path.parentField },
|
|
1967
|
+
fieldChange,
|
|
1968
|
+
localCrossFieldKeys: [],
|
|
1969
|
+
childId: nodeId,
|
|
1970
|
+
});
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
function renameTableFromRenameDescriptions(renames) {
|
|
1974
|
+
const table = newRootTable();
|
|
1975
|
+
for (const rename of renames) {
|
|
1976
|
+
addNodeRename(table, rename.oldId, rename.newId, rename.count, rename.detachLocation);
|
|
1977
|
+
}
|
|
1978
|
+
return table;
|
|
1589
1979
|
}
|
|
1590
1980
|
function getRevInfoFromTaggedChanges(changes) {
|
|
1591
1981
|
let maxId = -1;
|
|
@@ -1595,20 +1985,6 @@ function getRevInfoFromTaggedChanges(changes) {
|
|
|
1595
1985
|
maxId = Math.max(change.maxId ?? -1, maxId);
|
|
1596
1986
|
revInfos.push(...revisionInfoFromTaggedChange(taggedChange));
|
|
1597
1987
|
}
|
|
1598
|
-
const revisions = new Set();
|
|
1599
|
-
const rolledBackRevisions = [];
|
|
1600
|
-
for (const info of revInfos) {
|
|
1601
|
-
revisions.add(info.revision);
|
|
1602
|
-
if (info.rollbackOf !== undefined) {
|
|
1603
|
-
rolledBackRevisions.push(info.rollbackOf);
|
|
1604
|
-
}
|
|
1605
|
-
}
|
|
1606
|
-
rolledBackRevisions.reverse();
|
|
1607
|
-
for (const revision of rolledBackRevisions) {
|
|
1608
|
-
if (!revisions.has(revision)) {
|
|
1609
|
-
revInfos.push({ revision });
|
|
1610
|
-
}
|
|
1611
|
-
}
|
|
1612
1988
|
return { maxId: (0, index_js_2.brand)(maxId), revInfos };
|
|
1613
1989
|
}
|
|
1614
1990
|
function revisionInfoFromTaggedChange(taggedChange) {
|
|
@@ -1625,15 +2001,16 @@ function revisionInfoFromTaggedChange(taggedChange) {
|
|
|
1625
2001
|
}
|
|
1626
2002
|
return revInfos;
|
|
1627
2003
|
}
|
|
1628
|
-
function fieldChangeFromId(
|
|
1629
|
-
const
|
|
2004
|
+
function fieldChangeFromId(change, id) {
|
|
2005
|
+
const fieldId = normalizeFieldId(id, change.nodeAliases);
|
|
2006
|
+
const fieldMap = fieldMapFromNodeId(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldId.nodeId);
|
|
1630
2007
|
return fieldMap.get(id.field) ?? (0, internal_1.fail)(0xb25 /* No field exists for the given ID */);
|
|
1631
2008
|
}
|
|
1632
|
-
function fieldMapFromNodeId(rootFieldMap, nodes, nodeId) {
|
|
2009
|
+
function fieldMapFromNodeId(rootFieldMap, nodes, aliases, nodeId) {
|
|
1633
2010
|
if (nodeId === undefined) {
|
|
1634
2011
|
return rootFieldMap;
|
|
1635
2012
|
}
|
|
1636
|
-
const node = nodeChangeFromId(nodes, nodeId);
|
|
2013
|
+
const node = nodeChangeFromId(nodes, aliases, nodeId);
|
|
1637
2014
|
(0, internal_1.assert)(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);
|
|
1638
2015
|
return node.fieldChanges;
|
|
1639
2016
|
}
|
|
@@ -1644,10 +2021,11 @@ function rebasedFieldIdFromBaseId(table, baseId) {
|
|
|
1644
2021
|
return { ...baseId, nodeId: rebasedNodeIdFromBaseNodeId(table, baseId.nodeId) };
|
|
1645
2022
|
}
|
|
1646
2023
|
function rebasedNodeIdFromBaseNodeId(table, baseId) {
|
|
1647
|
-
return getFromChangeAtomIdMap(table.baseToRebasedNodeId, baseId) ?? baseId;
|
|
2024
|
+
return (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, baseId) ?? baseId;
|
|
1648
2025
|
}
|
|
1649
|
-
function nodeChangeFromId(nodes, id) {
|
|
1650
|
-
const
|
|
2026
|
+
function nodeChangeFromId(nodes, aliases, id) {
|
|
2027
|
+
const normalizedId = normalizeNodeId(id, aliases);
|
|
2028
|
+
const node = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodes, normalizedId);
|
|
1651
2029
|
(0, internal_1.assert)(node !== undefined, 0x9ca /* Unknown node ID */);
|
|
1652
2030
|
return node;
|
|
1653
2031
|
}
|
|
@@ -1655,12 +2033,20 @@ function fieldIdFromFieldIdKey([revision, localId, field]) {
|
|
|
1655
2033
|
const nodeId = localId !== undefined ? { revision, localId } : undefined;
|
|
1656
2034
|
return { nodeId, field };
|
|
1657
2035
|
}
|
|
2036
|
+
function fieldIdKeyFromFieldId(fieldId) {
|
|
2037
|
+
return [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];
|
|
2038
|
+
}
|
|
1658
2039
|
function cloneNodeChangeset(nodeChangeset) {
|
|
1659
2040
|
if (nodeChangeset.fieldChanges !== undefined) {
|
|
1660
2041
|
return { ...nodeChangeset, fieldChanges: new Map(nodeChangeset.fieldChanges) };
|
|
1661
2042
|
}
|
|
1662
2043
|
return { ...nodeChangeset };
|
|
1663
2044
|
}
|
|
2045
|
+
function replaceNodeLocationRevision(location, oldRevisions, newRevision) {
|
|
2046
|
+
return location.field !== undefined
|
|
2047
|
+
? { field: replaceFieldIdRevision(location.field, oldRevisions, newRevision) }
|
|
2048
|
+
: { root: (0, index_js_1.replaceAtomRevisions)(location.root, oldRevisions, newRevision) };
|
|
2049
|
+
}
|
|
1664
2050
|
function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
|
|
1665
2051
|
if (fieldId.nodeId === undefined) {
|
|
1666
2052
|
return fieldId;
|
|
@@ -1670,17 +2056,34 @@ function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
|
|
|
1670
2056
|
nodeId: (0, index_js_1.replaceAtomRevisions)(fieldId.nodeId, oldRevisions, newRevision),
|
|
1671
2057
|
};
|
|
1672
2058
|
}
|
|
1673
|
-
function
|
|
1674
|
-
const
|
|
1675
|
-
(0,
|
|
1676
|
-
|
|
2059
|
+
function getNodeParent(changeset, nodeId) {
|
|
2060
|
+
const normalizedNodeId = normalizeNodeId(nodeId, changeset.nodeAliases);
|
|
2061
|
+
const location = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(changeset.nodeToParent, normalizedNodeId);
|
|
2062
|
+
(0, internal_1.assert)(location !== undefined, 0x9cb /* Parent field should be defined */);
|
|
2063
|
+
if (location.field !== undefined) {
|
|
2064
|
+
return { field: normalizeFieldId(location.field, changeset.nodeAliases) };
|
|
2065
|
+
}
|
|
2066
|
+
return location;
|
|
1677
2067
|
}
|
|
1678
|
-
exports.
|
|
2068
|
+
exports.getNodeParent = getNodeParent;
|
|
1679
2069
|
function getFieldsForCrossFieldKey(changeset, key, count) {
|
|
1680
2070
|
return changeset.crossFieldKeys
|
|
1681
2071
|
.getAll(key, count)
|
|
1682
2072
|
.map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
|
|
1683
2073
|
}
|
|
2074
|
+
function getFirstFieldForCrossFieldKey(changeset, key, count) {
|
|
2075
|
+
const result = changeset.crossFieldKeys.getFirst(key, count);
|
|
2076
|
+
if (result.value === undefined) {
|
|
2077
|
+
return result;
|
|
2078
|
+
}
|
|
2079
|
+
return { ...result, value: normalizeFieldId(result.value, changeset.nodeAliases) };
|
|
2080
|
+
}
|
|
2081
|
+
function normalizeNodeLocation(location, nodeAliases) {
|
|
2082
|
+
if (location.field !== undefined) {
|
|
2083
|
+
return { field: normalizeFieldId(location.field, nodeAliases) };
|
|
2084
|
+
}
|
|
2085
|
+
return location;
|
|
2086
|
+
}
|
|
1684
2087
|
// This is only exported for use in test utilities.
|
|
1685
2088
|
function normalizeFieldId(fieldId, nodeAliases) {
|
|
1686
2089
|
return fieldId.nodeId !== undefined
|
|
@@ -1693,25 +2096,455 @@ exports.normalizeFieldId = normalizeFieldId;
|
|
|
1693
2096
|
*/
|
|
1694
2097
|
function normalizeNodeId(nodeId, nodeAliases) {
|
|
1695
2098
|
let currentId = nodeId;
|
|
2099
|
+
let cycleProbeId = nodeId;
|
|
1696
2100
|
// eslint-disable-next-line no-constant-condition
|
|
1697
2101
|
while (true) {
|
|
1698
|
-
const dealiased = getFromChangeAtomIdMap(nodeAliases, currentId);
|
|
2102
|
+
const dealiased = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, currentId);
|
|
1699
2103
|
if (dealiased === undefined) {
|
|
1700
2104
|
return currentId;
|
|
1701
2105
|
}
|
|
1702
2106
|
currentId = dealiased;
|
|
2107
|
+
if (cycleProbeId !== undefined) {
|
|
2108
|
+
cycleProbeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, cycleProbeId);
|
|
2109
|
+
}
|
|
2110
|
+
if (cycleProbeId !== undefined) {
|
|
2111
|
+
cycleProbeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, cycleProbeId);
|
|
2112
|
+
}
|
|
2113
|
+
(0, internal_1.assert)(!(0, index_js_1.areEqualChangeAtomIdOpts)(cycleProbeId, currentId), "Alias cycle detected");
|
|
1703
2114
|
}
|
|
1704
2115
|
}
|
|
2116
|
+
exports.normalizeNodeId = normalizeNodeId;
|
|
1705
2117
|
function hasConflicts(change) {
|
|
1706
2118
|
return (change.constraintViolationCount ?? 0) > 0;
|
|
1707
2119
|
}
|
|
1708
|
-
function getFromChangeAtomIdMap(map, id) {
|
|
1709
|
-
return map.get([id.revision, id.localId]);
|
|
1710
|
-
}
|
|
1711
|
-
function setInChangeAtomIdMap(map, id, value) {
|
|
1712
|
-
map.set([id.revision, id.localId], value);
|
|
1713
|
-
}
|
|
1714
2120
|
function areEqualFieldIds(a, b) {
|
|
1715
2121
|
return (0, index_js_1.areEqualChangeAtomIdOpts)(a.nodeId, b.nodeId) && a.field === b.field;
|
|
1716
2122
|
}
|
|
2123
|
+
function firstAttachIdFromDetachId(roots, detachId, count) {
|
|
2124
|
+
const result = roots.oldToNewId.getFirst(detachId, count);
|
|
2125
|
+
return { ...result, value: result.value ?? detachId };
|
|
2126
|
+
}
|
|
2127
|
+
function firstDetachIdFromAttachId(roots, attachId, count) {
|
|
2128
|
+
const result = roots.newToOldId.getFirst(attachId, count);
|
|
2129
|
+
return { ...result, start: attachId, value: result.value ?? attachId };
|
|
2130
|
+
}
|
|
2131
|
+
function rebaseCrossFieldKeys(sourceTable, movedDetaches, newDetachLocations) {
|
|
2132
|
+
const rebasedTable = sourceTable.clone();
|
|
2133
|
+
for (const entry of movedDetaches.entries()) {
|
|
2134
|
+
rebasedTable.delete({ ...entry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, entry.length);
|
|
2135
|
+
}
|
|
2136
|
+
for (const entry of newDetachLocations.entries()) {
|
|
2137
|
+
rebasedTable.set({ ...entry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, entry.length, entry.value);
|
|
2138
|
+
}
|
|
2139
|
+
return rebasedTable;
|
|
2140
|
+
}
|
|
2141
|
+
function newRootTable() {
|
|
2142
|
+
return {
|
|
2143
|
+
newToOldId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2144
|
+
oldToNewId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2145
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
2146
|
+
detachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
2147
|
+
outputDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
2148
|
+
};
|
|
2149
|
+
}
|
|
2150
|
+
exports.newRootTable = newRootTable;
|
|
2151
|
+
function rebaseRoots(change, base, affectedBaseFields, nodesToRebase, rebasedNodeToParent, rebaseVersion) {
|
|
2152
|
+
const rebasedRoots = newRootTable();
|
|
2153
|
+
for (const renameEntry of change.rootNodes.oldToNewId.entries()) {
|
|
2154
|
+
rebaseRename(change.rootNodes, rebasedRoots, renameEntry, base, affectedBaseFields);
|
|
2155
|
+
}
|
|
2156
|
+
for (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
2157
|
+
const changes = base.rootNodes.nodeChanges.get(detachIdKey);
|
|
2158
|
+
if (changes !== undefined) {
|
|
2159
|
+
nodesToRebase.push([nodeId, changes]);
|
|
2160
|
+
}
|
|
2161
|
+
const detachId = (0, index_js_1.makeChangeAtomId)(detachIdKey[1], detachIdKey[0]);
|
|
2162
|
+
const attachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;
|
|
2163
|
+
const baseAttachEntry = base.crossFieldKeys.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...attachId }, 1);
|
|
2164
|
+
if (baseAttachEntry.value !== undefined) {
|
|
2165
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(baseAttachEntry.value), true);
|
|
2166
|
+
rebasedNodeToParent.delete(detachIdKey);
|
|
2167
|
+
}
|
|
2168
|
+
else {
|
|
2169
|
+
const renamedDetachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;
|
|
2170
|
+
const baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(renamedDetachId, 1).value;
|
|
2171
|
+
if (baseOutputDetachLocation !== undefined) {
|
|
2172
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);
|
|
2173
|
+
}
|
|
2174
|
+
const detachLocation = baseOutputDetachLocation ??
|
|
2175
|
+
change.rootNodes.detachLocations.getFirst(detachId, 1).value;
|
|
2176
|
+
// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.
|
|
2177
|
+
// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`
|
|
2178
|
+
assignRootChange(rebasedRoots, rebasedNodeToParent, renamedDetachId, nodeId, detachLocation, rebaseVersion);
|
|
2179
|
+
}
|
|
2180
|
+
}
|
|
2181
|
+
for (const entry of change.rootNodes.outputDetachLocations.entries()) {
|
|
2182
|
+
rebasedRoots.outputDetachLocations.set(entry.start, entry.length, entry.value);
|
|
2183
|
+
}
|
|
2184
|
+
return rebasedRoots;
|
|
2185
|
+
}
|
|
2186
|
+
function rebaseRename(newRoots, rebasedRoots, renameEntry, base, affectedBaseFields) {
|
|
2187
|
+
let count = renameEntry.length;
|
|
2188
|
+
const baseRenameEntry = firstAttachIdFromDetachId(base.rootNodes, renameEntry.start, count);
|
|
2189
|
+
count = baseRenameEntry.length;
|
|
2190
|
+
const baseAttachEntry = base.crossFieldKeys.getFirst({
|
|
2191
|
+
...baseRenameEntry.value,
|
|
2192
|
+
target: crossFieldQueries_js_1.CrossFieldTarget.Destination,
|
|
2193
|
+
}, count);
|
|
2194
|
+
count = baseAttachEntry.length;
|
|
2195
|
+
if (baseAttachEntry.value !== undefined) {
|
|
2196
|
+
// This rename represents an intention to detach these nodes.
|
|
2197
|
+
// The rebased change should have a detach in the field where the base change attaches the nodes,
|
|
2198
|
+
// so we need to ensure that field is processed.
|
|
2199
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(normalizeFieldId(baseAttachEntry.value, base.nodeAliases)), true);
|
|
2200
|
+
}
|
|
2201
|
+
else {
|
|
2202
|
+
const baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(baseRenameEntry.value, 1).value;
|
|
2203
|
+
if (baseOutputDetachLocation !== undefined) {
|
|
2204
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);
|
|
2205
|
+
}
|
|
2206
|
+
const detachEntry = newRoots.detachLocations.getFirst(renameEntry.start, count);
|
|
2207
|
+
count = detachEntry.length;
|
|
2208
|
+
const detachLocation = baseOutputDetachLocation ?? detachEntry.value;
|
|
2209
|
+
// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.
|
|
2210
|
+
// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`
|
|
2211
|
+
addNodeRename(rebasedRoots, baseRenameEntry.value, renameEntry.value, count, detachLocation);
|
|
2212
|
+
}
|
|
2213
|
+
const countRemaining = renameEntry.length - count;
|
|
2214
|
+
if (countRemaining > 0) {
|
|
2215
|
+
rebaseRename(newRoots, rebasedRoots, {
|
|
2216
|
+
start: (0, index_js_1.offsetChangeAtomId)(renameEntry.start, count),
|
|
2217
|
+
value: (0, index_js_1.offsetChangeAtomId)(renameEntry.value, count),
|
|
2218
|
+
length: countRemaining,
|
|
2219
|
+
}, base, affectedBaseFields);
|
|
2220
|
+
}
|
|
2221
|
+
}
|
|
2222
|
+
/**
|
|
2223
|
+
* For each root detach location, replaces any node ID from the base changeset
|
|
2224
|
+
* with the corresponding ID in the new changeset.
|
|
2225
|
+
*/
|
|
2226
|
+
function fixupRebasedDetachLocations(table) {
|
|
2227
|
+
for (const { start, length, value: detachLocation, } of table.rebasedRootNodes.detachLocations.entries()) {
|
|
2228
|
+
const normalizedDetachLocation = normalizeFieldId(detachLocation, table.baseChange.nodeAliases);
|
|
2229
|
+
if (normalizedDetachLocation.nodeId !== undefined) {
|
|
2230
|
+
const rebasedNodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, normalizedDetachLocation.nodeId);
|
|
2231
|
+
if (rebasedNodeId !== undefined) {
|
|
2232
|
+
table.rebasedRootNodes.detachLocations.set(start, length, {
|
|
2233
|
+
...normalizedDetachLocation,
|
|
2234
|
+
nodeId: rebasedNodeId,
|
|
2235
|
+
});
|
|
2236
|
+
}
|
|
2237
|
+
}
|
|
2238
|
+
}
|
|
2239
|
+
}
|
|
2240
|
+
function addNodesToCompose(table, id1, id2) {
|
|
2241
|
+
const normalizedId1 = normalizeNodeId(id1, table.baseChange.nodeAliases);
|
|
2242
|
+
const normalizedId2 = normalizeNodeId(id2, table.newChange.nodeAliases);
|
|
2243
|
+
if ((0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.newToBaseNodeId, normalizedId2) === undefined) {
|
|
2244
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.newToBaseNodeId, normalizedId2, normalizedId1);
|
|
2245
|
+
table.pendingCompositions.nodeIdsToCompose.push([normalizedId1, normalizedId2]);
|
|
2246
|
+
}
|
|
2247
|
+
}
|
|
2248
|
+
function composeRevInfos(revisions1, revisions2) {
|
|
2249
|
+
const result = [...(revisions1 ?? []), ...(revisions2 ?? [])];
|
|
2250
|
+
return result;
|
|
2251
|
+
}
|
|
2252
|
+
function composeCrossFieldKeyTables(table1, table2, movedCrossFieldKeys, removedCrossFieldKeys) {
|
|
2253
|
+
const composedTable = index_js_2.RangeMap.union(table1, table2);
|
|
2254
|
+
for (const entry of movedCrossFieldKeys.entries()) {
|
|
2255
|
+
composedTable.set(entry.start, entry.length, entry.value);
|
|
2256
|
+
}
|
|
2257
|
+
for (const entry of removedCrossFieldKeys.entries()) {
|
|
2258
|
+
composedTable.delete(entry.start, entry.length);
|
|
2259
|
+
}
|
|
2260
|
+
return composedTable;
|
|
2261
|
+
}
|
|
2262
|
+
function composeRootTables(change1, change2, composedNodeToParent, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
|
|
2263
|
+
const composedTable = cloneRootTable(change1.rootNodes);
|
|
2264
|
+
for (const renameEntry of change2.rootNodes.oldToNewId.entries()) {
|
|
2265
|
+
composeRename(change1, change2, composedTable, renameEntry.start, renameEntry.value, renameEntry.length, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
|
|
2266
|
+
}
|
|
2267
|
+
for (const [[revision2, id2], nodeId2] of change2.rootNodes.nodeChanges.entries()) {
|
|
2268
|
+
const detachId2 = { revision: revision2, localId: id2 };
|
|
2269
|
+
const detachId1 = firstDetachIdFromAttachId(change1.rootNodes, detachId2, 1).value;
|
|
2270
|
+
const nodeId1 = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(change1.rootNodes.nodeChanges, detachId1);
|
|
2271
|
+
if (nodeId1 !== undefined) {
|
|
2272
|
+
pendingCompositions.nodeIdsToCompose.push([nodeId1, nodeId2]);
|
|
2273
|
+
}
|
|
2274
|
+
else {
|
|
2275
|
+
const fieldId = getFieldsForCrossFieldKey(change1, { ...detachId1, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, 1)[0];
|
|
2276
|
+
if (fieldId !== undefined) {
|
|
2277
|
+
// In this case, this node is attached in the input context of change1,
|
|
2278
|
+
// and is represented in detachFieldId.
|
|
2279
|
+
pendingCompositions.affectedBaseFields.set([fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field], true);
|
|
2280
|
+
}
|
|
2281
|
+
else {
|
|
2282
|
+
assignRootChange(composedTable, composedNodeToParent, detachId1, nodeId2, change1.rootNodes.detachLocations.getFirst(detachId1, 1).value ??
|
|
2283
|
+
change2.rootNodes.detachLocations.getFirst(detachId2, 1).value, Math.max(change1.rebaseVersion, change2.rebaseVersion));
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
}
|
|
2287
|
+
for (const outputDetachEntry of change1.rootNodes.outputDetachLocations.entries()) {
|
|
2288
|
+
composeOutputDetachLocation(outputDetachEntry.start, outputDetachEntry.length, outputDetachEntry.value, change2, composedTable);
|
|
2289
|
+
}
|
|
2290
|
+
for (const entry of change2.rootNodes.outputDetachLocations.entries()) {
|
|
2291
|
+
composedTable.outputDetachLocations.set(entry.start, entry.length, entry.value);
|
|
2292
|
+
}
|
|
2293
|
+
return composedTable;
|
|
2294
|
+
}
|
|
2295
|
+
function composeOutputDetachLocation(outputDetachId1, count, detachLocation, change2, composedTable) {
|
|
2296
|
+
let countToProcess = count;
|
|
2297
|
+
const renameEntry = firstAttachIdFromDetachId(change2.rootNodes, outputDetachId1, countToProcess);
|
|
2298
|
+
countToProcess = renameEntry.length;
|
|
2299
|
+
const attachEntry = getFirstAttachField(change2.crossFieldKeys, renameEntry.value, countToProcess);
|
|
2300
|
+
countToProcess = attachEntry.length;
|
|
2301
|
+
composedTable.outputDetachLocations.delete(outputDetachId1, countToProcess);
|
|
2302
|
+
if (attachEntry.value === undefined) {
|
|
2303
|
+
// We update the key for the detach location to the renamed ID of the root in the composed output context.
|
|
2304
|
+
composedTable.outputDetachLocations.set(renameEntry.value, countToProcess, detachLocation);
|
|
2305
|
+
}
|
|
2306
|
+
else {
|
|
2307
|
+
// These nodes are attached by `change2` and thus attached in the composed output context,
|
|
2308
|
+
// so there should be no output detach location.
|
|
2309
|
+
}
|
|
2310
|
+
const countRemaining = count - countToProcess;
|
|
2311
|
+
if (countRemaining > 0) {
|
|
2312
|
+
composeOutputDetachLocation((0, index_js_1.offsetChangeAtomId)(outputDetachId1, countToProcess), countRemaining, detachLocation, change2, composedTable);
|
|
2313
|
+
}
|
|
2314
|
+
}
|
|
2315
|
+
function composeRename(change1, change2, mergedTable, oldId, newId, count, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
|
|
2316
|
+
let countToProcess = count;
|
|
2317
|
+
const detachEntry = getFirstDetachField(change1.crossFieldKeys, oldId, countToProcess);
|
|
2318
|
+
countToProcess = detachEntry.length;
|
|
2319
|
+
if (detachEntry.value !== undefined) {
|
|
2320
|
+
// `change1` detached these nodes,
|
|
2321
|
+
// so we invalidate the detach location so that the detach's ID can be replaced with the new ID.
|
|
2322
|
+
pendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(detachEntry.value), true);
|
|
2323
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(oldId, newId)) {
|
|
2324
|
+
// `change1`'s detach will be replaced by `change2`'s detach, so we update the cross-field keys.
|
|
2325
|
+
removedCrossFieldKeys.set({ ...oldId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
|
|
2326
|
+
}
|
|
2327
|
+
movedCrossFieldKeys.set({ ...newId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, detachEntry.value);
|
|
2328
|
+
}
|
|
2329
|
+
else {
|
|
2330
|
+
// `change1` may also have a rename to `renameEntry.value`, in which case it must refer to a different node.
|
|
2331
|
+
// That node must have been attached by `change1` and detached by `change2`.
|
|
2332
|
+
// The final rename for that node will be created in `composeAttachDetach`.
|
|
2333
|
+
// We delete any such rename for now to avoid colliding with the rename currently being processed.
|
|
2334
|
+
deleteNodeRenameTo(mergedTable, newId, countToProcess);
|
|
2335
|
+
// The nodes were detached before `change`, so we append this rename.
|
|
2336
|
+
appendNodeRename(mergedTable, oldId, newId, countToProcess, change1.rootNodes, change2.rootNodes.detachLocations.getFirst(oldId, countToProcess).value);
|
|
2337
|
+
}
|
|
2338
|
+
if (countToProcess < count) {
|
|
2339
|
+
composeRename(change1, change2, mergedTable, (0, index_js_1.offsetChangeAtomId)(oldId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newId, countToProcess), count - countToProcess, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
|
|
2340
|
+
}
|
|
2341
|
+
}
|
|
2342
|
+
function cloneRootTable(table) {
|
|
2343
|
+
return {
|
|
2344
|
+
oldToNewId: table.oldToNewId.clone(),
|
|
2345
|
+
newToOldId: table.newToOldId.clone(),
|
|
2346
|
+
nodeChanges: (0, index_js_2.brand)(table.nodeChanges.clone()),
|
|
2347
|
+
detachLocations: table.detachLocations.clone(),
|
|
2348
|
+
outputDetachLocations: table.outputDetachLocations.clone(),
|
|
2349
|
+
};
|
|
2350
|
+
}
|
|
2351
|
+
exports.cloneRootTable = cloneRootTable;
|
|
2352
|
+
function invertRootTable(change, isRollback) {
|
|
2353
|
+
const invertedRoots = newRootTable();
|
|
2354
|
+
for (const [[revision, localId], nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
2355
|
+
const detachId = { revision, localId };
|
|
2356
|
+
const renamedId = firstAttachIdFromDetachId(change.rootNodes, detachId, 1).value;
|
|
2357
|
+
// This checks whether `change` attaches this node.
|
|
2358
|
+
// If it does, the node is not detached in the input context of the inverse, and so should not be included in the root table.
|
|
2359
|
+
if (change.crossFieldKeys.getFirst({ ...renamedId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, 1)
|
|
2360
|
+
.value === undefined) {
|
|
2361
|
+
assignRootChange(invertedRoots, undefined, renamedId, nodeId, change.rootNodes.detachLocations.getFirst(detachId, 1).value, change.rebaseVersion);
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
if (isRollback) {
|
|
2365
|
+
// We only invert renames of nodes which are not attached or detached by this changeset.
|
|
2366
|
+
// When we invert an attach we will create a detach which incorporates the rename.
|
|
2367
|
+
for (const { start: oldId, value: newId, length, } of change.rootNodes.oldToNewId.entries()) {
|
|
2368
|
+
invertRename(change, invertedRoots, oldId, newId, length);
|
|
2369
|
+
}
|
|
2370
|
+
}
|
|
2371
|
+
return invertedRoots;
|
|
2372
|
+
}
|
|
2373
|
+
function invertRename(change, invertedRoots, oldId, newId, length) {
|
|
2374
|
+
for (const detachEntry of doesChangeDetachNodes(change.crossFieldKeys, newId, length)) {
|
|
2375
|
+
(0, internal_1.assert)(!detachEntry.value, "A changeset should not have a rename and detach for the same node.");
|
|
2376
|
+
}
|
|
2377
|
+
let countProcessed = length;
|
|
2378
|
+
const attachEntry = getFirstAttachField(change.crossFieldKeys, newId, countProcessed);
|
|
2379
|
+
countProcessed = attachEntry.length;
|
|
2380
|
+
if (attachEntry.value === undefined) {
|
|
2381
|
+
const outputDetachEntry = change.rootNodes.outputDetachLocations.getFirst(newId, countProcessed);
|
|
2382
|
+
countProcessed = outputDetachEntry.length;
|
|
2383
|
+
const inputDetachEntry = change.rootNodes.detachLocations.getFirst(oldId, countProcessed);
|
|
2384
|
+
countProcessed = inputDetachEntry.length;
|
|
2385
|
+
addNodeRename(invertedRoots, newId, oldId, countProcessed, outputDetachEntry.value ?? inputDetachEntry.value);
|
|
2386
|
+
}
|
|
2387
|
+
if (countProcessed < length) {
|
|
2388
|
+
invertRename(change, invertedRoots, (0, index_js_1.offsetChangeAtomId)(oldId, countProcessed), (0, index_js_1.offsetChangeAtomId)(newId, countProcessed), length - countProcessed);
|
|
2389
|
+
}
|
|
2390
|
+
}
|
|
2391
|
+
function doesChangeAttachNodes(table, id, count) {
|
|
2392
|
+
return table
|
|
2393
|
+
.getAll2({ ...id, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, count)
|
|
2394
|
+
.map((entry) => ({ ...entry, value: entry.value !== undefined }));
|
|
2395
|
+
}
|
|
2396
|
+
function doesChangeDetachNodes(table, id, count) {
|
|
2397
|
+
return table
|
|
2398
|
+
.getAll2({ ...id, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, count)
|
|
2399
|
+
.map((entry) => ({ ...entry, value: entry.value !== undefined }));
|
|
2400
|
+
}
|
|
2401
|
+
function getFirstDetachField(table, id, count) {
|
|
2402
|
+
return table.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...id }, count);
|
|
2403
|
+
}
|
|
2404
|
+
exports.getFirstDetachField = getFirstDetachField;
|
|
2405
|
+
function getFirstAttachField(table, id, count) {
|
|
2406
|
+
return table.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...id }, count);
|
|
2407
|
+
}
|
|
2408
|
+
exports.getFirstAttachField = getFirstAttachField;
|
|
2409
|
+
function addNodeRename(table, oldId, newId, count, detachLocation) {
|
|
2410
|
+
if ((0, index_js_1.areEqualChangeAtomIds)(oldId, newId)) {
|
|
2411
|
+
return;
|
|
2412
|
+
}
|
|
2413
|
+
for (const entry of table.oldToNewId.getAll2(oldId, count)) {
|
|
2414
|
+
(0, internal_1.assert)(entry.value === undefined ||
|
|
2415
|
+
(0, index_js_1.areEqualChangeAtomIds)(entry.value, (0, index_js_1.offsetChangeAtomId)(newId, entry.offset)), "Rename collision detected");
|
|
2416
|
+
}
|
|
2417
|
+
for (const entry of table.newToOldId.getAll2(newId, count)) {
|
|
2418
|
+
(0, internal_1.assert)(entry.value === undefined ||
|
|
2419
|
+
(0, index_js_1.areEqualChangeAtomIds)(entry.value, (0, index_js_1.offsetChangeAtomId)(oldId, entry.offset)), "Rename collision detected");
|
|
2420
|
+
}
|
|
2421
|
+
table.oldToNewId.set(oldId, count, newId);
|
|
2422
|
+
table.newToOldId.set(newId, count, oldId);
|
|
2423
|
+
if (detachLocation !== undefined) {
|
|
2424
|
+
table.detachLocations.set(oldId, count, detachLocation);
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
exports.addNodeRename = addNodeRename;
|
|
2428
|
+
/**
|
|
2429
|
+
* Deletes any renames from `id`.
|
|
2430
|
+
*/
|
|
2431
|
+
function deleteNodeRenameFrom(roots, id, count) {
|
|
2432
|
+
for (const entry of roots.oldToNewId.getAll(id, count)) {
|
|
2433
|
+
deleteNodeRenameEntry(roots, entry.start, entry.value, entry.length);
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
/**
|
|
2437
|
+
* Deletes any renames to `id`.
|
|
2438
|
+
*/
|
|
2439
|
+
function deleteNodeRenameTo(roots, id, count) {
|
|
2440
|
+
for (const entry of roots.newToOldId.getAll(id, count)) {
|
|
2441
|
+
deleteNodeRenameEntry(roots, entry.value, entry.start, entry.length);
|
|
2442
|
+
}
|
|
2443
|
+
}
|
|
2444
|
+
function appendNodeRename(composedTable, oldId, newId, count, change1Table, detachLocation) {
|
|
2445
|
+
let countToProcess = count;
|
|
2446
|
+
const rename1Entry = change1Table.newToOldId.getFirst(oldId, countToProcess);
|
|
2447
|
+
countToProcess = rename1Entry.length;
|
|
2448
|
+
if (rename1Entry.value !== undefined) {
|
|
2449
|
+
deleteNodeRenameFrom(composedTable, rename1Entry.value, countToProcess);
|
|
2450
|
+
}
|
|
2451
|
+
addNodeRename(composedTable, rename1Entry.value ?? oldId, newId, countToProcess, detachLocation);
|
|
2452
|
+
tryRemoveDetachLocation(composedTable, newId, countToProcess);
|
|
2453
|
+
if (countToProcess < count) {
|
|
2454
|
+
const countRemaining = count - countToProcess;
|
|
2455
|
+
appendNodeRename(composedTable, (0, index_js_1.offsetChangeAtomId)(oldId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newId, countToProcess), countRemaining, change1Table, detachLocation);
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2458
|
+
function tryRemoveDetachLocation(roots, rootId, count) {
|
|
2459
|
+
let countProcessed = count;
|
|
2460
|
+
const renameEntry = roots.oldToNewId.getFirst(rootId, countProcessed);
|
|
2461
|
+
countProcessed = renameEntry.length;
|
|
2462
|
+
const outputDetachEntry = roots.outputDetachLocations.getFirst(rootId, countProcessed);
|
|
2463
|
+
countProcessed = outputDetachEntry.length;
|
|
2464
|
+
const nodeChangeEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(roots.nodeChanges, rootId, countProcessed);
|
|
2465
|
+
countProcessed = nodeChangeEntry.length;
|
|
2466
|
+
if (nodeChangeEntry.value === undefined &&
|
|
2467
|
+
renameEntry.value === undefined &&
|
|
2468
|
+
outputDetachEntry.value === undefined) {
|
|
2469
|
+
roots.detachLocations.delete(rootId, countProcessed);
|
|
2470
|
+
}
|
|
2471
|
+
const countRemaining = count - countProcessed;
|
|
2472
|
+
if (countRemaining > 0) {
|
|
2473
|
+
tryRemoveDetachLocation(roots, (0, index_js_1.offsetChangeAtomId)(rootId, countProcessed), countRemaining);
|
|
2474
|
+
}
|
|
2475
|
+
}
|
|
2476
|
+
/**
|
|
2477
|
+
* Deletes the entry renaming the ID range of length `count` from `oldId` to `newId`.
|
|
2478
|
+
* This function assumes that such an entry exists.
|
|
2479
|
+
*/
|
|
2480
|
+
function deleteNodeRenameEntry(roots, oldId, newId, count) {
|
|
2481
|
+
roots.oldToNewId.delete(oldId, count);
|
|
2482
|
+
roots.newToOldId.delete(newId, count);
|
|
2483
|
+
}
|
|
2484
|
+
function replaceRootTableRevision(table, oldRevisions, newRevision, nodeAliases) {
|
|
2485
|
+
const oldToNewId = table.oldToNewId.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision));
|
|
2486
|
+
const newToOldId = table.newToOldId.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision));
|
|
2487
|
+
const nodeChanges = (0, index_js_2.newTupleBTree)([...table.nodeChanges.entries()].map(([[revision, id], nodeId]) => [
|
|
2488
|
+
[oldRevisions.has(revision) ? newRevision : revision, id],
|
|
2489
|
+
(0, index_js_1.replaceAtomRevisions)(normalizeNodeId(nodeId, nodeAliases), oldRevisions, newRevision),
|
|
2490
|
+
]));
|
|
2491
|
+
const detachLocations = table.detachLocations.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, nodeAliases), oldRevisions, newRevision));
|
|
2492
|
+
const outputDetachLocations = table.outputDetachLocations.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, nodeAliases), oldRevisions, newRevision));
|
|
2493
|
+
return { oldToNewId, newToOldId, nodeChanges, detachLocations, outputDetachLocations };
|
|
2494
|
+
}
|
|
2495
|
+
function newDetachedEntryMap() {
|
|
2496
|
+
return new index_js_2.RangeMap(index_js_1.offsetChangeAtomId, index_js_1.subtractChangeAtomIds, offsetDetachedNodeEntry);
|
|
2497
|
+
}
|
|
2498
|
+
function offsetDetachedNodeEntry(entry, count) {
|
|
2499
|
+
(0, internal_1.assert)(count <= 1 || entry.nodeChange === undefined, "Cannot split an entry with a node change");
|
|
2500
|
+
return entry.detachId !== undefined
|
|
2501
|
+
? { ...entry, detachId: (0, index_js_1.offsetChangeAtomId)(entry.detachId, count) }
|
|
2502
|
+
: entry;
|
|
2503
|
+
}
|
|
2504
|
+
function getFieldsWithRootMoves(roots, nodeAliases) {
|
|
2505
|
+
const fields = (0, index_js_2.newTupleBTree)();
|
|
2506
|
+
for (const { start: rootId, value: fieldId, length } of roots.detachLocations.entries()) {
|
|
2507
|
+
let isRootMoved = false;
|
|
2508
|
+
for (const renameEntry of roots.oldToNewId.getAll2(rootId, length)) {
|
|
2509
|
+
if (renameEntry.value !== undefined) {
|
|
2510
|
+
isRootMoved = true;
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
for (const outputDetachEntry of roots.outputDetachLocations.getAll2(rootId, length)) {
|
|
2514
|
+
if (outputDetachEntry.value !== undefined) {
|
|
2515
|
+
isRootMoved = true;
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
2518
|
+
if (isRootMoved) {
|
|
2519
|
+
fields.set(fieldIdKeyFromFieldId(normalizeFieldId(fieldId, nodeAliases)), true);
|
|
2520
|
+
}
|
|
2521
|
+
}
|
|
2522
|
+
return fields;
|
|
2523
|
+
}
|
|
2524
|
+
function getFieldToRootChanges(roots, nodeAliases) {
|
|
2525
|
+
const fields = (0, index_js_2.newTupleBTree)();
|
|
2526
|
+
for (const rootIdKey of roots.nodeChanges.keys()) {
|
|
2527
|
+
const rootId = { revision: rootIdKey[0], localId: rootIdKey[1] };
|
|
2528
|
+
const detachLocation = roots.detachLocations.getFirst(rootId, 1).value;
|
|
2529
|
+
if (detachLocation !== undefined) {
|
|
2530
|
+
const fieldIdKey = fieldIdKeyFromFieldId(normalizeFieldId(detachLocation, nodeAliases));
|
|
2531
|
+
let rootsInField = fields.get(fieldIdKey);
|
|
2532
|
+
if (rootsInField === undefined) {
|
|
2533
|
+
rootsInField = [];
|
|
2534
|
+
fields.set(fieldIdKey, rootsInField);
|
|
2535
|
+
}
|
|
2536
|
+
rootsInField.push(rootId);
|
|
2537
|
+
}
|
|
2538
|
+
}
|
|
2539
|
+
return fields;
|
|
2540
|
+
}
|
|
2541
|
+
function muteRootChanges(roots) {
|
|
2542
|
+
return {
|
|
2543
|
+
oldToNewId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2544
|
+
newToOldId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2545
|
+
nodeChanges: (0, index_js_2.brand)(roots.nodeChanges.clone()),
|
|
2546
|
+
detachLocations: roots.detachLocations.clone(),
|
|
2547
|
+
outputDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
2548
|
+
};
|
|
2549
|
+
}
|
|
1717
2550
|
//# sourceMappingURL=modularChangeFamily.js.map
|