@fluidframework/tree 2.74.0-370705 → 2.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +1 -16
- package/.vscode/settings.json +2 -0
- package/CHANGELOG.md +29 -0
- package/api-report/tree.alpha.api.md +39 -17
- package/assertTagging.config.mjs +1 -1
- package/dist/alpha.d.ts +7 -0
- package/dist/codec/codec.d.ts +63 -20
- package/dist/codec/codec.d.ts.map +1 -1
- package/dist/codec/codec.js +50 -24
- package/dist/codec/codec.js.map +1 -1
- package/dist/codec/index.d.ts +2 -2
- package/dist/codec/index.d.ts.map +1 -1
- package/dist/codec/index.js +2 -2
- package/dist/codec/index.js.map +1 -1
- package/dist/codec/versioned/codec.d.ts +80 -22
- package/dist/codec/versioned/codec.d.ts.map +1 -1
- package/dist/codec/versioned/codec.js +137 -15
- package/dist/codec/versioned/codec.js.map +1 -1
- package/dist/codec/versioned/index.d.ts +1 -1
- package/dist/codec/versioned/index.d.ts.map +1 -1
- package/dist/codec/versioned/index.js +2 -2
- package/dist/codec/versioned/index.js.map +1 -1
- package/dist/core/change-family/changeFamily.d.ts +1 -4
- 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 +5 -8
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/changeRebaser.d.ts +37 -8
- 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 +2 -2
- package/dist/core/rebase/index.d.ts.map +1 -1
- package/dist/core/rebase/index.js +1 -3
- package/dist/core/rebase/index.js.map +1 -1
- package/dist/core/rebase/types.d.ts +27 -5
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js +1 -16
- 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 +10 -28
- package/dist/core/rebase/utils.js.map +1 -1
- package/dist/core/schema-stored/schema.d.ts +4 -7
- package/dist/core/schema-stored/schema.d.ts.map +1 -1
- package/dist/core/schema-stored/schema.js +5 -5
- package/dist/core/schema-stored/schema.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +3 -4
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts +1 -8
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +12 -65
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts +18 -10
- package/dist/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecCommon.js +6 -6
- package/dist/core/tree/detachedFieldIndexCodecCommon.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecV1.d.ts +2 -3
- package/dist/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecV1.js +4 -5
- package/dist/core/tree/detachedFieldIndexCodecV1.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecV2.d.ts +2 -3
- package/dist/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecV2.js +4 -6
- package/dist/core/tree/detachedFieldIndexCodecV2.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecs.d.ts +5 -6
- package/dist/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodecs.js +11 -41
- package/dist/core/tree/detachedFieldIndexCodecs.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts +4 -4
- package/dist/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormatCommon.js +2 -2
- package/dist/core/tree/detachedFieldIndexFormatCommon.js.map +1 -1
- package/dist/core/tree/index.d.ts +2 -2
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js +4 -5
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/mapTree.js +1 -1
- package/dist/core/tree/mapTree.js.map +1 -1
- package/dist/core/tree/pathTree.d.ts +3 -11
- package/dist/core/tree/pathTree.d.ts.map +1 -1
- package/dist/core/tree/pathTree.js +2 -14
- package/dist/core/tree/pathTree.js.map +1 -1
- package/dist/core/tree/sparseTree.d.ts.map +1 -1
- package/dist/core/tree/sparseTree.js +1 -0
- package/dist/core/tree/sparseTree.js.map +1 -1
- package/dist/core/tree/treeTextFormat.d.ts.map +1 -1
- package/dist/core/tree/treeTextFormat.js +5 -9
- package/dist/core/tree/treeTextFormat.js.map +1 -1
- package/dist/feature-libraries/changeAtomIdBTree.d.ts +10 -0
- package/dist/feature-libraries/changeAtomIdBTree.d.ts.map +1 -0
- package/dist/feature-libraries/changeAtomIdBTree.js +16 -0
- package/dist/feature-libraries/changeAtomIdBTree.js.map +1 -0
- package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/basicChunk.js +1 -8
- 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 +1 -4
- package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkedForest.js +6 -6
- package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +7 -4
- package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/codecs.js +19 -11
- package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +3 -3
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/format.d.ts +5 -5
- package/dist/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/format.js +4 -4
- package/dist/feature-libraries/chunked-forest/codec/format.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +9 -5
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/uniformChunk.js +1 -1
- package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +54 -93
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js +81 -245
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +6 -5
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/default-schema/index.d.ts +1 -2
- package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/index.js +2 -5
- package/dist/feature-libraries/default-schema/index.js.map +1 -1
- package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts +8 -7
- package/dist/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/mappedEditBuilder.js +6 -15
- package/dist/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
- package/dist/feature-libraries/deltaUtils.d.ts +0 -1
- package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
- package/dist/feature-libraries/deltaUtils.js +1 -6
- package/dist/feature-libraries/deltaUtils.js.map +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts +0 -9
- package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/context.js +0 -6
- 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 +7 -8
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +16 -47
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/forest-summary/codec.d.ts +8 -2
- package/dist/feature-libraries/forest-summary/codec.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/codec.js +13 -11
- package/dist/feature-libraries/forest-summary/codec.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +3 -2
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +18 -9
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/forest-summary/formatCommon.d.ts +61 -0
- package/dist/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/{format.js → formatCommon.js} +9 -6
- package/dist/feature-libraries/forest-summary/formatCommon.js.map +1 -0
- package/dist/feature-libraries/forest-summary/{format.d.ts → formatV1.d.ts} +6 -14
- package/dist/feature-libraries/forest-summary/formatV1.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/formatV1.js +11 -0
- package/dist/feature-libraries/forest-summary/formatV1.js.map +1 -0
- package/dist/feature-libraries/forest-summary/formatV2.d.ts +51 -0
- package/dist/feature-libraries/forest-summary/formatV2.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/formatV2.js +11 -0
- package/dist/feature-libraries/forest-summary/formatV2.js.map +1 -0
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +7 -15
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +11 -20
- package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
- package/dist/feature-libraries/forest-summary/index.d.ts +1 -2
- package/dist/feature-libraries/forest-summary/index.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/index.js +3 -5
- package/dist/feature-libraries/forest-summary/index.js.map +1 -1
- package/dist/feature-libraries/forest-summary/summaryFormatCommon.d.ts +35 -0
- package/dist/feature-libraries/forest-summary/summaryFormatCommon.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryFormatCommon.js +43 -0
- package/dist/feature-libraries/forest-summary/summaryFormatCommon.js.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV1ToV2.d.ts +11 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV1ToV2.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV1ToV2.js +14 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV1ToV2.js.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV3.d.ts +18 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV3.d.ts.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV3.js +21 -0
- package/dist/feature-libraries/forest-summary/summaryFormatV3.js.map +1 -0
- package/dist/feature-libraries/forest-summary/summaryTypes.d.ts +7 -37
- package/dist/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/summaryTypes.js +23 -45
- package/dist/feature-libraries/forest-summary/summaryTypes.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +5 -4
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +10 -12
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.js +6 -6
- package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
- package/dist/feature-libraries/mapTreeCursor.d.ts.map +1 -1
- package/dist/feature-libraries/mapTreeCursor.js +0 -1
- 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 +12 -3
- package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.js +13 -10
- package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +21 -97
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js +7 -4
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts +25 -0
- package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts.map +1 -0
- package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.js +59 -0
- package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.js.map +1 -0
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +52 -20
- 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/genericFieldKind.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js +13 -7
- package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +7 -5
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +7 -7
- package/dist/feature-libraries/modular-schema/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +41 -9
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +263 -336
- package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +7 -9
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js +8 -390
- package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +24 -11
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +27 -55
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +622 -1433
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts +3 -4
- package/dist/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js +4 -4
- package/dist/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +14 -48
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js +10 -21
- package/dist/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +18 -48
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js +3 -24
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/dist/feature-libraries/node-identifier/mockNodeIdentifierManager.js +1 -1
- package/dist/feature-libraries/node-identifier/mockNodeIdentifierManager.js.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +4 -4
- package/dist/feature-libraries/object-forest/objectForest.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 +2 -1
- package/dist/feature-libraries/optional-field/index.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.d.ts +26 -5
- package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.js +447 -218
- package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +33 -24
- 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 +28 -57
- package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +1 -5
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
- package/dist/feature-libraries/schema-edits/schemaChangeCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/schema-edits/schemaChangeCodecs.js +15 -4
- package/dist/feature-libraries/schema-edits/schemaChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/schema-index/codec.d.ts +7 -21
- package/dist/feature-libraries/schema-index/codec.d.ts.map +1 -1
- package/dist/feature-libraries/schema-index/codec.js +28 -70
- package/dist/feature-libraries/schema-index/codec.js.map +1 -1
- package/dist/feature-libraries/schema-index/formatV1.d.ts +1 -1
- package/dist/feature-libraries/schema-index/formatV2.d.ts +1 -1
- package/dist/feature-libraries/schema-index/index.d.ts +2 -2
- package/dist/feature-libraries/schema-index/index.d.ts.map +1 -1
- package/dist/feature-libraries/schema-index/index.js +2 -5
- package/dist/feature-libraries/schema-index/index.js.map +1 -1
- package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts +1 -9
- package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/schema-index/schemaSummarizer.js +1 -12
- package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
- package/dist/feature-libraries/schemaChecker.d.ts.map +1 -1
- package/dist/feature-libraries/schemaChecker.js +11 -6
- package/dist/feature-libraries/schemaChecker.js.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.d.ts +7 -6
- package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.js +264 -84
- package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
- package/dist/feature-libraries/sequence-field/helperTypes.d.ts +10 -14
- 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 +3 -2
- package/dist/feature-libraries/sequence-field/index.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/index.js +3 -1
- 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 +169 -66
- 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 +56 -4
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.js +93 -8
- 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 +127 -113
- package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +9 -0
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +1 -0
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js +50 -0
- package/dist/feature-libraries/sequence-field/relevantRemovedRoots.js.map +1 -0
- package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts +2 -2
- package/dist/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/replaceRevisions.js +49 -27
- 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 +2 -0
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +4 -22
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +187 -358
- 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 +62 -20
- 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 +2 -3
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +115 -17
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/dist/feature-libraries/sequence-field/types.d.ts +59 -30
- 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 +24 -15
- package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +334 -127
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.js +7 -7
- package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
- package/dist/feature-libraries/treeTextCursor.js +2 -2
- package/dist/feature-libraries/treeTextCursor.js.map +1 -1
- package/dist/feature-libraries/valueUtilities.d.ts.map +1 -1
- package/dist/feature-libraries/valueUtilities.js +16 -8
- package/dist/feature-libraries/valueUtilities.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/independentView.d.ts.map +1 -1
- package/dist/shared-tree/independentView.js +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 +1 -2
- package/dist/shared-tree/schematizeTree.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +9 -5
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +56 -41
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +3 -9
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +57 -50
- 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 +11 -11
- package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +5 -3
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts +7 -6
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js +23 -24
- package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/dist/shared-tree/sharedTreeEditBuilder.d.ts +6 -16
- package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeEditBuilder.js +7 -14
- package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
- package/dist/shared-tree/treeAlpha.d.ts +35 -29
- package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeAlpha.js +21 -23
- package/dist/shared-tree/treeAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +17 -12
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +85 -66
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +5 -4
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +7 -6
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.js +1 -1
- package/dist/shared-tree-core/branchCommitEnricher.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 +10 -10
- package/dist/shared-tree-core/editManager.js.map +1 -1
- package/dist/shared-tree-core/editManagerCodecs.d.ts +0 -4
- package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerCodecs.js +13 -16
- package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
- package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js +1 -1
- package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
- package/dist/shared-tree-core/editManagerFormatCommons.d.ts +9 -44
- package/dist/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
- package/dist/shared-tree-core/editManagerFormatCommons.js +8 -8
- 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 -1
- package/dist/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
- package/dist/shared-tree-core/editManagerFormatVSharedBranches.d.ts +1 -1
- package/dist/shared-tree-core/editManagerSummarizer.js +3 -3
- package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
- package/dist/shared-tree-core/index.d.ts +3 -2
- package/dist/shared-tree-core/index.d.ts.map +1 -1
- package/dist/shared-tree-core/index.js +2 -3
- 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/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
- package/dist/shared-tree-core/messageCodecVSharedBranches.js +2 -1
- package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
- package/dist/shared-tree-core/messageCodecs.d.ts +0 -4
- package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
- package/dist/shared-tree-core/messageCodecs.js +15 -19
- package/dist/shared-tree-core/messageCodecs.js.map +1 -1
- package/dist/shared-tree-core/messageFormat.d.ts +10 -50
- package/dist/shared-tree-core/messageFormat.d.ts.map +1 -1
- package/dist/shared-tree-core/messageFormat.js +9 -8
- package/dist/shared-tree-core/messageFormat.js.map +1 -1
- package/dist/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
- package/dist/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
- package/dist/shared-tree-core/messageFormatV1ToV4.js +1 -1
- package/dist/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
- package/dist/shared-tree-core/messageFormatVSharedBranches.d.ts +1 -1
- package/dist/shared-tree-core/sequenceIdUtils.d.ts.map +1 -1
- package/dist/shared-tree-core/sequenceIdUtils.js +4 -4
- package/dist/shared-tree-core/sequenceIdUtils.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +0 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +13 -9
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/shared-tree-core/transaction.d.ts +25 -8
- package/dist/shared-tree-core/transaction.d.ts.map +1 -1
- package/dist/shared-tree-core/transaction.js +65 -30
- package/dist/shared-tree-core/transaction.js.map +1 -1
- package/dist/shared-tree-core/transactionEnricher.d.ts +2 -2
- package/dist/shared-tree-core/transactionEnricher.d.ts.map +1 -1
- package/dist/shared-tree-core/transactionEnricher.js +3 -3
- package/dist/shared-tree-core/transactionEnricher.js.map +1 -1
- package/dist/shared-tree-core/versionedSummarizer.d.ts +6 -1
- package/dist/shared-tree-core/versionedSummarizer.d.ts.map +1 -1
- package/dist/shared-tree-core/versionedSummarizer.js +4 -3
- package/dist/shared-tree-core/versionedSummarizer.js.map +1 -1
- package/dist/simple-tree/api/configuration.js +1 -1
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/customTree.d.ts.map +1 -1
- package/dist/simple-tree/api/customTree.js +13 -9
- package/dist/simple-tree/api/customTree.js.map +1 -1
- package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/dist/simple-tree/api/discrepancies.js +21 -17
- package/dist/simple-tree/api/discrepancies.js.map +1 -1
- package/dist/simple-tree/api/eraseSchemaDetails.d.ts +89 -0
- package/dist/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -0
- package/dist/simple-tree/api/eraseSchemaDetails.js +97 -0
- package/dist/simple-tree/api/eraseSchemaDetails.js.map +1 -0
- package/dist/simple-tree/api/index.d.ts +2 -1
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +5 -1
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +12 -8
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/schemaFromSimple.js +18 -9
- package/dist/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaCodec.js +10 -5
- package/dist/simple-tree/api/simpleSchemaCodec.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +15 -11
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/simpleTreeIndex.js +10 -10
- package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
- package/dist/simple-tree/api/storedSchema.d.ts +1 -1
- package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/storedSchema.js +3 -5
- package/dist/simple-tree/api/storedSchema.js.map +1 -1
- package/dist/simple-tree/api/transactionTypes.d.ts +17 -4
- package/dist/simple-tree/api/transactionTypes.d.ts.map +1 -1
- package/dist/simple-tree/api/transactionTypes.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +15 -2
- package/dist/simple-tree/api/tree.d.ts.map +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js +21 -13
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/verboseTree.js +14 -9
- package/dist/simple-tree/api/verboseTree.js.map +1 -1
- package/dist/simple-tree/core/treeNode.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNode.js +1 -0
- package/dist/simple-tree/core/treeNode.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +6 -3
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts +15 -15
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.js +28 -74
- package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/dist/simple-tree/createContext.d.ts.map +1 -1
- package/dist/simple-tree/createContext.js +1 -1
- package/dist/simple-tree/createContext.js.map +1 -1
- package/dist/simple-tree/fieldSchema.d.ts +4 -4
- package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
- package/dist/simple-tree/fieldSchema.js.map +1 -1
- package/dist/simple-tree/getTreeNodeForField.d.ts.map +1 -1
- package/dist/simple-tree/getTreeNodeForField.js +2 -1
- package/dist/simple-tree/getTreeNodeForField.js.map +1 -1
- package/dist/simple-tree/index.d.ts +3 -3
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +5 -3
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/leafNodeSchema.js +9 -6
- package/dist/simple-tree/leafNodeSchema.js.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/array/arrayNode.js +18 -20
- package/dist/simple-tree/node-kinds/array/arrayNode.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.js +2 -2
- package/dist/simple-tree/node-kinds/map/mapNode.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 +21 -22
- package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/dist/simple-tree/node-kinds/record/recordNode.js +4 -7
- package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts +47 -54
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +125 -183
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +12 -8
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +4 -13
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js +11 -29
- package/dist/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/dist/tableSchema.d.ts +3 -14
- package/dist/tableSchema.d.ts.map +1 -1
- package/dist/tableSchema.js +2 -2
- package/dist/tableSchema.js.map +1 -1
- package/dist/treeFactory.d.ts.map +1 -1
- package/dist/treeFactory.js +2 -12
- package/dist/treeFactory.js.map +1 -1
- package/dist/util/bTreeUtils.js +1 -1
- package/dist/util/bTreeUtils.js.map +1 -1
- package/dist/util/brand.d.ts +49 -0
- package/dist/util/brand.d.ts.map +1 -1
- package/dist/util/brand.js +47 -1
- package/dist/util/brand.js.map +1 -1
- package/dist/util/breakable.js +7 -9
- package/dist/util/breakable.js.map +1 -1
- package/dist/util/idAllocator.d.ts.map +1 -1
- package/dist/util/idAllocator.js +1 -2
- package/dist/util/idAllocator.js.map +1 -1
- package/dist/util/index.d.ts +2 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +4 -3
- package/dist/util/index.js.map +1 -1
- package/dist/util/nestedMap.d.ts.map +1 -1
- package/dist/util/nestedMap.js +1 -1
- package/dist/util/nestedMap.js.map +1 -1
- package/dist/util/rangeMap.d.ts +12 -24
- package/dist/util/rangeMap.d.ts.map +1 -1
- package/dist/util/rangeMap.js +6 -46
- package/dist/util/rangeMap.js.map +1 -1
- package/dist/util/utils.d.ts.map +1 -1
- package/dist/util/utils.js +16 -15
- package/dist/util/utils.js.map +1 -1
- package/docs/main/sequence-field/move-composition.md +46 -0
- package/eslint.config.mts +83 -0
- package/lib/alpha.d.ts +7 -0
- package/lib/codec/codec.d.ts +63 -20
- package/lib/codec/codec.d.ts.map +1 -1
- package/lib/codec/codec.js +44 -18
- package/lib/codec/codec.js.map +1 -1
- package/lib/codec/index.d.ts +2 -2
- package/lib/codec/index.d.ts.map +1 -1
- package/lib/codec/index.js +1 -1
- package/lib/codec/index.js.map +1 -1
- package/lib/codec/versioned/codec.d.ts +80 -22
- package/lib/codec/versioned/codec.d.ts.map +1 -1
- package/lib/codec/versioned/codec.js +138 -15
- package/lib/codec/versioned/codec.js.map +1 -1
- package/lib/codec/versioned/index.d.ts +1 -1
- package/lib/codec/versioned/index.d.ts.map +1 -1
- package/lib/codec/versioned/index.js +1 -1
- package/lib/codec/versioned/index.js.map +1 -1
- package/lib/core/change-family/changeFamily.d.ts +1 -4
- 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 +37 -8
- 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 +2 -2
- 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 +27 -5
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js +0 -13
- 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 +10 -28
- package/lib/core/rebase/utils.js.map +1 -1
- package/lib/core/schema-stored/schema.d.ts +4 -7
- package/lib/core/schema-stored/schema.d.ts.map +1 -1
- package/lib/core/schema-stored/schema.js +6 -6
- package/lib/core/schema-stored/schema.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +3 -4
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts +1 -8
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +14 -67
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts +18 -10
- package/lib/core/tree/detachedFieldIndexCodecCommon.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecCommon.js +4 -4
- package/lib/core/tree/detachedFieldIndexCodecCommon.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecV1.d.ts +2 -3
- package/lib/core/tree/detachedFieldIndexCodecV1.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecV1.js +4 -5
- package/lib/core/tree/detachedFieldIndexCodecV1.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecV2.d.ts +2 -3
- package/lib/core/tree/detachedFieldIndexCodecV2.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecV2.js +4 -6
- package/lib/core/tree/detachedFieldIndexCodecV2.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecs.d.ts +5 -6
- package/lib/core/tree/detachedFieldIndexCodecs.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodecs.js +12 -39
- package/lib/core/tree/detachedFieldIndexCodecs.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts +4 -4
- package/lib/core/tree/detachedFieldIndexFormatCommon.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormatCommon.js +3 -3
- package/lib/core/tree/detachedFieldIndexFormatCommon.js.map +1 -1
- package/lib/core/tree/index.d.ts +2 -2
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js +2 -2
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/mapTree.js +1 -1
- package/lib/core/tree/mapTree.js.map +1 -1
- package/lib/core/tree/pathTree.d.ts +3 -11
- package/lib/core/tree/pathTree.d.ts.map +1 -1
- package/lib/core/tree/pathTree.js +1 -12
- package/lib/core/tree/pathTree.js.map +1 -1
- package/lib/core/tree/sparseTree.d.ts.map +1 -1
- package/lib/core/tree/sparseTree.js +1 -0
- package/lib/core/tree/sparseTree.js.map +1 -1
- package/lib/core/tree/treeTextFormat.d.ts.map +1 -1
- package/lib/core/tree/treeTextFormat.js +5 -9
- package/lib/core/tree/treeTextFormat.js.map +1 -1
- package/lib/feature-libraries/changeAtomIdBTree.d.ts +10 -0
- package/lib/feature-libraries/changeAtomIdBTree.d.ts.map +1 -0
- package/lib/feature-libraries/changeAtomIdBTree.js +11 -0
- package/lib/feature-libraries/changeAtomIdBTree.js.map +1 -0
- package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/basicChunk.js +2 -9
- 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 +1 -4
- package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkedForest.js +6 -6
- package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +7 -4
- package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/codecs.js +20 -12
- package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +3 -3
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/format.d.ts +5 -5
- package/lib/feature-libraries/chunked-forest/codec/format.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/format.js +5 -5
- package/lib/feature-libraries/chunked-forest/codec/format.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js +9 -5
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncode.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/uniformChunk.js +1 -1
- package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +54 -93
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js +82 -243
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +6 -5
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/default-schema/index.d.ts +1 -2
- package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/index.js +1 -2
- package/lib/feature-libraries/default-schema/index.js.map +1 -1
- package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts +8 -7
- package/lib/feature-libraries/default-schema/mappedEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/mappedEditBuilder.js +6 -15
- package/lib/feature-libraries/default-schema/mappedEditBuilder.js.map +1 -1
- package/lib/feature-libraries/deltaUtils.d.ts +0 -1
- package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
- package/lib/feature-libraries/deltaUtils.js +1 -5
- package/lib/feature-libraries/deltaUtils.js.map +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts +0 -9
- package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/context.js +0 -6
- 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 +7 -8
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +17 -48
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/forest-summary/codec.d.ts +8 -2
- package/lib/feature-libraries/forest-summary/codec.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/codec.js +12 -11
- package/lib/feature-libraries/forest-summary/codec.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +3 -2
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +19 -10
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/forest-summary/formatCommon.d.ts +61 -0
- package/lib/feature-libraries/forest-summary/formatCommon.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/{format.js → formatCommon.js} +8 -6
- package/lib/feature-libraries/forest-summary/formatCommon.js.map +1 -0
- package/lib/feature-libraries/forest-summary/{format.d.ts → formatV1.d.ts} +6 -14
- package/lib/feature-libraries/forest-summary/formatV1.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/formatV1.js +8 -0
- package/lib/feature-libraries/forest-summary/formatV1.js.map +1 -0
- package/lib/feature-libraries/forest-summary/formatV2.d.ts +51 -0
- package/lib/feature-libraries/forest-summary/formatV2.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/formatV2.js +8 -0
- package/lib/feature-libraries/forest-summary/formatV2.js.map +1 -0
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +7 -15
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +11 -20
- package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
- package/lib/feature-libraries/forest-summary/index.d.ts +1 -2
- package/lib/feature-libraries/forest-summary/index.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/index.js +1 -2
- package/lib/feature-libraries/forest-summary/index.js.map +1 -1
- package/lib/feature-libraries/forest-summary/summaryFormatCommon.d.ts +35 -0
- package/lib/feature-libraries/forest-summary/summaryFormatCommon.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryFormatCommon.js +40 -0
- package/lib/feature-libraries/forest-summary/summaryFormatCommon.js.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV1ToV2.d.ts +11 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV1ToV2.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV1ToV2.js +11 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV1ToV2.js.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV3.d.ts +18 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV3.d.ts.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV3.js +18 -0
- package/lib/feature-libraries/forest-summary/summaryFormatV3.js.map +1 -0
- package/lib/feature-libraries/forest-summary/summaryTypes.d.ts +7 -37
- package/lib/feature-libraries/forest-summary/summaryTypes.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/summaryTypes.js +20 -43
- package/lib/feature-libraries/forest-summary/summaryTypes.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +5 -4
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +5 -4
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.js +6 -6
- package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
- package/lib/feature-libraries/mapTreeCursor.d.ts.map +1 -1
- package/lib/feature-libraries/mapTreeCursor.js +1 -2
- 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 +12 -3
- package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.js +13 -10
- package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +21 -97
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js +5 -3
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts +25 -0
- package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts.map +1 -0
- package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.js +55 -0
- package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.js.map +1 -0
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +52 -20
- 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/genericFieldKind.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js +14 -8
- package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts +7 -5
- 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 +41 -9
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +248 -334
- package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +7 -9
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js +10 -392
- package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +24 -11
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +27 -55
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +549 -1352
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts +3 -4
- package/lib/feature-libraries/modular-schema/modularChangeFormatV1.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js +2 -2
- package/lib/feature-libraries/modular-schema/modularChangeFormatV1.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts +14 -48
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js +10 -21
- package/lib/feature-libraries/modular-schema/modularChangeFormatV2.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +18 -48
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js +2 -20
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/lib/feature-libraries/node-identifier/mockNodeIdentifierManager.js +1 -1
- package/lib/feature-libraries/node-identifier/mockNodeIdentifierManager.js.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +4 -4
- package/lib/feature-libraries/object-forest/objectForest.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 +26 -5
- package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.js +445 -218
- package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldChangeTypes.d.ts +33 -24
- 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 +26 -55
- package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +1 -5
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
- package/lib/feature-libraries/schema-edits/schemaChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/schema-edits/schemaChangeCodecs.js +16 -5
- package/lib/feature-libraries/schema-edits/schemaChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/schema-index/codec.d.ts +7 -21
- package/lib/feature-libraries/schema-index/codec.d.ts.map +1 -1
- package/lib/feature-libraries/schema-index/codec.js +29 -67
- package/lib/feature-libraries/schema-index/codec.js.map +1 -1
- package/lib/feature-libraries/schema-index/formatV1.d.ts +1 -1
- package/lib/feature-libraries/schema-index/formatV2.d.ts +1 -1
- package/lib/feature-libraries/schema-index/index.d.ts +2 -2
- package/lib/feature-libraries/schema-index/index.d.ts.map +1 -1
- package/lib/feature-libraries/schema-index/index.js +2 -2
- package/lib/feature-libraries/schema-index/index.js.map +1 -1
- package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts +1 -9
- package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/schema-index/schemaSummarizer.js +0 -10
- package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
- package/lib/feature-libraries/schemaChecker.d.ts.map +1 -1
- package/lib/feature-libraries/schemaChecker.js +11 -6
- package/lib/feature-libraries/schemaChecker.js.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.d.ts +7 -6
- package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.js +266 -86
- package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
- package/lib/feature-libraries/sequence-field/helperTypes.d.ts +10 -14
- 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 +3 -2
- package/lib/feature-libraries/sequence-field/index.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/index.js +1 -0
- 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 +171 -68
- 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 +56 -4
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.js +87 -7
- 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 +129 -115
- package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts +9 -0
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.d.ts.map +1 -0
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js +46 -0
- package/lib/feature-libraries/sequence-field/relevantRemovedRoots.js.map +1 -0
- package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts +2 -2
- package/lib/feature-libraries/sequence-field/replaceRevisions.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/replaceRevisions.js +50 -28
- 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 +2 -0
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +4 -22
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +183 -350
- 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 +63 -21
- 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 +2 -3
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +115 -17
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/lib/feature-libraries/sequence-field/types.d.ts +59 -30
- 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 +24 -15
- package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +327 -123
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.js +7 -7
- package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
- package/lib/feature-libraries/treeTextCursor.js +2 -2
- package/lib/feature-libraries/treeTextCursor.js.map +1 -1
- package/lib/feature-libraries/valueUtilities.d.ts.map +1 -1
- package/lib/feature-libraries/valueUtilities.js +16 -8
- package/lib/feature-libraries/valueUtilities.js.map +1 -1
- package/lib/index.d.ts +3 -3
- 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.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/independentView.d.ts.map +1 -1
- package/lib/shared-tree/independentView.js +2 -2
- 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 +2 -3
- package/lib/shared-tree/schematizeTree.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +9 -5
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +59 -44
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +3 -9
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +26 -19
- 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 +11 -11
- package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +6 -4
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts +7 -6
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js +24 -25
- package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/lib/shared-tree/sharedTreeEditBuilder.d.ts +6 -16
- package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeEditBuilder.js +6 -12
- package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
- package/lib/shared-tree/treeAlpha.d.ts +35 -29
- package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeAlpha.js +21 -23
- package/lib/shared-tree/treeAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +17 -12
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +89 -70
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +5 -4
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +7 -6
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
- package/lib/shared-tree-core/branchCommitEnricher.js +2 -2
- package/lib/shared-tree-core/branchCommitEnricher.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 +10 -10
- package/lib/shared-tree-core/editManager.js.map +1 -1
- package/lib/shared-tree-core/editManagerCodecs.d.ts +0 -4
- package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerCodecs.js +13 -15
- package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
- package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js +1 -1
- package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
- package/lib/shared-tree-core/editManagerFormatCommons.d.ts +9 -44
- package/lib/shared-tree-core/editManagerFormatCommons.d.ts.map +1 -1
- package/lib/shared-tree-core/editManagerFormatCommons.js +9 -9
- 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 -1
- package/lib/shared-tree-core/editManagerFormatV1toV4.js.map +1 -1
- package/lib/shared-tree-core/editManagerFormatVSharedBranches.d.ts +1 -1
- package/lib/shared-tree-core/editManagerSummarizer.js +3 -3
- package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
- package/lib/shared-tree-core/index.d.ts +3 -2
- package/lib/shared-tree-core/index.d.ts.map +1 -1
- package/lib/shared-tree-core/index.js +2 -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/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
- package/lib/shared-tree-core/messageCodecVSharedBranches.js +2 -1
- package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
- package/lib/shared-tree-core/messageCodecs.d.ts +0 -4
- package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
- package/lib/shared-tree-core/messageCodecs.js +15 -18
- package/lib/shared-tree-core/messageCodecs.js.map +1 -1
- package/lib/shared-tree-core/messageFormat.d.ts +10 -50
- package/lib/shared-tree-core/messageFormat.d.ts.map +1 -1
- package/lib/shared-tree-core/messageFormat.js +9 -8
- package/lib/shared-tree-core/messageFormat.js.map +1 -1
- package/lib/shared-tree-core/messageFormatV1ToV4.d.ts +2 -2
- package/lib/shared-tree-core/messageFormatV1ToV4.d.ts.map +1 -1
- package/lib/shared-tree-core/messageFormatV1ToV4.js +1 -1
- package/lib/shared-tree-core/messageFormatV1ToV4.js.map +1 -1
- package/lib/shared-tree-core/messageFormatVSharedBranches.d.ts +1 -1
- package/lib/shared-tree-core/sequenceIdUtils.d.ts.map +1 -1
- package/lib/shared-tree-core/sequenceIdUtils.js +4 -4
- package/lib/shared-tree-core/sequenceIdUtils.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +0 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +13 -9
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/shared-tree-core/transaction.d.ts +25 -8
- package/lib/shared-tree-core/transaction.d.ts.map +1 -1
- package/lib/shared-tree-core/transaction.js +67 -32
- package/lib/shared-tree-core/transaction.js.map +1 -1
- package/lib/shared-tree-core/transactionEnricher.d.ts +2 -2
- package/lib/shared-tree-core/transactionEnricher.d.ts.map +1 -1
- package/lib/shared-tree-core/transactionEnricher.js +3 -3
- package/lib/shared-tree-core/transactionEnricher.js.map +1 -1
- package/lib/shared-tree-core/versionedSummarizer.d.ts +6 -1
- package/lib/shared-tree-core/versionedSummarizer.d.ts.map +1 -1
- package/lib/shared-tree-core/versionedSummarizer.js +4 -3
- package/lib/shared-tree-core/versionedSummarizer.js.map +1 -1
- package/lib/simple-tree/api/configuration.js +1 -1
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/customTree.d.ts.map +1 -1
- package/lib/simple-tree/api/customTree.js +13 -9
- package/lib/simple-tree/api/customTree.js.map +1 -1
- package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/lib/simple-tree/api/discrepancies.js +21 -17
- package/lib/simple-tree/api/discrepancies.js.map +1 -1
- package/lib/simple-tree/api/eraseSchemaDetails.d.ts +89 -0
- package/lib/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -0
- package/lib/simple-tree/api/eraseSchemaDetails.js +92 -0
- package/lib/simple-tree/api/eraseSchemaDetails.js.map +1 -0
- package/lib/simple-tree/api/index.d.ts +2 -1
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +1 -0
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +12 -8
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/schemaFromSimple.js +18 -9
- package/lib/simple-tree/api/schemaFromSimple.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaCodec.js +10 -5
- package/lib/simple-tree/api/simpleSchemaCodec.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +15 -11
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/simpleTreeIndex.js +10 -10
- package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
- package/lib/simple-tree/api/storedSchema.d.ts +1 -1
- package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/storedSchema.js +5 -9
- package/lib/simple-tree/api/storedSchema.js.map +1 -1
- package/lib/simple-tree/api/transactionTypes.d.ts +17 -4
- package/lib/simple-tree/api/transactionTypes.d.ts.map +1 -1
- package/lib/simple-tree/api/transactionTypes.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +15 -2
- package/lib/simple-tree/api/tree.d.ts.map +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +21 -13
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/verboseTree.js +14 -9
- package/lib/simple-tree/api/verboseTree.js.map +1 -1
- package/lib/simple-tree/core/treeNode.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNode.js +1 -0
- package/lib/simple-tree/core/treeNode.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +6 -3
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts +15 -15
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js +28 -73
- package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/lib/simple-tree/createContext.d.ts.map +1 -1
- package/lib/simple-tree/createContext.js +1 -1
- package/lib/simple-tree/createContext.js.map +1 -1
- package/lib/simple-tree/fieldSchema.d.ts +4 -4
- package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
- package/lib/simple-tree/fieldSchema.js.map +1 -1
- package/lib/simple-tree/getTreeNodeForField.d.ts.map +1 -1
- package/lib/simple-tree/getTreeNodeForField.js +2 -1
- package/lib/simple-tree/getTreeNodeForField.js.map +1 -1
- package/lib/simple-tree/index.d.ts +3 -3
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +2 -2
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/leafNodeSchema.js +9 -6
- package/lib/simple-tree/leafNodeSchema.js.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/array/arrayNode.js +19 -21
- package/lib/simple-tree/node-kinds/array/arrayNode.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.js +2 -2
- package/lib/simple-tree/node-kinds/map/mapNode.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 +22 -23
- package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.d.ts.map +1 -1
- package/lib/simple-tree/node-kinds/record/recordNode.js +4 -7
- package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
- package/lib/simple-tree/prepareForInsertion.d.ts +47 -54
- package/lib/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +124 -183
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +12 -8
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts +4 -13
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.d.ts.map +1 -1
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js +9 -26
- package/lib/simple-tree/unhydratedFlexTreeFromInsertable.js.map +1 -1
- package/lib/tableSchema.d.ts +3 -14
- package/lib/tableSchema.d.ts.map +1 -1
- package/lib/tableSchema.js +3 -3
- package/lib/tableSchema.js.map +1 -1
- package/lib/treeFactory.d.ts.map +1 -1
- package/lib/treeFactory.js +3 -13
- package/lib/treeFactory.js.map +1 -1
- package/lib/util/bTreeUtils.js +1 -1
- package/lib/util/bTreeUtils.js.map +1 -1
- package/lib/util/brand.d.ts +49 -0
- package/lib/util/brand.d.ts.map +1 -1
- package/lib/util/brand.js +44 -0
- package/lib/util/brand.js.map +1 -1
- package/lib/util/breakable.js +7 -9
- package/lib/util/breakable.js.map +1 -1
- package/lib/util/idAllocator.d.ts.map +1 -1
- package/lib/util/idAllocator.js +1 -2
- package/lib/util/idAllocator.js.map +1 -1
- package/lib/util/index.d.ts +2 -2
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +2 -2
- package/lib/util/index.js.map +1 -1
- package/lib/util/nestedMap.d.ts.map +1 -1
- package/lib/util/nestedMap.js +1 -1
- package/lib/util/nestedMap.js.map +1 -1
- package/lib/util/rangeMap.d.ts +12 -24
- package/lib/util/rangeMap.d.ts.map +1 -1
- package/lib/util/rangeMap.js +5 -44
- package/lib/util/rangeMap.js.map +1 -1
- package/lib/util/utils.d.ts.map +1 -1
- package/lib/util/utils.js +16 -15
- package/lib/util/utils.js.map +1 -1
- package/package.json +33 -32
- package/src/codec/codec.ts +82 -26
- package/src/codec/index.ts +4 -1
- package/src/codec/versioned/codec.ts +340 -22
- package/src/codec/versioned/index.ts +3 -1
- package/src/core/change-family/changeFamily.ts +0 -5
- package/src/core/change-family/index.ts +0 -1
- package/src/core/index.ts +4 -6
- package/src/core/rebase/changeRebaser.ts +41 -12
- package/src/core/rebase/index.ts +2 -2
- package/src/core/rebase/types.ts +32 -26
- package/src/core/rebase/utils.ts +10 -34
- package/src/core/schema-stored/schema.ts +8 -10
- package/src/core/tree/anchorSet.ts +3 -4
- package/src/core/tree/detachedFieldIndex.ts +14 -91
- package/src/core/tree/detachedFieldIndexCodecCommon.ts +4 -8
- package/src/core/tree/detachedFieldIndexCodecV1.ts +3 -7
- package/src/core/tree/detachedFieldIndexCodecV2.ts +5 -9
- package/src/core/tree/detachedFieldIndexCodecs.ts +21 -64
- package/src/core/tree/detachedFieldIndexFormatCommon.ts +4 -7
- package/src/core/tree/index.ts +2 -3
- package/src/core/tree/mapTree.ts +1 -1
- package/src/core/tree/pathTree.ts +4 -16
- package/src/core/tree/sparseTree.ts +1 -0
- package/src/core/tree/treeTextFormat.ts +5 -9
- package/src/feature-libraries/changeAtomIdBTree.ts +24 -0
- package/src/feature-libraries/chunked-forest/basicChunk.ts +2 -8
- package/src/feature-libraries/chunked-forest/chunkTree.ts +1 -6
- package/src/feature-libraries/chunked-forest/chunkedForest.ts +5 -5
- package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +7 -4
- package/src/feature-libraries/chunked-forest/codec/codecs.ts +20 -11
- package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +3 -3
- package/src/feature-libraries/chunked-forest/codec/format.ts +6 -9
- package/src/feature-libraries/chunked-forest/codec/schemaBasedEncode.ts +9 -5
- package/src/feature-libraries/chunked-forest/uniformChunk.ts +1 -1
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +163 -403
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +9 -7
- package/src/feature-libraries/default-schema/index.ts +5 -17
- package/src/feature-libraries/default-schema/mappedEditBuilder.ts +15 -35
- package/src/feature-libraries/deltaUtils.ts +1 -6
- package/src/feature-libraries/flex-tree/context.ts +0 -17
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +8 -7
- package/src/feature-libraries/flex-tree/lazyField.ts +31 -74
- package/src/feature-libraries/forest-summary/codec.ts +25 -13
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +37 -12
- package/src/feature-libraries/forest-summary/{format.ts → formatCommon.ts} +10 -11
- package/src/feature-libraries/forest-summary/formatV1.ts +12 -0
- package/src/feature-libraries/forest-summary/formatV2.ts +12 -0
- package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +18 -21
- package/src/feature-libraries/forest-summary/index.ts +1 -2
- package/src/feature-libraries/forest-summary/summaryFormatCommon.ts +41 -0
- package/src/feature-libraries/forest-summary/summaryFormatV1ToV2.ts +11 -0
- package/src/feature-libraries/forest-summary/summaryFormatV3.ts +18 -0
- package/src/feature-libraries/forest-summary/summaryTypes.ts +26 -46
- package/src/feature-libraries/index.ts +18 -27
- package/src/feature-libraries/indexing/anchorTreeIndex.ts +5 -5
- package/src/feature-libraries/mapTreeCursor.ts +1 -2
- package/src/feature-libraries/mitigatedChangeFamily.ts +12 -9
- package/src/feature-libraries/modular-schema/comparison.ts +14 -10
- package/src/feature-libraries/modular-schema/crossFieldQueries.ts +44 -142
- package/src/feature-libraries/modular-schema/defaultRevisionReplacer.ts +70 -0
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +58 -40
- package/src/feature-libraries/modular-schema/genericFieldKind.ts +23 -13
- package/src/feature-libraries/modular-schema/index.ts +18 -21
- package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +543 -572
- package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +44 -745
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +37 -51
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +862 -2636
- package/src/feature-libraries/modular-schema/modularChangeFormatV1.ts +3 -4
- package/src/feature-libraries/modular-schema/modularChangeFormatV2.ts +17 -45
- package/src/feature-libraries/modular-schema/modularChangeTypes.ts +18 -97
- package/src/feature-libraries/node-identifier/mockNodeIdentifierManager.ts +1 -1
- package/src/feature-libraries/object-forest/objectForest.ts +4 -4
- package/src/feature-libraries/optional-field/index.ts +3 -1
- package/src/feature-libraries/optional-field/optionalField.ts +566 -321
- package/src/feature-libraries/optional-field/optionalFieldChangeTypes.ts +38 -24
- package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +35 -89
- package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +1 -5
- package/src/feature-libraries/schema-edits/schemaChangeCodecs.ts +19 -5
- package/src/feature-libraries/schema-index/codec.ts +30 -92
- package/src/feature-libraries/schema-index/index.ts +2 -4
- package/src/feature-libraries/schema-index/schemaSummarizer.ts +0 -17
- package/src/feature-libraries/schemaChecker.ts +11 -6
- package/src/feature-libraries/sequence-field/compose.ts +527 -138
- package/src/feature-libraries/sequence-field/helperTypes.ts +19 -34
- package/src/feature-libraries/sequence-field/index.ts +9 -0
- package/src/feature-libraries/sequence-field/invert.ts +229 -103
- package/src/feature-libraries/sequence-field/markQueue.ts +2 -2
- package/src/feature-libraries/sequence-field/moveEffectTable.ts +198 -9
- package/src/feature-libraries/sequence-field/rebase.ts +218 -175
- package/src/feature-libraries/sequence-field/relevantRemovedRoots.ts +57 -0
- package/src/feature-libraries/sequence-field/replaceRevisions.ts +76 -59
- package/src/feature-libraries/sequence-field/sequenceFieldChangeHandler.ts +2 -0
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +228 -643
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +70 -56
- package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +27 -25
- package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +135 -22
- package/src/feature-libraries/sequence-field/types.ts +64 -34
- package/src/feature-libraries/sequence-field/utils.ts +382 -150
- package/src/feature-libraries/treeCursorUtils.ts +7 -7
- package/src/feature-libraries/treeTextCursor.ts +2 -2
- package/src/feature-libraries/valueUtilities.ts +16 -8
- package/src/index.ts +7 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/independentView.ts +1 -2
- package/src/shared-tree/index.ts +2 -3
- package/src/shared-tree/schematizeTree.ts +8 -21
- package/src/shared-tree/schematizingTreeView.ts +96 -63
- package/src/shared-tree/sharedTree.ts +29 -29
- package/src/shared-tree/sharedTreeChangeCodecs.ts +12 -15
- package/src/shared-tree/sharedTreeChangeEnricher.ts +4 -4
- package/src/shared-tree/sharedTreeChangeFamily.ts +34 -34
- package/src/shared-tree/sharedTreeEditBuilder.ts +9 -39
- package/src/shared-tree/treeAlpha.ts +60 -51
- package/src/shared-tree/treeCheckout.ts +158 -132
- package/src/shared-tree-core/branch.ts +10 -11
- package/src/shared-tree-core/branchCommitEnricher.ts +3 -8
- package/src/shared-tree-core/editManager.ts +3 -17
- package/src/shared-tree-core/editManagerCodecs.ts +13 -18
- package/src/shared-tree-core/editManagerCodecsVSharedBranches.ts +1 -1
- package/src/shared-tree-core/editManagerFormatCommons.ts +12 -15
- package/src/shared-tree-core/editManagerFormatV1toV4.ts +2 -2
- package/src/shared-tree-core/editManagerSummarizer.ts +3 -3
- package/src/shared-tree-core/index.ts +3 -2
- package/src/shared-tree-core/messageCodecV1ToV4.ts +1 -1
- package/src/shared-tree-core/messageCodecVSharedBranches.ts +2 -1
- package/src/shared-tree-core/messageCodecs.ts +15 -21
- package/src/shared-tree-core/messageFormat.ts +12 -15
- package/src/shared-tree-core/messageFormatV1ToV4.ts +2 -2
- package/src/shared-tree-core/sequenceIdUtils.ts +4 -4
- package/src/shared-tree-core/sharedTreeCore.ts +12 -11
- package/src/shared-tree-core/transaction.ts +115 -56
- package/src/shared-tree-core/transactionEnricher.ts +5 -6
- package/src/shared-tree-core/versionedSummarizer.ts +10 -3
- package/src/simple-tree/api/configuration.ts +1 -1
- package/src/simple-tree/api/customTree.ts +14 -10
- package/src/simple-tree/api/discrepancies.ts +23 -17
- package/src/simple-tree/api/eraseSchemaDetails.ts +123 -0
- package/src/simple-tree/api/index.ts +6 -0
- package/src/simple-tree/api/schemaFactory.ts +11 -7
- package/src/simple-tree/api/schemaFromSimple.ts +18 -9
- package/src/simple-tree/api/simpleSchemaCodec.ts +10 -5
- package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +17 -13
- package/src/simple-tree/api/simpleTreeIndex.ts +8 -8
- package/src/simple-tree/api/storedSchema.ts +12 -9
- package/src/simple-tree/api/transactionTypes.ts +19 -4
- package/src/simple-tree/api/tree.ts +16 -1
- package/src/simple-tree/api/treeNodeApi.ts +21 -13
- package/src/simple-tree/api/verboseTree.ts +14 -9
- package/src/simple-tree/core/treeNode.ts +1 -0
- package/src/simple-tree/core/treeNodeKernel.ts +6 -3
- package/src/simple-tree/core/unhydratedFlexTree.ts +58 -104
- package/src/simple-tree/createContext.ts +4 -1
- package/src/simple-tree/fieldSchema.ts +4 -6
- package/src/simple-tree/getTreeNodeForField.ts +2 -1
- package/src/simple-tree/index.ts +5 -2
- package/src/simple-tree/leafNodeSchema.ts +8 -5
- package/src/simple-tree/node-kinds/array/arrayNode.ts +28 -30
- package/src/simple-tree/node-kinds/common.ts +5 -2
- package/src/simple-tree/node-kinds/map/mapNode.ts +4 -4
- package/src/simple-tree/node-kinds/object/objectNode.ts +28 -29
- package/src/simple-tree/node-kinds/record/recordNode.ts +11 -13
- package/src/simple-tree/prepareForInsertion.ts +200 -343
- package/src/simple-tree/toStoredSchema.ts +12 -8
- package/src/simple-tree/unhydratedFlexTreeFromInsertable.ts +14 -42
- package/src/tableSchema.ts +13 -18
- package/src/treeFactory.ts +5 -14
- package/src/util/bTreeUtils.ts +1 -1
- package/src/util/brand.ts +61 -0
- package/src/util/breakable.ts +9 -9
- package/src/util/idAllocator.ts +1 -2
- package/src/util/index.ts +3 -3
- package/src/util/nestedMap.ts +1 -3
- package/src/util/rangeMap.ts +18 -72
- package/src/util/utils.ts +14 -13
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +0 -36
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +0 -1
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js +0 -126
- package/dist/feature-libraries/default-schema/locationBasedEditBuilder.js.map +0 -1
- package/dist/feature-libraries/forest-summary/format.d.ts.map +0 -1
- package/dist/feature-libraries/forest-summary/format.js.map +0 -1
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +0 -23
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +0 -1
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +0 -31
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +0 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +0 -12
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +0 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +0 -57
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +0 -1
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts +0 -36
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.d.ts.map +0 -1
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js +0 -122
- package/lib/feature-libraries/default-schema/locationBasedEditBuilder.js.map +0 -1
- package/lib/feature-libraries/forest-summary/format.d.ts.map +0 -1
- package/lib/feature-libraries/forest-summary/format.js.map +0 -1
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +0 -23
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +0 -1
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +0 -27
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +0 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +0 -12
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +0 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +0 -53
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +0 -1
- package/src/feature-libraries/default-schema/locationBasedEditBuilder.ts +0 -180
- package/src/feature-libraries/optional-field/optionalFieldChangeFormatV3.ts +0 -45
- package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +0 -94
|
@@ -4,22 +4,27 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.normalizeFieldId = exports.getParentFieldId = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
9
|
const sorted_btree_es6_1 = require("@tylerbu/sorted-btree-es6");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
11
|
+
const index_js_1 = require("../../codec/index.js");
|
|
12
|
+
const index_js_2 = require("../../core/index.js");
|
|
13
|
+
const index_js_3 = require("../../util/index.js");
|
|
12
14
|
const crossFieldQueries_js_1 = require("./crossFieldQueries.js");
|
|
13
15
|
const fieldChangeHandler_js_1 = require("./fieldChangeHandler.js");
|
|
14
16
|
const genericFieldKind_js_1 = require("./genericFieldKind.js");
|
|
15
17
|
const modularChangeTypes_js_1 = require("./modularChangeTypes.js");
|
|
18
|
+
const changeAtomIdBTree_js_1 = require("../changeAtomIdBTree.js");
|
|
19
|
+
const semver_ts_1 = require("semver-ts");
|
|
16
20
|
/**
|
|
17
21
|
* Implementation of ChangeFamily which delegates work in a given field to the appropriate FieldKind
|
|
18
22
|
* as determined by the schema.
|
|
19
23
|
*/
|
|
20
24
|
class ModularChangeFamily {
|
|
21
|
-
constructor(fieldKinds, codecs) {
|
|
25
|
+
constructor(fieldKinds, codecs, codecOptions) {
|
|
22
26
|
this.codecs = codecs;
|
|
27
|
+
this.codecOptions = codecOptions;
|
|
23
28
|
this.fieldKinds = fieldKinds;
|
|
24
29
|
}
|
|
25
30
|
get rebaser() {
|
|
@@ -34,9 +39,9 @@ class ModularChangeFamily {
|
|
|
34
39
|
*/
|
|
35
40
|
normalizeFieldChanges(change1, change2) {
|
|
36
41
|
// TODO: Handle the case where changes have conflicting field kinds
|
|
37
|
-
const kind = change1.fieldKind
|
|
38
|
-
?
|
|
39
|
-
:
|
|
42
|
+
const kind = change1.fieldKind === genericFieldKind_js_1.genericFieldKind.identifier
|
|
43
|
+
? change2.fieldKind
|
|
44
|
+
: change1.fieldKind;
|
|
40
45
|
if (kind === genericFieldKind_js_1.genericFieldKind.identifier) {
|
|
41
46
|
// Both changes are generic
|
|
42
47
|
return {
|
|
@@ -67,19 +72,21 @@ class ModularChangeFamily {
|
|
|
67
72
|
return convertedChange;
|
|
68
73
|
}
|
|
69
74
|
compose(changes) {
|
|
70
|
-
const { maxId } = getRevInfoFromTaggedChanges(changes);
|
|
75
|
+
const { revInfos, maxId } = getRevInfoFromTaggedChanges(changes);
|
|
71
76
|
const idState = { maxId };
|
|
72
77
|
const pairwiseDelegate = (left, right) => {
|
|
73
|
-
return this.composePair(left, right, idState);
|
|
78
|
+
return this.composePair(left, right, revInfos, idState);
|
|
74
79
|
};
|
|
75
80
|
const innerChanges = changes.map((change) => change.change);
|
|
76
|
-
return (0,
|
|
81
|
+
return (0, index_js_3.balancedReduce)(innerChanges, pairwiseDelegate, makeModularChangeset);
|
|
77
82
|
}
|
|
78
|
-
composePair(change1, change2, idState) {
|
|
79
|
-
const
|
|
80
|
-
const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, rootNodes } = this.composeAllFields(change1, change2, revInfos, idState);
|
|
83
|
+
composePair(change1, change2, revInfos, idState) {
|
|
84
|
+
const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys } = this.composeAllFields(change1, change2, revInfos, idState);
|
|
81
85
|
const { allBuilds, allDestroys, allRefreshers } = composeBuildsDestroysAndRefreshers(change1, change2);
|
|
82
|
-
|
|
86
|
+
// The composed changeset has a "no change" constraint if either change has one
|
|
87
|
+
const noChangeConstraint = change1.noChangeConstraint ?? change2.noChangeConstraint;
|
|
88
|
+
const noChangeConstraintOnRevert = change1.noChangeConstraintOnRevert ?? change2.noChangeConstraintOnRevert;
|
|
89
|
+
return makeModularChangeset({
|
|
83
90
|
fieldChanges,
|
|
84
91
|
nodeChanges,
|
|
85
92
|
nodeToParent,
|
|
@@ -87,14 +94,12 @@ class ModularChangeFamily {
|
|
|
87
94
|
crossFieldKeys,
|
|
88
95
|
maxId: idState.maxId,
|
|
89
96
|
revisions: revInfos,
|
|
90
|
-
|
|
97
|
+
noChangeConstraint,
|
|
98
|
+
noChangeConstraintOnRevert,
|
|
91
99
|
builds: allBuilds,
|
|
92
100
|
destroys: allDestroys,
|
|
93
101
|
refreshers: allRefreshers,
|
|
94
102
|
});
|
|
95
|
-
// XXX: This is an expensive assert which should be disabled before merging.
|
|
96
|
-
this.validateChangeset(composed);
|
|
97
|
-
return composed;
|
|
98
103
|
}
|
|
99
104
|
composeAllFields(potentiallyConflictedChange1, potentiallyConflictedChange2, revInfos, idState) {
|
|
100
105
|
// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.
|
|
@@ -102,8 +107,8 @@ class ModularChangeFamily {
|
|
|
102
107
|
// TODO: remove once AB#46104 is completed
|
|
103
108
|
const change1 = this.getEffectiveChange(potentiallyConflictedChange1);
|
|
104
109
|
const change2 = this.getEffectiveChange(potentiallyConflictedChange2);
|
|
105
|
-
const genId = (0,
|
|
106
|
-
const revisionMetadata = (0,
|
|
110
|
+
const genId = (0, index_js_3.idAllocatorFromState)(idState);
|
|
111
|
+
const revisionMetadata = (0, index_js_2.revisionMetadataSourceFromInfo)(revInfos);
|
|
107
112
|
// We merge nodeChanges, nodeToParent, and nodeAliases from the two changesets.
|
|
108
113
|
// The merged tables will have correct entries for all nodes which are only referenced in one of the input changesets.
|
|
109
114
|
// During composeFieldMaps and composeInvalidatedElements we will find all nodes referenced in both input changesets
|
|
@@ -112,54 +117,38 @@ class ModularChangeFamily {
|
|
|
112
117
|
// A collision for a node ID means that that node is referenced in both changesets
|
|
113
118
|
// (since we assume that if two changesets use the same node ID they are referring to the same node),
|
|
114
119
|
// therefore all collisions will be addressed when processing the intersection of the changesets.
|
|
115
|
-
const composedNodeChanges = (0,
|
|
116
|
-
const composedNodeToParent = (0,
|
|
117
|
-
const composedNodeAliases = (0,
|
|
118
|
-
const
|
|
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);
|
|
120
|
+
const composedNodeChanges = (0, index_js_3.brand)((0, index_js_3.mergeTupleBTrees)(change1.nodeChanges, change2.nodeChanges));
|
|
121
|
+
const composedNodeToParent = (0, index_js_3.brand)((0, index_js_3.mergeTupleBTrees)(change1.nodeToParent, change2.nodeToParent));
|
|
122
|
+
const composedNodeAliases = (0, index_js_3.brand)((0, index_js_3.mergeTupleBTrees)(change1.nodeAliases, change2.nodeAliases));
|
|
123
|
+
const crossFieldTable = newComposeTable(change1, change2, composedNodeToParent);
|
|
126
124
|
const composedFields = this.composeFieldMaps(change1.fieldChanges, change2.fieldChanges, undefined, genId, crossFieldTable, revisionMetadata);
|
|
127
125
|
this.composeInvalidatedElements(crossFieldTable, composedFields, composedNodeChanges, composedNodeToParent, composedNodeAliases, genId, revisionMetadata);
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
}
|
|
126
|
+
// Currently no field kinds require making changes to cross-field keys during composition, so we can just merge the two tables.
|
|
127
|
+
const composedCrossFieldKeys = index_js_3.RangeMap.union(change1.crossFieldKeys, change2.crossFieldKeys);
|
|
140
128
|
return {
|
|
141
129
|
fieldChanges: composedFields,
|
|
142
130
|
nodeChanges: composedNodeChanges,
|
|
143
131
|
nodeToParent: composedNodeToParent,
|
|
144
132
|
nodeAliases: composedNodeAliases,
|
|
145
|
-
crossFieldKeys:
|
|
146
|
-
rootNodes: composedRoots,
|
|
133
|
+
crossFieldKeys: composedCrossFieldKeys,
|
|
147
134
|
};
|
|
148
135
|
}
|
|
149
136
|
composeInvalidatedField(fieldChange, crossFieldTable, genId, revisionMetadata) {
|
|
150
137
|
const context = crossFieldTable.fieldToContext.get(fieldChange);
|
|
151
138
|
(0, internal_1.assert)(context !== undefined, 0x8cc /* Should have context for every invalidated field */);
|
|
152
|
-
const { change1: fieldChange1, change2: fieldChange2, composedChange } = context;
|
|
153
|
-
crossFieldTable.pendingCompositions.affectedBaseFields.delete(fieldIdKeyFromFieldId(context.fieldId));
|
|
139
|
+
const { fieldId, change1: fieldChange1, change2: fieldChange2, composedChange } = context;
|
|
154
140
|
const rebaser = getChangeHandler(this.fieldKinds, composedChange.fieldKind).rebaser;
|
|
155
141
|
const composeNodes = (child1, child2) => {
|
|
156
|
-
if (child1 !== undefined &&
|
|
157
|
-
|
|
142
|
+
if (child1 !== undefined &&
|
|
143
|
+
child2 !== undefined &&
|
|
144
|
+
(0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(crossFieldTable.newToBaseNodeId, child2) === undefined) {
|
|
145
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(crossFieldTable.newToBaseNodeId, child2, child1);
|
|
146
|
+
crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
|
|
158
147
|
}
|
|
159
148
|
return child1 ?? child2 ?? (0, internal_1.fail)(0xb22 /* Should not compose two undefined nodes */);
|
|
160
149
|
};
|
|
161
|
-
const amendedChange = rebaser.compose(fieldChange1, fieldChange2, composeNodes, genId, new
|
|
162
|
-
composedChange.change = (0,
|
|
150
|
+
const amendedChange = rebaser.compose(fieldChange1, fieldChange2, composeNodes, genId, new ComposeManager(crossFieldTable, fieldChange, fieldId, false), revisionMetadata);
|
|
151
|
+
composedChange.change = (0, index_js_3.brand)(amendedChange);
|
|
163
152
|
}
|
|
164
153
|
/**
|
|
165
154
|
* Updates everything in the composed output which may no longer be valid.
|
|
@@ -167,23 +156,32 @@ class ModularChangeFamily {
|
|
|
167
156
|
* - discovering that two node changesets refer to the same node (`nodeIdsToCompose`)
|
|
168
157
|
* - a previously composed field being invalidated by a cross field effect (`invalidatedFields`)
|
|
169
158
|
* - a field which was copied directly from an input changeset being invalidated by a cross field effect
|
|
170
|
-
* (`affectedBaseFields`)
|
|
159
|
+
* (`affectedBaseFields` and `affectedNewFields`)
|
|
171
160
|
*
|
|
172
161
|
* Updating an element may invalidate further elements. This function runs until there is no more invalidation.
|
|
173
162
|
*/
|
|
174
163
|
composeInvalidatedElements(table, composedFields, composedNodes, composedNodeToParent, nodeAliases, genId, metadata) {
|
|
175
164
|
const pending = table.pendingCompositions;
|
|
176
|
-
while (
|
|
177
|
-
|
|
178
|
-
|
|
165
|
+
while (table.invalidatedFields.size > 0 ||
|
|
166
|
+
pending.nodeIdsToCompose.length > 0 ||
|
|
167
|
+
pending.affectedBaseFields.length > 0 ||
|
|
168
|
+
pending.affectedNewFields.length > 0) {
|
|
169
|
+
// Note that the call to `composeNodesById` can add entries to `crossFieldTable.nodeIdPairs`.
|
|
170
|
+
for (const [id1, id2] of pending.nodeIdsToCompose) {
|
|
171
|
+
this.composeNodesById(table.baseChange.nodeChanges, table.newChange.nodeChanges, composedNodes, composedNodeToParent, nodeAliases, id1, id2, genId, table, metadata);
|
|
172
|
+
}
|
|
173
|
+
pending.nodeIdsToCompose.length = 0;
|
|
174
|
+
this.composeAffectedFields(table, table.baseChange, true, pending.affectedBaseFields, composedFields, composedNodes, genId, metadata);
|
|
175
|
+
this.composeAffectedFields(table, table.newChange, false, pending.affectedNewFields, composedFields, composedNodes, genId, metadata);
|
|
176
|
+
this.processInvalidatedCompositions(table, genId, metadata);
|
|
179
177
|
}
|
|
180
178
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
179
|
+
processInvalidatedCompositions(table, genId, metadata) {
|
|
180
|
+
const fieldsToUpdate = table.invalidatedFields;
|
|
181
|
+
table.invalidatedFields = new Set();
|
|
182
|
+
for (const fieldChange of fieldsToUpdate) {
|
|
183
|
+
this.composeInvalidatedField(fieldChange, table, genId, metadata);
|
|
185
184
|
}
|
|
186
|
-
table.pendingCompositions.nodeIdsToCompose.length = 0;
|
|
187
185
|
}
|
|
188
186
|
/**
|
|
189
187
|
* Ensures that each field in `affectedFields` has been updated in the composition output.
|
|
@@ -196,36 +194,38 @@ class ModularChangeFamily {
|
|
|
196
194
|
* If not, they are assumed to be part of the new changeset.
|
|
197
195
|
* @param affectedFields - The set of fields to process.
|
|
198
196
|
*/
|
|
199
|
-
composeAffectedFields(table, change, affectedFields, composedFields, composedNodes, genId, metadata) {
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const fieldId = fieldIdFromFieldIdKey(fieldIdKey);
|
|
204
|
-
const fieldChange = fieldChangeFromId(change, fieldId);
|
|
197
|
+
composeAffectedFields(table, change, areBaseFields, affectedFields, composedFields, composedNodes, genId, metadata) {
|
|
198
|
+
for (const fieldIdKey of affectedFields.keys()) {
|
|
199
|
+
const fieldId = normalizeFieldId(fieldIdFromFieldIdKey(fieldIdKey), change.nodeAliases);
|
|
200
|
+
const fieldChange = fieldChangeFromId(change.fieldChanges, change.nodeChanges, fieldId);
|
|
205
201
|
if (table.fieldToContext.has(fieldChange) ||
|
|
206
202
|
table.newFieldToBaseField.has(fieldChange)) {
|
|
207
|
-
|
|
203
|
+
// This function handles fields which were not part of the intersection of the two changesets but which need to be updated anyway.
|
|
204
|
+
// If we've already processed this field then either it is up to date
|
|
205
|
+
// or there is pending inval which will be handled in processInvalidatedCompositions.
|
|
206
|
+
continue;
|
|
208
207
|
}
|
|
209
|
-
|
|
210
|
-
|
|
208
|
+
const emptyChange = this.createEmptyFieldChange(fieldChange.fieldKind);
|
|
209
|
+
const [change1, change2] = areBaseFields
|
|
210
|
+
? [fieldChange, emptyChange]
|
|
211
|
+
: [emptyChange, fieldChange];
|
|
212
|
+
const composedField = this.composeFieldChanges(fieldId, change1, change2, genId, table, metadata);
|
|
213
|
+
if (fieldId.nodeId === undefined) {
|
|
214
|
+
composedFields.set(fieldId.field, composedField);
|
|
215
|
+
continue;
|
|
211
216
|
}
|
|
217
|
+
const nodeId = (0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(table.newToBaseNodeId, fieldId.nodeId) ?? fieldId.nodeId;
|
|
218
|
+
let nodeChangeset = nodeChangeFromId(composedNodes, nodeId);
|
|
219
|
+
if (!table.composedNodes.has(nodeChangeset)) {
|
|
220
|
+
nodeChangeset = cloneNodeChangeset(nodeChangeset);
|
|
221
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(composedNodes, nodeId, nodeChangeset);
|
|
222
|
+
}
|
|
223
|
+
if (nodeChangeset.fieldChanges === undefined) {
|
|
224
|
+
nodeChangeset.fieldChanges = new Map();
|
|
225
|
+
}
|
|
226
|
+
nodeChangeset.fieldChanges.set(fieldId.field, composedField);
|
|
212
227
|
}
|
|
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);
|
|
228
|
+
affectedFields.clear();
|
|
229
229
|
}
|
|
230
230
|
composeFieldMaps(change1, change2, parentId, genId, crossFieldTable, revisionMetadata) {
|
|
231
231
|
const composedFields = new Map();
|
|
@@ -235,17 +235,9 @@ class ModularChangeFamily {
|
|
|
235
235
|
for (const [field, fieldChange1] of change1) {
|
|
236
236
|
const fieldId = { nodeId: parentId, field };
|
|
237
237
|
const fieldChange2 = change2.get(field);
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
}
|
|
246
|
-
const composedField = fieldChange2 !== undefined
|
|
247
|
-
? this.composeFieldChanges(fieldId, fieldChange1, fieldChange2, genId, crossFieldTable, revisionMetadata)
|
|
248
|
-
: fieldChange1;
|
|
238
|
+
const composedField = fieldChange2 === undefined
|
|
239
|
+
? fieldChange1
|
|
240
|
+
: this.composeFieldChanges(fieldId, fieldChange1, fieldChange2, genId, crossFieldTable, revisionMetadata);
|
|
249
241
|
composedFields.set(field, composedField);
|
|
250
242
|
}
|
|
251
243
|
for (const [field, fieldChange2] of change2) {
|
|
@@ -262,22 +254,23 @@ class ModularChangeFamily {
|
|
|
262
254
|
* will be added to `crossFieldTable.pendingCompositions.nodeIdsToCompose`.
|
|
263
255
|
*
|
|
264
256
|
* Any fields which had cross-field information sent to them as part of this field composition
|
|
265
|
-
* will be added to `affectedBaseFields` in `crossFieldTable.pendingCompositions`.
|
|
257
|
+
* will be added to either `affectedBaseFields` or `affectedNewFields` in `crossFieldTable.pendingCompositions`.
|
|
266
258
|
*
|
|
267
259
|
* Any composed `FieldChange` which is invalidated by new cross-field information will be added to `crossFieldTable.invalidatedFields`.
|
|
268
260
|
*/
|
|
269
261
|
composeFieldChanges(fieldId, change1, change2, idAllocator, crossFieldTable, revisionMetadata) {
|
|
270
262
|
const { fieldKind, changeHandler, change1: change1Normalized, change2: change2Normalized, } = this.normalizeFieldChanges(change1, change2);
|
|
271
|
-
const manager = new
|
|
263
|
+
const manager = new ComposeManager(crossFieldTable, change1, fieldId);
|
|
272
264
|
const composedChange = changeHandler.rebaser.compose(change1Normalized, change2Normalized, (child1, child2) => {
|
|
273
265
|
if (child1 !== undefined && child2 !== undefined) {
|
|
274
|
-
|
|
266
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(crossFieldTable.newToBaseNodeId, child2, child1);
|
|
267
|
+
crossFieldTable.pendingCompositions.nodeIdsToCompose.push([child1, child2]);
|
|
275
268
|
}
|
|
276
269
|
return child1 ?? child2 ?? (0, internal_1.fail)(0xb23 /* Should not compose two undefined nodes */);
|
|
277
270
|
}, idAllocator, manager, revisionMetadata);
|
|
278
271
|
const composedField = {
|
|
279
272
|
fieldKind,
|
|
280
|
-
change: (0,
|
|
273
|
+
change: (0, index_js_3.brand)(composedChange),
|
|
281
274
|
};
|
|
282
275
|
crossFieldTable.fieldToContext.set(change1, {
|
|
283
276
|
fieldId,
|
|
@@ -288,18 +281,19 @@ class ModularChangeFamily {
|
|
|
288
281
|
crossFieldTable.newFieldToBaseField.set(change2, change1);
|
|
289
282
|
return composedField;
|
|
290
283
|
}
|
|
291
|
-
composeNodesById(
|
|
292
|
-
const nodeChangeset1 = nodeChangeFromId(
|
|
293
|
-
const nodeChangeset2 = nodeChangeFromId(
|
|
284
|
+
composeNodesById(nodeChanges1, nodeChanges2, composedNodes, composedNodeToParent, nodeAliases, id1, id2, idAllocator, crossFieldTable, revisionMetadata) {
|
|
285
|
+
const nodeChangeset1 = nodeChangeFromId(nodeChanges1, id1);
|
|
286
|
+
const nodeChangeset2 = nodeChangeFromId(nodeChanges2, id2);
|
|
294
287
|
const composedNodeChangeset = this.composeNodeChanges(id1, nodeChangeset1, nodeChangeset2, idAllocator, crossFieldTable, revisionMetadata);
|
|
295
|
-
(0,
|
|
296
|
-
if (!(0,
|
|
288
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(composedNodes, id1, composedNodeChangeset);
|
|
289
|
+
if (!(0, index_js_2.areEqualChangeAtomIds)(id1, id2)) {
|
|
297
290
|
composedNodes.delete([id2.revision, id2.localId]);
|
|
298
291
|
composedNodeToParent.delete([id2.revision, id2.localId]);
|
|
299
|
-
(0,
|
|
292
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(nodeAliases, id2, id1);
|
|
300
293
|
// We need to delete id1 to avoid forming a cycle in case id1 already had an alias.
|
|
301
|
-
|
|
294
|
+
nodeAliases.delete([id1.revision, id1.localId]);
|
|
302
295
|
}
|
|
296
|
+
crossFieldTable.composedNodes.add(composedNodeChangeset);
|
|
303
297
|
}
|
|
304
298
|
composeNodeChanges(nodeId, change1, change2, genId, crossFieldTable, revisionMetadata) {
|
|
305
299
|
// WARNING: this composition logic assumes that we never make compositions of the following form:
|
|
@@ -330,8 +324,8 @@ class ModularChangeFamily {
|
|
|
330
324
|
/**
|
|
331
325
|
* @param change - The change to invert.
|
|
332
326
|
* @param isRollback - Whether the inverted change is meant to rollback a change on a branch as is the case when
|
|
333
|
-
* @param revisionForInvert - The revision for the invert changeset.
|
|
334
327
|
* performing a sandwich rebase.
|
|
328
|
+
* @param revisionForInvert - The revision for the invert changeset.
|
|
335
329
|
*/
|
|
336
330
|
invert(change, isRollback, revisionForInvert) {
|
|
337
331
|
// Rollback changesets destroy the nodes created by the change being rolled back.
|
|
@@ -341,6 +335,8 @@ class ModularChangeFamily {
|
|
|
341
335
|
const revInfos = isRollback
|
|
342
336
|
? [{ revision: revisionForInvert, rollbackOf: change.revision }]
|
|
343
337
|
: [{ revision: revisionForInvert }];
|
|
338
|
+
const noChangeConstraint = change.change.noChangeConstraintOnRevert;
|
|
339
|
+
const noChangeConstraintOnRevert = change.change.noChangeConstraint;
|
|
344
340
|
if (hasConflicts(change.change)) {
|
|
345
341
|
return makeModularChangeset({
|
|
346
342
|
maxId: change.change.maxId,
|
|
@@ -348,21 +344,16 @@ class ModularChangeFamily {
|
|
|
348
344
|
destroys,
|
|
349
345
|
});
|
|
350
346
|
}
|
|
351
|
-
const genId = (0,
|
|
347
|
+
const genId = (0, index_js_3.idAllocatorFromMaxId)(change.change.maxId ?? -1);
|
|
352
348
|
const crossFieldTable = {
|
|
353
|
-
|
|
354
|
-
entries: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
349
|
+
...newCrossFieldTable(),
|
|
355
350
|
originalFieldToContext: new Map(),
|
|
356
|
-
|
|
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)(),
|
|
351
|
+
invertedNodeToParent: (0, index_js_3.brand)(change.change.nodeToParent.clone()),
|
|
361
352
|
};
|
|
362
353
|
const { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);
|
|
363
|
-
const revisionMetadata = (0,
|
|
354
|
+
const revisionMetadata = (0, index_js_2.revisionMetadataSourceFromInfo)(oldRevInfos);
|
|
364
355
|
const invertedFields = this.invertFieldMap(change.change.fieldChanges, undefined, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert);
|
|
365
|
-
const invertedNodes = (0,
|
|
356
|
+
const invertedNodes = (0, index_js_3.newTupleBTree)();
|
|
366
357
|
change.change.nodeChanges.forEachPair(([revision, localId], nodeChangeset) => {
|
|
367
358
|
invertedNodes.set([revision, localId], this.invertNodeChange(nodeChangeset, { revision, localId }, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert));
|
|
368
359
|
});
|
|
@@ -373,24 +364,24 @@ class ModularChangeFamily {
|
|
|
373
364
|
const originalFieldChange = fieldChange.change;
|
|
374
365
|
const context = crossFieldTable.originalFieldToContext.get(fieldChange);
|
|
375
366
|
(0, internal_1.assert)(context !== undefined, 0x851 /* Should have context for every invalidated field */);
|
|
376
|
-
const { invertedField } = context;
|
|
377
|
-
const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new
|
|
378
|
-
invertedField.change = (0,
|
|
367
|
+
const { invertedField, fieldId } = context;
|
|
368
|
+
const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new InvertManager(crossFieldTable, fieldChange, fieldId), revisionMetadata);
|
|
369
|
+
invertedField.change = (0, index_js_3.brand)(amendedChange);
|
|
379
370
|
}
|
|
380
371
|
}
|
|
381
372
|
const crossFieldKeys = this.makeCrossFieldKeyTable(invertedFields, invertedNodes);
|
|
382
|
-
this.processInvertRenames(crossFieldTable);
|
|
383
373
|
return makeModularChangeset({
|
|
384
374
|
fieldChanges: invertedFields,
|
|
385
375
|
nodeChanges: invertedNodes,
|
|
386
376
|
nodeToParent: crossFieldTable.invertedNodeToParent,
|
|
387
|
-
rootNodes: crossFieldTable.invertedRoots,
|
|
388
377
|
nodeAliases: change.change.nodeAliases,
|
|
389
378
|
crossFieldKeys,
|
|
390
379
|
maxId: genId.getMaxId(),
|
|
391
380
|
revisions: revInfos,
|
|
392
381
|
constraintViolationCount: change.change.constraintViolationCountOnRevert,
|
|
393
382
|
constraintViolationCountOnRevert: change.change.constraintViolationCount,
|
|
383
|
+
noChangeConstraint,
|
|
384
|
+
noChangeConstraintOnRevert,
|
|
394
385
|
destroys,
|
|
395
386
|
});
|
|
396
387
|
}
|
|
@@ -398,11 +389,11 @@ class ModularChangeFamily {
|
|
|
398
389
|
const invertedFields = new Map();
|
|
399
390
|
for (const [field, fieldChange] of changes) {
|
|
400
391
|
const fieldId = { nodeId: parentId, field };
|
|
401
|
-
const manager = new
|
|
392
|
+
const manager = new InvertManager(crossFieldTable, fieldChange, fieldId);
|
|
402
393
|
const invertedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(fieldChange.change, isRollback, genId, revisionForInvert, manager, revisionMetadata);
|
|
403
394
|
const invertedFieldChange = {
|
|
404
395
|
...fieldChange,
|
|
405
|
-
change: (0,
|
|
396
|
+
change: (0, index_js_3.brand)(invertedChange),
|
|
406
397
|
};
|
|
407
398
|
invertedFields.set(field, invertedFieldChange);
|
|
408
399
|
crossFieldTable.originalFieldToContext.set(fieldChange, {
|
|
@@ -430,42 +421,27 @@ class ModularChangeFamily {
|
|
|
430
421
|
}
|
|
431
422
|
return inverse;
|
|
432
423
|
}
|
|
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
|
-
}
|
|
439
424
|
rebase(taggedChange, potentiallyConflictedOver, revisionMetadata) {
|
|
440
425
|
// Our current cell ordering scheme in sequences depends on being able to rebase over a change with conflicts.
|
|
441
426
|
// This means that we must rebase over a muted version of the conflicted changeset.
|
|
442
427
|
// That is, a version that includes its declarations (e.g., new cells) but not its changes.
|
|
443
428
|
// TODO: remove once AB#46104 is completed
|
|
444
|
-
const over = (0,
|
|
429
|
+
const over = (0, index_js_2.mapTaggedChange)(potentiallyConflictedOver, this.getEffectiveChange(potentiallyConflictedOver.change));
|
|
445
430
|
const change = taggedChange.change;
|
|
446
431
|
const maxId = Math.max(change.maxId ?? -1, over.change.maxId ?? -1);
|
|
447
432
|
const idState = { maxId };
|
|
448
|
-
const genId = (0,
|
|
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);
|
|
433
|
+
const genId = (0, index_js_3.idAllocatorFromState)(idState);
|
|
454
434
|
const crossFieldTable = {
|
|
455
|
-
|
|
456
|
-
entries: newDetachedEntryMap(),
|
|
435
|
+
...newCrossFieldTable(),
|
|
457
436
|
newChange: change,
|
|
458
437
|
baseChange: over.change,
|
|
459
438
|
baseFieldToContext: new Map(),
|
|
460
|
-
|
|
461
|
-
rebasedRootNodes,
|
|
462
|
-
baseToRebasedNodeId: (0, index_js_2.newTupleBTree)(),
|
|
439
|
+
baseToRebasedNodeId: (0, index_js_3.newTupleBTree)(),
|
|
463
440
|
rebasedFields: new Set(),
|
|
464
|
-
rebasedNodeToParent,
|
|
465
|
-
|
|
466
|
-
movedDetaches: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
441
|
+
rebasedNodeToParent: (0, index_js_3.brand)(change.nodeToParent.clone()),
|
|
442
|
+
rebasedCrossFieldKeys: change.crossFieldKeys.clone(),
|
|
467
443
|
nodeIdPairs: [],
|
|
468
|
-
affectedBaseFields,
|
|
444
|
+
affectedBaseFields: (0, index_js_3.newTupleBTree)(),
|
|
469
445
|
fieldsWithUnattachedChild: new Set(),
|
|
470
446
|
};
|
|
471
447
|
const getBaseRevisions = () => revisionInfoFromTaggedChange(over).map((info) => info.revision);
|
|
@@ -474,201 +450,184 @@ class ModularChangeFamily {
|
|
|
474
450
|
getRevisionToRebase: () => taggedChange.revision,
|
|
475
451
|
getBaseRevisions,
|
|
476
452
|
};
|
|
477
|
-
const rebasedNodes = (0,
|
|
478
|
-
const rebasedFields = this.rebaseIntersectingFields(
|
|
479
|
-
this.
|
|
480
|
-
fixupRebasedDetachLocations(crossFieldTable);
|
|
453
|
+
const rebasedNodes = (0, index_js_3.brand)(change.nodeChanges.clone());
|
|
454
|
+
const rebasedFields = this.rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, rebaseMetadata);
|
|
455
|
+
this.rebaseInvalidatedElements(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId);
|
|
481
456
|
const constraintState = newConstraintState(change.constraintViolationCount ?? 0);
|
|
482
457
|
const revertConstraintState = newConstraintState(change.constraintViolationCountOnRevert ?? 0);
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
458
|
+
let noChangeConstraint = change.noChangeConstraint;
|
|
459
|
+
if (noChangeConstraint !== undefined && !noChangeConstraint.violated) {
|
|
460
|
+
noChangeConstraint = { violated: true };
|
|
461
|
+
constraintState.violationCount += 1;
|
|
462
|
+
}
|
|
463
|
+
this.updateConstraintsForFields(rebasedFields, fieldChangeHandler_js_1.NodeAttachState.Attached, fieldChangeHandler_js_1.NodeAttachState.Attached, constraintState, revertConstraintState, rebasedNodes);
|
|
486
464
|
const rebased = makeModularChangeset({
|
|
487
|
-
fieldChanges: this.pruneFieldMap(rebasedFields,
|
|
465
|
+
fieldChanges: this.pruneFieldMap(rebasedFields, rebasedNodes),
|
|
488
466
|
nodeChanges: rebasedNodes,
|
|
489
467
|
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?
|
|
492
468
|
nodeAliases: change.nodeAliases,
|
|
493
|
-
crossFieldKeys:
|
|
469
|
+
crossFieldKeys: crossFieldTable.rebasedCrossFieldKeys,
|
|
494
470
|
maxId: idState.maxId,
|
|
495
471
|
revisions: change.revisions,
|
|
496
472
|
constraintViolationCount: constraintState.violationCount,
|
|
497
473
|
constraintViolationCountOnRevert: revertConstraintState.violationCount,
|
|
474
|
+
noChangeConstraint,
|
|
475
|
+
noChangeConstraintOnRevert: change.noChangeConstraintOnRevert,
|
|
498
476
|
builds: change.builds,
|
|
499
477
|
destroys: change.destroys,
|
|
500
478
|
refreshers: change.refreshers,
|
|
501
|
-
rebaseVersion,
|
|
502
479
|
});
|
|
503
|
-
// XXX: This is an expensive assert which should be disabled before merging.
|
|
504
|
-
this.validateChangeset(rebased);
|
|
505
480
|
return rebased;
|
|
506
481
|
}
|
|
507
482
|
// This performs a first pass on all fields which have both new and base changes.
|
|
508
483
|
// TODO: Can we also handle additional passes in this method?
|
|
509
|
-
rebaseIntersectingFields(
|
|
484
|
+
rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, metadata) {
|
|
510
485
|
const change = crossFieldTable.newChange;
|
|
511
486
|
const baseChange = crossFieldTable.baseChange;
|
|
512
487
|
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
|
-
}
|
|
517
488
|
// This loop processes all fields which have both base and new changes.
|
|
518
489
|
// Note that the call to `rebaseNodeChange` can add entries to `crossFieldTable.nodeIdPairs`.
|
|
519
490
|
for (const [newId, baseId, _attachState] of crossFieldTable.nodeIdPairs) {
|
|
520
491
|
const rebasedNode = this.rebaseNodeChange(newId, baseId, genId, crossFieldTable, metadata);
|
|
521
|
-
(0,
|
|
492
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(rebasedNodes, newId, rebasedNode);
|
|
522
493
|
}
|
|
523
494
|
return rebasedFields;
|
|
524
495
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
(0, internal_1.assert)(
|
|
534
|
-
if (
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
return (0, index_js_1.areEqualChangeAtomIds)(normalizeNodeId(baseChild, crossFieldTable.baseChange.nodeAliases), baseNodeId)
|
|
538
|
-
? baseNodeId
|
|
539
|
-
: undefined;
|
|
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
|
-
}
|
|
496
|
+
// This processes fields which have no new changes but have been invalidated by another field.
|
|
497
|
+
rebaseFieldsWithoutNewChanges(rebasedFields, rebasedNodes, crossFieldTable, genId, metadata) {
|
|
498
|
+
const baseChange = crossFieldTable.baseChange;
|
|
499
|
+
for (const [revision, localId, fieldKey] of crossFieldTable.affectedBaseFields.keys()) {
|
|
500
|
+
const baseNodeId = localId === undefined
|
|
501
|
+
? undefined
|
|
502
|
+
: normalizeNodeId({ revision, localId }, baseChange.nodeAliases);
|
|
503
|
+
const baseFieldChange = fieldMapFromNodeId(baseChange.fieldChanges, baseChange.nodeChanges, baseNodeId).get(fieldKey);
|
|
504
|
+
(0, internal_1.assert)(baseFieldChange !== undefined, 0x9c2 /* Cross field key registered for empty field */);
|
|
505
|
+
if (crossFieldTable.baseFieldToContext.has(baseFieldChange)) {
|
|
506
|
+
// This field has already been processed because there were changes to rebase.
|
|
507
|
+
continue;
|
|
584
508
|
}
|
|
509
|
+
// This field has no changes in the new changeset, otherwise it would have been added to
|
|
510
|
+
// `crossFieldTable.baseFieldToContext` when processing fields with both base and new changes.
|
|
511
|
+
const rebaseChild = (child, baseChild, stateChange) => {
|
|
512
|
+
(0, internal_1.assert)(child === undefined, 0x9c3 /* There should be no new changes in this field */);
|
|
513
|
+
return undefined;
|
|
514
|
+
};
|
|
515
|
+
const handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);
|
|
516
|
+
const fieldChange = {
|
|
517
|
+
...baseFieldChange,
|
|
518
|
+
change: (0, index_js_3.brand)(handler.createEmpty()),
|
|
519
|
+
};
|
|
520
|
+
const rebasedNodeId = baseNodeId === undefined
|
|
521
|
+
? undefined
|
|
522
|
+
: rebasedNodeIdFromBaseNodeId(crossFieldTable, baseNodeId);
|
|
523
|
+
const fieldId = { nodeId: rebasedNodeId, field: fieldKey };
|
|
524
|
+
const rebasedField = handler.rebaser.rebase(fieldChange.change, baseFieldChange.change, rebaseChild, genId, new RebaseManager(crossFieldTable, baseFieldChange, fieldId), metadata);
|
|
525
|
+
const rebasedFieldChange = {
|
|
526
|
+
...baseFieldChange,
|
|
527
|
+
change: (0, index_js_3.brand)(rebasedField),
|
|
528
|
+
};
|
|
529
|
+
// TODO: Deduplicate
|
|
530
|
+
crossFieldTable.baseFieldToContext.set(baseFieldChange, {
|
|
531
|
+
newChange: fieldChange,
|
|
532
|
+
baseChange: baseFieldChange,
|
|
533
|
+
rebasedChange: rebasedFieldChange,
|
|
534
|
+
fieldId,
|
|
535
|
+
baseNodeIds: [],
|
|
536
|
+
});
|
|
537
|
+
crossFieldTable.rebasedFields.add(rebasedFieldChange);
|
|
538
|
+
this.attachRebasedField(rebasedFields, rebasedNodes, crossFieldTable, rebasedFieldChange, fieldId, genId, metadata);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
rebaseInvalidatedElements(rebasedFields, rebasedNodes, table, metadata, idAllocator) {
|
|
542
|
+
this.rebaseFieldsWithoutNewChanges(rebasedFields, rebasedNodes, table, idAllocator, metadata);
|
|
543
|
+
this.rebaseFieldsWithUnattachedChild(table, metadata, idAllocator);
|
|
544
|
+
this.rebaseInvalidatedFields(table, metadata, idAllocator);
|
|
545
|
+
}
|
|
546
|
+
rebaseInvalidatedFields(crossFieldTable, rebaseMetadata, genId) {
|
|
547
|
+
const fieldsToUpdate = crossFieldTable.invalidatedFields;
|
|
548
|
+
crossFieldTable.invalidatedFields = new Set();
|
|
549
|
+
for (const field of fieldsToUpdate) {
|
|
550
|
+
this.rebaseInvalidatedField(field, crossFieldTable, rebaseMetadata, genId);
|
|
585
551
|
}
|
|
586
552
|
}
|
|
587
|
-
|
|
553
|
+
rebaseFieldsWithUnattachedChild(table, metadata, idAllocator) {
|
|
554
|
+
for (const field of table.fieldsWithUnattachedChild) {
|
|
555
|
+
table.invalidatedFields.delete(field);
|
|
556
|
+
this.rebaseInvalidatedField(field, table, metadata, idAllocator, true);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
rebaseInvalidatedField(baseField, crossFieldTable, rebaseMetadata, genId, allowInval = false) {
|
|
560
|
+
const context = crossFieldTable.baseFieldToContext.get(baseField);
|
|
561
|
+
(0, internal_1.assert)(context !== undefined, 0x852 /* Every field should have a context */);
|
|
588
562
|
const { changeHandler, change1: fieldChangeset, change2: baseChangeset, } = this.normalizeFieldChanges(context.newChange, context.baseChange);
|
|
589
563
|
const rebaseChild = (curr, base) => {
|
|
590
564
|
if (curr !== undefined) {
|
|
591
565
|
return curr;
|
|
592
566
|
}
|
|
593
|
-
if (base !== undefined
|
|
594
|
-
|
|
567
|
+
if (base !== undefined) {
|
|
568
|
+
for (const id of context.baseNodeIds) {
|
|
569
|
+
if ((0, index_js_2.areEqualChangeAtomIds)(base, id)) {
|
|
570
|
+
return base;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
595
573
|
}
|
|
596
574
|
return undefined;
|
|
597
575
|
};
|
|
598
|
-
|
|
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));
|
|
576
|
+
context.rebasedChange.change = (0, index_js_3.brand)(changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, new RebaseManager(crossFieldTable, baseField, context.fieldId, allowInval), rebaseMetadata));
|
|
604
577
|
}
|
|
605
578
|
attachRebasedField(rebasedFields, rebasedNodes, table, rebasedField, { nodeId, field: fieldKey }, idAllocator, metadata) {
|
|
606
579
|
if (nodeId === undefined) {
|
|
607
580
|
rebasedFields.set(fieldKey, rebasedField);
|
|
608
581
|
return;
|
|
609
582
|
}
|
|
610
|
-
const rebasedNode = (0,
|
|
583
|
+
const rebasedNode = (0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(rebasedNodes, nodeId);
|
|
611
584
|
if (rebasedNode !== undefined) {
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
if (updatedRebasedNode.fieldChanges === undefined) {
|
|
615
|
-
updatedRebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);
|
|
585
|
+
if (rebasedNode.fieldChanges === undefined) {
|
|
586
|
+
rebasedNode.fieldChanges = new Map([[fieldKey, rebasedField]]);
|
|
616
587
|
return;
|
|
617
588
|
}
|
|
618
|
-
(0, internal_1.assert)(!
|
|
619
|
-
|
|
589
|
+
(0, internal_1.assert)(!rebasedNode.fieldChanges.has(fieldKey), 0x9c4 /* Expected an empty field */);
|
|
590
|
+
rebasedNode.fieldChanges.set(fieldKey, rebasedField);
|
|
620
591
|
return;
|
|
621
592
|
}
|
|
622
593
|
const newNode = {
|
|
623
594
|
fieldChanges: new Map([[fieldKey, rebasedField]]),
|
|
624
595
|
};
|
|
625
|
-
(0,
|
|
626
|
-
(0,
|
|
627
|
-
const
|
|
628
|
-
this.attachRebasedNode(rebasedFields, rebasedNodes, table, nodeId,
|
|
629
|
-
}
|
|
630
|
-
attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId,
|
|
631
|
-
|
|
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);
|
|
596
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(rebasedNodes, nodeId, newNode);
|
|
597
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(table.baseToRebasedNodeId, nodeId, nodeId);
|
|
598
|
+
const parentFieldId = getParentFieldId(table.baseChange, nodeId);
|
|
599
|
+
this.attachRebasedNode(rebasedFields, rebasedNodes, table, nodeId, parentFieldId, idAllocator, metadata);
|
|
600
|
+
}
|
|
601
|
+
attachRebasedNode(rebasedFields, rebasedNodes, table, baseNodeId, parentFieldIdBase, idAllocator, metadata) {
|
|
602
|
+
const baseFieldChange = fieldChangeFromId(table.baseChange.fieldChanges, table.baseChange.nodeChanges, parentFieldIdBase);
|
|
656
603
|
const rebasedFieldId = rebasedFieldIdFromBaseId(table, parentFieldIdBase);
|
|
657
|
-
(0,
|
|
604
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(table.rebasedNodeToParent, baseNodeId, rebasedFieldId);
|
|
658
605
|
const context = table.baseFieldToContext.get(baseFieldChange);
|
|
659
606
|
if (context !== undefined) {
|
|
660
607
|
// We've already processed this field.
|
|
661
|
-
// The new child node will be attached in
|
|
662
|
-
|
|
663
|
-
|
|
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
|
-
}
|
|
608
|
+
// The new child node will be attached in rebaseFieldsWithUnattachedChild.
|
|
609
|
+
context.baseNodeIds.push(baseNodeId);
|
|
610
|
+
table.fieldsWithUnattachedChild.add(baseFieldChange);
|
|
669
611
|
return;
|
|
670
612
|
}
|
|
671
|
-
|
|
613
|
+
const handler = getChangeHandler(this.fieldKinds, baseFieldChange.fieldKind);
|
|
614
|
+
const fieldChange = {
|
|
615
|
+
...baseFieldChange,
|
|
616
|
+
change: (0, index_js_3.brand)(handler.createEmpty()),
|
|
617
|
+
};
|
|
618
|
+
const rebasedChangeset = handler.rebaser.rebase(handler.createEmpty(), baseFieldChange.change, (_idNew, idBase) => idBase !== undefined && (0, index_js_2.areEqualChangeAtomIds)(idBase, baseNodeId)
|
|
619
|
+
? baseNodeId
|
|
620
|
+
: undefined, idAllocator, new RebaseManager(table, baseFieldChange, rebasedFieldId), metadata);
|
|
621
|
+
const rebasedField = { ...baseFieldChange, change: (0, index_js_3.brand)(rebasedChangeset) };
|
|
622
|
+
table.rebasedFields.add(rebasedField);
|
|
623
|
+
table.baseFieldToContext.set(baseFieldChange, {
|
|
624
|
+
newChange: fieldChange,
|
|
625
|
+
baseChange: baseFieldChange,
|
|
626
|
+
rebasedChange: rebasedField,
|
|
627
|
+
fieldId: rebasedFieldId,
|
|
628
|
+
baseNodeIds: [],
|
|
629
|
+
});
|
|
630
|
+
this.attachRebasedField(rebasedFields, rebasedNodes, table, rebasedField, rebasedFieldId, idAllocator, metadata);
|
|
672
631
|
}
|
|
673
632
|
rebaseFieldMap(change, over, parentId, genId, crossFieldTable, revisionMetadata) {
|
|
674
633
|
const rebasedFields = new Map();
|
|
@@ -686,11 +645,11 @@ class ModularChangeFamily {
|
|
|
686
645
|
continue;
|
|
687
646
|
}
|
|
688
647
|
const { fieldKind, changeHandler, change1: fieldChangeset, change2: baseChangeset, } = this.normalizeFieldChanges(fieldChange, baseChange);
|
|
689
|
-
const manager = new
|
|
690
|
-
const rebasedField = changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, manager, revisionMetadata
|
|
648
|
+
const manager = new RebaseManager(crossFieldTable, baseChange, fieldId);
|
|
649
|
+
const rebasedField = changeHandler.rebaser.rebase(fieldChangeset, baseChangeset, rebaseChild, genId, manager, revisionMetadata);
|
|
691
650
|
const rebasedFieldChange = {
|
|
692
651
|
fieldKind,
|
|
693
|
-
change: (0,
|
|
652
|
+
change: (0, index_js_3.brand)(rebasedField),
|
|
694
653
|
};
|
|
695
654
|
rebasedFields.set(field, rebasedFieldChange);
|
|
696
655
|
crossFieldTable.baseFieldToContext.set(baseChange, {
|
|
@@ -698,15 +657,15 @@ class ModularChangeFamily {
|
|
|
698
657
|
newChange: fieldChange,
|
|
699
658
|
rebasedChange: rebasedFieldChange,
|
|
700
659
|
fieldId,
|
|
701
|
-
baseNodeIds:
|
|
660
|
+
baseNodeIds: [],
|
|
702
661
|
});
|
|
703
662
|
crossFieldTable.rebasedFields.add(rebasedFieldChange);
|
|
704
663
|
}
|
|
705
664
|
return rebasedFields;
|
|
706
665
|
}
|
|
707
666
|
rebaseNodeChange(newId, baseId, genId, crossFieldTable, revisionMetadata) {
|
|
708
|
-
const change = nodeChangeFromId(crossFieldTable.newChange.nodeChanges,
|
|
709
|
-
const over = nodeChangeFromId(crossFieldTable.baseChange.nodeChanges,
|
|
667
|
+
const change = nodeChangeFromId(crossFieldTable.newChange.nodeChanges, newId);
|
|
668
|
+
const over = nodeChangeFromId(crossFieldTable.baseChange.nodeChanges, baseId);
|
|
710
669
|
const baseMap = over?.fieldChanges ?? new Map();
|
|
711
670
|
const fieldChanges = change.fieldChanges !== undefined && over.fieldChanges !== undefined
|
|
712
671
|
? this.rebaseFieldMap(change?.fieldChanges ?? new Map(), baseMap, newId, genId, crossFieldTable, revisionMetadata)
|
|
@@ -721,40 +680,31 @@ class ModularChangeFamily {
|
|
|
721
680
|
if (change?.nodeExistsConstraintOnRevert !== undefined) {
|
|
722
681
|
rebasedChange.nodeExistsConstraintOnRevert = change.nodeExistsConstraintOnRevert;
|
|
723
682
|
}
|
|
724
|
-
(0,
|
|
683
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(crossFieldTable.baseToRebasedNodeId, baseId, newId);
|
|
725
684
|
return rebasedChange;
|
|
726
685
|
}
|
|
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
|
-
}
|
|
736
686
|
updateConstraintsForFields(fields, parentInputAttachState, parentOutputAttachState, constraintState, revertConstraintState, nodes) {
|
|
737
687
|
for (const field of fields.values()) {
|
|
738
688
|
const handler = getChangeHandler(this.fieldKinds, field.fieldKind);
|
|
739
|
-
for (const [nodeId] of handler.getNestedChanges(field.change)) {
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
689
|
+
for (const [nodeId, inputIndex, outputIndex] of handler.getNestedChanges(field.change)) {
|
|
690
|
+
const isInputDetached = inputIndex === undefined;
|
|
691
|
+
const inputAttachState = parentInputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached || isInputDetached
|
|
692
|
+
? fieldChangeHandler_js_1.NodeAttachState.Detached
|
|
693
|
+
: fieldChangeHandler_js_1.NodeAttachState.Attached;
|
|
694
|
+
const isOutputDetached = outputIndex === undefined;
|
|
743
695
|
const outputAttachState = parentOutputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached || isOutputDetached
|
|
744
696
|
? fieldChangeHandler_js_1.NodeAttachState.Detached
|
|
745
697
|
: fieldChangeHandler_js_1.NodeAttachState.Attached;
|
|
746
|
-
this.updateConstraintsForNode(nodeId,
|
|
698
|
+
this.updateConstraintsForNode(nodeId, inputAttachState, outputAttachState, nodes, constraintState, revertConstraintState);
|
|
747
699
|
}
|
|
748
700
|
}
|
|
749
701
|
}
|
|
750
702
|
updateConstraintsForNode(nodeId, inputAttachState, outputAttachState, nodes, constraintState, revertConstraintState) {
|
|
751
|
-
const node = (
|
|
752
|
-
const updatedNode = { ...node };
|
|
753
|
-
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodes, nodeId, updatedNode);
|
|
703
|
+
const node = nodes.get([nodeId.revision, nodeId.localId]) ?? (0, internal_1.fail)(0xb24 /* Unknown node ID */);
|
|
754
704
|
if (node.nodeExistsConstraint !== undefined) {
|
|
755
705
|
const isNowViolated = inputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached;
|
|
756
706
|
if (node.nodeExistsConstraint.violated !== isNowViolated) {
|
|
757
|
-
|
|
707
|
+
node.nodeExistsConstraint = {
|
|
758
708
|
...node.nodeExistsConstraint,
|
|
759
709
|
violated: isNowViolated,
|
|
760
710
|
};
|
|
@@ -764,7 +714,7 @@ class ModularChangeFamily {
|
|
|
764
714
|
if (node.nodeExistsConstraintOnRevert !== undefined) {
|
|
765
715
|
const isNowViolated = outputAttachState === fieldChangeHandler_js_1.NodeAttachState.Detached;
|
|
766
716
|
if (node.nodeExistsConstraintOnRevert.violated !== isNowViolated) {
|
|
767
|
-
|
|
717
|
+
node.nodeExistsConstraintOnRevert = {
|
|
768
718
|
...node.nodeExistsConstraintOnRevert,
|
|
769
719
|
violated: isNowViolated,
|
|
770
720
|
};
|
|
@@ -775,134 +725,87 @@ class ModularChangeFamily {
|
|
|
775
725
|
this.updateConstraintsForFields(node.fieldChanges, inputAttachState, outputAttachState, constraintState, revertConstraintState, nodes);
|
|
776
726
|
}
|
|
777
727
|
}
|
|
778
|
-
pruneFieldMap(changeset,
|
|
728
|
+
pruneFieldMap(changeset, nodeMap) {
|
|
779
729
|
if (changeset === undefined) {
|
|
780
730
|
return undefined;
|
|
781
731
|
}
|
|
782
732
|
const prunedChangeset = new Map();
|
|
783
733
|
for (const [field, fieldChange] of changeset) {
|
|
784
734
|
const handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);
|
|
785
|
-
const prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) => this.pruneNodeChange(nodeId, nodeMap
|
|
786
|
-
|
|
787
|
-
|
|
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) {
|
|
803
|
-
prunedChangeset.set(field, { ...fieldChange, change: (0, index_js_2.brand)(prunedFieldChangeset) });
|
|
735
|
+
const prunedFieldChangeset = handler.rebaser.prune(fieldChange.change, (nodeId) => this.pruneNodeChange(nodeId, nodeMap));
|
|
736
|
+
if (!handler.isEmpty(prunedFieldChangeset)) {
|
|
737
|
+
prunedChangeset.set(field, { ...fieldChange, change: (0, index_js_3.brand)(prunedFieldChangeset) });
|
|
804
738
|
}
|
|
805
739
|
}
|
|
806
740
|
return prunedChangeset.size > 0 ? prunedChangeset : undefined;
|
|
807
741
|
}
|
|
808
|
-
|
|
809
|
-
const
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
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);
|
|
826
|
-
const prunedFields = changeset.fieldChanges !== undefined
|
|
827
|
-
? this.pruneFieldMap(changeset.fieldChanges, nodeId, nodes, nodeToParent, aliases, roots, fieldsWithRootMoves, fieldsToRootChanges)
|
|
828
|
-
: undefined;
|
|
742
|
+
pruneNodeChange(nodeId, nodeMap) {
|
|
743
|
+
const changeset = nodeChangeFromId(nodeMap, nodeId);
|
|
744
|
+
const prunedFields = changeset.fieldChanges === undefined
|
|
745
|
+
? undefined
|
|
746
|
+
: this.pruneFieldMap(changeset.fieldChanges, nodeMap);
|
|
829
747
|
const prunedChange = { ...changeset, fieldChanges: prunedFields };
|
|
830
748
|
if (prunedChange.fieldChanges === undefined) {
|
|
831
749
|
delete prunedChange.fieldChanges;
|
|
832
750
|
}
|
|
833
751
|
if (isEmptyNodeChangeset(prunedChange)) {
|
|
834
|
-
|
|
835
|
-
// TODO: Shouldn't we also delete all aliases associated with this node?
|
|
836
|
-
nodes.delete(nodeIdKey);
|
|
837
|
-
nodeToParent.delete(nodeIdKey);
|
|
752
|
+
nodeMap.delete([nodeId.revision, nodeId.localId]);
|
|
838
753
|
return undefined;
|
|
839
754
|
}
|
|
840
755
|
else {
|
|
841
|
-
(0,
|
|
756
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(nodeMap, nodeId, prunedChange);
|
|
842
757
|
return nodeId;
|
|
843
758
|
}
|
|
844
759
|
}
|
|
845
|
-
|
|
846
|
-
const
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
const updatedFields = this.replaceFieldMapRevisions(change.fieldChanges, oldRevisions, newRevision);
|
|
850
|
-
const updatedNodes = (0, index_js_2.newTupleBTree)();
|
|
851
|
-
for (const [[revision, id], nodeChangeset] of change.nodeChanges.entries()) {
|
|
852
|
-
updatedNodes.set([replaceRevision(revision, oldRevisions, newRevision), id], this.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision));
|
|
853
|
-
}
|
|
854
|
-
const updatedNodeToParent = (0, index_js_2.newTupleBTree)();
|
|
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));
|
|
760
|
+
getRevisions(change) {
|
|
761
|
+
const aggregated = new Set();
|
|
762
|
+
for (const revInfo of change.revisions ?? [{ revision: undefined }]) {
|
|
763
|
+
aggregated.add(revInfo.revision);
|
|
857
764
|
}
|
|
765
|
+
return aggregated;
|
|
766
|
+
}
|
|
767
|
+
changeRevision(change, replacer) {
|
|
768
|
+
const updatedFields = this.replaceFieldMapRevisions(change.fieldChanges, replacer);
|
|
769
|
+
const updatedNodes = replaceIdMapRevisions(change.nodeChanges, replacer, (nodeChangeset) => this.replaceNodeChangesetRevisions(nodeChangeset, replacer));
|
|
770
|
+
const updatedNodeToParent = replaceIdMapRevisions(change.nodeToParent, replacer, (fieldId) => replaceFieldIdRevision(normalizeFieldId(fieldId, change.nodeAliases), replacer));
|
|
858
771
|
const updated = {
|
|
859
772
|
...change,
|
|
860
773
|
fieldChanges: updatedFields,
|
|
861
774
|
nodeChanges: updatedNodes,
|
|
862
775
|
nodeToParent: updatedNodeToParent,
|
|
863
|
-
rootNodes: replaceRootTableRevision(change.rootNodes, oldRevisions, newRevision, change.nodeAliases),
|
|
864
776
|
// We've updated all references to old node IDs, so we no longer need an alias table.
|
|
865
|
-
nodeAliases: (0,
|
|
866
|
-
crossFieldKeys: change.crossFieldKeys
|
|
777
|
+
nodeAliases: (0, index_js_3.newTupleBTree)(),
|
|
778
|
+
crossFieldKeys: replaceCrossFieldKeyTableRevisions(change.crossFieldKeys, replacer, change.nodeAliases),
|
|
867
779
|
};
|
|
868
780
|
if (change.builds !== undefined) {
|
|
869
|
-
updated.builds = replaceIdMapRevisions(change.builds,
|
|
781
|
+
updated.builds = replaceIdMapRevisions(change.builds, replacer);
|
|
870
782
|
}
|
|
871
783
|
if (change.destroys !== undefined) {
|
|
872
|
-
updated.destroys = replaceIdMapRevisions(change.destroys,
|
|
784
|
+
updated.destroys = replaceIdMapRevisions(change.destroys, replacer);
|
|
873
785
|
}
|
|
874
786
|
if (change.refreshers !== undefined) {
|
|
875
|
-
updated.refreshers = replaceIdMapRevisions(change.refreshers,
|
|
876
|
-
}
|
|
877
|
-
if (newRevision !== undefined) {
|
|
878
|
-
const revInfo = { revision: newRevision };
|
|
879
|
-
if (rollbackOf !== undefined) {
|
|
880
|
-
revInfo.rollbackOf = rollbackOf;
|
|
881
|
-
}
|
|
882
|
-
updated.revisions = [revInfo];
|
|
883
|
-
}
|
|
884
|
-
else {
|
|
885
|
-
delete updated.revisions;
|
|
787
|
+
updated.refreshers = replaceIdMapRevisions(change.refreshers, replacer);
|
|
886
788
|
}
|
|
789
|
+
updated.revisions = [{ revision: replacer.updatedRevision }];
|
|
887
790
|
return updated;
|
|
888
791
|
}
|
|
889
|
-
replaceNodeChangesetRevisions(nodeChangeset,
|
|
792
|
+
replaceNodeChangesetRevisions(nodeChangeset, replacer) {
|
|
890
793
|
const updated = { ...nodeChangeset };
|
|
891
794
|
if (nodeChangeset.fieldChanges !== undefined) {
|
|
892
|
-
updated.fieldChanges = this.replaceFieldMapRevisions(nodeChangeset.fieldChanges,
|
|
795
|
+
updated.fieldChanges = this.replaceFieldMapRevisions(nodeChangeset.fieldChanges, replacer);
|
|
893
796
|
}
|
|
894
797
|
return updated;
|
|
895
798
|
}
|
|
896
|
-
replaceFieldMapRevisions(fields,
|
|
799
|
+
replaceFieldMapRevisions(fields, replacer) {
|
|
897
800
|
const updatedFields = new Map();
|
|
898
801
|
for (const [field, fieldChange] of fields) {
|
|
899
|
-
const updatedFieldChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.replaceRevisions(fieldChange.change,
|
|
900
|
-
updatedFields.set(field, { ...fieldChange, change: (0,
|
|
802
|
+
const updatedFieldChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.replaceRevisions(fieldChange.change, replacer);
|
|
803
|
+
updatedFields.set(field, { ...fieldChange, change: (0, index_js_3.brand)(updatedFieldChange) });
|
|
901
804
|
}
|
|
902
805
|
return updatedFields;
|
|
903
806
|
}
|
|
904
807
|
makeCrossFieldKeyTable(fields, nodes) {
|
|
905
|
-
const keys = (0, modularChangeTypes_js_1.
|
|
808
|
+
const keys = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
|
|
906
809
|
this.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);
|
|
907
810
|
nodes.forEachPair(([revision, localId], node) => {
|
|
908
811
|
if (node.fieldChanges !== undefined) {
|
|
@@ -922,61 +825,48 @@ class ModularChangeFamily {
|
|
|
922
825
|
}
|
|
923
826
|
}
|
|
924
827
|
}
|
|
925
|
-
buildEditor(changeReceiver) {
|
|
926
|
-
return new ModularEditBuilder(this, this.fieldKinds, changeReceiver);
|
|
828
|
+
buildEditor(mintRevisionTag, changeReceiver) {
|
|
829
|
+
return new ModularEditBuilder(this, this.fieldKinds, changeReceiver, this.codecOptions);
|
|
927
830
|
}
|
|
928
831
|
createEmptyFieldChange(fieldKind) {
|
|
929
832
|
const emptyChange = getChangeHandler(this.fieldKinds, fieldKind).createEmpty();
|
|
930
|
-
return { fieldKind, change: (0,
|
|
833
|
+
return { fieldKind, change: (0, index_js_3.brand)(emptyChange) };
|
|
931
834
|
}
|
|
932
835
|
validateChangeset(change) {
|
|
933
|
-
|
|
934
|
-
const unreachableCFKs = change.crossFieldKeys.clone();
|
|
935
|
-
this.validateFieldChanges(change, change.fieldChanges, undefined, unreachableNodes, unreachableCFKs);
|
|
836
|
+
let numNodes = this.validateFieldChanges(change, change.fieldChanges, undefined);
|
|
936
837
|
for (const [[revision, localId], node] of change.nodeChanges.entries()) {
|
|
937
838
|
if (node.fieldChanges === undefined) {
|
|
938
839
|
continue;
|
|
939
840
|
}
|
|
940
|
-
const nodeId =
|
|
941
|
-
this.validateFieldChanges(change, node.fieldChanges, nodeId
|
|
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
|
-
}
|
|
841
|
+
const nodeId = { revision, localId };
|
|
842
|
+
const numChildren = this.validateFieldChanges(change, node.fieldChanges, nodeId);
|
|
843
|
+
numNodes += numChildren;
|
|
953
844
|
}
|
|
954
|
-
(0, internal_1.assert)(
|
|
955
|
-
(0, internal_1.assert)(unreachableCFKs.entries().length === 0, "Unreachable cross-field keys found");
|
|
845
|
+
(0, internal_1.assert)(numNodes === change.nodeChanges.size, 0xa4d /* Node table contains unparented nodes */);
|
|
956
846
|
}
|
|
957
847
|
/**
|
|
958
|
-
* Asserts that each
|
|
959
|
-
*
|
|
848
|
+
* Asserts that each child and cross field key in each field has a correct entry in
|
|
849
|
+
* `nodeToParent` or `crossFieldKeyTable`.
|
|
960
850
|
* @returns the number of children found.
|
|
961
851
|
*/
|
|
962
|
-
validateFieldChanges(change, fieldChanges, nodeParent
|
|
852
|
+
validateFieldChanges(change, fieldChanges, nodeParent) {
|
|
853
|
+
let numChildren = 0;
|
|
963
854
|
for (const [field, fieldChange] of fieldChanges.entries()) {
|
|
964
855
|
const fieldId = { nodeId: nodeParent, field };
|
|
965
856
|
const handler = getChangeHandler(this.fieldKinds, fieldChange.fieldKind);
|
|
966
857
|
for (const [child, _index] of handler.getNestedChanges(fieldChange.change)) {
|
|
967
|
-
const parentFieldId =
|
|
968
|
-
(0, internal_1.assert)(
|
|
969
|
-
|
|
858
|
+
const parentFieldId = getParentFieldId(change, child);
|
|
859
|
+
(0, internal_1.assert)(areEqualFieldIds(parentFieldId, fieldId), 0xa4e /* Inconsistent node parentage */);
|
|
860
|
+
numChildren += 1;
|
|
970
861
|
}
|
|
971
862
|
for (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {
|
|
972
863
|
const fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);
|
|
973
|
-
(0, internal_1.assert)(fields.length
|
|
974
|
-
|
|
975
|
-
(0,
|
|
976
|
-
}
|
|
977
|
-
unreachableCFKs.delete(keyRange.key, keyRange.count);
|
|
864
|
+
(0, internal_1.assert)(fields.length === 1 &&
|
|
865
|
+
fields[0] !== undefined &&
|
|
866
|
+
areEqualFieldIds(fields[0], fieldId), 0xa4f /* Inconsistent cross field keys */);
|
|
978
867
|
}
|
|
979
868
|
}
|
|
869
|
+
return numChildren;
|
|
980
870
|
}
|
|
981
871
|
getEffectiveChange(change) {
|
|
982
872
|
if (hasConflicts(change)) {
|
|
@@ -990,10 +880,9 @@ class ModularChangeFamily {
|
|
|
990
880
|
muteChange(change) {
|
|
991
881
|
const muted = {
|
|
992
882
|
...change,
|
|
993
|
-
|
|
994
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
883
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
995
884
|
fieldChanges: this.muteFieldChanges(change.fieldChanges),
|
|
996
|
-
nodeChanges: (0,
|
|
885
|
+
nodeChanges: (0, index_js_3.brand)(change.nodeChanges.mapValues((v) => this.muteNodeChange(v))),
|
|
997
886
|
};
|
|
998
887
|
return muted;
|
|
999
888
|
}
|
|
@@ -1013,26 +902,35 @@ class ModularChangeFamily {
|
|
|
1013
902
|
const handler = getChangeHandler(this.fieldKinds, change.fieldKind);
|
|
1014
903
|
return {
|
|
1015
904
|
fieldKind: change.fieldKind,
|
|
1016
|
-
change: (0,
|
|
905
|
+
change: (0, index_js_3.brand)(handler.rebaser.mute(change.change)),
|
|
1017
906
|
};
|
|
1018
907
|
}
|
|
1019
908
|
}
|
|
1020
909
|
exports.ModularChangeFamily = ModularChangeFamily;
|
|
1021
910
|
ModularChangeFamily.emptyChange = makeModularChangeset();
|
|
1022
|
-
function
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
911
|
+
function replaceCrossFieldKeyTableRevisions(table, replacer, nodeAliases) {
|
|
912
|
+
const updated = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
|
|
913
|
+
for (const entry of table.entries()) {
|
|
914
|
+
const key = entry.start;
|
|
915
|
+
const updatedKey = replacer.getUpdatedAtomId(key);
|
|
916
|
+
const field = entry.value;
|
|
917
|
+
const normalizedFieldId = normalizeFieldId(field, nodeAliases);
|
|
918
|
+
const updatedNodeId = normalizedFieldId.nodeId === undefined
|
|
919
|
+
? undefined
|
|
920
|
+
: replacer.getUpdatedAtomId(normalizedFieldId.nodeId);
|
|
921
|
+
const updatedValue = {
|
|
922
|
+
...normalizedFieldId,
|
|
923
|
+
nodeId: updatedNodeId,
|
|
924
|
+
};
|
|
925
|
+
updated.set(updatedKey, entry.length, updatedValue);
|
|
926
|
+
}
|
|
927
|
+
return updated;
|
|
1031
928
|
}
|
|
1032
|
-
function replaceIdMapRevisions(map,
|
|
1033
|
-
const updated = (0,
|
|
1034
|
-
for (const [[revision,
|
|
1035
|
-
|
|
929
|
+
function replaceIdMapRevisions(map, replacer, valueMapper = (value) => value) {
|
|
930
|
+
const updated = (0, index_js_3.newTupleBTree)();
|
|
931
|
+
for (const [[revision, localId], value] of map.entries()) {
|
|
932
|
+
const newAtom = replacer.getUpdatedAtomId({ revision, localId });
|
|
933
|
+
updated.set([newAtom.revision, newAtom.localId], valueMapper(value));
|
|
1036
934
|
}
|
|
1037
935
|
return updated;
|
|
1038
936
|
}
|
|
@@ -1047,9 +945,9 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
|
|
|
1047
945
|
// Note that it would in principle be possible to adopt the later build and exclude from the
|
|
1048
946
|
// composition all the changes already reflected on the tree, but that is not something we
|
|
1049
947
|
// care to support at this time.
|
|
1050
|
-
const allBuilds = (0,
|
|
1051
|
-
const allDestroys = (0,
|
|
1052
|
-
const allRefreshers = (0,
|
|
948
|
+
const allBuilds = (0, index_js_3.brand)((0, index_js_3.mergeTupleBTrees)(change1.builds ?? (0, index_js_3.newTupleBTree)(), change2.builds ?? (0, index_js_3.newTupleBTree)(), true));
|
|
949
|
+
const allDestroys = (0, index_js_3.brand)((0, index_js_3.mergeTupleBTrees)(change1.destroys ?? (0, index_js_3.newTupleBTree)(), change2.destroys ?? (0, index_js_3.newTupleBTree)()));
|
|
950
|
+
const allRefreshers = (0, index_js_3.brand)((0, index_js_3.mergeTupleBTrees)(change1.refreshers ?? (0, index_js_3.newTupleBTree)(), change2.refreshers ?? (0, index_js_3.newTupleBTree)(), true));
|
|
1053
951
|
if (change1.destroys !== undefined && change2.builds !== undefined) {
|
|
1054
952
|
for (const [key, chunk] of change2.builds.entries()) {
|
|
1055
953
|
const destroyCount = change1.destroys.get(key);
|
|
@@ -1070,24 +968,11 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
|
|
|
1070
968
|
}
|
|
1071
969
|
}
|
|
1072
970
|
}
|
|
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
|
-
}
|
|
1086
971
|
return { allBuilds, allDestroys, allRefreshers };
|
|
1087
972
|
}
|
|
1088
973
|
function invertBuilds(builds) {
|
|
1089
974
|
if (builds !== undefined) {
|
|
1090
|
-
return (0,
|
|
975
|
+
return (0, index_js_3.brand)(builds.mapValues((chunk) => chunk.topLevelLength));
|
|
1091
976
|
}
|
|
1092
977
|
return undefined;
|
|
1093
978
|
}
|
|
@@ -1107,53 +992,19 @@ function invertBuilds(builds) {
|
|
|
1107
992
|
* @param fieldKinds - The field kinds to delegate to.
|
|
1108
993
|
*/
|
|
1109
994
|
function* relevantRemovedRoots(change, fieldKinds) {
|
|
1110
|
-
|
|
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
|
-
}
|
|
995
|
+
yield* relevantRemovedRootsFromFields(change.fieldChanges, change.nodeChanges, fieldKinds);
|
|
1122
996
|
}
|
|
1123
997
|
exports.relevantRemovedRoots = relevantRemovedRoots;
|
|
1124
|
-
function*
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
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
|
-
}
|
|
1144
|
-
}
|
|
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);
|
|
998
|
+
function* relevantRemovedRootsFromFields(change, nodeChanges, fieldKinds) {
|
|
999
|
+
for (const [_, fieldChange] of change) {
|
|
1000
|
+
const handler = getChangeHandler(fieldKinds, fieldChange.fieldKind);
|
|
1001
|
+
const delegate = function* (node) {
|
|
1002
|
+
const nodeChangeset = nodeChangeFromId(nodeChanges, node);
|
|
1003
|
+
if (nodeChangeset.fieldChanges !== undefined) {
|
|
1004
|
+
yield* relevantRemovedRootsFromFields(nodeChangeset.fieldChanges, nodeChanges, fieldKinds);
|
|
1155
1005
|
}
|
|
1156
|
-
}
|
|
1006
|
+
};
|
|
1007
|
+
yield* handler.relevantRemovedRoots(fieldChange.change, delegate);
|
|
1157
1008
|
}
|
|
1158
1009
|
}
|
|
1159
1010
|
/**
|
|
@@ -1168,11 +1019,11 @@ function addRenamesToSet(change, rootIds) {
|
|
|
1168
1019
|
* corresponding build or refresher.
|
|
1169
1020
|
*/
|
|
1170
1021
|
function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshers = true) {
|
|
1171
|
-
const refreshers = (0,
|
|
1022
|
+
const refreshers = (0, index_js_3.newTupleBTree)();
|
|
1172
1023
|
const chunkLengths = new Map();
|
|
1173
1024
|
if (change.builds !== undefined) {
|
|
1174
1025
|
for (const [[revision, id], chunk] of change.builds.entries()) {
|
|
1175
|
-
const lengthTree = (0,
|
|
1026
|
+
const lengthTree = (0, index_js_3.getOrCreate)(chunkLengths, revision, () => new sorted_btree_es6_1.BTree());
|
|
1176
1027
|
lengthTree.set(id, chunk.topLevelLength);
|
|
1177
1028
|
}
|
|
1178
1029
|
}
|
|
@@ -1196,17 +1047,16 @@ function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshe
|
|
|
1196
1047
|
(0, internal_1.assert)(!requireRefreshers, 0x8cd /* detached node should exist */);
|
|
1197
1048
|
}
|
|
1198
1049
|
else {
|
|
1199
|
-
refreshers.set([root.major, (0,
|
|
1050
|
+
refreshers.set([root.major, (0, index_js_3.brand)(root.minor)], node);
|
|
1200
1051
|
}
|
|
1201
1052
|
}
|
|
1202
|
-
const { fieldChanges, nodeChanges, maxId, revisions, constraintViolationCount, constraintViolationCountOnRevert, builds, destroys, } = change;
|
|
1053
|
+
const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, maxId, revisions, constraintViolationCount, constraintViolationCountOnRevert, builds, destroys, } = change;
|
|
1203
1054
|
return makeModularChangeset({
|
|
1204
1055
|
fieldChanges,
|
|
1205
1056
|
nodeChanges,
|
|
1206
|
-
nodeToParent
|
|
1207
|
-
nodeAliases
|
|
1208
|
-
|
|
1209
|
-
crossFieldKeys: change.crossFieldKeys,
|
|
1057
|
+
nodeToParent,
|
|
1058
|
+
nodeAliases,
|
|
1059
|
+
crossFieldKeys,
|
|
1210
1060
|
maxId: maxId,
|
|
1211
1061
|
revisions,
|
|
1212
1062
|
constraintViolationCount,
|
|
@@ -1226,24 +1076,11 @@ exports.updateRefreshers = updateRefreshers;
|
|
|
1226
1076
|
function intoDelta(taggedChange, fieldKinds) {
|
|
1227
1077
|
const change = taggedChange.change;
|
|
1228
1078
|
const rootDelta = {};
|
|
1079
|
+
const global = [];
|
|
1080
|
+
const rename = [];
|
|
1229
1081
|
if (!hasConflicts(change)) {
|
|
1230
1082
|
// If there are no constraint violations, then tree changes apply.
|
|
1231
|
-
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges,
|
|
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
|
-
}
|
|
1083
|
+
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds, global, rename);
|
|
1247
1084
|
if (fieldDeltas.size > 0) {
|
|
1248
1085
|
rootDelta.fields = fieldDeltas;
|
|
1249
1086
|
}
|
|
@@ -1262,7 +1099,7 @@ function intoDelta(taggedChange, fieldKinds) {
|
|
|
1262
1099
|
const destroys = [];
|
|
1263
1100
|
for (const [[major, minor], count] of change.destroys.entries()) {
|
|
1264
1101
|
destroys.push({
|
|
1265
|
-
id: (0,
|
|
1102
|
+
id: (0, index_js_2.makeDetachedNodeId)(major, minor),
|
|
1266
1103
|
count,
|
|
1267
1104
|
});
|
|
1268
1105
|
}
|
|
@@ -1280,7 +1117,7 @@ function copyDetachedNodes(detachedNodes) {
|
|
|
1280
1117
|
if (chunk.topLevelLength > 0) {
|
|
1281
1118
|
chunk.referenceAdded();
|
|
1282
1119
|
copiedDetachedNodes.push({
|
|
1283
|
-
id: (0,
|
|
1120
|
+
id: (0, index_js_2.makeDetachedNodeId)(major, minor),
|
|
1284
1121
|
trees: chunk,
|
|
1285
1122
|
});
|
|
1286
1123
|
}
|
|
@@ -1290,22 +1127,24 @@ function copyDetachedNodes(detachedNodes) {
|
|
|
1290
1127
|
/**
|
|
1291
1128
|
* @param change - The change to convert into a delta.
|
|
1292
1129
|
*/
|
|
1293
|
-
function intoDeltaImpl(change, nodeChanges,
|
|
1130
|
+
function intoDeltaImpl(change, nodeChanges, fieldKinds, global, rename) {
|
|
1294
1131
|
const delta = new Map();
|
|
1295
1132
|
for (const [field, fieldChange] of change) {
|
|
1296
|
-
const
|
|
1297
|
-
const nodeChange = nodeChangeFromId(nodeChanges,
|
|
1298
|
-
return deltaFromNodeChange(nodeChange, nodeChanges,
|
|
1133
|
+
const { local: fieldChanges, global: fieldGlobal, rename: fieldRename, } = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
|
|
1134
|
+
const nodeChange = nodeChangeFromId(nodeChanges, childChange);
|
|
1135
|
+
return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds, global, rename);
|
|
1299
1136
|
});
|
|
1300
|
-
if (
|
|
1301
|
-
delta.set(field,
|
|
1137
|
+
if (fieldChanges !== undefined && fieldChanges.length > 0) {
|
|
1138
|
+
delta.set(field, fieldChanges);
|
|
1302
1139
|
}
|
|
1140
|
+
fieldGlobal?.forEach((c) => global.push(c));
|
|
1141
|
+
fieldRename?.forEach((r) => rename.push(r));
|
|
1303
1142
|
}
|
|
1304
1143
|
return delta;
|
|
1305
1144
|
}
|
|
1306
|
-
function deltaFromNodeChange(change, nodeChanges,
|
|
1145
|
+
function deltaFromNodeChange(change, nodeChanges, fieldKinds, global, rename) {
|
|
1307
1146
|
if (change.fieldChanges !== undefined) {
|
|
1308
|
-
return intoDeltaImpl(change.fieldChanges, nodeChanges,
|
|
1147
|
+
return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds, global, rename);
|
|
1309
1148
|
}
|
|
1310
1149
|
// TODO: update the API to allow undefined to be returned here
|
|
1311
1150
|
return new Map();
|
|
@@ -1331,7 +1170,7 @@ function rebaseRevisionMetadataFromInfo(revInfos, revisionToRebase, baseRevision
|
|
|
1331
1170
|
}
|
|
1332
1171
|
const getBaseRevisions = () => filteredRevisions;
|
|
1333
1172
|
return {
|
|
1334
|
-
...(0,
|
|
1173
|
+
...(0, index_js_2.revisionMetadataSourceFromInfo)(revInfos),
|
|
1335
1174
|
getRevisionToRebase: () => revisionToRebase,
|
|
1336
1175
|
getBaseRevisions,
|
|
1337
1176
|
};
|
|
@@ -1355,22 +1194,30 @@ function getChangeHandler(fieldKinds, kind) {
|
|
|
1355
1194
|
return getFieldKind(fieldKinds, kind).changeHandler;
|
|
1356
1195
|
}
|
|
1357
1196
|
exports.getChangeHandler = getChangeHandler;
|
|
1358
|
-
function newComposeTable(baseChange, newChange,
|
|
1197
|
+
function newComposeTable(baseChange, newChange, composedNodeToParent) {
|
|
1359
1198
|
return {
|
|
1360
|
-
|
|
1361
|
-
entries: newDetachedEntryMap(),
|
|
1199
|
+
...newCrossFieldTable(),
|
|
1362
1200
|
baseChange,
|
|
1363
1201
|
newChange,
|
|
1364
1202
|
fieldToContext: new Map(),
|
|
1365
1203
|
newFieldToBaseField: new Map(),
|
|
1366
|
-
newToBaseNodeId: (0,
|
|
1204
|
+
newToBaseNodeId: (0, index_js_3.newTupleBTree)(),
|
|
1367
1205
|
composedNodes: new Set(),
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1206
|
+
composedNodeToParent,
|
|
1207
|
+
pendingCompositions: {
|
|
1208
|
+
nodeIdsToCompose: [],
|
|
1209
|
+
affectedBaseFields: (0, index_js_3.newTupleBTree)(),
|
|
1210
|
+
affectedNewFields: (0, index_js_3.newTupleBTree)(),
|
|
1211
|
+
},
|
|
1212
|
+
};
|
|
1213
|
+
}
|
|
1214
|
+
function newCrossFieldTable() {
|
|
1215
|
+
return {
|
|
1216
|
+
srcTable: (0, index_js_2.newChangeAtomIdRangeMap)(),
|
|
1217
|
+
dstTable: (0, index_js_2.newChangeAtomIdRangeMap)(),
|
|
1218
|
+
srcDependents: (0, index_js_2.newChangeAtomIdRangeMap)(),
|
|
1219
|
+
dstDependents: (0, index_js_2.newChangeAtomIdRangeMap)(),
|
|
1220
|
+
invalidatedFields: new Set(),
|
|
1374
1221
|
};
|
|
1375
1222
|
}
|
|
1376
1223
|
function newConstraintState(violationCount) {
|
|
@@ -1378,360 +1225,153 @@ function newConstraintState(violationCount) {
|
|
|
1378
1225
|
violationCount,
|
|
1379
1226
|
};
|
|
1380
1227
|
}
|
|
1381
|
-
class
|
|
1382
|
-
constructor(
|
|
1383
|
-
this.
|
|
1384
|
-
this.
|
|
1228
|
+
class CrossFieldManagerI {
|
|
1229
|
+
constructor(crossFieldTable, currentFieldKey, allowInval = true) {
|
|
1230
|
+
this.crossFieldTable = crossFieldTable;
|
|
1231
|
+
this.currentFieldKey = currentFieldKey;
|
|
1232
|
+
this.allowInval = allowInval;
|
|
1385
1233
|
}
|
|
1386
|
-
|
|
1387
|
-
if (
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
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);
|
|
1234
|
+
set(target, revision, id, count, newValue, invalidateDependents) {
|
|
1235
|
+
if (invalidateDependents && this.allowInval) {
|
|
1236
|
+
const lastChangedId = id + count - 1;
|
|
1237
|
+
let firstId = id;
|
|
1238
|
+
while (firstId <= lastChangedId) {
|
|
1239
|
+
const dependentEntry = (0, crossFieldQueries_js_1.getFirstFromCrossFieldMap)(this.getDependents(target), revision, firstId, lastChangedId - firstId + 1);
|
|
1240
|
+
if (dependentEntry.value !== undefined) {
|
|
1241
|
+
this.crossFieldTable.invalidatedFields.add(dependentEntry.value);
|
|
1404
1242
|
}
|
|
1243
|
+
firstId = (0, index_js_3.brand)(firstId + dependentEntry.length);
|
|
1405
1244
|
}
|
|
1406
1245
|
}
|
|
1246
|
+
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.getMap(target), revision, id, count, newValue);
|
|
1407
1247
|
}
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
let result;
|
|
1415
|
-
if (detachEntry.value !== undefined) {
|
|
1416
|
-
const moveEntry = this.table.entries.getFirst(attachId, countToProcess);
|
|
1417
|
-
result = { ...moveEntry, value: { nodeChange: moveEntry.value } };
|
|
1248
|
+
get(target, revision, id, count, addDependency) {
|
|
1249
|
+
if (addDependency) {
|
|
1250
|
+
// We assume that if there is already an entry for this ID it is because
|
|
1251
|
+
// a field handler has called compose on the same node multiple times.
|
|
1252
|
+
// In this case we only want to update the latest version, so we overwrite the dependency.
|
|
1253
|
+
(0, crossFieldQueries_js_1.setInCrossFieldMap)(this.getDependents(target), revision, id, count, this.currentFieldKey);
|
|
1418
1254
|
}
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
field: this.fieldId,
|
|
1431
|
-
});
|
|
1432
|
-
}
|
|
1433
|
-
return result;
|
|
1255
|
+
return (0, crossFieldQueries_js_1.getFirstFromCrossFieldMap)(this.getMap(target), revision, id, count);
|
|
1256
|
+
}
|
|
1257
|
+
getMap(target) {
|
|
1258
|
+
return target === crossFieldQueries_js_1.CrossFieldTarget.Source
|
|
1259
|
+
? this.crossFieldTable.srcTable
|
|
1260
|
+
: this.crossFieldTable.dstTable;
|
|
1261
|
+
}
|
|
1262
|
+
getDependents(target) {
|
|
1263
|
+
return target === crossFieldQueries_js_1.CrossFieldTarget.Source
|
|
1264
|
+
? this.crossFieldTable.srcDependents
|
|
1265
|
+
: this.crossFieldTable.dstDependents;
|
|
1434
1266
|
}
|
|
1435
1267
|
}
|
|
1436
|
-
class
|
|
1437
|
-
constructor(table, fieldId, allowInval = true) {
|
|
1438
|
-
|
|
1268
|
+
class InvertManager extends CrossFieldManagerI {
|
|
1269
|
+
constructor(table, field, fieldId, allowInval = true) {
|
|
1270
|
+
super(table, field, allowInval);
|
|
1439
1271
|
this.fieldId = fieldId;
|
|
1440
|
-
this.allowInval = allowInval;
|
|
1441
1272
|
}
|
|
1442
|
-
|
|
1443
|
-
|
|
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);
|
|
1553
|
-
}
|
|
1554
|
-
}
|
|
1273
|
+
onMoveIn(id) {
|
|
1274
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(this.table.invertedNodeToParent, id, this.fieldId);
|
|
1555
1275
|
}
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
(
|
|
1560
|
-
|
|
1561
|
-
(0, modularChangeTypes_js_1.setInChangeAtomIdMap)(nodeToParent, nodeId, { root: detachId });
|
|
1276
|
+
moveKey(target, revision, id, count) {
|
|
1277
|
+
(0, internal_1.assert)(false, 0x9c5 /* Keys should not be moved manually during invert */);
|
|
1278
|
+
}
|
|
1279
|
+
get table() {
|
|
1280
|
+
return this.crossFieldTable;
|
|
1562
1281
|
}
|
|
1563
|
-
table.detachLocations.set(detachId, 1, detachLocation);
|
|
1564
1282
|
}
|
|
1565
|
-
class
|
|
1566
|
-
constructor(table, fieldId, allowInval = true) {
|
|
1567
|
-
|
|
1283
|
+
class RebaseManager extends CrossFieldManagerI {
|
|
1284
|
+
constructor(table, currentField, fieldId, allowInval = true) {
|
|
1285
|
+
super(table, currentField, allowInval);
|
|
1568
1286
|
this.fieldId = fieldId;
|
|
1569
|
-
this.allowInval = allowInval;
|
|
1570
1287
|
}
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
const
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
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);
|
|
1288
|
+
set(target, revision, id, count, newValue, invalidateDependents) {
|
|
1289
|
+
if (invalidateDependents && this.allowInval) {
|
|
1290
|
+
const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
|
|
1291
|
+
target,
|
|
1292
|
+
revision,
|
|
1293
|
+
localId: id,
|
|
1294
|
+
}, count);
|
|
1295
|
+
(0, internal_1.assert)(newFieldIds.length === 0, 0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */);
|
|
1296
|
+
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
|
|
1297
|
+
target,
|
|
1298
|
+
revision,
|
|
1299
|
+
localId: id,
|
|
1300
|
+
}, count);
|
|
1301
|
+
(0, internal_1.assert)(baseFieldIds.length > 0, 0x9c7 /* Cross field key not registered in base or new change */);
|
|
1302
|
+
for (const baseFieldId of baseFieldIds) {
|
|
1303
|
+
this.table.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
|
|
1664
1304
|
}
|
|
1665
1305
|
}
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1306
|
+
super.set(target, revision, id, count, newValue, invalidateDependents);
|
|
1307
|
+
}
|
|
1308
|
+
onMoveIn(id) {
|
|
1309
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(this.table.rebasedNodeToParent, id, this.fieldId);
|
|
1310
|
+
}
|
|
1311
|
+
moveKey(target, revision, id, count) {
|
|
1312
|
+
this.table.rebasedCrossFieldKeys.set({ target, revision, localId: id }, count, this.fieldId);
|
|
1313
|
+
}
|
|
1314
|
+
get table() {
|
|
1315
|
+
return this.crossFieldTable;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
// TODO: Deduplicate this with RebaseTable
|
|
1319
|
+
class ComposeManager extends CrossFieldManagerI {
|
|
1320
|
+
constructor(table, currentField, fieldId, allowInval = true) {
|
|
1321
|
+
super(table, currentField, allowInval);
|
|
1322
|
+
this.fieldId = fieldId;
|
|
1323
|
+
}
|
|
1324
|
+
set(target, revision, id, count, newValue, invalidateDependents) {
|
|
1325
|
+
if (invalidateDependents && this.allowInval) {
|
|
1326
|
+
const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
|
|
1327
|
+
target,
|
|
1328
|
+
revision,
|
|
1329
|
+
localId: id,
|
|
1330
|
+
}, count);
|
|
1331
|
+
if (newFieldIds.length > 0) {
|
|
1332
|
+
for (const newFieldId of newFieldIds) {
|
|
1333
|
+
this.table.pendingCompositions.affectedNewFields.set([newFieldId.nodeId?.revision, newFieldId.nodeId?.localId, newFieldId.field], true);
|
|
1334
|
+
}
|
|
1670
1335
|
}
|
|
1671
1336
|
else {
|
|
1672
|
-
|
|
1337
|
+
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
|
|
1338
|
+
target,
|
|
1339
|
+
revision,
|
|
1340
|
+
localId: id,
|
|
1341
|
+
}, count);
|
|
1342
|
+
(0, internal_1.assert)(baseFieldIds.length > 0, 0x9c8 /* Cross field key not registered in base or new change */);
|
|
1343
|
+
for (const baseFieldId of baseFieldIds) {
|
|
1344
|
+
this.table.pendingCompositions.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
|
|
1345
|
+
}
|
|
1673
1346
|
}
|
|
1674
1347
|
}
|
|
1348
|
+
super.set(target, revision, id, count, newValue, invalidateDependents);
|
|
1675
1349
|
}
|
|
1676
|
-
|
|
1677
|
-
|
|
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
|
-
}
|
|
1350
|
+
onMoveIn(id) {
|
|
1351
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(this.table.composedNodeToParent, id, this.fieldId);
|
|
1709
1352
|
}
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
}
|
|
1353
|
+
moveKey(target, revision, id, count) {
|
|
1354
|
+
throw new Error("Moving cross-field keys during compose is currently unsupported");
|
|
1355
|
+
}
|
|
1356
|
+
get table() {
|
|
1357
|
+
return this.crossFieldTable;
|
|
1716
1358
|
}
|
|
1717
1359
|
}
|
|
1718
1360
|
function makeModularChangeset(props = {
|
|
1719
1361
|
maxId: -1,
|
|
1720
1362
|
}) {
|
|
1721
1363
|
const changeset = {
|
|
1722
|
-
rebaseVersion: props.rebaseVersion ?? 1,
|
|
1723
1364
|
fieldChanges: props.fieldChanges ?? new Map(),
|
|
1724
|
-
nodeChanges: props.nodeChanges ?? (0,
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldRangeTable)(),
|
|
1365
|
+
nodeChanges: props.nodeChanges ?? (0, index_js_3.newTupleBTree)(),
|
|
1366
|
+
nodeToParent: props.nodeToParent ?? (0, index_js_3.newTupleBTree)(),
|
|
1367
|
+
nodeAliases: props.nodeAliases ?? (0, index_js_3.newTupleBTree)(),
|
|
1368
|
+
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1729
1369
|
};
|
|
1730
1370
|
if (props.revisions !== undefined && props.revisions.length > 0) {
|
|
1731
1371
|
changeset.revisions = props.revisions;
|
|
1732
1372
|
}
|
|
1733
1373
|
if (props.maxId >= 0) {
|
|
1734
|
-
changeset.maxId = (0,
|
|
1374
|
+
changeset.maxId = (0, index_js_3.brand)(props.maxId);
|
|
1735
1375
|
}
|
|
1736
1376
|
if (props.constraintViolationCount !== undefined && props.constraintViolationCount > 0) {
|
|
1737
1377
|
changeset.constraintViolationCount = props.constraintViolationCount;
|
|
@@ -1740,6 +1380,12 @@ function makeModularChangeset(props = {
|
|
|
1740
1380
|
props.constraintViolationCountOnRevert > 0) {
|
|
1741
1381
|
changeset.constraintViolationCountOnRevert = props.constraintViolationCountOnRevert;
|
|
1742
1382
|
}
|
|
1383
|
+
if (props.noChangeConstraint !== undefined) {
|
|
1384
|
+
changeset.noChangeConstraint = props.noChangeConstraint;
|
|
1385
|
+
}
|
|
1386
|
+
if (props.noChangeConstraintOnRevert !== undefined) {
|
|
1387
|
+
changeset.noChangeConstraintOnRevert = props.noChangeConstraintOnRevert;
|
|
1388
|
+
}
|
|
1743
1389
|
if (props.builds !== undefined && props.builds.size > 0) {
|
|
1744
1390
|
changeset.builds = props.builds;
|
|
1745
1391
|
}
|
|
@@ -1751,27 +1397,25 @@ function makeModularChangeset(props = {
|
|
|
1751
1397
|
}
|
|
1752
1398
|
return changeset;
|
|
1753
1399
|
}
|
|
1754
|
-
class ModularEditBuilder extends
|
|
1755
|
-
constructor(family, fieldKinds, changeReceiver) {
|
|
1400
|
+
class ModularEditBuilder extends index_js_2.EditBuilder {
|
|
1401
|
+
constructor(family, fieldKinds, changeReceiver, codecOptions) {
|
|
1756
1402
|
super(family, changeReceiver);
|
|
1757
1403
|
this.fieldKinds = fieldKinds;
|
|
1758
1404
|
this.transactionDepth = 0;
|
|
1759
|
-
this.idAllocator = (0,
|
|
1760
|
-
|
|
1761
|
-
isInTransaction() {
|
|
1762
|
-
return this.transactionDepth > 0;
|
|
1405
|
+
this.idAllocator = (0, index_js_3.idAllocatorFromMaxId)();
|
|
1406
|
+
this.codecOptions = codecOptions;
|
|
1763
1407
|
}
|
|
1764
1408
|
enterTransaction() {
|
|
1765
1409
|
this.transactionDepth += 1;
|
|
1766
1410
|
if (this.transactionDepth === 1) {
|
|
1767
|
-
this.idAllocator = (0,
|
|
1411
|
+
this.idAllocator = (0, index_js_3.idAllocatorFromMaxId)();
|
|
1768
1412
|
}
|
|
1769
1413
|
}
|
|
1770
1414
|
exitTransaction() {
|
|
1771
1415
|
(0, internal_1.assert)(this.transactionDepth > 0, 0x5b9 /* Cannot exit inexistent transaction */);
|
|
1772
1416
|
this.transactionDepth -= 1;
|
|
1773
1417
|
if (this.transactionDepth === 0) {
|
|
1774
|
-
this.idAllocator = (0,
|
|
1418
|
+
this.idAllocator = (0, index_js_3.idAllocatorFromMaxId)();
|
|
1775
1419
|
}
|
|
1776
1420
|
}
|
|
1777
1421
|
/**
|
|
@@ -1789,7 +1433,7 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1789
1433
|
}
|
|
1790
1434
|
// This content will be added to a GlobalEditDescription whose lifetime exceeds the scope of this function.
|
|
1791
1435
|
content.referenceAdded();
|
|
1792
|
-
const builds = (0,
|
|
1436
|
+
const builds = (0, index_js_3.newTupleBTree)();
|
|
1793
1437
|
builds.set([revision, firstId], content);
|
|
1794
1438
|
return {
|
|
1795
1439
|
type: "global",
|
|
@@ -1809,29 +1453,27 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1809
1453
|
const modularChange = buildModularChangesetFromField({
|
|
1810
1454
|
path: field,
|
|
1811
1455
|
fieldChange: { fieldKind, change },
|
|
1812
|
-
nodeChanges: (0,
|
|
1813
|
-
nodeToParent: (0,
|
|
1814
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1815
|
-
rootNodes: newRootTable(),
|
|
1456
|
+
nodeChanges: (0, index_js_3.newTupleBTree)(),
|
|
1457
|
+
nodeToParent: (0, index_js_3.newTupleBTree)(),
|
|
1458
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1816
1459
|
idAllocator: this.idAllocator,
|
|
1817
1460
|
localCrossFieldKeys,
|
|
1818
1461
|
revision,
|
|
1819
1462
|
});
|
|
1820
|
-
this.applyChange((0,
|
|
1463
|
+
this.applyChange((0, index_js_2.tagChange)(modularChange, revision));
|
|
1821
1464
|
}
|
|
1822
1465
|
submitChanges(changes, revision) {
|
|
1823
1466
|
const modularChange = this.buildChanges(changes);
|
|
1824
|
-
this.applyChange((0,
|
|
1467
|
+
this.applyChange((0, index_js_2.tagChange)(modularChange, revision));
|
|
1825
1468
|
}
|
|
1826
1469
|
buildChanges(changes) {
|
|
1827
1470
|
const revisions = new Set();
|
|
1828
1471
|
const changeMaps = changes.map((change) => {
|
|
1829
1472
|
revisions.add(change.revision);
|
|
1830
|
-
return (0,
|
|
1473
|
+
return (0, index_js_2.makeAnonChange)(change.type === "global"
|
|
1831
1474
|
? makeModularChangeset({
|
|
1832
1475
|
maxId: this.idAllocator.getMaxId(),
|
|
1833
1476
|
builds: change.builds,
|
|
1834
|
-
rootNodes: renameTableFromRenameDescriptions(change.renames ?? []),
|
|
1835
1477
|
revisions: [{ revision: change.revision }],
|
|
1836
1478
|
})
|
|
1837
1479
|
: buildModularChangesetFromField({
|
|
@@ -1840,40 +1482,38 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1840
1482
|
fieldKind: change.fieldKind,
|
|
1841
1483
|
change: change.change,
|
|
1842
1484
|
},
|
|
1843
|
-
nodeChanges: (0,
|
|
1844
|
-
nodeToParent: (0,
|
|
1845
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1846
|
-
rootNodes: newRootTable(),
|
|
1485
|
+
nodeChanges: (0, index_js_3.newTupleBTree)(),
|
|
1486
|
+
nodeToParent: (0, index_js_3.newTupleBTree)(),
|
|
1487
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1847
1488
|
idAllocator: this.idAllocator,
|
|
1848
1489
|
localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
|
|
1849
1490
|
revision: change.revision,
|
|
1850
1491
|
}));
|
|
1851
1492
|
});
|
|
1852
|
-
const revInfo =
|
|
1493
|
+
const revInfo = [...revisions].map((revision) => ({ revision }));
|
|
1853
1494
|
const composedChange = {
|
|
1854
1495
|
...this.changeFamily.rebaser.compose(changeMaps),
|
|
1855
1496
|
revisions: revInfo,
|
|
1856
1497
|
};
|
|
1857
|
-
const maxId = (0,
|
|
1498
|
+
const maxId = (0, index_js_3.brand)(this.idAllocator.getMaxId());
|
|
1858
1499
|
if (maxId >= 0) {
|
|
1859
1500
|
composedChange.maxId = maxId;
|
|
1860
1501
|
}
|
|
1861
1502
|
return composedChange;
|
|
1862
1503
|
}
|
|
1863
1504
|
generateId(count) {
|
|
1864
|
-
return (0,
|
|
1505
|
+
return (0, index_js_3.brand)(this.idAllocator.allocate(count));
|
|
1865
1506
|
}
|
|
1866
1507
|
addNodeExistsConstraint(path, revision) {
|
|
1867
1508
|
const nodeChange = {
|
|
1868
1509
|
nodeExistsConstraint: { violated: false },
|
|
1869
1510
|
};
|
|
1870
|
-
this.applyChange((0,
|
|
1511
|
+
this.applyChange((0, index_js_2.tagChange)(buildModularChangesetFromNode({
|
|
1871
1512
|
path,
|
|
1872
1513
|
nodeChange,
|
|
1873
|
-
nodeChanges: (0,
|
|
1874
|
-
nodeToParent: (0,
|
|
1875
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1876
|
-
rootNodes: newRootTable(),
|
|
1514
|
+
nodeChanges: (0, index_js_3.newTupleBTree)(),
|
|
1515
|
+
nodeToParent: (0, index_js_3.newTupleBTree)(),
|
|
1516
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1877
1517
|
idAllocator: this.idAllocator,
|
|
1878
1518
|
revision,
|
|
1879
1519
|
}), revision));
|
|
@@ -1882,33 +1522,49 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1882
1522
|
const nodeChange = {
|
|
1883
1523
|
nodeExistsConstraintOnRevert: { violated: false },
|
|
1884
1524
|
};
|
|
1885
|
-
this.applyChange((0,
|
|
1525
|
+
this.applyChange((0, index_js_2.tagChange)(buildModularChangesetFromNode({
|
|
1886
1526
|
path,
|
|
1887
1527
|
nodeChange,
|
|
1888
|
-
nodeChanges: (0,
|
|
1889
|
-
nodeToParent: (0,
|
|
1890
|
-
crossFieldKeys: (0, modularChangeTypes_js_1.
|
|
1891
|
-
rootNodes: newRootTable(),
|
|
1528
|
+
nodeChanges: (0, index_js_3.newTupleBTree)(),
|
|
1529
|
+
nodeToParent: (0, index_js_3.newTupleBTree)(),
|
|
1530
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1892
1531
|
idAllocator: this.idAllocator,
|
|
1893
1532
|
revision,
|
|
1894
1533
|
}), revision));
|
|
1895
1534
|
}
|
|
1535
|
+
addNoChangeConstraint(revision) {
|
|
1536
|
+
if ((0, semver_ts_1.lt)(this.codecOptions.minVersionForCollab, index_js_1.FluidClientVersion.v2_80)) {
|
|
1537
|
+
throw new internal_2.UsageError(`No change constraints require min client version of at least ${index_js_1.FluidClientVersion.v2_80}`);
|
|
1538
|
+
}
|
|
1539
|
+
const changeset = makeModularChangeset({
|
|
1540
|
+
maxId: -1,
|
|
1541
|
+
noChangeConstraint: { violated: false },
|
|
1542
|
+
});
|
|
1543
|
+
this.applyChange((0, index_js_2.tagChange)(changeset, revision));
|
|
1544
|
+
}
|
|
1545
|
+
addNoChangeConstraintOnRevert(revision) {
|
|
1546
|
+
if ((0, semver_ts_1.lt)(this.codecOptions.minVersionForCollab, index_js_1.FluidClientVersion.v2_80)) {
|
|
1547
|
+
throw new internal_2.UsageError(`No change constraints require min client version of at least ${index_js_1.FluidClientVersion.v2_80}`);
|
|
1548
|
+
}
|
|
1549
|
+
const changeset = makeModularChangeset({
|
|
1550
|
+
maxId: -1,
|
|
1551
|
+
noChangeConstraintOnRevert: { violated: false },
|
|
1552
|
+
});
|
|
1553
|
+
this.applyChange((0, index_js_2.tagChange)(changeset, revision));
|
|
1554
|
+
}
|
|
1896
1555
|
}
|
|
1897
1556
|
exports.ModularEditBuilder = ModularEditBuilder;
|
|
1898
1557
|
function buildModularChangesetFromField(props) {
|
|
1899
|
-
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys,
|
|
1558
|
+
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = (0, index_js_3.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
|
|
1900
1559
|
const fieldChanges = new Map([[path.field, fieldChange]]);
|
|
1901
1560
|
if (path.parent === undefined) {
|
|
1902
|
-
const field = { nodeId: undefined, field: path.field };
|
|
1903
1561
|
for (const { key, count } of localCrossFieldKeys) {
|
|
1904
|
-
crossFieldKeys.set(key, count, field);
|
|
1562
|
+
crossFieldKeys.set(key, count, { nodeId: undefined, field: path.field });
|
|
1905
1563
|
}
|
|
1906
1564
|
if (childId !== undefined) {
|
|
1907
|
-
(0,
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
field: path.field,
|
|
1911
|
-
},
|
|
1565
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
|
|
1566
|
+
nodeId: undefined,
|
|
1567
|
+
field: path.field,
|
|
1912
1568
|
});
|
|
1913
1569
|
}
|
|
1914
1570
|
return makeModularChangeset({
|
|
@@ -1916,7 +1572,6 @@ function buildModularChangesetFromField(props) {
|
|
|
1916
1572
|
nodeChanges,
|
|
1917
1573
|
nodeToParent,
|
|
1918
1574
|
crossFieldKeys,
|
|
1919
|
-
rootNodes,
|
|
1920
1575
|
maxId: idAllocator.getMaxId(),
|
|
1921
1576
|
revisions: [{ revision }],
|
|
1922
1577
|
});
|
|
@@ -1924,14 +1579,14 @@ function buildModularChangesetFromField(props) {
|
|
|
1924
1579
|
const nodeChangeset = {
|
|
1925
1580
|
fieldChanges,
|
|
1926
1581
|
};
|
|
1927
|
-
const parentId = { localId: (0,
|
|
1928
|
-
const fieldId = { nodeId: parentId, field: path.field };
|
|
1582
|
+
const parentId = { localId: (0, index_js_3.brand)(idAllocator.allocate()), revision };
|
|
1929
1583
|
for (const { key, count } of localCrossFieldKeys) {
|
|
1930
1584
|
crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
|
|
1931
1585
|
}
|
|
1932
1586
|
if (childId !== undefined) {
|
|
1933
|
-
(0,
|
|
1934
|
-
|
|
1587
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(nodeToParent, childId, {
|
|
1588
|
+
nodeId: parentId,
|
|
1589
|
+
field: path.field,
|
|
1935
1590
|
});
|
|
1936
1591
|
}
|
|
1937
1592
|
return buildModularChangesetFromNode({
|
|
@@ -1940,60 +1595,57 @@ function buildModularChangesetFromField(props) {
|
|
|
1940
1595
|
nodeChanges,
|
|
1941
1596
|
nodeToParent,
|
|
1942
1597
|
crossFieldKeys,
|
|
1943
|
-
rootNodes,
|
|
1944
1598
|
idAllocator,
|
|
1945
1599
|
revision,
|
|
1946
1600
|
nodeId: parentId,
|
|
1947
1601
|
});
|
|
1948
1602
|
}
|
|
1949
|
-
exports.buildModularChangesetFromField = buildModularChangesetFromField;
|
|
1950
1603
|
function buildModularChangesetFromNode(props) {
|
|
1951
|
-
const { path, nodeId = { localId: (0,
|
|
1952
|
-
(0,
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
}
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
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;
|
|
1604
|
+
const { path, idAllocator, revision, nodeChanges, nodeChange, nodeId = { localId: (0, index_js_3.brand)(idAllocator.allocate()), revision }, } = props;
|
|
1605
|
+
(0, changeAtomIdBTree_js_1.setInChangeAtomIdMap)(nodeChanges, nodeId, nodeChange);
|
|
1606
|
+
const fieldChangeset = genericFieldKind_js_1.genericFieldKind.changeHandler.editor.buildChildChanges([
|
|
1607
|
+
[path.parentIndex, nodeId],
|
|
1608
|
+
]);
|
|
1609
|
+
const fieldChange = {
|
|
1610
|
+
fieldKind: genericFieldKind_js_1.genericFieldKind.identifier,
|
|
1611
|
+
change: fieldChangeset,
|
|
1612
|
+
};
|
|
1613
|
+
return buildModularChangesetFromField({
|
|
1614
|
+
...props,
|
|
1615
|
+
path: { parent: path.parent, field: path.parentField },
|
|
1616
|
+
fieldChange,
|
|
1617
|
+
localCrossFieldKeys: [],
|
|
1618
|
+
childId: nodeId,
|
|
1619
|
+
});
|
|
1987
1620
|
}
|
|
1988
1621
|
function getRevInfoFromTaggedChanges(changes) {
|
|
1989
1622
|
let maxId = -1;
|
|
1990
1623
|
const revInfos = [];
|
|
1624
|
+
const revisions = new Set();
|
|
1991
1625
|
for (const taggedChange of changes) {
|
|
1992
1626
|
const change = taggedChange.change;
|
|
1993
1627
|
maxId = Math.max(change.maxId ?? -1, maxId);
|
|
1994
|
-
|
|
1628
|
+
const infosToAdd = revisionInfoFromTaggedChange(taggedChange);
|
|
1629
|
+
for (const info of infosToAdd) {
|
|
1630
|
+
if (!revisions.has(info.revision)) {
|
|
1631
|
+
revisions.add(info.revision);
|
|
1632
|
+
revInfos.push(info);
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
const rolledBackRevisions = [];
|
|
1637
|
+
for (const info of revInfos) {
|
|
1638
|
+
if (info.rollbackOf !== undefined) {
|
|
1639
|
+
rolledBackRevisions.push(info.rollbackOf);
|
|
1640
|
+
}
|
|
1641
|
+
}
|
|
1642
|
+
rolledBackRevisions.reverse();
|
|
1643
|
+
for (const revision of rolledBackRevisions) {
|
|
1644
|
+
if (!revisions.has(revision)) {
|
|
1645
|
+
revInfos.push({ revision });
|
|
1646
|
+
}
|
|
1995
1647
|
}
|
|
1996
|
-
return { maxId: (0,
|
|
1648
|
+
return { maxId: (0, index_js_3.brand)(maxId), revInfos };
|
|
1997
1649
|
}
|
|
1998
1650
|
function revisionInfoFromTaggedChange(taggedChange) {
|
|
1999
1651
|
const revInfos = [];
|
|
@@ -2009,16 +1661,15 @@ function revisionInfoFromTaggedChange(taggedChange) {
|
|
|
2009
1661
|
}
|
|
2010
1662
|
return revInfos;
|
|
2011
1663
|
}
|
|
2012
|
-
function fieldChangeFromId(
|
|
2013
|
-
const
|
|
2014
|
-
const fieldMap = fieldMapFromNodeId(change.fieldChanges, change.nodeChanges, change.nodeAliases, fieldId.nodeId);
|
|
1664
|
+
function fieldChangeFromId(fields, nodes, id) {
|
|
1665
|
+
const fieldMap = fieldMapFromNodeId(fields, nodes, id.nodeId);
|
|
2015
1666
|
return fieldMap.get(id.field) ?? (0, internal_1.fail)(0xb25 /* No field exists for the given ID */);
|
|
2016
1667
|
}
|
|
2017
|
-
function fieldMapFromNodeId(rootFieldMap, nodes,
|
|
1668
|
+
function fieldMapFromNodeId(rootFieldMap, nodes, nodeId) {
|
|
2018
1669
|
if (nodeId === undefined) {
|
|
2019
1670
|
return rootFieldMap;
|
|
2020
1671
|
}
|
|
2021
|
-
const node = nodeChangeFromId(nodes,
|
|
1672
|
+
const node = nodeChangeFromId(nodes, nodeId);
|
|
2022
1673
|
(0, internal_1.assert)(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);
|
|
2023
1674
|
return node.fieldChanges;
|
|
2024
1675
|
}
|
|
@@ -2029,74 +1680,48 @@ function rebasedFieldIdFromBaseId(table, baseId) {
|
|
|
2029
1680
|
return { ...baseId, nodeId: rebasedNodeIdFromBaseNodeId(table, baseId.nodeId) };
|
|
2030
1681
|
}
|
|
2031
1682
|
function rebasedNodeIdFromBaseNodeId(table, baseId) {
|
|
2032
|
-
return (0,
|
|
1683
|
+
return (0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(table.baseToRebasedNodeId, baseId) ?? baseId;
|
|
2033
1684
|
}
|
|
2034
|
-
function nodeChangeFromId(nodes,
|
|
2035
|
-
const
|
|
2036
|
-
const node = (0, modularChangeTypes_js_1.getFromChangeAtomIdMap)(nodes, normalizedId);
|
|
1685
|
+
function nodeChangeFromId(nodes, id) {
|
|
1686
|
+
const node = (0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(nodes, id);
|
|
2037
1687
|
(0, internal_1.assert)(node !== undefined, 0x9ca /* Unknown node ID */);
|
|
2038
1688
|
return node;
|
|
2039
1689
|
}
|
|
2040
1690
|
function fieldIdFromFieldIdKey([revision, localId, field]) {
|
|
2041
|
-
const nodeId = localId
|
|
1691
|
+
const nodeId = localId === undefined ? undefined : { revision, localId };
|
|
2042
1692
|
return { nodeId, field };
|
|
2043
1693
|
}
|
|
2044
|
-
function fieldIdKeyFromFieldId(fieldId) {
|
|
2045
|
-
return [fieldId.nodeId?.revision, fieldId.nodeId?.localId, fieldId.field];
|
|
2046
|
-
}
|
|
2047
1694
|
function cloneNodeChangeset(nodeChangeset) {
|
|
2048
1695
|
if (nodeChangeset.fieldChanges !== undefined) {
|
|
2049
1696
|
return { ...nodeChangeset, fieldChanges: new Map(nodeChangeset.fieldChanges) };
|
|
2050
1697
|
}
|
|
2051
1698
|
return { ...nodeChangeset };
|
|
2052
1699
|
}
|
|
2053
|
-
function
|
|
2054
|
-
return location.field !== undefined
|
|
2055
|
-
? { field: replaceFieldIdRevision(location.field, oldRevisions, newRevision) }
|
|
2056
|
-
: { root: (0, index_js_1.replaceAtomRevisions)(location.root, oldRevisions, newRevision) };
|
|
2057
|
-
}
|
|
2058
|
-
function replaceFieldIdRevision(fieldId, oldRevisions, newRevision) {
|
|
1700
|
+
function replaceFieldIdRevision(fieldId, replacer) {
|
|
2059
1701
|
if (fieldId.nodeId === undefined) {
|
|
2060
1702
|
return fieldId;
|
|
2061
1703
|
}
|
|
2062
1704
|
return {
|
|
2063
1705
|
...fieldId,
|
|
2064
|
-
nodeId:
|
|
1706
|
+
nodeId: replacer.getUpdatedAtomId(fieldId.nodeId),
|
|
2065
1707
|
};
|
|
2066
1708
|
}
|
|
2067
|
-
function
|
|
2068
|
-
const
|
|
2069
|
-
|
|
2070
|
-
(
|
|
2071
|
-
if (location.field !== undefined) {
|
|
2072
|
-
return { field: normalizeFieldId(location.field, changeset.nodeAliases) };
|
|
2073
|
-
}
|
|
2074
|
-
return location;
|
|
1709
|
+
function getParentFieldId(changeset, nodeId) {
|
|
1710
|
+
const parentId = (0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(changeset.nodeToParent, nodeId);
|
|
1711
|
+
(0, internal_1.assert)(parentId !== undefined, 0x9cb /* Parent field should be defined */);
|
|
1712
|
+
return normalizeFieldId(parentId, changeset.nodeAliases);
|
|
2075
1713
|
}
|
|
2076
|
-
exports.
|
|
1714
|
+
exports.getParentFieldId = getParentFieldId;
|
|
2077
1715
|
function getFieldsForCrossFieldKey(changeset, key, count) {
|
|
2078
1716
|
return changeset.crossFieldKeys
|
|
2079
1717
|
.getAll(key, count)
|
|
2080
1718
|
.map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
|
|
2081
1719
|
}
|
|
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
|
-
}
|
|
2095
1720
|
// This is only exported for use in test utilities.
|
|
2096
1721
|
function normalizeFieldId(fieldId, nodeAliases) {
|
|
2097
|
-
return fieldId.nodeId
|
|
2098
|
-
?
|
|
2099
|
-
: fieldId;
|
|
1722
|
+
return fieldId.nodeId === undefined
|
|
1723
|
+
? fieldId
|
|
1724
|
+
: { ...fieldId, nodeId: normalizeNodeId(fieldId.nodeId, nodeAliases) };
|
|
2100
1725
|
}
|
|
2101
1726
|
exports.normalizeFieldId = normalizeFieldId;
|
|
2102
1727
|
/**
|
|
@@ -2104,455 +1729,19 @@ exports.normalizeFieldId = normalizeFieldId;
|
|
|
2104
1729
|
*/
|
|
2105
1730
|
function normalizeNodeId(nodeId, nodeAliases) {
|
|
2106
1731
|
let currentId = nodeId;
|
|
2107
|
-
let cycleProbeId = nodeId;
|
|
2108
1732
|
// eslint-disable-next-line no-constant-condition
|
|
2109
1733
|
while (true) {
|
|
2110
|
-
const dealiased = (0,
|
|
1734
|
+
const dealiased = (0, changeAtomIdBTree_js_1.getFromChangeAtomIdMap)(nodeAliases, currentId);
|
|
2111
1735
|
if (dealiased === undefined) {
|
|
2112
1736
|
return currentId;
|
|
2113
1737
|
}
|
|
2114
1738
|
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");
|
|
2122
1739
|
}
|
|
2123
1740
|
}
|
|
2124
|
-
exports.normalizeNodeId = normalizeNodeId;
|
|
2125
1741
|
function hasConflicts(change) {
|
|
2126
1742
|
return (change.constraintViolationCount ?? 0) > 0;
|
|
2127
1743
|
}
|
|
2128
1744
|
function areEqualFieldIds(a, b) {
|
|
2129
|
-
return (0,
|
|
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
|
-
};
|
|
1745
|
+
return (0, index_js_2.areEqualChangeAtomIdOpts)(a.nodeId, b.nodeId) && a.field === b.field;
|
|
2557
1746
|
}
|
|
2558
1747
|
//# sourceMappingURL=modularChangeFamily.js.map
|