@fluidframework/tree 2.74.0-365691 → 2.74.0-370705
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 +119 -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 +3 -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/incrementalEncodingPolicy.d.ts +14 -6
- 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 +91 -42
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js +238 -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 +5 -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 +21 -26
- 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 +4 -4
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +8 -3
- 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 +6 -6
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +13 -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 +2 -2
- 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 +49 -15
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +1306 -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/optionalFieldChangeFormatV3.d.ts +23 -0
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +31 -0
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
- 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/optional-field/optionalFieldCodecV3.d.ts +12 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +57 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.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/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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/independentView.d.ts +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 +11 -5
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +14 -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 +26 -12
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts +5 -5
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js +10 -4
- 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 +14 -7
- 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 +12 -10
- 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 +1 -1
- package/dist/simple-tree/api/incrementalAllowedTypes.d.ts.map +1 -1
- package/dist/simple-tree/api/incrementalAllowedTypes.js +7 -0
- package/dist/simple-tree/api/incrementalAllowedTypes.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +3 -4
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +4 -5
- 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/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/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 +15 -12
- 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 +5 -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 +18 -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.map +1 -1
- package/dist/treeFactory.js +17 -3
- package/dist/treeFactory.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/lib/alpha.d.ts +3 -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/incrementalEncodingPolicy.d.ts +14 -6
- 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 +91 -42
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js +236 -70
- 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 +17 -22
- 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 +4 -4
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +3 -3
- 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 +6 -6
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js +5 -4
- 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 +2 -2
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +9 -285
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +49 -15
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +1291 -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/optionalFieldChangeFormatV3.d.ts +23 -0
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +27 -0
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
- 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/optional-field/optionalFieldCodecV3.d.ts +12 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +53 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.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/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/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/independentView.d.ts +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 +11 -5
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +14 -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 +27 -13
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts +5 -5
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js +11 -5
- 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 +12 -6
- 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 +12 -10
- 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 +1 -1
- package/lib/simple-tree/api/incrementalAllowedTypes.d.ts.map +1 -1
- package/lib/simple-tree/api/incrementalAllowedTypes.js +8 -1
- package/lib/simple-tree/api/incrementalAllowedTypes.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +3 -4
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +2 -3
- 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/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/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 +6 -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 +19 -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.map +1 -1
- package/lib/treeFactory.js +18 -4
- package/lib/treeFactory.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/package.json +21 -21
- 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/incrementalEncodingPolicy.ts +15 -7
- package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +9 -9
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +398 -127
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +35 -38
- package/src/feature-libraries/default-schema/index.ts +17 -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 +45 -37
- 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 -9
- 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 +22 -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 +29 -499
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +2547 -739
- 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/optionalFieldChangeFormatV3.ts +45 -0
- package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +24 -38
- package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +89 -35
- package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +94 -0
- package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -1
- 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/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/index.ts +3 -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 +39 -12
- package/src/shared-tree/sharedTreeChangeCodecs.ts +5 -1
- package/src/shared-tree/sharedTreeChangeEnricher.ts +33 -11
- package/src/shared-tree/sharedTreeChangeFamily.ts +15 -5
- package/src/shared-tree/sharedTreeEditBuilder.ts +47 -13
- package/src/shared-tree/treeAlpha.ts +2 -3
- package/src/shared-tree/treeCheckout.ts +104 -31
- 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 +15 -3
- package/src/simple-tree/api/index.ts +3 -4
- 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/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/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 +12 -11
- package/src/simple-tree/node-kinds/array/arrayNode.ts +12 -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 +26 -26
- 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 +19 -5
- package/src/util/index.ts +5 -0
- package/src/util/rangeMap.ts +72 -18
- package/src/util/readSnapshotBlob.ts +23 -0
- 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.getBuildIds = 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,53 @@ 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
|
-
const
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1124
|
+
function* getBuildIds(change) {
|
|
1125
|
+
if (change.builds !== undefined) {
|
|
1126
|
+
for (const [[revision, localId]] of change.builds.entries()) {
|
|
1127
|
+
yield (0, index_js_1.makeDetachedNodeId)(revision, localId);
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
exports.getBuildIds = getBuildIds;
|
|
1132
|
+
function addAttachesToSet(change, rootIds) {
|
|
1133
|
+
// This includes each attach which does not have a corresponding detach.
|
|
1134
|
+
for (const entry of change.crossFieldKeys.entries()) {
|
|
1135
|
+
if (entry.start.target !== crossFieldQueries_js_1.CrossFieldTarget.Destination) {
|
|
1136
|
+
continue;
|
|
1137
|
+
}
|
|
1138
|
+
for (const detachIdEntry of change.rootNodes.newToOldId.getAll2(entry.start, entry.length)) {
|
|
1139
|
+
const detachId = detachIdEntry.value ?? (0, index_js_1.offsetChangeAtomId)(entry.start, detachIdEntry.offset);
|
|
1140
|
+
for (const detachEntry of change.crossFieldKeys.getAll2({ ...detachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, detachIdEntry.length)) {
|
|
1141
|
+
if (detachEntry.value === undefined) {
|
|
1142
|
+
rootIds.set((0, index_js_1.offsetChangeAtomId)(detachId, detachEntry.offset), detachEntry.length, true);
|
|
1143
|
+
}
|
|
1001
1144
|
}
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
function addRenamesToSet(change, rootIds) {
|
|
1149
|
+
for (const renameEntry of change.rootNodes.oldToNewId.entries()) {
|
|
1150
|
+
for (const detachEntry of change.crossFieldKeys.getAll2({ ...renameEntry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, renameEntry.length)) {
|
|
1151
|
+
// We only want to include renames of nodes which are detached in the input context of the changeset.
|
|
1152
|
+
// So if there is a detach for the node, the rename is not relevant.
|
|
1153
|
+
if (detachEntry.value === undefined) {
|
|
1154
|
+
rootIds.set(renameEntry.start, renameEntry.length, true);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1004
1157
|
}
|
|
1005
1158
|
}
|
|
1006
1159
|
/**
|
|
@@ -1052,6 +1205,7 @@ function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshe
|
|
|
1052
1205
|
nodeChanges,
|
|
1053
1206
|
nodeToParent: change.nodeToParent,
|
|
1054
1207
|
nodeAliases: change.nodeAliases,
|
|
1208
|
+
rootNodes: change.rootNodes,
|
|
1055
1209
|
crossFieldKeys: change.crossFieldKeys,
|
|
1056
1210
|
maxId: maxId,
|
|
1057
1211
|
revisions,
|
|
@@ -1072,11 +1226,24 @@ exports.updateRefreshers = updateRefreshers;
|
|
|
1072
1226
|
function intoDelta(taggedChange, fieldKinds) {
|
|
1073
1227
|
const change = taggedChange.change;
|
|
1074
1228
|
const rootDelta = {};
|
|
1075
|
-
const global = [];
|
|
1076
|
-
const rename = [];
|
|
1077
1229
|
if (!hasConflicts(change)) {
|
|
1078
1230
|
// If there are no constraint violations, then tree changes apply.
|
|
1079
|
-
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges,
|
|
1231
|
+
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldKinds);
|
|
1232
|
+
const global = [];
|
|
1233
|
+
for (const [[major, minor], nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
1234
|
+
global.push({
|
|
1235
|
+
id: { major, minor },
|
|
1236
|
+
fields: deltaFromNodeChange(nodeChangeFromId(change.nodeChanges, change.nodeAliases, nodeId), change.nodeChanges, change.nodeAliases, fieldKinds),
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
const rename = [];
|
|
1240
|
+
for (const { start: oldId, value: newId, length, } of change.rootNodes.oldToNewId.entries()) {
|
|
1241
|
+
rename.push({
|
|
1242
|
+
count: length,
|
|
1243
|
+
oldId: (0, index_js_1.makeDetachedNodeId)(oldId.revision, oldId.localId),
|
|
1244
|
+
newId: (0, index_js_1.makeDetachedNodeId)(newId.revision, newId.localId),
|
|
1245
|
+
});
|
|
1246
|
+
}
|
|
1080
1247
|
if (fieldDeltas.size > 0) {
|
|
1081
1248
|
rootDelta.fields = fieldDeltas;
|
|
1082
1249
|
}
|
|
@@ -1123,24 +1290,22 @@ function copyDetachedNodes(detachedNodes) {
|
|
|
1123
1290
|
/**
|
|
1124
1291
|
* @param change - The change to convert into a delta.
|
|
1125
1292
|
*/
|
|
1126
|
-
function intoDeltaImpl(change, nodeChanges,
|
|
1293
|
+
function intoDeltaImpl(change, nodeChanges, nodeAliases, fieldKinds) {
|
|
1127
1294
|
const delta = new Map();
|
|
1128
1295
|
for (const [field, fieldChange] of change) {
|
|
1129
|
-
const
|
|
1130
|
-
const nodeChange = nodeChangeFromId(nodeChanges, childChange);
|
|
1131
|
-
return deltaFromNodeChange(nodeChange, nodeChanges,
|
|
1296
|
+
const fieldDelta = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
|
|
1297
|
+
const nodeChange = nodeChangeFromId(nodeChanges, nodeAliases, childChange);
|
|
1298
|
+
return deltaFromNodeChange(nodeChange, nodeChanges, nodeAliases, fieldKinds);
|
|
1132
1299
|
});
|
|
1133
|
-
if (
|
|
1134
|
-
delta.set(field,
|
|
1300
|
+
if (fieldDelta !== undefined && fieldDelta.length > 0) {
|
|
1301
|
+
delta.set(field, fieldDelta);
|
|
1135
1302
|
}
|
|
1136
|
-
fieldGlobal?.forEach((c) => global.push(c));
|
|
1137
|
-
fieldRename?.forEach((r) => rename.push(r));
|
|
1138
1303
|
}
|
|
1139
1304
|
return delta;
|
|
1140
1305
|
}
|
|
1141
|
-
function deltaFromNodeChange(change, nodeChanges,
|
|
1306
|
+
function deltaFromNodeChange(change, nodeChanges, nodeAliases, fieldKinds) {
|
|
1142
1307
|
if (change.fieldChanges !== undefined) {
|
|
1143
|
-
return intoDeltaImpl(change.fieldChanges, nodeChanges,
|
|
1308
|
+
return intoDeltaImpl(change.fieldChanges, nodeChanges, nodeAliases, fieldKinds);
|
|
1144
1309
|
}
|
|
1145
1310
|
// TODO: update the API to allow undefined to be returned here
|
|
1146
1311
|
return new Map();
|
|
@@ -1190,30 +1355,22 @@ function getChangeHandler(fieldKinds, kind) {
|
|
|
1190
1355
|
return getFieldKind(fieldKinds, kind).changeHandler;
|
|
1191
1356
|
}
|
|
1192
1357
|
exports.getChangeHandler = getChangeHandler;
|
|
1193
|
-
function newComposeTable(baseChange, newChange,
|
|
1358
|
+
function newComposeTable(baseChange, newChange, composedRootNodes, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
|
|
1194
1359
|
return {
|
|
1195
|
-
|
|
1360
|
+
rebaseVersion: Math.max(baseChange.rebaseVersion, newChange.rebaseVersion),
|
|
1361
|
+
entries: newDetachedEntryMap(),
|
|
1196
1362
|
baseChange,
|
|
1197
1363
|
newChange,
|
|
1198
1364
|
fieldToContext: new Map(),
|
|
1199
1365
|
newFieldToBaseField: new Map(),
|
|
1200
1366
|
newToBaseNodeId: (0, index_js_2.newTupleBTree)(),
|
|
1201
1367
|
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(),
|
|
1368
|
+
movedNodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1369
|
+
composedRootNodes,
|
|
1370
|
+
movedCrossFieldKeys,
|
|
1371
|
+
removedCrossFieldKeys,
|
|
1372
|
+
renamesToDelete: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1373
|
+
pendingCompositions,
|
|
1217
1374
|
};
|
|
1218
1375
|
}
|
|
1219
1376
|
function newConstraintState(violationCount) {
|
|
@@ -1221,147 +1378,354 @@ function newConstraintState(violationCount) {
|
|
|
1221
1378
|
violationCount,
|
|
1222
1379
|
};
|
|
1223
1380
|
}
|
|
1224
|
-
class
|
|
1225
|
-
constructor(
|
|
1226
|
-
this.
|
|
1227
|
-
this.
|
|
1228
|
-
this.allowInval = allowInval;
|
|
1381
|
+
class InvertNodeManagerI {
|
|
1382
|
+
constructor(table, fieldId) {
|
|
1383
|
+
this.table = table;
|
|
1384
|
+
this.fieldId = fieldId;
|
|
1229
1385
|
}
|
|
1230
|
-
|
|
1231
|
-
if (
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1386
|
+
invertDetach(detachId, count, nodeChange, newAttachId) {
|
|
1387
|
+
if (nodeChange !== undefined) {
|
|
1388
|
+
(0, internal_1.assert)(count === 1, "A node change should only affect one node");
|
|
1389
|
+
const attachEntry = firstAttachIdFromDetachId(this.table.change.rootNodes, detachId, count);
|
|
1390
|
+
const attachFieldEntry = this.table.change.crossFieldKeys.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...attachEntry.value }, count);
|
|
1391
|
+
if (attachFieldEntry.value !== undefined) {
|
|
1392
|
+
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.table.entries, attachEntry.value, count, nodeChange);
|
|
1393
|
+
this.table.invalidatedFields.add(fieldChangeFromId(this.table.change, attachFieldEntry.value));
|
|
1394
|
+
}
|
|
1395
|
+
else {
|
|
1396
|
+
assignRootChange(this.table.invertedRoots, this.table.invertedNodeToParent, attachEntry.value, nodeChange, this.fieldId, this.table.change.rebaseVersion);
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(detachId, newAttachId)) {
|
|
1400
|
+
for (const entry of doesChangeAttachNodes(this.table.change.crossFieldKeys, detachId, count)) {
|
|
1401
|
+
if (!entry.value) {
|
|
1402
|
+
this.table.attachToDetachId.set(newAttachId, count, detachId);
|
|
1403
|
+
this.table.invertedRoots.detachLocations.set(detachId, count, this.fieldId);
|
|
1238
1404
|
}
|
|
1239
|
-
firstId = (0, index_js_2.brand)(firstId + dependentEntry.length);
|
|
1240
1405
|
}
|
|
1241
1406
|
}
|
|
1242
|
-
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.getMap(target), revision, id, count, newValue);
|
|
1243
1407
|
}
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1408
|
+
invertAttach(attachId, count) {
|
|
1409
|
+
let countToProcess = count;
|
|
1410
|
+
const detachIdEntry = firstDetachIdFromAttachId(this.table.change.rootNodes, attachId, countToProcess);
|
|
1411
|
+
countToProcess = detachIdEntry.length;
|
|
1412
|
+
const detachEntry = getFirstFieldForCrossFieldKey(this.table.change, { target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...detachIdEntry.value }, countToProcess);
|
|
1413
|
+
countToProcess = detachEntry.length;
|
|
1414
|
+
let result;
|
|
1415
|
+
if (detachEntry.value !== undefined) {
|
|
1416
|
+
const moveEntry = this.table.entries.getFirst(attachId, countToProcess);
|
|
1417
|
+
result = { ...moveEntry, value: { nodeChange: moveEntry.value } };
|
|
1250
1418
|
}
|
|
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;
|
|
1419
|
+
else {
|
|
1420
|
+
// This node is detached in the input context of the original change.
|
|
1421
|
+
const nodeIdEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.change.rootNodes.nodeChanges, detachIdEntry.value, countToProcess);
|
|
1422
|
+
countToProcess = nodeIdEntry.length;
|
|
1423
|
+
result = {
|
|
1424
|
+
value: { nodeChange: nodeIdEntry.value, detachId: detachIdEntry.value },
|
|
1425
|
+
length: countToProcess,
|
|
1426
|
+
};
|
|
1427
|
+
}
|
|
1428
|
+
if (result.value?.nodeChange !== undefined) {
|
|
1429
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.invertedNodeToParent, result.value.nodeChange, {
|
|
1430
|
+
field: this.fieldId,
|
|
1431
|
+
});
|
|
1432
|
+
}
|
|
1433
|
+
return result;
|
|
1277
1434
|
}
|
|
1278
1435
|
}
|
|
1279
|
-
class
|
|
1280
|
-
constructor(table,
|
|
1281
|
-
|
|
1436
|
+
class RebaseNodeManagerI {
|
|
1437
|
+
constructor(table, fieldId, allowInval = true) {
|
|
1438
|
+
this.table = table;
|
|
1282
1439
|
this.fieldId = fieldId;
|
|
1440
|
+
this.allowInval = allowInval;
|
|
1283
1441
|
}
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1442
|
+
getNewChangesForBaseAttach(baseAttachId, count) {
|
|
1443
|
+
let countToProcess = count;
|
|
1444
|
+
const detachEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, countToProcess);
|
|
1445
|
+
countToProcess = detachEntry.length;
|
|
1446
|
+
const nodeEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.newChange.rootNodes.nodeChanges, detachEntry.value, countToProcess);
|
|
1447
|
+
countToProcess = nodeEntry.length;
|
|
1448
|
+
const newNodeId = nodeEntry.value;
|
|
1449
|
+
const newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(detachEntry.value, countToProcess);
|
|
1450
|
+
countToProcess = newRenameEntry.length;
|
|
1451
|
+
let result;
|
|
1452
|
+
// eslint-disable-next-line unicorn/prefer-ternary
|
|
1453
|
+
if (newNodeId !== undefined || newRenameEntry.value !== undefined) {
|
|
1454
|
+
result = {
|
|
1455
|
+
...newRenameEntry,
|
|
1456
|
+
value: { detachId: newRenameEntry.value, nodeChange: newNodeId },
|
|
1457
|
+
};
|
|
1458
|
+
}
|
|
1459
|
+
else {
|
|
1460
|
+
// This handles the case where the base changeset has moved these nodes,
|
|
1461
|
+
// meaning they were attached in the input context of the base changeset.
|
|
1462
|
+
result = this.table.entries.getFirst(baseAttachId, countToProcess);
|
|
1463
|
+
}
|
|
1464
|
+
// TODO: Consider moving these two checks into a separate method so that this function has no side effects.
|
|
1465
|
+
if (result.value?.detachId !== undefined) {
|
|
1466
|
+
this.table.rebasedDetachLocations.set(result.value.detachId, result.length, this.fieldId);
|
|
1467
|
+
}
|
|
1468
|
+
if (result.value?.nodeChange !== undefined) {
|
|
1469
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.rebasedNodeToParent, result.value.nodeChange, {
|
|
1470
|
+
field: this.fieldId,
|
|
1471
|
+
});
|
|
1472
|
+
}
|
|
1473
|
+
return result;
|
|
1474
|
+
}
|
|
1475
|
+
rebaseOverDetach(baseDetachId, count, newDetachId, nodeChange, cellRename) {
|
|
1476
|
+
let countToProcess = count;
|
|
1477
|
+
const attachIdEntry = firstAttachIdFromDetachId(this.table.baseRoots, baseDetachId, countToProcess);
|
|
1478
|
+
const baseAttachId = attachIdEntry.value;
|
|
1479
|
+
countToProcess = attachIdEntry.length;
|
|
1480
|
+
const attachFieldEntry = getFirstFieldForCrossFieldKey(this.table.baseChange, { ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, countToProcess);
|
|
1481
|
+
countToProcess = attachFieldEntry.length;
|
|
1482
|
+
const detachedMoveEntry = this.table.baseChange.rootNodes.outputDetachLocations.getFirst(baseDetachId, countToProcess);
|
|
1483
|
+
countToProcess = detachedMoveEntry.length;
|
|
1484
|
+
const destinationField = attachFieldEntry.value ?? detachedMoveEntry.value;
|
|
1485
|
+
if (destinationField !== undefined) {
|
|
1486
|
+
// The base detach is part of a move (or move of detach location) in the base changeset.
|
|
1487
|
+
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.table.entries, baseAttachId, countToProcess, {
|
|
1488
|
+
nodeChange,
|
|
1489
|
+
detachId: newDetachId,
|
|
1490
|
+
cellRename,
|
|
1491
|
+
});
|
|
1492
|
+
if (nodeChange !== undefined || newDetachId !== undefined) {
|
|
1493
|
+
this.invalidateBaseFields([destinationField]);
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
if (attachFieldEntry.value === undefined) {
|
|
1497
|
+
// These nodes are detached in the output context of the base changeset.
|
|
1498
|
+
if (nodeChange !== undefined) {
|
|
1499
|
+
assignRootChange(this.table.rebasedRootNodes, this.table.rebasedNodeToParent, baseAttachId, nodeChange, this.fieldId, this.table.rebaseVersion);
|
|
1500
|
+
}
|
|
1501
|
+
if (newDetachId !== undefined) {
|
|
1502
|
+
addNodeRename(this.table.rebasedRootNodes, baseAttachId, newDetachId, countToProcess, this.fieldId);
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
if (newDetachId !== undefined) {
|
|
1506
|
+
this.table.movedDetaches.set(newDetachId, countToProcess, true);
|
|
1507
|
+
}
|
|
1508
|
+
if (countToProcess < count) {
|
|
1509
|
+
const remainingCount = count - countToProcess;
|
|
1510
|
+
const nextDetachId = newDetachId !== undefined
|
|
1511
|
+
? (0, index_js_1.offsetChangeAtomId)(newDetachId, countToProcess)
|
|
1512
|
+
: undefined;
|
|
1513
|
+
this.rebaseOverDetach((0, index_js_1.offsetChangeAtomId)(baseDetachId, countToProcess), remainingCount, nextDetachId, nodeChange);
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
addDetach(id, count) {
|
|
1517
|
+
this.table.rebasedDetachLocations.set(id, count, this.fieldId);
|
|
1518
|
+
}
|
|
1519
|
+
removeDetach(id, count) {
|
|
1520
|
+
this.table.movedDetaches.set(id, count, true);
|
|
1521
|
+
}
|
|
1522
|
+
doesBaseAttachNodes(id, count) {
|
|
1523
|
+
let countToProcess = count;
|
|
1524
|
+
const attachEntry = getFirstAttachField(this.table.baseChange.crossFieldKeys, id, countToProcess);
|
|
1525
|
+
countToProcess = attachEntry.length;
|
|
1526
|
+
return { start: id, value: attachEntry.value !== undefined, length: countToProcess };
|
|
1527
|
+
}
|
|
1528
|
+
getBaseRename(id, count) {
|
|
1529
|
+
return this.table.baseChange.rootNodes.oldToNewId.getFirst(id, count);
|
|
1530
|
+
}
|
|
1531
|
+
getNewRenameForBaseRename(baseRenameTo, count) {
|
|
1532
|
+
let countToProcess = count;
|
|
1533
|
+
const inputEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseRenameTo, countToProcess);
|
|
1534
|
+
const attachEntry = getFirstAttachField(this.table.baseChange.crossFieldKeys, baseRenameTo, countToProcess);
|
|
1535
|
+
countToProcess = attachEntry.length;
|
|
1536
|
+
if (attachEntry.value !== undefined) {
|
|
1537
|
+
// These nodes are attached in the output context of the base changeset.
|
|
1538
|
+
return { value: undefined, length: countToProcess };
|
|
1539
|
+
}
|
|
1540
|
+
countToProcess = inputEntry.length;
|
|
1541
|
+
const inputId = inputEntry.value;
|
|
1542
|
+
const moveEntry = this.table.entries.getFirst(inputId, countToProcess);
|
|
1543
|
+
countToProcess = moveEntry.length;
|
|
1544
|
+
if (moveEntry.value !== undefined) {
|
|
1545
|
+
return { ...moveEntry, value: moveEntry.value.cellRename ?? moveEntry.value.detachId };
|
|
1546
|
+
}
|
|
1547
|
+
return this.table.newChange.rootNodes.oldToNewId.getFirst(inputId, countToProcess);
|
|
1548
|
+
}
|
|
1549
|
+
invalidateBaseFields(fields) {
|
|
1550
|
+
if (this.allowInval) {
|
|
1551
|
+
for (const fieldId of fields) {
|
|
1552
|
+
this.table.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);
|
|
1300
1553
|
}
|
|
1301
1554
|
}
|
|
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
1555
|
}
|
|
1310
|
-
|
|
1311
|
-
|
|
1556
|
+
}
|
|
1557
|
+
function assignRootChange(table, nodeToParent, detachId, nodeId, detachLocation, rebaseVersion) {
|
|
1558
|
+
(0, internal_1.assert)(rebaseVersion >= 2 || detachLocation !== undefined, "All root changes need a detach location to support compatibility with older client versions");
|
|
1559
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.nodeChanges, detachId, nodeId);
|
|
1560
|
+
if (nodeToParent !== undefined) {
|
|
1561
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, nodeId, { root: detachId });
|
|
1312
1562
|
}
|
|
1563
|
+
table.detachLocations.set(detachId, 1, detachLocation);
|
|
1313
1564
|
}
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
super(table, currentField, allowInval);
|
|
1565
|
+
class ComposeNodeManagerI {
|
|
1566
|
+
constructor(table, fieldId, allowInval = true) {
|
|
1567
|
+
this.table = table;
|
|
1318
1568
|
this.fieldId = fieldId;
|
|
1569
|
+
this.allowInval = allowInval;
|
|
1319
1570
|
}
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
if
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1571
|
+
getNewChangesForBaseDetach(baseDetachId, count) {
|
|
1572
|
+
let countToProcess = count;
|
|
1573
|
+
const baseAttachEntry = getFirstFieldForCrossFieldKey(this.table.baseChange, { target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...baseDetachId }, countToProcess);
|
|
1574
|
+
countToProcess = baseAttachEntry.length;
|
|
1575
|
+
let result;
|
|
1576
|
+
if (baseAttachEntry.value !== undefined) {
|
|
1577
|
+
// The base detach was part of a move.
|
|
1578
|
+
// We check if we've previously seen a node change at the move destination.
|
|
1579
|
+
const entry = this.table.entries.getFirst(baseDetachId, countToProcess);
|
|
1580
|
+
result = { value: entry.value, length: entry.length };
|
|
1581
|
+
}
|
|
1582
|
+
else {
|
|
1583
|
+
// The detached nodes are still detached in the new change's input context.
|
|
1584
|
+
const rootEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(this.table.newChange.rootNodes.nodeChanges, baseDetachId, countToProcess);
|
|
1585
|
+
countToProcess = rootEntry.length;
|
|
1586
|
+
const newRenameEntry = this.table.newChange.rootNodes.oldToNewId.getFirst(baseDetachId, countToProcess);
|
|
1587
|
+
countToProcess = newRenameEntry.length;
|
|
1588
|
+
result = {
|
|
1589
|
+
value: { nodeChange: rootEntry.value, detachId: newRenameEntry.value },
|
|
1590
|
+
length: countToProcess,
|
|
1591
|
+
};
|
|
1592
|
+
}
|
|
1593
|
+
// TODO: Consider moving this to a separate method so that this method can be side-effect free.
|
|
1594
|
+
if (result.value?.nodeChange !== undefined) {
|
|
1595
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(this.table.movedNodeToParent, result.value.nodeChange, {
|
|
1596
|
+
field: this.fieldId,
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
return result;
|
|
1600
|
+
}
|
|
1601
|
+
composeAttachDetach(baseAttachId, newDetachId, count) {
|
|
1602
|
+
let countToProcess = count;
|
|
1603
|
+
const newAttachEntry = getFirstAttachField(this.table.newChange.crossFieldKeys, newDetachId, countToProcess);
|
|
1604
|
+
countToProcess = newAttachEntry.length;
|
|
1605
|
+
// Both changes can have the same ID if they came from inverse changesets.
|
|
1606
|
+
// If the new detach is part of a move,
|
|
1607
|
+
// then both input changesets contain the attach cross-field key for this ID.
|
|
1608
|
+
// The new attach may still exist in the composed changeset so we do not remove it here.
|
|
1609
|
+
// The new attach will typically cancel with a base detach,
|
|
1610
|
+
// in which case the cross-field key will be removed in `composeDetachAttach`.
|
|
1611
|
+
const hasNewAttachWithBaseAttachId = (0, index_js_1.areEqualChangeAtomIds)(baseAttachId, newDetachId) && newAttachEntry.value !== undefined;
|
|
1612
|
+
if (!hasNewAttachWithBaseAttachId) {
|
|
1613
|
+
this.table.removedCrossFieldKeys.set({ ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, countToProcess, true);
|
|
1614
|
+
}
|
|
1615
|
+
const baseDetachEntry = getFirstDetachField(this.table.baseChange.crossFieldKeys, baseAttachId, countToProcess);
|
|
1616
|
+
countToProcess = baseDetachEntry.length;
|
|
1617
|
+
const baseRootIdEntry = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, countToProcess);
|
|
1618
|
+
countToProcess = baseRootIdEntry.length;
|
|
1619
|
+
const baseDetachId = baseRootIdEntry.value;
|
|
1620
|
+
if (baseDetachEntry.value !== undefined) {
|
|
1621
|
+
// The base change moves these nodes.
|
|
1622
|
+
const prevEntry = this.table.entries.getFirst(baseAttachId, baseDetachEntry.length).value ?? {};
|
|
1623
|
+
this.table.entries.set(baseAttachId, baseDetachEntry.length, {
|
|
1624
|
+
...prevEntry,
|
|
1625
|
+
detachId: newDetachId,
|
|
1626
|
+
});
|
|
1627
|
+
// The new detach will replace the base detach, so we remove the key for the base detach, unless they have the same ID.
|
|
1628
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(baseAttachId, newDetachId)) {
|
|
1629
|
+
this.table.removedCrossFieldKeys.set({ ...baseAttachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
|
|
1630
|
+
}
|
|
1631
|
+
this.table.movedCrossFieldKeys.set({ ...newDetachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, baseDetachEntry.value);
|
|
1632
|
+
this.invalidateBaseFields([baseDetachEntry.value]);
|
|
1633
|
+
}
|
|
1634
|
+
else {
|
|
1635
|
+
const baseDetachLocationEntry = this.table.baseChange.rootNodes.detachLocations.getFirst(baseDetachId, countToProcess);
|
|
1636
|
+
countToProcess = baseDetachLocationEntry.length;
|
|
1637
|
+
// These nodes were detached in the base change's input context,
|
|
1638
|
+
// so the net effect of the two changes is a rename.
|
|
1639
|
+
appendNodeRename(this.table.composedRootNodes, baseAttachId, newDetachId, baseDetachEntry.length, this.table.baseChange.rootNodes, baseDetachLocationEntry.value ?? this.fieldId);
|
|
1640
|
+
this.table.removedCrossFieldKeys.set({ ...newDetachId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
|
|
1641
|
+
}
|
|
1642
|
+
if (newAttachEntry.value === undefined) {
|
|
1643
|
+
const newOutputDetachLocationEntry = this.table.newChange.rootNodes.outputDetachLocations.getFirst(newDetachId, countToProcess);
|
|
1644
|
+
countToProcess = newOutputDetachLocationEntry.length;
|
|
1645
|
+
this.table.composedRootNodes.outputDetachLocations.set(newDetachId, countToProcess, newOutputDetachLocationEntry.value ?? this.fieldId);
|
|
1646
|
+
}
|
|
1647
|
+
if (countToProcess < count) {
|
|
1648
|
+
const remainingCount = count - countToProcess;
|
|
1649
|
+
this.composeAttachDetach((0, index_js_1.offsetChangeAtomId)(baseAttachId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newDetachId, countToProcess), remainingCount);
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
sendNewChangesToBaseSourceLocation(baseAttachId, newChanges) {
|
|
1653
|
+
const { value: baseDetachId } = firstDetachIdFromAttachId(this.table.baseChange.rootNodes, baseAttachId, 1);
|
|
1654
|
+
const detachFields = getFieldsForCrossFieldKey(this.table.baseChange, {
|
|
1655
|
+
...baseDetachId,
|
|
1656
|
+
target: crossFieldQueries_js_1.CrossFieldTarget.Source,
|
|
1657
|
+
}, 1);
|
|
1658
|
+
if (detachFields.length > 0) {
|
|
1659
|
+
// The base attach is part of a move in the base changeset.
|
|
1660
|
+
const prevEntry = this.table.entries.getFirst(baseDetachId, 1).value ?? {};
|
|
1661
|
+
this.table.entries.set(baseDetachId, 1, { ...prevEntry, nodeChange: newChanges });
|
|
1662
|
+
if (newChanges !== undefined) {
|
|
1663
|
+
this.invalidateBaseFields(detachFields);
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
else {
|
|
1667
|
+
const baseNodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(this.table.baseChange.rootNodes.nodeChanges, baseDetachId);
|
|
1668
|
+
if (baseNodeId !== undefined) {
|
|
1669
|
+
addNodesToCompose(this.table, baseNodeId, newChanges);
|
|
1331
1670
|
}
|
|
1332
1671
|
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
|
-
}
|
|
1672
|
+
assignRootChange(this.table.composedRootNodes, this.table.movedNodeToParent, baseDetachId, newChanges, this.fieldId, this.table.rebaseVersion);
|
|
1342
1673
|
}
|
|
1343
1674
|
}
|
|
1344
|
-
super.set(target, revision, id, count, newValue, invalidateDependents);
|
|
1345
|
-
}
|
|
1346
|
-
onMoveIn(id) {
|
|
1347
|
-
setInChangeAtomIdMap(this.table.composedNodeToParent, id, this.fieldId);
|
|
1348
1675
|
}
|
|
1349
|
-
|
|
1350
|
-
|
|
1676
|
+
areSameNodes(baseDetachId, newAttachId, count) {
|
|
1677
|
+
const renamedDetachEntry = firstAttachIdFromDetachId(this.table.composedRootNodes, baseDetachId, count);
|
|
1678
|
+
const isReattachOfSameNodes = (0, index_js_1.areEqualChangeAtomIds)(renamedDetachEntry.value, newAttachId);
|
|
1679
|
+
return { ...renamedDetachEntry, value: isReattachOfSameNodes };
|
|
1680
|
+
}
|
|
1681
|
+
composeDetachAttach(baseDetachId, newAttachId, count, composeToPin) {
|
|
1682
|
+
const areSameEntry = this.areSameNodes(baseDetachId, newAttachId, count);
|
|
1683
|
+
const countToProcess = areSameEntry.length;
|
|
1684
|
+
if (areSameEntry.value) {
|
|
1685
|
+
// These nodes have been moved back to their original location, so the composed changeset should not have any renames for them.
|
|
1686
|
+
// Note that deleting the rename from `this.table.composedRootNodes` would change the result of this method
|
|
1687
|
+
// if it were rerun due to the field being invalidated, so we instead record that the rename should be deleted later.
|
|
1688
|
+
this.table.renamesToDelete.set(baseDetachId, countToProcess, true);
|
|
1689
|
+
}
|
|
1690
|
+
if (composeToPin) {
|
|
1691
|
+
this.table.movedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...newAttachId }, countToProcess, this.fieldId);
|
|
1692
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(baseDetachId, newAttachId)) {
|
|
1693
|
+
// The pin will have `newAttachId` as both its detach and attach ID.
|
|
1694
|
+
// So we remove `baseDetachId` unless that is equal to the pin's detach ID.
|
|
1695
|
+
this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...baseDetachId }, countToProcess, true);
|
|
1696
|
+
}
|
|
1697
|
+
// Note that while change2 should already have this key, change1 may have a rollback for the same ID in a different location.
|
|
1698
|
+
// In that case, change1's attach should be canceled out by a detach from change2.
|
|
1699
|
+
// Here we make sure that the composed change has the correct location (this field) for the attach ID.
|
|
1700
|
+
this.table.movedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...newAttachId }, countToProcess, this.fieldId);
|
|
1701
|
+
}
|
|
1702
|
+
else {
|
|
1703
|
+
this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...baseDetachId }, countToProcess, true);
|
|
1704
|
+
this.table.removedCrossFieldKeys.set({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...newAttachId }, countToProcess, true);
|
|
1705
|
+
}
|
|
1706
|
+
if (countToProcess < count) {
|
|
1707
|
+
this.composeAttachDetach((0, index_js_1.offsetChangeAtomId)(baseDetachId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newAttachId, countToProcess), count - countToProcess);
|
|
1708
|
+
}
|
|
1351
1709
|
}
|
|
1352
|
-
|
|
1353
|
-
|
|
1710
|
+
invalidateBaseFields(fields) {
|
|
1711
|
+
if (this.allowInval) {
|
|
1712
|
+
for (const fieldId of fields) {
|
|
1713
|
+
this.table.pendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(fieldId), true);
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1354
1716
|
}
|
|
1355
1717
|
}
|
|
1356
1718
|
function makeModularChangeset(props = {
|
|
1357
1719
|
maxId: -1,
|
|
1358
1720
|
}) {
|
|
1359
1721
|
const changeset = {
|
|
1722
|
+
rebaseVersion: props.rebaseVersion ?? 1,
|
|
1360
1723
|
fieldChanges: props.fieldChanges ?? new Map(),
|
|
1361
1724
|
nodeChanges: props.nodeChanges ?? (0, index_js_2.newTupleBTree)(),
|
|
1725
|
+
rootNodes: props.rootNodes ?? newRootTable(),
|
|
1362
1726
|
nodeToParent: props.nodeToParent ?? (0, index_js_2.newTupleBTree)(),
|
|
1363
1727
|
nodeAliases: props.nodeAliases ?? (0, index_js_2.newTupleBTree)(),
|
|
1364
|
-
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.
|
|
1728
|
+
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1365
1729
|
};
|
|
1366
1730
|
if (props.revisions !== undefined && props.revisions.length > 0) {
|
|
1367
1731
|
changeset.revisions = props.revisions;
|
|
@@ -1394,6 +1758,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1394
1758
|
this.transactionDepth = 0;
|
|
1395
1759
|
this.idAllocator = (0, index_js_2.idAllocatorFromMaxId)();
|
|
1396
1760
|
}
|
|
1761
|
+
isInTransaction() {
|
|
1762
|
+
return this.transactionDepth > 0;
|
|
1763
|
+
}
|
|
1397
1764
|
enterTransaction() {
|
|
1398
1765
|
this.transactionDepth += 1;
|
|
1399
1766
|
if (this.transactionDepth === 1) {
|
|
@@ -1444,7 +1811,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1444
1811
|
fieldChange: { fieldKind, change },
|
|
1445
1812
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1446
1813
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1447
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1814
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1815
|
+
rootNodes: newRootTable(),
|
|
1448
1816
|
idAllocator: this.idAllocator,
|
|
1449
1817
|
localCrossFieldKeys,
|
|
1450
1818
|
revision,
|
|
@@ -1463,6 +1831,7 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1463
1831
|
? makeModularChangeset({
|
|
1464
1832
|
maxId: this.idAllocator.getMaxId(),
|
|
1465
1833
|
builds: change.builds,
|
|
1834
|
+
rootNodes: renameTableFromRenameDescriptions(change.renames ?? []),
|
|
1466
1835
|
revisions: [{ revision: change.revision }],
|
|
1467
1836
|
})
|
|
1468
1837
|
: buildModularChangesetFromField({
|
|
@@ -1473,7 +1842,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1473
1842
|
},
|
|
1474
1843
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1475
1844
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1476
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1845
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1846
|
+
rootNodes: newRootTable(),
|
|
1477
1847
|
idAllocator: this.idAllocator,
|
|
1478
1848
|
localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
|
|
1479
1849
|
revision: change.revision,
|
|
@@ -1502,7 +1872,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1502
1872
|
nodeChange,
|
|
1503
1873
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1504
1874
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1505
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1875
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1876
|
+
rootNodes: newRootTable(),
|
|
1506
1877
|
idAllocator: this.idAllocator,
|
|
1507
1878
|
revision,
|
|
1508
1879
|
}), revision));
|
|
@@ -1516,7 +1887,8 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1516
1887
|
nodeChange,
|
|
1517
1888
|
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1518
1889
|
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1519
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1890
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1891
|
+
rootNodes: newRootTable(),
|
|
1520
1892
|
idAllocator: this.idAllocator,
|
|
1521
1893
|
revision,
|
|
1522
1894
|
}), revision));
|
|
@@ -1524,16 +1896,19 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1524
1896
|
}
|
|
1525
1897
|
exports.ModularEditBuilder = ModularEditBuilder;
|
|
1526
1898
|
function buildModularChangesetFromField(props) {
|
|
1527
|
-
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
|
|
1899
|
+
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, rootNodes, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
|
|
1528
1900
|
const fieldChanges = new Map([[path.field, fieldChange]]);
|
|
1529
1901
|
if (path.parent === undefined) {
|
|
1902
|
+
const field = { nodeId: undefined, field: path.field };
|
|
1530
1903
|
for (const { key, count } of localCrossFieldKeys) {
|
|
1531
|
-
crossFieldKeys.set(key, count,
|
|
1904
|
+
crossFieldKeys.set(key, count, field);
|
|
1532
1905
|
}
|
|
1533
1906
|
if (childId !== undefined) {
|
|
1534
|
-
setInChangeAtomIdMap(nodeToParent, childId, {
|
|
1535
|
-
|
|
1536
|
-
|
|
1907
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
|
|
1908
|
+
field: {
|
|
1909
|
+
nodeId: undefined,
|
|
1910
|
+
field: path.field,
|
|
1911
|
+
},
|
|
1537
1912
|
});
|
|
1538
1913
|
}
|
|
1539
1914
|
return makeModularChangeset({
|
|
@@ -1541,6 +1916,7 @@ function buildModularChangesetFromField(props) {
|
|
|
1541
1916
|
nodeChanges,
|
|
1542
1917
|
nodeToParent,
|
|
1543
1918
|
crossFieldKeys,
|
|
1919
|
+
rootNodes,
|
|
1544
1920
|
maxId: idAllocator.getMaxId(),
|
|
1545
1921
|
revisions: [{ revision }],
|
|
1546
1922
|
});
|
|
@@ -1549,13 +1925,13 @@ function buildModularChangesetFromField(props) {
|
|
|
1549
1925
|
fieldChanges,
|
|
1550
1926
|
};
|
|
1551
1927
|
const parentId = { localId: (0, index_js_2.brand)(idAllocator.allocate()), revision };
|
|
1928
|
+
const fieldId = { nodeId: parentId, field: path.field };
|
|
1552
1929
|
for (const { key, count } of localCrossFieldKeys) {
|
|
1553
1930
|
crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
|
|
1554
1931
|
}
|
|
1555
1932
|
if (childId !== undefined) {
|
|
1556
|
-
setInChangeAtomIdMap(nodeToParent, childId, {
|
|
1557
|
-
|
|
1558
|
-
field: path.field,
|
|
1933
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
|
|
1934
|
+
field: fieldId,
|
|
1559
1935
|
});
|
|
1560
1936
|
}
|
|
1561
1937
|
return buildModularChangesetFromNode({
|
|
@@ -1564,28 +1940,50 @@ function buildModularChangesetFromField(props) {
|
|
|
1564
1940
|
nodeChanges,
|
|
1565
1941
|
nodeToParent,
|
|
1566
1942
|
crossFieldKeys,
|
|
1943
|
+
rootNodes,
|
|
1567
1944
|
idAllocator,
|
|
1568
1945
|
revision,
|
|
1569
1946
|
nodeId: parentId,
|
|
1570
1947
|
});
|
|
1571
1948
|
}
|
|
1949
|
+
exports.buildModularChangesetFromField = buildModularChangesetFromField;
|
|
1572
1950
|
function buildModularChangesetFromNode(props) {
|
|
1573
1951
|
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
|
-
|
|
1952
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(props.nodeChanges, nodeId, props.nodeChange);
|
|
1953
|
+
if ((0, index_js_1.isDetachedUpPathRoot)(path)) {
|
|
1954
|
+
props.rootNodes.nodeChanges.set([path.detachedNodeId.major, (0, index_js_2.brand)(path.detachedNodeId.minor)], nodeId);
|
|
1955
|
+
return makeModularChangeset({
|
|
1956
|
+
rootNodes: props.rootNodes,
|
|
1957
|
+
nodeChanges: props.nodeChanges,
|
|
1958
|
+
nodeToParent: props.nodeToParent,
|
|
1959
|
+
crossFieldKeys: props.crossFieldKeys,
|
|
1960
|
+
maxId: props.idAllocator.getMaxId(),
|
|
1961
|
+
revisions: [{ revision: props.revision }],
|
|
1962
|
+
});
|
|
1963
|
+
}
|
|
1964
|
+
else {
|
|
1965
|
+
const fieldChangeset = genericFieldKind_js_1.genericFieldKind.changeHandler.editor.buildChildChanges([
|
|
1966
|
+
[path.parentIndex, nodeId],
|
|
1967
|
+
]);
|
|
1968
|
+
const fieldChange = {
|
|
1969
|
+
fieldKind: genericFieldKind_js_1.genericFieldKind.identifier,
|
|
1970
|
+
change: fieldChangeset,
|
|
1971
|
+
};
|
|
1972
|
+
return buildModularChangesetFromField({
|
|
1973
|
+
...props,
|
|
1974
|
+
path: { parent: path.parent, field: path.parentField },
|
|
1975
|
+
fieldChange,
|
|
1976
|
+
localCrossFieldKeys: [],
|
|
1977
|
+
childId: nodeId,
|
|
1978
|
+
});
|
|
1979
|
+
}
|
|
1980
|
+
}
|
|
1981
|
+
function renameTableFromRenameDescriptions(renames) {
|
|
1982
|
+
const table = newRootTable();
|
|
1983
|
+
for (const rename of renames) {
|
|
1984
|
+
addNodeRename(table, rename.oldId, rename.newId, rename.count, rename.detachLocation);
|
|
1985
|
+
}
|
|
1986
|
+
return table;
|
|
1589
1987
|
}
|
|
1590
1988
|
function getRevInfoFromTaggedChanges(changes) {
|
|
1591
1989
|
let maxId = -1;
|
|
@@ -1595,20 +1993,6 @@ function getRevInfoFromTaggedChanges(changes) {
|
|
|
1595
1993
|
maxId = Math.max(change.maxId ?? -1, maxId);
|
|
1596
1994
|
revInfos.push(...revisionInfoFromTaggedChange(taggedChange));
|
|
1597
1995
|
}
|
|
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
1996
|
return { maxId: (0, index_js_2.brand)(maxId), revInfos };
|
|
1613
1997
|
}
|
|
1614
1998
|
function revisionInfoFromTaggedChange(taggedChange) {
|
|
@@ -1625,15 +2009,16 @@ function revisionInfoFromTaggedChange(taggedChange) {
|
|
|
1625
2009
|
}
|
|
1626
2010
|
return revInfos;
|
|
1627
2011
|
}
|
|
1628
|
-
function fieldChangeFromId(
|
|
1629
|
-
const
|
|
2012
|
+
function fieldChangeFromId(change, id) {
|
|
2013
|
+
const fieldId = normalizeFieldId(id, change.nodeAliases);
|
|
2014
|
+
const fieldMap = fieldMapFromNodeId(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldId.nodeId);
|
|
1630
2015
|
return fieldMap.get(id.field) ?? (0, internal_1.fail)(0xb25 /* No field exists for the given ID */);
|
|
1631
2016
|
}
|
|
1632
|
-
function fieldMapFromNodeId(rootFieldMap, nodes, nodeId) {
|
|
2017
|
+
function fieldMapFromNodeId(rootFieldMap, nodes, aliases, nodeId) {
|
|
1633
2018
|
if (nodeId === undefined) {
|
|
1634
2019
|
return rootFieldMap;
|
|
1635
2020
|
}
|
|
1636
|
-
const node = nodeChangeFromId(nodes, nodeId);
|
|
2021
|
+
const node = nodeChangeFromId(nodes, aliases, nodeId);
|
|
1637
2022
|
(0, internal_1.assert)(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);
|
|
1638
2023
|
return node.fieldChanges;
|
|
1639
2024
|
}
|
|
@@ -1644,10 +2029,11 @@ function rebasedFieldIdFromBaseId(table, baseId) {
|
|
|
1644
2029
|
return { ...baseId, nodeId: rebasedNodeIdFromBaseNodeId(table, baseId.nodeId) };
|
|
1645
2030
|
}
|
|
1646
2031
|
function rebasedNodeIdFromBaseNodeId(table, baseId) {
|
|
1647
|
-
return getFromChangeAtomIdMap(table.baseToRebasedNodeId, baseId) ?? baseId;
|
|
2032
|
+
return (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, baseId) ?? baseId;
|
|
1648
2033
|
}
|
|
1649
|
-
function nodeChangeFromId(nodes, id) {
|
|
1650
|
-
const
|
|
2034
|
+
function nodeChangeFromId(nodes, aliases, id) {
|
|
2035
|
+
const normalizedId = normalizeNodeId(id, aliases);
|
|
2036
|
+
const node = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodes, normalizedId);
|
|
1651
2037
|
(0, internal_1.assert)(node !== undefined, 0x9ca /* Unknown node ID */);
|
|
1652
2038
|
return node;
|
|
1653
2039
|
}
|
|
@@ -1655,12 +2041,20 @@ function fieldIdFromFieldIdKey([revision, localId, field]) {
|
|
|
1655
2041
|
const nodeId = localId !== undefined ? { revision, localId } : undefined;
|
|
1656
2042
|
return { nodeId, field };
|
|
1657
2043
|
}
|
|
2044
|
+
function fieldIdKeyFromFieldId(fieldId) {
|
|
2045
|
+
return [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];
|
|
2046
|
+
}
|
|
1658
2047
|
function cloneNodeChangeset(nodeChangeset) {
|
|
1659
2048
|
if (nodeChangeset.fieldChanges !== undefined) {
|
|
1660
2049
|
return { ...nodeChangeset, fieldChanges: new Map(nodeChangeset.fieldChanges) };
|
|
1661
2050
|
}
|
|
1662
2051
|
return { ...nodeChangeset };
|
|
1663
2052
|
}
|
|
2053
|
+
function replaceNodeLocationRevision(location, oldRevisions, newRevision) {
|
|
2054
|
+
return location.field !== undefined
|
|
2055
|
+
? { field: replaceFieldIdRevision(location.field, oldRevisions, newRevision) }
|
|
2056
|
+
: { root: (0, index_js_1.replaceAtomRevisions)(location.root, oldRevisions, newRevision) };
|
|
2057
|
+
}
|
|
1664
2058
|
function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
|
|
1665
2059
|
if (fieldId.nodeId === undefined) {
|
|
1666
2060
|
return fieldId;
|
|
@@ -1670,17 +2064,34 @@ function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
|
|
|
1670
2064
|
nodeId: (0, index_js_1.replaceAtomRevisions)(fieldId.nodeId, oldRevisions, newRevision),
|
|
1671
2065
|
};
|
|
1672
2066
|
}
|
|
1673
|
-
function
|
|
1674
|
-
const
|
|
1675
|
-
(0,
|
|
1676
|
-
|
|
2067
|
+
function getNodeParent(changeset, nodeId) {
|
|
2068
|
+
const normalizedNodeId = normalizeNodeId(nodeId, changeset.nodeAliases);
|
|
2069
|
+
const location = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(changeset.nodeToParent, normalizedNodeId);
|
|
2070
|
+
(0, internal_1.assert)(location !== undefined, 0x9cb /* Parent field should be defined */);
|
|
2071
|
+
if (location.field !== undefined) {
|
|
2072
|
+
return { field: normalizeFieldId(location.field, changeset.nodeAliases) };
|
|
2073
|
+
}
|
|
2074
|
+
return location;
|
|
1677
2075
|
}
|
|
1678
|
-
exports.
|
|
2076
|
+
exports.getNodeParent = getNodeParent;
|
|
1679
2077
|
function getFieldsForCrossFieldKey(changeset, key, count) {
|
|
1680
2078
|
return changeset.crossFieldKeys
|
|
1681
2079
|
.getAll(key, count)
|
|
1682
2080
|
.map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
|
|
1683
2081
|
}
|
|
2082
|
+
function getFirstFieldForCrossFieldKey(changeset, key, count) {
|
|
2083
|
+
const result = changeset.crossFieldKeys.getFirst(key, count);
|
|
2084
|
+
if (result.value === undefined) {
|
|
2085
|
+
return result;
|
|
2086
|
+
}
|
|
2087
|
+
return { ...result, value: normalizeFieldId(result.value, changeset.nodeAliases) };
|
|
2088
|
+
}
|
|
2089
|
+
function normalizeNodeLocation(location, nodeAliases) {
|
|
2090
|
+
if (location.field !== undefined) {
|
|
2091
|
+
return { field: normalizeFieldId(location.field, nodeAliases) };
|
|
2092
|
+
}
|
|
2093
|
+
return location;
|
|
2094
|
+
}
|
|
1684
2095
|
// This is only exported for use in test utilities.
|
|
1685
2096
|
function normalizeFieldId(fieldId, nodeAliases) {
|
|
1686
2097
|
return fieldId.nodeId !== undefined
|
|
@@ -1693,25 +2104,455 @@ exports.normalizeFieldId = normalizeFieldId;
|
|
|
1693
2104
|
*/
|
|
1694
2105
|
function normalizeNodeId(nodeId, nodeAliases) {
|
|
1695
2106
|
let currentId = nodeId;
|
|
2107
|
+
let cycleProbeId = nodeId;
|
|
1696
2108
|
// eslint-disable-next-line no-constant-condition
|
|
1697
2109
|
while (true) {
|
|
1698
|
-
const dealiased = getFromChangeAtomIdMap(nodeAliases, currentId);
|
|
2110
|
+
const dealiased = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, currentId);
|
|
1699
2111
|
if (dealiased === undefined) {
|
|
1700
2112
|
return currentId;
|
|
1701
2113
|
}
|
|
1702
2114
|
currentId = dealiased;
|
|
2115
|
+
if (cycleProbeId !== undefined) {
|
|
2116
|
+
cycleProbeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, cycleProbeId);
|
|
2117
|
+
}
|
|
2118
|
+
if (cycleProbeId !== undefined) {
|
|
2119
|
+
cycleProbeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodeAliases, cycleProbeId);
|
|
2120
|
+
}
|
|
2121
|
+
(0, internal_1.assert)(!(0, index_js_1.areEqualChangeAtomIdOpts)(cycleProbeId, currentId), "Alias cycle detected");
|
|
1703
2122
|
}
|
|
1704
2123
|
}
|
|
2124
|
+
exports.normalizeNodeId = normalizeNodeId;
|
|
1705
2125
|
function hasConflicts(change) {
|
|
1706
2126
|
return (change.constraintViolationCount ?? 0) > 0;
|
|
1707
2127
|
}
|
|
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
2128
|
function areEqualFieldIds(a, b) {
|
|
1715
2129
|
return (0, index_js_1.areEqualChangeAtomIdOpts)(a.nodeId, b.nodeId) && a.field === b.field;
|
|
1716
2130
|
}
|
|
2131
|
+
function firstAttachIdFromDetachId(roots, detachId, count) {
|
|
2132
|
+
const result = roots.oldToNewId.getFirst(detachId, count);
|
|
2133
|
+
return { ...result, value: result.value ?? detachId };
|
|
2134
|
+
}
|
|
2135
|
+
function firstDetachIdFromAttachId(roots, attachId, count) {
|
|
2136
|
+
const result = roots.newToOldId.getFirst(attachId, count);
|
|
2137
|
+
return { ...result, start: attachId, value: result.value ?? attachId };
|
|
2138
|
+
}
|
|
2139
|
+
function rebaseCrossFieldKeys(sourceTable, movedDetaches, newDetachLocations) {
|
|
2140
|
+
const rebasedTable = sourceTable.clone();
|
|
2141
|
+
for (const entry of movedDetaches.entries()) {
|
|
2142
|
+
rebasedTable.delete({ ...entry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, entry.length);
|
|
2143
|
+
}
|
|
2144
|
+
for (const entry of newDetachLocations.entries()) {
|
|
2145
|
+
rebasedTable.set({ ...entry.start, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, entry.length, entry.value);
|
|
2146
|
+
}
|
|
2147
|
+
return rebasedTable;
|
|
2148
|
+
}
|
|
2149
|
+
function newRootTable() {
|
|
2150
|
+
return {
|
|
2151
|
+
newToOldId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2152
|
+
oldToNewId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2153
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
2154
|
+
detachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
2155
|
+
outputDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
2156
|
+
};
|
|
2157
|
+
}
|
|
2158
|
+
exports.newRootTable = newRootTable;
|
|
2159
|
+
function rebaseRoots(change, base, affectedBaseFields, nodesToRebase, rebasedNodeToParent, rebaseVersion) {
|
|
2160
|
+
const rebasedRoots = newRootTable();
|
|
2161
|
+
for (const renameEntry of change.rootNodes.oldToNewId.entries()) {
|
|
2162
|
+
rebaseRename(change.rootNodes, rebasedRoots, renameEntry, base, affectedBaseFields);
|
|
2163
|
+
}
|
|
2164
|
+
for (const [detachIdKey, nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
2165
|
+
const changes = base.rootNodes.nodeChanges.get(detachIdKey);
|
|
2166
|
+
if (changes !== undefined) {
|
|
2167
|
+
nodesToRebase.push([nodeId, changes]);
|
|
2168
|
+
}
|
|
2169
|
+
const detachId = (0, index_js_1.makeChangeAtomId)(detachIdKey[1], detachIdKey[0]);
|
|
2170
|
+
const attachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;
|
|
2171
|
+
const baseAttachEntry = base.crossFieldKeys.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...attachId }, 1);
|
|
2172
|
+
if (baseAttachEntry.value !== undefined) {
|
|
2173
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(baseAttachEntry.value), true);
|
|
2174
|
+
rebasedNodeToParent.delete(detachIdKey);
|
|
2175
|
+
}
|
|
2176
|
+
else {
|
|
2177
|
+
const renamedDetachId = firstAttachIdFromDetachId(base.rootNodes, detachId, 1).value;
|
|
2178
|
+
const baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(renamedDetachId, 1).value;
|
|
2179
|
+
if (baseOutputDetachLocation !== undefined) {
|
|
2180
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);
|
|
2181
|
+
}
|
|
2182
|
+
const detachLocation = baseOutputDetachLocation ??
|
|
2183
|
+
change.rootNodes.detachLocations.getFirst(detachId, 1).value;
|
|
2184
|
+
// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.
|
|
2185
|
+
// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`
|
|
2186
|
+
assignRootChange(rebasedRoots, rebasedNodeToParent, renamedDetachId, nodeId, detachLocation, rebaseVersion);
|
|
2187
|
+
}
|
|
2188
|
+
}
|
|
2189
|
+
for (const entry of change.rootNodes.outputDetachLocations.entries()) {
|
|
2190
|
+
rebasedRoots.outputDetachLocations.set(entry.start, entry.length, entry.value);
|
|
2191
|
+
}
|
|
2192
|
+
return rebasedRoots;
|
|
2193
|
+
}
|
|
2194
|
+
function rebaseRename(newRoots, rebasedRoots, renameEntry, base, affectedBaseFields) {
|
|
2195
|
+
let count = renameEntry.length;
|
|
2196
|
+
const baseRenameEntry = firstAttachIdFromDetachId(base.rootNodes, renameEntry.start, count);
|
|
2197
|
+
count = baseRenameEntry.length;
|
|
2198
|
+
const baseAttachEntry = base.crossFieldKeys.getFirst({
|
|
2199
|
+
...baseRenameEntry.value,
|
|
2200
|
+
target: crossFieldQueries_js_1.CrossFieldTarget.Destination,
|
|
2201
|
+
}, count);
|
|
2202
|
+
count = baseAttachEntry.length;
|
|
2203
|
+
if (baseAttachEntry.value !== undefined) {
|
|
2204
|
+
// This rename represents an intention to detach these nodes.
|
|
2205
|
+
// The rebased change should have a detach in the field where the base change attaches the nodes,
|
|
2206
|
+
// so we need to ensure that field is processed.
|
|
2207
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(normalizeFieldId(baseAttachEntry.value, base.nodeAliases)), true);
|
|
2208
|
+
}
|
|
2209
|
+
else {
|
|
2210
|
+
const baseOutputDetachLocation = base.rootNodes.outputDetachLocations.getFirst(baseRenameEntry.value, 1).value;
|
|
2211
|
+
if (baseOutputDetachLocation !== undefined) {
|
|
2212
|
+
affectedBaseFields.set(fieldIdKeyFromFieldId(baseOutputDetachLocation), true);
|
|
2213
|
+
}
|
|
2214
|
+
const detachEntry = newRoots.detachLocations.getFirst(renameEntry.start, count);
|
|
2215
|
+
count = detachEntry.length;
|
|
2216
|
+
const detachLocation = baseOutputDetachLocation ?? detachEntry.value;
|
|
2217
|
+
// Note that `baseOutputDetachLocation` may contain a node ID from the base changeset.
|
|
2218
|
+
// We will replace the detach location entry with the node ID from the rebased changeset in `fixupRebasedDetachLocations`
|
|
2219
|
+
addNodeRename(rebasedRoots, baseRenameEntry.value, renameEntry.value, count, detachLocation);
|
|
2220
|
+
}
|
|
2221
|
+
const countRemaining = renameEntry.length - count;
|
|
2222
|
+
if (countRemaining > 0) {
|
|
2223
|
+
rebaseRename(newRoots, rebasedRoots, {
|
|
2224
|
+
start: (0, index_js_1.offsetChangeAtomId)(renameEntry.start, count),
|
|
2225
|
+
value: (0, index_js_1.offsetChangeAtomId)(renameEntry.value, count),
|
|
2226
|
+
length: countRemaining,
|
|
2227
|
+
}, base, affectedBaseFields);
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2230
|
+
/**
|
|
2231
|
+
* For each root detach location, replaces any node ID from the base changeset
|
|
2232
|
+
* with the corresponding ID in the new changeset.
|
|
2233
|
+
*/
|
|
2234
|
+
function fixupRebasedDetachLocations(table) {
|
|
2235
|
+
for (const { start, length, value: detachLocation, } of table.rebasedRootNodes.detachLocations.entries()) {
|
|
2236
|
+
const normalizedDetachLocation = normalizeFieldId(detachLocation, table.baseChange.nodeAliases);
|
|
2237
|
+
if (normalizedDetachLocation.nodeId !== undefined) {
|
|
2238
|
+
const rebasedNodeId = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, normalizedDetachLocation.nodeId);
|
|
2239
|
+
if (rebasedNodeId !== undefined) {
|
|
2240
|
+
table.rebasedRootNodes.detachLocations.set(start, length, {
|
|
2241
|
+
...normalizedDetachLocation,
|
|
2242
|
+
nodeId: rebasedNodeId,
|
|
2243
|
+
});
|
|
2244
|
+
}
|
|
2245
|
+
}
|
|
2246
|
+
}
|
|
2247
|
+
}
|
|
2248
|
+
function addNodesToCompose(table, id1, id2) {
|
|
2249
|
+
const normalizedId1 = normalizeNodeId(id1, table.baseChange.nodeAliases);
|
|
2250
|
+
const normalizedId2 = normalizeNodeId(id2, table.newChange.nodeAliases);
|
|
2251
|
+
if ((0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(table.newToBaseNodeId, normalizedId2) === undefined) {
|
|
2252
|
+
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(table.newToBaseNodeId, normalizedId2, normalizedId1);
|
|
2253
|
+
table.pendingCompositions.nodeIdsToCompose.push([normalizedId1, normalizedId2]);
|
|
2254
|
+
}
|
|
2255
|
+
}
|
|
2256
|
+
function composeRevInfos(revisions1, revisions2) {
|
|
2257
|
+
const result = [...(revisions1 ?? []), ...(revisions2 ?? [])];
|
|
2258
|
+
return result;
|
|
2259
|
+
}
|
|
2260
|
+
function composeCrossFieldKeyTables(table1, table2, movedCrossFieldKeys, removedCrossFieldKeys) {
|
|
2261
|
+
const composedTable = index_js_2.RangeMap.union(table1, table2);
|
|
2262
|
+
for (const entry of movedCrossFieldKeys.entries()) {
|
|
2263
|
+
composedTable.set(entry.start, entry.length, entry.value);
|
|
2264
|
+
}
|
|
2265
|
+
for (const entry of removedCrossFieldKeys.entries()) {
|
|
2266
|
+
composedTable.delete(entry.start, entry.length);
|
|
2267
|
+
}
|
|
2268
|
+
return composedTable;
|
|
2269
|
+
}
|
|
2270
|
+
function composeRootTables(change1, change2, composedNodeToParent, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
|
|
2271
|
+
const composedTable = cloneRootTable(change1.rootNodes);
|
|
2272
|
+
for (const renameEntry of change2.rootNodes.oldToNewId.entries()) {
|
|
2273
|
+
composeRename(change1, change2, composedTable, renameEntry.start, renameEntry.value, renameEntry.length, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
|
|
2274
|
+
}
|
|
2275
|
+
for (const [[revision2, id2], nodeId2] of change2.rootNodes.nodeChanges.entries()) {
|
|
2276
|
+
const detachId2 = { revision: revision2, localId: id2 };
|
|
2277
|
+
const detachId1 = firstDetachIdFromAttachId(change1.rootNodes, detachId2, 1).value;
|
|
2278
|
+
const nodeId1 = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(change1.rootNodes.nodeChanges, detachId1);
|
|
2279
|
+
if (nodeId1 !== undefined) {
|
|
2280
|
+
pendingCompositions.nodeIdsToCompose.push([nodeId1, nodeId2]);
|
|
2281
|
+
}
|
|
2282
|
+
else {
|
|
2283
|
+
const fieldId = getFieldsForCrossFieldKey(change1, { ...detachId1, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, 1)[0];
|
|
2284
|
+
if (fieldId !== undefined) {
|
|
2285
|
+
// In this case, this node is attached in the input context of change1,
|
|
2286
|
+
// and is represented in detachFieldId.
|
|
2287
|
+
pendingCompositions.affectedBaseFields.set([fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field], true);
|
|
2288
|
+
}
|
|
2289
|
+
else {
|
|
2290
|
+
assignRootChange(composedTable, composedNodeToParent, detachId1, nodeId2, change1.rootNodes.detachLocations.getFirst(detachId1, 1).value ??
|
|
2291
|
+
change2.rootNodes.detachLocations.getFirst(detachId2, 1).value, Math.max(change1.rebaseVersion, change2.rebaseVersion));
|
|
2292
|
+
}
|
|
2293
|
+
}
|
|
2294
|
+
}
|
|
2295
|
+
for (const outputDetachEntry of change1.rootNodes.outputDetachLocations.entries()) {
|
|
2296
|
+
composeOutputDetachLocation(outputDetachEntry.start, outputDetachEntry.length, outputDetachEntry.value, change2, composedTable);
|
|
2297
|
+
}
|
|
2298
|
+
for (const entry of change2.rootNodes.outputDetachLocations.entries()) {
|
|
2299
|
+
composedTable.outputDetachLocations.set(entry.start, entry.length, entry.value);
|
|
2300
|
+
}
|
|
2301
|
+
return composedTable;
|
|
2302
|
+
}
|
|
2303
|
+
function composeOutputDetachLocation(outputDetachId1, count, detachLocation, change2, composedTable) {
|
|
2304
|
+
let countToProcess = count;
|
|
2305
|
+
const renameEntry = firstAttachIdFromDetachId(change2.rootNodes, outputDetachId1, countToProcess);
|
|
2306
|
+
countToProcess = renameEntry.length;
|
|
2307
|
+
const attachEntry = getFirstAttachField(change2.crossFieldKeys, renameEntry.value, countToProcess);
|
|
2308
|
+
countToProcess = attachEntry.length;
|
|
2309
|
+
composedTable.outputDetachLocations.delete(outputDetachId1, countToProcess);
|
|
2310
|
+
if (attachEntry.value === undefined) {
|
|
2311
|
+
// We update the key for the detach location to the renamed ID of the root in the composed output context.
|
|
2312
|
+
composedTable.outputDetachLocations.set(renameEntry.value, countToProcess, detachLocation);
|
|
2313
|
+
}
|
|
2314
|
+
else {
|
|
2315
|
+
// These nodes are attached by `change2` and thus attached in the composed output context,
|
|
2316
|
+
// so there should be no output detach location.
|
|
2317
|
+
}
|
|
2318
|
+
const countRemaining = count - countToProcess;
|
|
2319
|
+
if (countRemaining > 0) {
|
|
2320
|
+
composeOutputDetachLocation((0, index_js_1.offsetChangeAtomId)(outputDetachId1, countToProcess), countRemaining, detachLocation, change2, composedTable);
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
function composeRename(change1, change2, mergedTable, oldId, newId, count, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions) {
|
|
2324
|
+
let countToProcess = count;
|
|
2325
|
+
const detachEntry = getFirstDetachField(change1.crossFieldKeys, oldId, countToProcess);
|
|
2326
|
+
countToProcess = detachEntry.length;
|
|
2327
|
+
if (detachEntry.value !== undefined) {
|
|
2328
|
+
// `change1` detached these nodes,
|
|
2329
|
+
// so we invalidate the detach location so that the detach's ID can be replaced with the new ID.
|
|
2330
|
+
pendingCompositions.affectedBaseFields.set(fieldIdKeyFromFieldId(detachEntry.value), true);
|
|
2331
|
+
if (!(0, index_js_1.areEqualChangeAtomIds)(oldId, newId)) {
|
|
2332
|
+
// `change1`'s detach will be replaced by `change2`'s detach, so we update the cross-field keys.
|
|
2333
|
+
removedCrossFieldKeys.set({ ...oldId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, true);
|
|
2334
|
+
}
|
|
2335
|
+
movedCrossFieldKeys.set({ ...newId, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, countToProcess, detachEntry.value);
|
|
2336
|
+
}
|
|
2337
|
+
else {
|
|
2338
|
+
// `change1` may also have a rename to `renameEntry.value`, in which case it must refer to a different node.
|
|
2339
|
+
// That node must have been attached by `change1` and detached by `change2`.
|
|
2340
|
+
// The final rename for that node will be created in `composeAttachDetach`.
|
|
2341
|
+
// We delete any such rename for now to avoid colliding with the rename currently being processed.
|
|
2342
|
+
deleteNodeRenameTo(mergedTable, newId, countToProcess);
|
|
2343
|
+
// The nodes were detached before `change`, so we append this rename.
|
|
2344
|
+
appendNodeRename(mergedTable, oldId, newId, countToProcess, change1.rootNodes, change2.rootNodes.detachLocations.getFirst(oldId, countToProcess).value);
|
|
2345
|
+
}
|
|
2346
|
+
if (countToProcess < count) {
|
|
2347
|
+
composeRename(change1, change2, mergedTable, (0, index_js_1.offsetChangeAtomId)(oldId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newId, countToProcess), count - countToProcess, movedCrossFieldKeys, removedCrossFieldKeys, pendingCompositions);
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
function cloneRootTable(table) {
|
|
2351
|
+
return {
|
|
2352
|
+
oldToNewId: table.oldToNewId.clone(),
|
|
2353
|
+
newToOldId: table.newToOldId.clone(),
|
|
2354
|
+
nodeChanges: (0, index_js_2.brand)(table.nodeChanges.clone()),
|
|
2355
|
+
detachLocations: table.detachLocations.clone(),
|
|
2356
|
+
outputDetachLocations: table.outputDetachLocations.clone(),
|
|
2357
|
+
};
|
|
2358
|
+
}
|
|
2359
|
+
exports.cloneRootTable = cloneRootTable;
|
|
2360
|
+
function invertRootTable(change, isRollback) {
|
|
2361
|
+
const invertedRoots = newRootTable();
|
|
2362
|
+
for (const [[revision, localId], nodeId] of change.rootNodes.nodeChanges.entries()) {
|
|
2363
|
+
const detachId = { revision, localId };
|
|
2364
|
+
const renamedId = firstAttachIdFromDetachId(change.rootNodes, detachId, 1).value;
|
|
2365
|
+
// This checks whether `change` attaches this node.
|
|
2366
|
+
// 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.
|
|
2367
|
+
if (change.crossFieldKeys.getFirst({ ...renamedId, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, 1)
|
|
2368
|
+
.value === undefined) {
|
|
2369
|
+
assignRootChange(invertedRoots, undefined, renamedId, nodeId, change.rootNodes.detachLocations.getFirst(detachId, 1).value, change.rebaseVersion);
|
|
2370
|
+
}
|
|
2371
|
+
}
|
|
2372
|
+
if (isRollback) {
|
|
2373
|
+
// We only invert renames of nodes which are not attached or detached by this changeset.
|
|
2374
|
+
// When we invert an attach we will create a detach which incorporates the rename.
|
|
2375
|
+
for (const { start: oldId, value: newId, length, } of change.rootNodes.oldToNewId.entries()) {
|
|
2376
|
+
invertRename(change, invertedRoots, oldId, newId, length);
|
|
2377
|
+
}
|
|
2378
|
+
}
|
|
2379
|
+
return invertedRoots;
|
|
2380
|
+
}
|
|
2381
|
+
function invertRename(change, invertedRoots, oldId, newId, length) {
|
|
2382
|
+
for (const detachEntry of doesChangeDetachNodes(change.crossFieldKeys, newId, length)) {
|
|
2383
|
+
(0, internal_1.assert)(!detachEntry.value, "A changeset should not have a rename and detach for the same node.");
|
|
2384
|
+
}
|
|
2385
|
+
let countProcessed = length;
|
|
2386
|
+
const attachEntry = getFirstAttachField(change.crossFieldKeys, newId, countProcessed);
|
|
2387
|
+
countProcessed = attachEntry.length;
|
|
2388
|
+
if (attachEntry.value === undefined) {
|
|
2389
|
+
const outputDetachEntry = change.rootNodes.outputDetachLocations.getFirst(newId, countProcessed);
|
|
2390
|
+
countProcessed = outputDetachEntry.length;
|
|
2391
|
+
const inputDetachEntry = change.rootNodes.detachLocations.getFirst(oldId, countProcessed);
|
|
2392
|
+
countProcessed = inputDetachEntry.length;
|
|
2393
|
+
addNodeRename(invertedRoots, newId, oldId, countProcessed, outputDetachEntry.value ?? inputDetachEntry.value);
|
|
2394
|
+
}
|
|
2395
|
+
if (countProcessed < length) {
|
|
2396
|
+
invertRename(change, invertedRoots, (0, index_js_1.offsetChangeAtomId)(oldId, countProcessed), (0, index_js_1.offsetChangeAtomId)(newId, countProcessed), length - countProcessed);
|
|
2397
|
+
}
|
|
2398
|
+
}
|
|
2399
|
+
function doesChangeAttachNodes(table, id, count) {
|
|
2400
|
+
return table
|
|
2401
|
+
.getAll2({ ...id, target: crossFieldQueries_js_1.CrossFieldTarget.Destination }, count)
|
|
2402
|
+
.map((entry) => ({ ...entry, value: entry.value !== undefined }));
|
|
2403
|
+
}
|
|
2404
|
+
function doesChangeDetachNodes(table, id, count) {
|
|
2405
|
+
return table
|
|
2406
|
+
.getAll2({ ...id, target: crossFieldQueries_js_1.CrossFieldTarget.Source }, count)
|
|
2407
|
+
.map((entry) => ({ ...entry, value: entry.value !== undefined }));
|
|
2408
|
+
}
|
|
2409
|
+
function getFirstDetachField(table, id, count) {
|
|
2410
|
+
return table.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Source, ...id }, count);
|
|
2411
|
+
}
|
|
2412
|
+
exports.getFirstDetachField = getFirstDetachField;
|
|
2413
|
+
function getFirstAttachField(table, id, count) {
|
|
2414
|
+
return table.getFirst({ target: crossFieldQueries_js_1.CrossFieldTarget.Destination, ...id }, count);
|
|
2415
|
+
}
|
|
2416
|
+
exports.getFirstAttachField = getFirstAttachField;
|
|
2417
|
+
function addNodeRename(table, oldId, newId, count, detachLocation) {
|
|
2418
|
+
if ((0, index_js_1.areEqualChangeAtomIds)(oldId, newId)) {
|
|
2419
|
+
return;
|
|
2420
|
+
}
|
|
2421
|
+
for (const entry of table.oldToNewId.getAll2(oldId, count)) {
|
|
2422
|
+
(0, internal_1.assert)(entry.value === undefined ||
|
|
2423
|
+
(0, index_js_1.areEqualChangeAtomIds)(entry.value, (0, index_js_1.offsetChangeAtomId)(newId, entry.offset)), "Rename collision detected");
|
|
2424
|
+
}
|
|
2425
|
+
for (const entry of table.newToOldId.getAll2(newId, count)) {
|
|
2426
|
+
(0, internal_1.assert)(entry.value === undefined ||
|
|
2427
|
+
(0, index_js_1.areEqualChangeAtomIds)(entry.value, (0, index_js_1.offsetChangeAtomId)(oldId, entry.offset)), "Rename collision detected");
|
|
2428
|
+
}
|
|
2429
|
+
table.oldToNewId.set(oldId, count, newId);
|
|
2430
|
+
table.newToOldId.set(newId, count, oldId);
|
|
2431
|
+
if (detachLocation !== undefined) {
|
|
2432
|
+
table.detachLocations.set(oldId, count, detachLocation);
|
|
2433
|
+
}
|
|
2434
|
+
}
|
|
2435
|
+
exports.addNodeRename = addNodeRename;
|
|
2436
|
+
/**
|
|
2437
|
+
* Deletes any renames from `id`.
|
|
2438
|
+
*/
|
|
2439
|
+
function deleteNodeRenameFrom(roots, id, count) {
|
|
2440
|
+
for (const entry of roots.oldToNewId.getAll(id, count)) {
|
|
2441
|
+
deleteNodeRenameEntry(roots, entry.start, entry.value, entry.length);
|
|
2442
|
+
}
|
|
2443
|
+
}
|
|
2444
|
+
/**
|
|
2445
|
+
* Deletes any renames to `id`.
|
|
2446
|
+
*/
|
|
2447
|
+
function deleteNodeRenameTo(roots, id, count) {
|
|
2448
|
+
for (const entry of roots.newToOldId.getAll(id, count)) {
|
|
2449
|
+
deleteNodeRenameEntry(roots, entry.value, entry.start, entry.length);
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
function appendNodeRename(composedTable, oldId, newId, count, change1Table, detachLocation) {
|
|
2453
|
+
let countToProcess = count;
|
|
2454
|
+
const rename1Entry = change1Table.newToOldId.getFirst(oldId, countToProcess);
|
|
2455
|
+
countToProcess = rename1Entry.length;
|
|
2456
|
+
if (rename1Entry.value !== undefined) {
|
|
2457
|
+
deleteNodeRenameFrom(composedTable, rename1Entry.value, countToProcess);
|
|
2458
|
+
}
|
|
2459
|
+
addNodeRename(composedTable, rename1Entry.value ?? oldId, newId, countToProcess, detachLocation);
|
|
2460
|
+
tryRemoveDetachLocation(composedTable, newId, countToProcess);
|
|
2461
|
+
if (countToProcess < count) {
|
|
2462
|
+
const countRemaining = count - countToProcess;
|
|
2463
|
+
appendNodeRename(composedTable, (0, index_js_1.offsetChangeAtomId)(oldId, countToProcess), (0, index_js_1.offsetChangeAtomId)(newId, countToProcess), countRemaining, change1Table, detachLocation);
|
|
2464
|
+
}
|
|
2465
|
+
}
|
|
2466
|
+
function tryRemoveDetachLocation(roots, rootId, count) {
|
|
2467
|
+
let countProcessed = count;
|
|
2468
|
+
const renameEntry = roots.oldToNewId.getFirst(rootId, countProcessed);
|
|
2469
|
+
countProcessed = renameEntry.length;
|
|
2470
|
+
const outputDetachEntry = roots.outputDetachLocations.getFirst(rootId, countProcessed);
|
|
2471
|
+
countProcessed = outputDetachEntry.length;
|
|
2472
|
+
const nodeChangeEntry = (0, modularChangeTypes_js_1.rangeQueryChangeAtomIdMap)(roots.nodeChanges, rootId, countProcessed);
|
|
2473
|
+
countProcessed = nodeChangeEntry.length;
|
|
2474
|
+
if (nodeChangeEntry.value === undefined &&
|
|
2475
|
+
renameEntry.value === undefined &&
|
|
2476
|
+
outputDetachEntry.value === undefined) {
|
|
2477
|
+
roots.detachLocations.delete(rootId, countProcessed);
|
|
2478
|
+
}
|
|
2479
|
+
const countRemaining = count - countProcessed;
|
|
2480
|
+
if (countRemaining > 0) {
|
|
2481
|
+
tryRemoveDetachLocation(roots, (0, index_js_1.offsetChangeAtomId)(rootId, countProcessed), countRemaining);
|
|
2482
|
+
}
|
|
2483
|
+
}
|
|
2484
|
+
/**
|
|
2485
|
+
* Deletes the entry renaming the ID range of length `count` from `oldId` to `newId`.
|
|
2486
|
+
* This function assumes that such an entry exists.
|
|
2487
|
+
*/
|
|
2488
|
+
function deleteNodeRenameEntry(roots, oldId, newId, count) {
|
|
2489
|
+
roots.oldToNewId.delete(oldId, count);
|
|
2490
|
+
roots.newToOldId.delete(newId, count);
|
|
2491
|
+
}
|
|
2492
|
+
function replaceRootTableRevision(table, oldRevisions, newRevision, nodeAliases) {
|
|
2493
|
+
const oldToNewId = table.oldToNewId.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision));
|
|
2494
|
+
const newToOldId = table.newToOldId.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision));
|
|
2495
|
+
const nodeChanges = (0, index_js_2.newTupleBTree)([...table.nodeChanges.entries()].map(([[revision, id], nodeId]) => [
|
|
2496
|
+
[oldRevisions.has(revision) ? newRevision : revision, id],
|
|
2497
|
+
(0, index_js_1.replaceAtomRevisions)(normalizeNodeId(nodeId, nodeAliases), oldRevisions, newRevision),
|
|
2498
|
+
]));
|
|
2499
|
+
const detachLocations = table.detachLocations.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, nodeAliases), oldRevisions, newRevision));
|
|
2500
|
+
const outputDetachLocations = table.outputDetachLocations.mapEntries((id) => (0, index_js_1.replaceAtomRevisions)(id, oldRevisions, newRevision), (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, nodeAliases), oldRevisions, newRevision));
|
|
2501
|
+
return { oldToNewId, newToOldId, nodeChanges, detachLocations, outputDetachLocations };
|
|
2502
|
+
}
|
|
2503
|
+
function newDetachedEntryMap() {
|
|
2504
|
+
return new index_js_2.RangeMap(index_js_1.offsetChangeAtomId, index_js_1.subtractChangeAtomIds, offsetDetachedNodeEntry);
|
|
2505
|
+
}
|
|
2506
|
+
function offsetDetachedNodeEntry(entry, count) {
|
|
2507
|
+
(0, internal_1.assert)(count <= 1 || entry.nodeChange === undefined, "Cannot split an entry with a node change");
|
|
2508
|
+
return entry.detachId !== undefined
|
|
2509
|
+
? { ...entry, detachId: (0, index_js_1.offsetChangeAtomId)(entry.detachId, count) }
|
|
2510
|
+
: entry;
|
|
2511
|
+
}
|
|
2512
|
+
function getFieldsWithRootMoves(roots, nodeAliases) {
|
|
2513
|
+
const fields = (0, index_js_2.newTupleBTree)();
|
|
2514
|
+
for (const { start: rootId, value: fieldId, length } of roots.detachLocations.entries()) {
|
|
2515
|
+
let isRootMoved = false;
|
|
2516
|
+
for (const renameEntry of roots.oldToNewId.getAll2(rootId, length)) {
|
|
2517
|
+
if (renameEntry.value !== undefined) {
|
|
2518
|
+
isRootMoved = true;
|
|
2519
|
+
}
|
|
2520
|
+
}
|
|
2521
|
+
for (const outputDetachEntry of roots.outputDetachLocations.getAll2(rootId, length)) {
|
|
2522
|
+
if (outputDetachEntry.value !== undefined) {
|
|
2523
|
+
isRootMoved = true;
|
|
2524
|
+
}
|
|
2525
|
+
}
|
|
2526
|
+
if (isRootMoved) {
|
|
2527
|
+
fields.set(fieldIdKeyFromFieldId(normalizeFieldId(fieldId, nodeAliases)), true);
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
return fields;
|
|
2531
|
+
}
|
|
2532
|
+
function getFieldToRootChanges(roots, nodeAliases) {
|
|
2533
|
+
const fields = (0, index_js_2.newTupleBTree)();
|
|
2534
|
+
for (const rootIdKey of roots.nodeChanges.keys()) {
|
|
2535
|
+
const rootId = { revision: rootIdKey[0], localId: rootIdKey[1] };
|
|
2536
|
+
const detachLocation = roots.detachLocations.getFirst(rootId, 1).value;
|
|
2537
|
+
if (detachLocation !== undefined) {
|
|
2538
|
+
const fieldIdKey = fieldIdKeyFromFieldId(normalizeFieldId(detachLocation, nodeAliases));
|
|
2539
|
+
let rootsInField = fields.get(fieldIdKey);
|
|
2540
|
+
if (rootsInField === undefined) {
|
|
2541
|
+
rootsInField = [];
|
|
2542
|
+
fields.set(fieldIdKey, rootsInField);
|
|
2543
|
+
}
|
|
2544
|
+
rootsInField.push(rootId);
|
|
2545
|
+
}
|
|
2546
|
+
}
|
|
2547
|
+
return fields;
|
|
2548
|
+
}
|
|
2549
|
+
function muteRootChanges(roots) {
|
|
2550
|
+
return {
|
|
2551
|
+
oldToNewId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2552
|
+
newToOldId: (0, index_js_1.newChangeAtomIdTransform)(),
|
|
2553
|
+
nodeChanges: (0, index_js_2.brand)(roots.nodeChanges.clone()),
|
|
2554
|
+
detachLocations: roots.detachLocations.clone(),
|
|
2555
|
+
outputDetachLocations: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
2556
|
+
};
|
|
2557
|
+
}
|
|
1717
2558
|
//# sourceMappingURL=modularChangeFamily.js.map
|