@fluidframework/tree 2.112.0 → 2.113.0-411909
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/api-report/tree.alpha.api.md +23 -2
- package/dist/entrypoints/alpha.d.ts +1 -1
- package/dist/entrypoints/alpha.d.ts.map +1 -1
- package/dist/entrypoints/alpha.js +3 -2
- package/dist/entrypoints/alpha.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +39 -7
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js +22 -2
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +2 -1
- package/dist/feature-libraries/modular-schema/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +8 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.js +26 -3
- package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/dist/feature-libraries/sequence-field/filterEdits.d.ts +12 -0
- package/dist/feature-libraries/sequence-field/filterEdits.d.ts.map +1 -0
- package/dist/feature-libraries/sequence-field/filterEdits.js +111 -0
- package/dist/feature-libraries/sequence-field/filterEdits.js.map +1 -0
- package/dist/feature-libraries/sequence-field/markQueue.d.ts +8 -3
- package/dist/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/markQueue.js +22 -8
- package/dist/feature-libraries/sequence-field/markQueue.js.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.js +2 -6
- package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +7 -6
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +2 -4
- package/dist/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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/schematizingTreeView.d.ts +8 -0
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +25 -13
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts +32 -2
- package/dist/simple-tree/api/configuration.d.ts.map +1 -1
- package/dist/simple-tree/api/configuration.js +3 -1
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +1 -1
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +7 -4
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js +7 -5
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +58 -1
- 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/core/index.d.ts +1 -1
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +2 -1
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/toStored.d.ts +72 -6
- package/dist/simple-tree/core/toStored.d.ts.map +1 -1
- package/dist/simple-tree/core/toStored.js +25 -1
- package/dist/simple-tree/core/toStored.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 +4 -5
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/prepareForInsertion.d.ts.map +1 -1
- package/dist/simple-tree/prepareForInsertion.js +9 -0
- package/dist/simple-tree/prepareForInsertion.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts +11 -27
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +25 -33
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/docs/main/runtime-schema-upgrade.md +208 -0
- package/lib/entrypoints/alpha.d.ts +1 -1
- package/lib/entrypoints/alpha.d.ts.map +1 -1
- package/lib/entrypoints/alpha.js +1 -1
- package/lib/entrypoints/alpha.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +39 -7
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js +21 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js +1 -1
- package/lib/feature-libraries/modular-schema/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +9 -2
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.js +27 -4
- package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/lib/feature-libraries/sequence-field/filterEdits.d.ts +12 -0
- package/lib/feature-libraries/sequence-field/filterEdits.d.ts.map +1 -0
- package/lib/feature-libraries/sequence-field/filterEdits.js +107 -0
- package/lib/feature-libraries/sequence-field/filterEdits.js.map +1 -0
- package/lib/feature-libraries/sequence-field/markQueue.d.ts +8 -3
- package/lib/feature-libraries/sequence-field/markQueue.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/markQueue.js +22 -9
- package/lib/feature-libraries/sequence-field/markQueue.js.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.js +2 -6
- package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts +7 -6
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js +2 -4
- package/lib/feature-libraries/sequence-field/sequenceFieldChangeRebaser.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +8 -0
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +26 -14
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts +32 -2
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- package/lib/simple-tree/api/configuration.js +4 -2
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +1 -1
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +7 -4
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js +7 -5
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +58 -1
- 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/core/index.d.ts +1 -1
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +1 -1
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/toStored.d.ts +72 -6
- package/lib/simple-tree/core/toStored.d.ts.map +1 -1
- package/lib/simple-tree/core/toStored.js +24 -0
- package/lib/simple-tree/core/toStored.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/prepareForInsertion.d.ts.map +1 -1
- package/lib/simple-tree/prepareForInsertion.js +9 -0
- package/lib/simple-tree/prepareForInsertion.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts +11 -27
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +24 -33
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/package.json +21 -21
- package/src/entrypoints/alpha.ts +3 -0
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +51 -7
- package/src/feature-libraries/modular-schema/genericFieldKind.ts +1 -1
- package/src/feature-libraries/modular-schema/index.ts +4 -2
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +16 -1
- package/src/feature-libraries/optional-field/optionalField.ts +43 -3
- package/src/feature-libraries/sequence-field/filterEdits.ts +143 -0
- package/src/feature-libraries/sequence-field/markQueue.ts +28 -11
- package/src/feature-libraries/sequence-field/moveEffectTable.ts +2 -7
- package/src/feature-libraries/sequence-field/sequenceFieldChangeRebaser.ts +3 -5
- package/src/index.ts +3 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/schematizingTreeView.ts +42 -20
- package/src/simple-tree/api/configuration.ts +40 -2
- package/src/simple-tree/api/index.ts +1 -0
- package/src/simple-tree/api/schemaCompatibilityTester.ts +8 -4
- package/src/simple-tree/api/tree.ts +58 -1
- package/src/simple-tree/core/index.ts +2 -1
- package/src/simple-tree/core/toStored.ts +95 -8
- package/src/simple-tree/index.ts +3 -2
- package/src/simple-tree/prepareForInsertion.ts +12 -0
- package/src/simple-tree/toStoredSchema.ts +44 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optionalField.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/optional-field/optionalField.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,KAAK,YAAY,EAMjB,YAAY,EAEZ,KAAK,WAAW,EAKhB,MAAM,qBAAqB,CAAC;AAU7B,OAAO,EACN,kBAAkB,EAGlB,MAAM,4BAA4B,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"optionalField.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/optional-field/optionalField.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,KAAK,YAAY,EAMjB,YAAY,EAEZ,KAAK,WAAW,EAKhB,MAAM,qBAAqB,CAAC;AAU7B,OAAO,EACN,kBAAkB,EAGlB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAOhB,KAAK,OAAO,EAEZ,KAAK,gBAAgB,EACrB,aAAa,EAEb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAGX,iBAAiB,EACjB,UAAU,EAEV,MAAM,+BAA+B,CAAC;AAGvC,MAAM,WAAW,YAAY,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC;IAChC,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7B,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,IAAI,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAW,CAAC,CAAC,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAI1B;IAEG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;IAQvB,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI;IAQzC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS;IAMlC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO;IAI5B,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO;IAM/B,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC;IAgB5B,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC;IAGrB,OAAO,IAAI,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAsB3C,IAAW,IAAI,IAAI,MAAM,CAExB;CACD;AAED,eAAO,MAAM,qBAAqB,EAAE,kBAAkB,CAAC,iBAAiB,CAyTvE,CAAC;AAoHF,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAM5F;AAED,MAAM,WAAW,mBAAoB,SAAQ,WAAW,CAAC,iBAAiB,CAAC;IAC1E;;;;;;;OAOG;IACH,GAAG,CACF,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE;QACJ,IAAI,EAAE,YAAY,CAAC;QACnB,MAAM,EAAE,YAAY,CAAC;KACrB,GACC,iBAAiB,CAAC;IAErB;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,GAAG,iBAAiB,CAAC;CACpE;AAED,eAAO,MAAM,mBAAmB,EAAE,mBAyCjC,CAAC;AAEF,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,OAAO,GACrB,gBAAgB,CAkDlB;AAED,eAAO,MAAM,qBAAqB,EAAE,kBAAkB,CACrD,iBAAiB,EACjB,mBAAmB,CAkBnB,CAAC;AAwDF,UAAU,QACT,SAAQ,aAAa,CACpB,mBAAmB,EACnB,OAAO,kBAAkB,EACzB,YAAY,CAAC,QAAQ,CACrB;CAAG;AAEL;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,QAWtB,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { Multiplicity, areEqualChangeAtomIds, forbiddenFieldKindIdentifier, make
|
|
|
7
7
|
import { SizedNestedMap, deleteFromNestedMap, setInNestedMap, tryGetFromNestedMap, } from "../../util/index.js";
|
|
8
8
|
import { nodeIdFromChangeAtom } from "../deltaUtils.js";
|
|
9
9
|
import { optionalIdentifier, identifierFieldIdentifier, requiredIdentifier, } from "../fieldKindIdentifiers.js";
|
|
10
|
-
import { NodeAttachState, FlexFieldKind, } from "../modular-schema/index.js";
|
|
10
|
+
import { EditFilterStatus, NodeAttachState, FlexFieldKind, } from "../modular-schema/index.js";
|
|
11
11
|
import { makeOptionalFieldCodecFamily } from "./optionalFieldCodecs.js";
|
|
12
12
|
export class RegisterMap {
|
|
13
13
|
constructor() {
|
|
@@ -330,9 +330,7 @@ export const optionalChangeRebaser = {
|
|
|
330
330
|
}
|
|
331
331
|
return updated;
|
|
332
332
|
},
|
|
333
|
-
|
|
334
|
-
return { childChanges: change.childChanges, moves: [] };
|
|
335
|
-
},
|
|
333
|
+
filterEdits,
|
|
336
334
|
};
|
|
337
335
|
function replaceReplaceRevisions(replace, replacer) {
|
|
338
336
|
if (replace === undefined) {
|
|
@@ -551,4 +549,29 @@ export const optional = new FlexFieldKind(optionalIdentifier, Multiplicity.Optio
|
|
|
551
549
|
forbiddenFieldKindIdentifier,
|
|
552
550
|
]),
|
|
553
551
|
});
|
|
552
|
+
function filterEdits(change, options) {
|
|
553
|
+
const filtered = { ...change };
|
|
554
|
+
if (filtered.valueReplace !== undefined) {
|
|
555
|
+
if (isReplaceEffectful(filtered.valueReplace)) {
|
|
556
|
+
const detachId = getEffectfulDst(filtered.valueReplace);
|
|
557
|
+
const detachResult = detachId === undefined ? undefined : options.filterDetach(detachId, 1).value;
|
|
558
|
+
const attachId = filtered.valueReplace.src;
|
|
559
|
+
const attachResult = attachId === undefined ? undefined : options.filterAttach(attachId, 1).value;
|
|
560
|
+
if (detachResult === EditFilterStatus.Remove) {
|
|
561
|
+
assert(attachId === undefined || attachResult === EditFilterStatus.Remove, "Cannot remove detach without also removing attach");
|
|
562
|
+
delete filtered.valueReplace;
|
|
563
|
+
}
|
|
564
|
+
else if (attachResult === EditFilterStatus.Remove) {
|
|
565
|
+
delete filtered.valueReplace.src;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
else if (!options.preserveOtherEdits) {
|
|
569
|
+
delete filtered.valueReplace;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
if (!options.preserveOtherEdits) {
|
|
573
|
+
filtered.moves = [];
|
|
574
|
+
}
|
|
575
|
+
return filtered;
|
|
576
|
+
}
|
|
554
577
|
//# sourceMappingURL=optionalField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optionalField.js","sourceRoot":"","sources":["../../../src/feature-libraries/optional-field/optionalField.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype ChangeAtomId,\n\ttype ChangeAtomIdMap,\n\ttype ChangesetLocalId,\n\ttype DeltaDetachedNodeChanges,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaMark,\n\tMultiplicity,\n\ttype RevisionReplacer,\n\ttype RevisionTag,\n\tareEqualChangeAtomIds,\n\tforbiddenFieldKindIdentifier,\n\tmakeChangeAtomId,\n\ttaggedAtomId,\n} from \"../../core/index.js\";\nimport {\n\ttype IdAllocator,\n\ttype Mutable,\n\tSizedNestedMap,\n\tdeleteFromNestedMap,\n\tsetInNestedMap,\n\ttryGetFromNestedMap,\n} from \"../../util/index.js\";\nimport { nodeIdFromChangeAtom } from \"../deltaUtils.js\";\nimport {\n\toptionalIdentifier,\n\tidentifierFieldIdentifier,\n\trequiredIdentifier,\n} from \"../fieldKindIdentifiers.js\";\nimport {\n\ttype FieldChangeHandler,\n\ttype FieldChangeRebaser,\n\ttype FieldEditor,\n\ttype NodeChangeComposer,\n\ttype NodeChangePruner,\n\ttype NodeChangeRebaser,\n\tNodeAttachState,\n\ttype NodeId,\n\ttype RelevantRemovedRootsFromChild,\n\ttype ToDelta,\n\ttype NestedChangesIndices,\n\ttype FieldChangeDelta,\n\tFlexFieldKind,\n} from \"../modular-schema/index.js\";\n\nimport type {\n\tChildChange,\n\tMove,\n\tOptionalChangeset,\n\tRegisterId,\n\tReplace,\n} from \"./optionalFieldChangeTypes.js\";\nimport { makeOptionalFieldCodecFamily } from \"./optionalFieldCodecs.js\";\n\nexport interface IRegisterMap<T> {\n\tset(id: RegisterId, childChange: T): void;\n\tget(id: RegisterId): T | undefined;\n\tdelete(id: RegisterId): boolean;\n\tkeys(): Iterable<RegisterId>;\n\tvalues(): Iterable<T>;\n\tentries(): Iterable<[RegisterId, T]>;\n\treadonly size: number;\n}\n\nexport class RegisterMap<T> implements IRegisterMap<T> {\n\tprivate readonly nestedMapData = new SizedNestedMap<\n\t\tChangesetLocalId | \"self\",\n\t\tRevisionTag | undefined,\n\t\tT\n\t>();\n\n\tpublic clone(): RegisterMap<T> {\n\t\tconst clone = new RegisterMap<T>();\n\t\tfor (const [id, t] of this.entries()) {\n\t\t\tclone.set(id, t);\n\t\t}\n\t\treturn clone;\n\t}\n\n\tpublic set(id: RegisterId, childChange: T): void {\n\t\tif (id === \"self\") {\n\t\t\tthis.nestedMapData.set(\"self\", undefined, childChange);\n\t\t} else {\n\t\t\tthis.nestedMapData.set(id.localId, id.revision, childChange);\n\t\t}\n\t}\n\n\tpublic get(id: RegisterId): T | undefined {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.tryGet(id, undefined)\n\t\t\t: this.nestedMapData.tryGet(id.localId, id.revision);\n\t}\n\n\tpublic has(id: RegisterId): boolean {\n\t\treturn this.get(id) !== undefined;\n\t}\n\n\tpublic delete(id: RegisterId): boolean {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.delete(\"self\", undefined)\n\t\t\t: this.nestedMapData.delete(id.localId, id.revision);\n\t}\n\n\tpublic keys(): Iterable<RegisterId> {\n\t\tconst changeIds: RegisterId[] = [];\n\t\tfor (const [localId, nestedMap] of this.nestedMapData) {\n\t\t\tif (localId === \"self\") {\n\t\t\t\tchangeIds.push(\"self\");\n\t\t\t} else {\n\t\t\t\tfor (const [revisionTag, _] of nestedMap) {\n\t\t\t\t\tchangeIds.push(\n\t\t\t\t\t\trevisionTag === undefined ? { localId } : { localId, revision: revisionTag },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changeIds;\n\t}\n\tpublic values(): Iterable<T> {\n\t\treturn this.nestedMapData.values();\n\t}\n\tpublic entries(): Iterable<[RegisterId, T]> {\n\t\tconst entries: [RegisterId, T][] = [];\n\t\tfor (const changeId of this.keys()) {\n\t\t\tif (changeId === \"self\") {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(\"self\", undefined);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x770 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([\"self\", entry]);\n\t\t\t} else {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(changeId.localId, changeId.revision);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x771 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([changeId, entry]);\n\t\t\t}\n\t\t}\n\n\t\treturn entries;\n\t}\n\tpublic get size(): number {\n\t\treturn this.nestedMapData.size;\n\t}\n}\n\nexport const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {\n\tcompose: (\n\t\tchange1: OptionalChangeset,\n\t\tchange2: OptionalChangeset,\n\t\tcomposeChild: NodeChangeComposer,\n\t): OptionalChangeset => {\n\t\tconst { srcToDst, dstToSrc } = getBidirectionalMaps(change1.moves);\n\t\tconst change1FieldSrc = change1.valueReplace?.src;\n\t\tconst change1FieldDst = getEffectfulDst(change1.valueReplace);\n\n\t\tconst change2FieldSrc = change2.valueReplace?.src;\n\t\tlet composedFieldSrc: RegisterId | undefined;\n\t\tif (change2FieldSrc !== undefined) {\n\t\t\tif (change2FieldSrc === \"self\") {\n\t\t\t\tcomposedFieldSrc = change1FieldSrc ?? change2FieldSrc;\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst !== undefined &&\n\t\t\t\tareEqualRegisterIds(change1FieldDst, change2FieldSrc)\n\t\t\t) {\n\t\t\t\tcomposedFieldSrc = \"self\";\n\t\t\t} else {\n\t\t\t\tcomposedFieldSrc =\n\t\t\t\t\ttryGetFromNestedMap(dstToSrc, change2FieldSrc.revision, change2FieldSrc.localId) ??\n\t\t\t\t\tchange2FieldSrc;\n\t\t\t}\n\t\t} else if (change1FieldSrc !== undefined && change2.valueReplace === undefined) {\n\t\t\tcomposedFieldSrc = change1FieldSrc;\n\t\t}\n\n\t\tconst childChanges2ByOriginalId = new RegisterMap<NodeId>();\n\t\tfor (const [id, change] of change2.childChanges) {\n\t\t\tif (id === \"self\") {\n\t\t\t\tif (change1FieldSrc === undefined) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t} else {\n\t\t\t\t\tchildChanges2ByOriginalId.set(change1FieldSrc, change);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (change1FieldDst !== undefined && areEqualChangeAtomIds(change1FieldDst, id)) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t} else {\n\t\t\t\t\tconst originalId = tryGetFromNestedMap(dstToSrc, id.revision, id.localId);\n\t\t\t\t\tchildChanges2ByOriginalId.set(originalId ?? id, change);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst composedMoves: Move[] = [];\n\t\tconst composedChildChanges: ChildChange[] = [];\n\t\tconst composed: Mutable<OptionalChangeset> = {\n\t\t\tmoves: composedMoves,\n\t\t\tchildChanges: composedChildChanges,\n\t\t};\n\n\t\tfor (const [id, childChange1] of change1.childChanges) {\n\t\t\tconst childChange2 = childChanges2ByOriginalId.get(id);\n\t\t\tcomposedChildChanges.push([id, composeChild(childChange1, childChange2)]);\n\t\t\tchildChanges2ByOriginalId.delete(id);\n\t\t}\n\n\t\tfor (const [id, childChange2] of childChanges2ByOriginalId.entries()) {\n\t\t\tcomposedChildChanges.push([id, composeChild(undefined, childChange2)]);\n\t\t}\n\n\t\tfor (const [leg2Src, leg2Dst] of change2.moves) {\n\t\t\tconst leg1Src = tryGetFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\tif (leg1Src !== undefined) {\n\t\t\t\tcomposedMoves.push([leg1Src, leg2Dst]);\n\t\t\t\tdeleteFromNestedMap(srcToDst, leg1Src.revision, leg1Src.localId);\n\t\t\t\tdeleteFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst === undefined ||\n\t\t\t\t!areEqualChangeAtomIds(change1FieldDst, leg2Src)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([leg2Src, leg2Dst]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [revision, innerMap] of srcToDst.entries()) {\n\t\t\tfor (const [localId, dst] of innerMap.entries()) {\n\t\t\t\tconst src = makeChangeAtomId(localId, revision);\n\t\t\t\tif (composedFieldSrc === undefined || !areEqualRegisterIds(src, composedFieldSrc)) {\n\t\t\t\t\tcomposedMoves.push([src, dst]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tchange1FieldSrc !== undefined &&\n\t\t\tchange1FieldSrc !== \"self\" &&\n\t\t\tchange2.valueReplace !== undefined\n\t\t) {\n\t\t\tconst change2FieldDst = change2.valueReplace.dst;\n\t\t\tif (\n\t\t\t\tisReplaceEffectful(change2.valueReplace) &&\n\t\t\t\t!areEqualChangeAtomIds(change1FieldSrc, change2FieldDst)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([change1FieldSrc, change2FieldDst]);\n\t\t\t}\n\t\t}\n\n\t\tconst firstChange = change1.valueReplace ?? change2.valueReplace;\n\t\tif (firstChange === undefined) {\n\t\t\treturn composed;\n\t\t}\n\n\t\tconst replace: Mutable<Replace> = {\n\t\t\tisEmpty: firstChange.isEmpty,\n\t\t\tdst: getComposedReplaceDst(change1.valueReplace, change2),\n\t\t};\n\t\tif (composedFieldSrc !== undefined) {\n\t\t\treplace.src = composedFieldSrc;\n\t\t}\n\t\tcomposed.valueReplace = replace;\n\t\treturn composed;\n\t},\n\n\tinvert: (\n\t\tchange: OptionalChangeset,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator<ChangesetLocalId>,\n\t\trevision: RevisionTag | undefined,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges, valueReplace } = change;\n\n\t\tconst invertIdMap = new RegisterMap<RegisterId>();\n\t\tconst invertedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tinvertIdMap.set(src, dst);\n\t\t\tinvertedMoves.push([dst, src]);\n\t\t}\n\t\tif (valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tinvertIdMap.set(\"self\", valueReplace.dst);\n\t\t\t}\n\t\t\tif (valueReplace.src !== undefined) {\n\t\t\t\tinvertIdMap.set(valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst inverted: Mutable<OptionalChangeset> = {\n\t\t\tmoves: invertedMoves,\n\t\t\tchildChanges: childChanges.map(([id, childChange]) => {\n\t\t\t\treturn [invertIdMap.get(id) ?? id, childChange];\n\t\t\t}),\n\t\t};\n\n\t\tif (valueReplace !== undefined) {\n\t\t\tif (isReplaceEffectful(valueReplace)) {\n\t\t\t\tconst replace: Mutable<Replace> =\n\t\t\t\t\tvalueReplace.src === undefined\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tisEmpty: true,\n\t\t\t\t\t\t\t\tdst: makeChangeAtomId(genId.allocate(), revision),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tisEmpty: false,\n\t\t\t\t\t\t\t\tdst: isRollback\n\t\t\t\t\t\t\t\t\t? valueReplace.src\n\t\t\t\t\t\t\t\t\t: makeChangeAtomId(genId.allocate(), revision),\n\t\t\t\t\t\t\t};\n\t\t\t\tif (valueReplace.isEmpty === false) {\n\t\t\t\t\treplace.src = valueReplace.dst;\n\t\t\t\t}\n\t\t\t\tinverted.valueReplace = replace;\n\t\t\t} else if (!isRollback && valueReplace.src === \"self\") {\n\t\t\t\tinverted.valueReplace = {\n\t\t\t\t\tisEmpty: false,\n\t\t\t\t\tsrc: \"self\",\n\t\t\t\t\tdst: makeChangeAtomId(genId.allocate(), revision),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn inverted;\n\t},\n\n\trebase: (\n\t\tchange: OptionalChangeset,\n\t\toverChange: OptionalChangeset,\n\t\trebaseChild: NodeChangeRebaser,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges, valueReplace: field } = change;\n\n\t\t// TODO: avoid computing the dstToSrc map if it's not needed.\n\t\t// TODO: de-dupe overSrcToDst and forwardMap\n\t\tconst { srcToDst: overSrcToDst } = getBidirectionalMaps(overChange.moves);\n\n\t\tconst forwardMap = new RegisterMap<RegisterId>();\n\t\tfor (const [src, dst] of overChange.moves) {\n\t\t\tforwardMap.set(src, dst);\n\t\t}\n\t\tif (overChange.valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(overChange.valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tforwardMap.set(\"self\", overChange.valueReplace.dst);\n\t\t\t}\n\t\t\tif (overChange.valueReplace.src !== undefined) {\n\t\t\t\tforwardMap.set(overChange.valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst rebasedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tconst newDst = tryGetFromNestedMap(overSrcToDst, src.revision, src.localId);\n\t\t\trebasedMoves.push([src, newDst ?? dst]);\n\t\t}\n\n\t\tconst overChildChangesBySrc = new RegisterMap<NodeId>();\n\t\tfor (const [id, childChange] of overChange.childChanges) {\n\t\t\toverChildChangesBySrc.set(id, childChange);\n\t\t}\n\n\t\tconst rebasedChildChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of childChanges) {\n\t\t\tconst overChildChange = overChildChangesBySrc.get(id);\n\t\t\tif (overChildChange !== undefined) {\n\t\t\t\toverChildChangesBySrc.delete(id);\n\t\t\t}\n\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tchildChange,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeAttachState.Attached : NodeAttachState.Detached,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, overChildChange] of overChildChangesBySrc.entries()) {\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tundefined,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeAttachState.Attached : NodeAttachState.Detached,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tconst rebased: Mutable<OptionalChangeset> = {\n\t\t\tmoves: rebasedMoves,\n\t\t\tchildChanges: rebasedChildChanges,\n\t\t};\n\n\t\tif (field !== undefined) {\n\t\t\tconst replace: Mutable<Replace> = {\n\t\t\t\tisEmpty:\n\t\t\t\t\toverChange.valueReplace === undefined\n\t\t\t\t\t\t? field.isEmpty\n\t\t\t\t\t\t: overChange.valueReplace.src === undefined,\n\t\t\t\tdst: field.dst,\n\t\t\t};\n\t\t\tif (field.src !== undefined) {\n\t\t\t\treplace.src = forwardMap.get(field.src) ?? field.src;\n\t\t\t}\n\t\t\trebased.valueReplace = replace;\n\t\t}\n\n\t\treturn rebased;\n\t},\n\n\tprune: (change: OptionalChangeset, pruneChild: NodeChangePruner): OptionalChangeset => {\n\t\tconst childChanges: ChildChange[] = [];\n\t\tconst prunedChange: Mutable<OptionalChangeset> = {\n\t\t\tmoves: change.moves,\n\t\t\tchildChanges,\n\t\t};\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tprunedChange.valueReplace = change.valueReplace;\n\t\t}\n\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst prunedChildChange = pruneChild(childChange);\n\t\t\tif (prunedChildChange !== undefined) {\n\t\t\t\tchildChanges.push([id, prunedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\treturn prunedChange;\n\t},\n\n\treplaceRevisions: (\n\t\tchange: OptionalChangeset,\n\t\treplacer: RevisionReplacer,\n\t): OptionalChangeset => {\n\t\tconst valueReplace = replaceReplaceRevisions(change.valueReplace, replacer);\n\n\t\tconst childChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tchildChanges.push([\n\t\t\t\treplaceRegisterRevisions(id, replacer),\n\t\t\t\treplacer.getUpdatedAtomId(childChange),\n\t\t\t]);\n\t\t}\n\n\t\tconst moves: Move[] = [];\n\t\tfor (const [src, dst] of change.moves) {\n\t\t\tmoves.push([replacer.getUpdatedAtomId(src), replacer.getUpdatedAtomId(dst)]);\n\t\t}\n\n\t\tconst updated: Mutable<OptionalChangeset> = { childChanges, moves };\n\t\tif (valueReplace !== undefined) {\n\t\t\tupdated.valueReplace = valueReplace;\n\t\t}\n\n\t\treturn updated;\n\t},\n\n\tmute: (change: OptionalChangeset): OptionalChangeset => {\n\t\treturn { childChanges: change.childChanges, moves: [] };\n\t},\n};\n\nfunction replaceReplaceRevisions(\n\treplace: Replace | undefined,\n\treplacer: RevisionReplacer,\n): Replace | undefined {\n\tif (replace === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst updated: Mutable<Replace> = {\n\t\t...replace,\n\t\tdst: replacer.getUpdatedAtomId(replace.dst),\n\t};\n\n\tif (replace.src !== undefined) {\n\t\tupdated.src = replaceRegisterRevisions(replace.src, replacer);\n\t}\n\n\treturn updated;\n}\n\nfunction replaceRegisterRevisions(\n\tregister: RegisterId,\n\treplacer: RevisionReplacer,\n): RegisterId {\n\treturn register === \"self\" ? register : replacer.getUpdatedAtomId(register);\n}\n\nfunction getComposedReplaceDst(\n\tchange1: Replace | undefined,\n\tchange2: OptionalChangeset,\n): ChangeAtomId {\n\tconst dst1 = change1?.dst;\n\tif (change2.valueReplace === undefined) {\n\t\tassert(dst1 !== undefined, 0x8ce /* Both replace replaces should not be undefined */);\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n\n\tif (\n\t\tdst1 === undefined ||\n\t\tchange1?.src === \"self\" ||\n\t\t(change2.valueReplace.src !== undefined &&\n\t\t\tareEqualRegisterIds(change2.valueReplace.src, dst1))\n\t) {\n\t\tassert(\n\t\t\tchange2.valueReplace !== undefined,\n\t\t\t0x8cf /* Both replace replaces should not be undefined */,\n\t\t);\n\t\treturn change2.valueReplace.dst;\n\t} else {\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n}\n\nfunction getIdAfterMoves(id: ChangeAtomId, moves: readonly Move[]): ChangeAtomId {\n\tfor (const [src, dst] of moves) {\n\t\tif (areEqualChangeAtomIds(id, src)) {\n\t\t\treturn dst;\n\t\t}\n\t}\n\treturn id;\n}\n\nfunction areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {\n\treturn id1 === \"self\" || id2 === \"self\" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);\n}\n\nfunction areEqualRegisterIdsOpt(\n\tid1: RegisterId | undefined,\n\tid2: RegisterId | undefined,\n): boolean {\n\tif (id1 === undefined || id2 === undefined) {\n\t\treturn id1 === id2;\n\t}\n\treturn areEqualRegisterIds(id1, id2);\n}\n\nfunction getBidirectionalMaps(moves: OptionalChangeset[\"moves\"]): {\n\tsrcToDst: ChangeAtomIdMap<ChangeAtomId>;\n\tdstToSrc: ChangeAtomIdMap<ChangeAtomId>;\n} {\n\tconst srcToDst: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tconst dstToSrc: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tfor (const [src, dst] of moves) {\n\t\tsetInNestedMap(srcToDst, src.revision, src.localId, dst);\n\t\tsetInNestedMap(dstToSrc, dst.revision, dst.localId, src);\n\t}\n\treturn { srcToDst, dstToSrc };\n}\n\ntype EffectfulReplace =\n\t| {\n\t\t\tisEmpty: true;\n\t\t\tsrc?: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t }\n\t| {\n\t\t\tisEmpty: boolean;\n\t\t\tsrc: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t };\n\nfunction isReplaceEffectful(replace: Replace): replace is EffectfulReplace {\n\tif (replace.src === \"self\") {\n\t\treturn false;\n\t}\n\treturn !replace.isEmpty || replace.src !== undefined;\n}\n\nfunction getEffectfulDst(replace: Replace | undefined): ChangeAtomId | undefined {\n\treturn replace === undefined || replace.isEmpty || replace.src === \"self\"\n\t\t? undefined\n\t\t: replace.dst;\n}\n\nexport function taggedRegister(id: RegisterId, revision: RevisionTag | undefined): RegisterId {\n\tif (id === \"self\") {\n\t\treturn id;\n\t}\n\n\treturn taggedAtomId(id, revision);\n}\n\nexport interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {\n\t/**\n\t * Creates a change which will replace the content already in the field (if any at the time the change applies)\n\t * with new content.\n\t * The content in the field will be moved to the `ids.detach` register.\n\t * The content in the `ids.detach` register will be moved to into the field.\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param ids - the \"fill\" and \"detach\" ids associated with the change.\n\t */\n\tset(\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangeAtomId;\n\t\t\tdetach: ChangeAtomId;\n\t\t},\n\t): OptionalChangeset;\n\n\t/**\n\t * Creates a change which clears the field's contents (if any).\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param detachId - the ID of the register that existing field content (if any) will be moved to.\n\t */\n\tclear(wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;\n}\n\nexport const optionalFieldEditor: OptionalFieldEditor = {\n\tset: (\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangeAtomId;\n\t\t\t// Should be interpreted as a set of an empty field if undefined.\n\t\t\tdetach: ChangeAtomId;\n\t\t},\n\t): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tsrc: ids.fill,\n\t\t\tdst: ids.detach,\n\t\t},\n\t}),\n\n\tclear: (wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tdst: detachId,\n\t\t},\n\t}),\n\n\tbuildChildChanges: (changes: Iterable<[number, NodeId]>): OptionalChangeset => {\n\t\tconst childChanges: ChildChange[] = Array.from(changes, ([index, childChange]) => {\n\t\t\tassert(index === 0, 0x404 /* Optional fields only support a single child node */);\n\t\t\treturn [\"self\", childChange];\n\t\t});\n\t\tassert(\n\t\t\tchildChanges.length <= 1,\n\t\t\t0xabd /* Optional fields only support a single child node */,\n\t\t);\n\t\treturn {\n\t\t\tmoves: [],\n\t\t\tchildChanges,\n\t\t};\n\t},\n};\n\nexport function optionalFieldIntoDelta(\n\tchange: OptionalChangeset,\n\tdeltaFromChild: ToDelta,\n): FieldChangeDelta {\n\tconst delta: Mutable<FieldChangeDelta> = {};\n\n\tlet markIsANoop = true;\n\tconst mark: Mutable<DeltaMark> = { count: 1 };\n\n\tif (change.valueReplace !== undefined && isReplaceEffectful(change.valueReplace)) {\n\t\tif (!change.valueReplace.isEmpty) {\n\t\t\tmark.detach = nodeIdFromChangeAtom(change.valueReplace.dst);\n\t\t}\n\t\tif (change.valueReplace.src !== undefined) {\n\t\t\tmark.attach = nodeIdFromChangeAtom(change.valueReplace.src);\n\t\t}\n\t\tmarkIsANoop = false;\n\t}\n\n\tif (change.moves.length > 0) {\n\t\tdelta.rename = change.moves.map(([src, dst]) => ({\n\t\t\tcount: 1,\n\t\t\toldId: nodeIdFromChangeAtom(src),\n\t\t\tnewId: nodeIdFromChangeAtom(dst),\n\t\t}));\n\t}\n\n\tif (change.childChanges.length > 0) {\n\t\tconst globals: DeltaDetachedNodeChanges[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst childDelta = deltaFromChild(childChange);\n\t\t\tif (id === \"self\") {\n\t\t\t\tmark.fields = childDelta;\n\t\t\t\tmarkIsANoop = false;\n\t\t\t} else {\n\t\t\t\tconst fields = childDelta;\n\t\t\t\tglobals.push({\n\t\t\t\t\tid: { major: id.revision, minor: id.localId },\n\t\t\t\t\tfields,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (globals.length > 0) {\n\t\t\tdelta.global = globals;\n\t\t}\n\t}\n\n\tif (!markIsANoop) {\n\t\tdelta.local = { marks: [mark] };\n\t}\n\n\treturn delta;\n}\n\nexport const optionalChangeHandler: FieldChangeHandler<\n\tOptionalChangeset,\n\tOptionalFieldEditor\n> = {\n\trebaser: optionalChangeRebaser,\n\tcodecsFactory: makeOptionalFieldCodecFamily,\n\teditor: optionalFieldEditor,\n\n\tintoDelta: optionalFieldIntoDelta,\n\trelevantRemovedRoots,\n\n\tisEmpty: (change: OptionalChangeset) =>\n\t\tchange.childChanges.length === 0 &&\n\t\tchange.moves.length === 0 &&\n\t\tchange.valueReplace === undefined,\n\n\tgetNestedChanges,\n\n\tcreateEmpty: () => ({ moves: [], childChanges: [] }),\n\tgetCrossFieldKeys: (_change) => [],\n};\n\nfunction getNestedChanges(change: OptionalChangeset): NestedChangesIndices {\n\t// True iff the content of the field changes in some way\n\tconst isFieldContentChanged =\n\t\tchange.valueReplace !== undefined && change.valueReplace.src !== \"self\";\n\n\t// The node that is moved into the field (if any).\n\tconst nodeMovedIntoField = change.valueReplace?.src;\n\n\treturn change.childChanges.map(([register, nodeId]) => {\n\t\t// The node is removed in the input context iif register is not self.\n\t\tconst inputIndex = register === \"self\" ? 0 : undefined;\n\t\tconst outputIndex =\n\t\t\tregister === \"self\"\n\t\t\t\t? // If the node starts out as not-removed, it is removed in the output context iff the field content is changed\n\t\t\t\t\tisFieldContentChanged\n\t\t\t\t\t? undefined\n\t\t\t\t\t: 0\n\t\t\t\t: // If the node starts out as removed, then it remains removed in the output context iff it is not the node that is moved into the field\n\t\t\t\t\tareEqualRegisterIdsOpt(register, nodeMovedIntoField)\n\t\t\t\t\t? 0\n\t\t\t\t\t: undefined;\n\t\treturn [nodeId, inputIndex, outputIndex];\n\t});\n}\n\nfunction* relevantRemovedRoots(\n\tchange: OptionalChangeset,\n\trelevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,\n): Iterable<DeltaDetachedNodeId> {\n\tconst alreadyYielded = new RegisterMap<boolean>();\n\n\tfor (const [src] of change.moves) {\n\t\tif (!alreadyYielded.has(src)) {\n\t\t\talreadyYielded.set(src, true);\n\t\t\tyield nodeIdFromChangeAtom(src);\n\t\t}\n\t}\n\n\tfor (const [id, childChange] of change.childChanges) {\n\t\t// Child changes make the tree they apply to relevant unless that tree existed in the starting context of\n\t\t// of this change.\n\t\tif (id !== \"self\" && !alreadyYielded.has(id)) {\n\t\t\talreadyYielded.set(id, true);\n\t\t\tyield nodeIdFromChangeAtom(id);\n\t\t}\n\t\tyield* relevantRemovedRootsFromChild(childChange);\n\t}\n\n\tconst selfSrc = change.valueReplace?.src;\n\tif (selfSrc !== undefined && selfSrc !== \"self\" && !alreadyYielded.has(selfSrc)) {\n\t\tyield nodeIdFromChangeAtom(selfSrc);\n\t}\n}\n\ninterface Optional\n\textends FlexFieldKind<\n\t\tOptionalFieldEditor,\n\t\ttypeof optionalIdentifier,\n\t\tMultiplicity.Optional\n\t> {}\n\n/**\n * 0 or 1 items.\n */\nexport const optional: Optional = new FlexFieldKind(\n\toptionalIdentifier,\n\tMultiplicity.Optional,\n\t{\n\t\tchangeHandler: optionalChangeHandler,\n\t\tallowMonotonicUpgradeFrom: new Set([\n\t\t\tidentifierFieldIdentifier,\n\t\t\trequiredIdentifier,\n\t\t\tforbiddenFieldKindIdentifier,\n\t\t]),\n\t},\n);\n"]}
|
|
1
|
+
{"version":3,"file":"optionalField.js","sourceRoot":"","sources":["../../../src/feature-libraries/optional-field/optionalField.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype ChangeAtomId,\n\ttype ChangeAtomIdMap,\n\ttype ChangesetLocalId,\n\ttype DeltaDetachedNodeChanges,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaMark,\n\tMultiplicity,\n\ttype RevisionReplacer,\n\ttype RevisionTag,\n\tareEqualChangeAtomIds,\n\tforbiddenFieldKindIdentifier,\n\tmakeChangeAtomId,\n\ttaggedAtomId,\n} from \"../../core/index.js\";\nimport {\n\ttype IdAllocator,\n\ttype Mutable,\n\tSizedNestedMap,\n\tdeleteFromNestedMap,\n\tsetInNestedMap,\n\ttryGetFromNestedMap,\n} from \"../../util/index.js\";\nimport { nodeIdFromChangeAtom } from \"../deltaUtils.js\";\nimport {\n\toptionalIdentifier,\n\tidentifierFieldIdentifier,\n\trequiredIdentifier,\n} from \"../fieldKindIdentifiers.js\";\nimport {\n\tEditFilterStatus,\n\ttype FieldChangeHandler,\n\ttype FieldChangeRebaser,\n\ttype FieldEditor,\n\ttype NodeChangeComposer,\n\ttype NodeChangePruner,\n\ttype NodeChangeRebaser,\n\tNodeAttachState,\n\ttype NodeId,\n\ttype RelevantRemovedRootsFromChild,\n\ttype ToDelta,\n\ttype NestedChangesIndices,\n\ttype FieldChangeDelta,\n\tFlexFieldKind,\n\ttype EditFilterFunc,\n} from \"../modular-schema/index.js\";\n\nimport type {\n\tChildChange,\n\tMove,\n\tOptionalChangeset,\n\tRegisterId,\n\tReplace,\n} from \"./optionalFieldChangeTypes.js\";\nimport { makeOptionalFieldCodecFamily } from \"./optionalFieldCodecs.js\";\n\nexport interface IRegisterMap<T> {\n\tset(id: RegisterId, childChange: T): void;\n\tget(id: RegisterId): T | undefined;\n\tdelete(id: RegisterId): boolean;\n\tkeys(): Iterable<RegisterId>;\n\tvalues(): Iterable<T>;\n\tentries(): Iterable<[RegisterId, T]>;\n\treadonly size: number;\n}\n\nexport class RegisterMap<T> implements IRegisterMap<T> {\n\tprivate readonly nestedMapData = new SizedNestedMap<\n\t\tChangesetLocalId | \"self\",\n\t\tRevisionTag | undefined,\n\t\tT\n\t>();\n\n\tpublic clone(): RegisterMap<T> {\n\t\tconst clone = new RegisterMap<T>();\n\t\tfor (const [id, t] of this.entries()) {\n\t\t\tclone.set(id, t);\n\t\t}\n\t\treturn clone;\n\t}\n\n\tpublic set(id: RegisterId, childChange: T): void {\n\t\tif (id === \"self\") {\n\t\t\tthis.nestedMapData.set(\"self\", undefined, childChange);\n\t\t} else {\n\t\t\tthis.nestedMapData.set(id.localId, id.revision, childChange);\n\t\t}\n\t}\n\n\tpublic get(id: RegisterId): T | undefined {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.tryGet(id, undefined)\n\t\t\t: this.nestedMapData.tryGet(id.localId, id.revision);\n\t}\n\n\tpublic has(id: RegisterId): boolean {\n\t\treturn this.get(id) !== undefined;\n\t}\n\n\tpublic delete(id: RegisterId): boolean {\n\t\treturn id === \"self\"\n\t\t\t? this.nestedMapData.delete(\"self\", undefined)\n\t\t\t: this.nestedMapData.delete(id.localId, id.revision);\n\t}\n\n\tpublic keys(): Iterable<RegisterId> {\n\t\tconst changeIds: RegisterId[] = [];\n\t\tfor (const [localId, nestedMap] of this.nestedMapData) {\n\t\t\tif (localId === \"self\") {\n\t\t\t\tchangeIds.push(\"self\");\n\t\t\t} else {\n\t\t\t\tfor (const [revisionTag, _] of nestedMap) {\n\t\t\t\t\tchangeIds.push(\n\t\t\t\t\t\trevisionTag === undefined ? { localId } : { localId, revision: revisionTag },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changeIds;\n\t}\n\tpublic values(): Iterable<T> {\n\t\treturn this.nestedMapData.values();\n\t}\n\tpublic entries(): Iterable<[RegisterId, T]> {\n\t\tconst entries: [RegisterId, T][] = [];\n\t\tfor (const changeId of this.keys()) {\n\t\t\tif (changeId === \"self\") {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(\"self\", undefined);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x770 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([\"self\", entry]);\n\t\t\t} else {\n\t\t\t\tconst entry = this.nestedMapData.tryGet(changeId.localId, changeId.revision);\n\t\t\t\tassert(\n\t\t\t\t\tentry !== undefined,\n\t\t\t\t\t0x771 /* Entry should not be undefined when iterating keys. */,\n\t\t\t\t);\n\t\t\t\tentries.push([changeId, entry]);\n\t\t\t}\n\t\t}\n\n\t\treturn entries;\n\t}\n\tpublic get size(): number {\n\t\treturn this.nestedMapData.size;\n\t}\n}\n\nexport const optionalChangeRebaser: FieldChangeRebaser<OptionalChangeset> = {\n\tcompose: (\n\t\tchange1: OptionalChangeset,\n\t\tchange2: OptionalChangeset,\n\t\tcomposeChild: NodeChangeComposer,\n\t): OptionalChangeset => {\n\t\tconst { srcToDst, dstToSrc } = getBidirectionalMaps(change1.moves);\n\t\tconst change1FieldSrc = change1.valueReplace?.src;\n\t\tconst change1FieldDst = getEffectfulDst(change1.valueReplace);\n\n\t\tconst change2FieldSrc = change2.valueReplace?.src;\n\t\tlet composedFieldSrc: RegisterId | undefined;\n\t\tif (change2FieldSrc !== undefined) {\n\t\t\tif (change2FieldSrc === \"self\") {\n\t\t\t\tcomposedFieldSrc = change1FieldSrc ?? change2FieldSrc;\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst !== undefined &&\n\t\t\t\tareEqualRegisterIds(change1FieldDst, change2FieldSrc)\n\t\t\t) {\n\t\t\t\tcomposedFieldSrc = \"self\";\n\t\t\t} else {\n\t\t\t\tcomposedFieldSrc =\n\t\t\t\t\ttryGetFromNestedMap(dstToSrc, change2FieldSrc.revision, change2FieldSrc.localId) ??\n\t\t\t\t\tchange2FieldSrc;\n\t\t\t}\n\t\t} else if (change1FieldSrc !== undefined && change2.valueReplace === undefined) {\n\t\t\tcomposedFieldSrc = change1FieldSrc;\n\t\t}\n\n\t\tconst childChanges2ByOriginalId = new RegisterMap<NodeId>();\n\t\tfor (const [id, change] of change2.childChanges) {\n\t\t\tif (id === \"self\") {\n\t\t\t\tif (change1FieldSrc === undefined) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t} else {\n\t\t\t\t\tchildChanges2ByOriginalId.set(change1FieldSrc, change);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (change1FieldDst !== undefined && areEqualChangeAtomIds(change1FieldDst, id)) {\n\t\t\t\t\tchildChanges2ByOriginalId.set(\"self\", change);\n\t\t\t\t} else {\n\t\t\t\t\tconst originalId = tryGetFromNestedMap(dstToSrc, id.revision, id.localId);\n\t\t\t\t\tchildChanges2ByOriginalId.set(originalId ?? id, change);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst composedMoves: Move[] = [];\n\t\tconst composedChildChanges: ChildChange[] = [];\n\t\tconst composed: Mutable<OptionalChangeset> = {\n\t\t\tmoves: composedMoves,\n\t\t\tchildChanges: composedChildChanges,\n\t\t};\n\n\t\tfor (const [id, childChange1] of change1.childChanges) {\n\t\t\tconst childChange2 = childChanges2ByOriginalId.get(id);\n\t\t\tcomposedChildChanges.push([id, composeChild(childChange1, childChange2)]);\n\t\t\tchildChanges2ByOriginalId.delete(id);\n\t\t}\n\n\t\tfor (const [id, childChange2] of childChanges2ByOriginalId.entries()) {\n\t\t\tcomposedChildChanges.push([id, composeChild(undefined, childChange2)]);\n\t\t}\n\n\t\tfor (const [leg2Src, leg2Dst] of change2.moves) {\n\t\t\tconst leg1Src = tryGetFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\tif (leg1Src !== undefined) {\n\t\t\t\tcomposedMoves.push([leg1Src, leg2Dst]);\n\t\t\t\tdeleteFromNestedMap(srcToDst, leg1Src.revision, leg1Src.localId);\n\t\t\t\tdeleteFromNestedMap(dstToSrc, leg2Src.revision, leg2Src.localId);\n\t\t\t} else if (\n\t\t\t\tchange1FieldDst === undefined ||\n\t\t\t\t!areEqualChangeAtomIds(change1FieldDst, leg2Src)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([leg2Src, leg2Dst]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [revision, innerMap] of srcToDst.entries()) {\n\t\t\tfor (const [localId, dst] of innerMap.entries()) {\n\t\t\t\tconst src = makeChangeAtomId(localId, revision);\n\t\t\t\tif (composedFieldSrc === undefined || !areEqualRegisterIds(src, composedFieldSrc)) {\n\t\t\t\t\tcomposedMoves.push([src, dst]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tchange1FieldSrc !== undefined &&\n\t\t\tchange1FieldSrc !== \"self\" &&\n\t\t\tchange2.valueReplace !== undefined\n\t\t) {\n\t\t\tconst change2FieldDst = change2.valueReplace.dst;\n\t\t\tif (\n\t\t\t\tisReplaceEffectful(change2.valueReplace) &&\n\t\t\t\t!areEqualChangeAtomIds(change1FieldSrc, change2FieldDst)\n\t\t\t) {\n\t\t\t\tcomposedMoves.push([change1FieldSrc, change2FieldDst]);\n\t\t\t}\n\t\t}\n\n\t\tconst firstChange = change1.valueReplace ?? change2.valueReplace;\n\t\tif (firstChange === undefined) {\n\t\t\treturn composed;\n\t\t}\n\n\t\tconst replace: Mutable<Replace> = {\n\t\t\tisEmpty: firstChange.isEmpty,\n\t\t\tdst: getComposedReplaceDst(change1.valueReplace, change2),\n\t\t};\n\t\tif (composedFieldSrc !== undefined) {\n\t\t\treplace.src = composedFieldSrc;\n\t\t}\n\t\tcomposed.valueReplace = replace;\n\t\treturn composed;\n\t},\n\n\tinvert: (\n\t\tchange: OptionalChangeset,\n\t\tisRollback: boolean,\n\t\tgenId: IdAllocator<ChangesetLocalId>,\n\t\trevision: RevisionTag | undefined,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges, valueReplace } = change;\n\n\t\tconst invertIdMap = new RegisterMap<RegisterId>();\n\t\tconst invertedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tinvertIdMap.set(src, dst);\n\t\t\tinvertedMoves.push([dst, src]);\n\t\t}\n\t\tif (valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tinvertIdMap.set(\"self\", valueReplace.dst);\n\t\t\t}\n\t\t\tif (valueReplace.src !== undefined) {\n\t\t\t\tinvertIdMap.set(valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst inverted: Mutable<OptionalChangeset> = {\n\t\t\tmoves: invertedMoves,\n\t\t\tchildChanges: childChanges.map(([id, childChange]) => {\n\t\t\t\treturn [invertIdMap.get(id) ?? id, childChange];\n\t\t\t}),\n\t\t};\n\n\t\tif (valueReplace !== undefined) {\n\t\t\tif (isReplaceEffectful(valueReplace)) {\n\t\t\t\tconst replace: Mutable<Replace> =\n\t\t\t\t\tvalueReplace.src === undefined\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tisEmpty: true,\n\t\t\t\t\t\t\t\tdst: makeChangeAtomId(genId.allocate(), revision),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tisEmpty: false,\n\t\t\t\t\t\t\t\tdst: isRollback\n\t\t\t\t\t\t\t\t\t? valueReplace.src\n\t\t\t\t\t\t\t\t\t: makeChangeAtomId(genId.allocate(), revision),\n\t\t\t\t\t\t\t};\n\t\t\t\tif (valueReplace.isEmpty === false) {\n\t\t\t\t\treplace.src = valueReplace.dst;\n\t\t\t\t}\n\t\t\t\tinverted.valueReplace = replace;\n\t\t\t} else if (!isRollback && valueReplace.src === \"self\") {\n\t\t\t\tinverted.valueReplace = {\n\t\t\t\t\tisEmpty: false,\n\t\t\t\t\tsrc: \"self\",\n\t\t\t\t\tdst: makeChangeAtomId(genId.allocate(), revision),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn inverted;\n\t},\n\n\trebase: (\n\t\tchange: OptionalChangeset,\n\t\toverChange: OptionalChangeset,\n\t\trebaseChild: NodeChangeRebaser,\n\t): OptionalChangeset => {\n\t\tconst { moves, childChanges, valueReplace: field } = change;\n\n\t\t// TODO: avoid computing the dstToSrc map if it's not needed.\n\t\t// TODO: de-dupe overSrcToDst and forwardMap\n\t\tconst { srcToDst: overSrcToDst } = getBidirectionalMaps(overChange.moves);\n\n\t\tconst forwardMap = new RegisterMap<RegisterId>();\n\t\tfor (const [src, dst] of overChange.moves) {\n\t\t\tforwardMap.set(src, dst);\n\t\t}\n\t\tif (overChange.valueReplace !== undefined) {\n\t\t\tconst effectfulDst = getEffectfulDst(overChange.valueReplace);\n\t\t\tif (effectfulDst !== undefined) {\n\t\t\t\tforwardMap.set(\"self\", overChange.valueReplace.dst);\n\t\t\t}\n\t\t\tif (overChange.valueReplace.src !== undefined) {\n\t\t\t\tforwardMap.set(overChange.valueReplace.src, \"self\");\n\t\t\t}\n\t\t}\n\n\t\tconst rebasedMoves: Move[] = [];\n\t\tfor (const [src, dst] of moves) {\n\t\t\tconst newDst = tryGetFromNestedMap(overSrcToDst, src.revision, src.localId);\n\t\t\trebasedMoves.push([src, newDst ?? dst]);\n\t\t}\n\n\t\tconst overChildChangesBySrc = new RegisterMap<NodeId>();\n\t\tfor (const [id, childChange] of overChange.childChanges) {\n\t\t\toverChildChangesBySrc.set(id, childChange);\n\t\t}\n\n\t\tconst rebasedChildChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of childChanges) {\n\t\t\tconst overChildChange = overChildChangesBySrc.get(id);\n\t\t\tif (overChildChange !== undefined) {\n\t\t\t\toverChildChangesBySrc.delete(id);\n\t\t\t}\n\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tchildChange,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeAttachState.Attached : NodeAttachState.Detached,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, overChildChange] of overChildChangesBySrc.entries()) {\n\t\t\tconst rebasedId = forwardMap.get(id) ?? id;\n\t\t\tconst rebasedChildChange = rebaseChild(\n\t\t\t\tundefined,\n\t\t\t\toverChildChange,\n\t\t\t\trebasedId === \"self\" ? NodeAttachState.Attached : NodeAttachState.Detached,\n\t\t\t);\n\t\t\tif (rebasedChildChange !== undefined) {\n\t\t\t\trebasedChildChanges.push([rebasedId, rebasedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\tconst rebased: Mutable<OptionalChangeset> = {\n\t\t\tmoves: rebasedMoves,\n\t\t\tchildChanges: rebasedChildChanges,\n\t\t};\n\n\t\tif (field !== undefined) {\n\t\t\tconst replace: Mutable<Replace> = {\n\t\t\t\tisEmpty:\n\t\t\t\t\toverChange.valueReplace === undefined\n\t\t\t\t\t\t? field.isEmpty\n\t\t\t\t\t\t: overChange.valueReplace.src === undefined,\n\t\t\t\tdst: field.dst,\n\t\t\t};\n\t\t\tif (field.src !== undefined) {\n\t\t\t\treplace.src = forwardMap.get(field.src) ?? field.src;\n\t\t\t}\n\t\t\trebased.valueReplace = replace;\n\t\t}\n\n\t\treturn rebased;\n\t},\n\n\tprune: (change: OptionalChangeset, pruneChild: NodeChangePruner): OptionalChangeset => {\n\t\tconst childChanges: ChildChange[] = [];\n\t\tconst prunedChange: Mutable<OptionalChangeset> = {\n\t\t\tmoves: change.moves,\n\t\t\tchildChanges,\n\t\t};\n\t\tif (change.valueReplace !== undefined) {\n\t\t\tprunedChange.valueReplace = change.valueReplace;\n\t\t}\n\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst prunedChildChange = pruneChild(childChange);\n\t\t\tif (prunedChildChange !== undefined) {\n\t\t\t\tchildChanges.push([id, prunedChildChange]);\n\t\t\t}\n\t\t}\n\n\t\treturn prunedChange;\n\t},\n\n\treplaceRevisions: (\n\t\tchange: OptionalChangeset,\n\t\treplacer: RevisionReplacer,\n\t): OptionalChangeset => {\n\t\tconst valueReplace = replaceReplaceRevisions(change.valueReplace, replacer);\n\n\t\tconst childChanges: ChildChange[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tchildChanges.push([\n\t\t\t\treplaceRegisterRevisions(id, replacer),\n\t\t\t\treplacer.getUpdatedAtomId(childChange),\n\t\t\t]);\n\t\t}\n\n\t\tconst moves: Move[] = [];\n\t\tfor (const [src, dst] of change.moves) {\n\t\t\tmoves.push([replacer.getUpdatedAtomId(src), replacer.getUpdatedAtomId(dst)]);\n\t\t}\n\n\t\tconst updated: Mutable<OptionalChangeset> = { childChanges, moves };\n\t\tif (valueReplace !== undefined) {\n\t\t\tupdated.valueReplace = valueReplace;\n\t\t}\n\n\t\treturn updated;\n\t},\n\n\tfilterEdits,\n};\n\nfunction replaceReplaceRevisions(\n\treplace: Replace | undefined,\n\treplacer: RevisionReplacer,\n): Replace | undefined {\n\tif (replace === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst updated: Mutable<Replace> = {\n\t\t...replace,\n\t\tdst: replacer.getUpdatedAtomId(replace.dst),\n\t};\n\n\tif (replace.src !== undefined) {\n\t\tupdated.src = replaceRegisterRevisions(replace.src, replacer);\n\t}\n\n\treturn updated;\n}\n\nfunction replaceRegisterRevisions(\n\tregister: RegisterId,\n\treplacer: RevisionReplacer,\n): RegisterId {\n\treturn register === \"self\" ? register : replacer.getUpdatedAtomId(register);\n}\n\nfunction getComposedReplaceDst(\n\tchange1: Replace | undefined,\n\tchange2: OptionalChangeset,\n): ChangeAtomId {\n\tconst dst1 = change1?.dst;\n\tif (change2.valueReplace === undefined) {\n\t\tassert(dst1 !== undefined, 0x8ce /* Both replace replaces should not be undefined */);\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n\n\tif (\n\t\tdst1 === undefined ||\n\t\tchange1?.src === \"self\" ||\n\t\t(change2.valueReplace.src !== undefined &&\n\t\t\tareEqualRegisterIds(change2.valueReplace.src, dst1))\n\t) {\n\t\tassert(\n\t\t\tchange2.valueReplace !== undefined,\n\t\t\t0x8cf /* Both replace replaces should not be undefined */,\n\t\t);\n\t\treturn change2.valueReplace.dst;\n\t} else {\n\t\treturn getIdAfterMoves(dst1, change2.moves);\n\t}\n}\n\nfunction getIdAfterMoves(id: ChangeAtomId, moves: readonly Move[]): ChangeAtomId {\n\tfor (const [src, dst] of moves) {\n\t\tif (areEqualChangeAtomIds(id, src)) {\n\t\t\treturn dst;\n\t\t}\n\t}\n\treturn id;\n}\n\nfunction areEqualRegisterIds(id1: RegisterId, id2: RegisterId): boolean {\n\treturn id1 === \"self\" || id2 === \"self\" ? id1 === id2 : areEqualChangeAtomIds(id1, id2);\n}\n\nfunction areEqualRegisterIdsOpt(\n\tid1: RegisterId | undefined,\n\tid2: RegisterId | undefined,\n): boolean {\n\tif (id1 === undefined || id2 === undefined) {\n\t\treturn id1 === id2;\n\t}\n\treturn areEqualRegisterIds(id1, id2);\n}\n\nfunction getBidirectionalMaps(moves: OptionalChangeset[\"moves\"]): {\n\tsrcToDst: ChangeAtomIdMap<ChangeAtomId>;\n\tdstToSrc: ChangeAtomIdMap<ChangeAtomId>;\n} {\n\tconst srcToDst: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tconst dstToSrc: ChangeAtomIdMap<ChangeAtomId> = new Map();\n\tfor (const [src, dst] of moves) {\n\t\tsetInNestedMap(srcToDst, src.revision, src.localId, dst);\n\t\tsetInNestedMap(dstToSrc, dst.revision, dst.localId, src);\n\t}\n\treturn { srcToDst, dstToSrc };\n}\n\ntype EffectfulReplace =\n\t| {\n\t\t\tisEmpty: true;\n\t\t\tsrc?: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t }\n\t| {\n\t\t\tisEmpty: boolean;\n\t\t\tsrc: ChangeAtomId;\n\t\t\tdst: ChangeAtomId;\n\t };\n\nfunction isReplaceEffectful(replace: Replace): replace is EffectfulReplace {\n\tif (replace.src === \"self\") {\n\t\treturn false;\n\t}\n\treturn !replace.isEmpty || replace.src !== undefined;\n}\n\nfunction getEffectfulDst(replace: Replace | undefined): ChangeAtomId | undefined {\n\treturn replace === undefined || replace.isEmpty || replace.src === \"self\"\n\t\t? undefined\n\t\t: replace.dst;\n}\n\nexport function taggedRegister(id: RegisterId, revision: RevisionTag | undefined): RegisterId {\n\tif (id === \"self\") {\n\t\treturn id;\n\t}\n\n\treturn taggedAtomId(id, revision);\n}\n\nexport interface OptionalFieldEditor extends FieldEditor<OptionalChangeset> {\n\t/**\n\t * Creates a change which will replace the content already in the field (if any at the time the change applies)\n\t * with new content.\n\t * The content in the field will be moved to the `ids.detach` register.\n\t * The content in the `ids.detach` register will be moved to into the field.\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param ids - the \"fill\" and \"detach\" ids associated with the change.\n\t */\n\tset(\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangeAtomId;\n\t\t\tdetach: ChangeAtomId;\n\t\t},\n\t): OptionalChangeset;\n\n\t/**\n\t * Creates a change which clears the field's contents (if any).\n\t * @param wasEmpty - whether the field is empty when creating this change\n\t * @param detachId - the ID of the register that existing field content (if any) will be moved to.\n\t */\n\tclear(wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset;\n}\n\nexport const optionalFieldEditor: OptionalFieldEditor = {\n\tset: (\n\t\twasEmpty: boolean,\n\t\tids: {\n\t\t\tfill: ChangeAtomId;\n\t\t\t// Should be interpreted as a set of an empty field if undefined.\n\t\t\tdetach: ChangeAtomId;\n\t\t},\n\t): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tsrc: ids.fill,\n\t\t\tdst: ids.detach,\n\t\t},\n\t}),\n\n\tclear: (wasEmpty: boolean, detachId: ChangeAtomId): OptionalChangeset => ({\n\t\tmoves: [],\n\t\tchildChanges: [],\n\t\tvalueReplace: {\n\t\t\tisEmpty: wasEmpty,\n\t\t\tdst: detachId,\n\t\t},\n\t}),\n\n\tbuildChildChanges: (changes: Iterable<[number, NodeId]>): OptionalChangeset => {\n\t\tconst childChanges: ChildChange[] = Array.from(changes, ([index, childChange]) => {\n\t\t\tassert(index === 0, 0x404 /* Optional fields only support a single child node */);\n\t\t\treturn [\"self\", childChange];\n\t\t});\n\t\tassert(\n\t\t\tchildChanges.length <= 1,\n\t\t\t0xabd /* Optional fields only support a single child node */,\n\t\t);\n\t\treturn {\n\t\t\tmoves: [],\n\t\t\tchildChanges,\n\t\t};\n\t},\n};\n\nexport function optionalFieldIntoDelta(\n\tchange: OptionalChangeset,\n\tdeltaFromChild: ToDelta,\n): FieldChangeDelta {\n\tconst delta: Mutable<FieldChangeDelta> = {};\n\n\tlet markIsANoop = true;\n\tconst mark: Mutable<DeltaMark> = { count: 1 };\n\n\tif (change.valueReplace !== undefined && isReplaceEffectful(change.valueReplace)) {\n\t\tif (!change.valueReplace.isEmpty) {\n\t\t\tmark.detach = nodeIdFromChangeAtom(change.valueReplace.dst);\n\t\t}\n\t\tif (change.valueReplace.src !== undefined) {\n\t\t\tmark.attach = nodeIdFromChangeAtom(change.valueReplace.src);\n\t\t}\n\t\tmarkIsANoop = false;\n\t}\n\n\tif (change.moves.length > 0) {\n\t\tdelta.rename = change.moves.map(([src, dst]) => ({\n\t\t\tcount: 1,\n\t\t\toldId: nodeIdFromChangeAtom(src),\n\t\t\tnewId: nodeIdFromChangeAtom(dst),\n\t\t}));\n\t}\n\n\tif (change.childChanges.length > 0) {\n\t\tconst globals: DeltaDetachedNodeChanges[] = [];\n\t\tfor (const [id, childChange] of change.childChanges) {\n\t\t\tconst childDelta = deltaFromChild(childChange);\n\t\t\tif (id === \"self\") {\n\t\t\t\tmark.fields = childDelta;\n\t\t\t\tmarkIsANoop = false;\n\t\t\t} else {\n\t\t\t\tconst fields = childDelta;\n\t\t\t\tglobals.push({\n\t\t\t\t\tid: { major: id.revision, minor: id.localId },\n\t\t\t\t\tfields,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (globals.length > 0) {\n\t\t\tdelta.global = globals;\n\t\t}\n\t}\n\n\tif (!markIsANoop) {\n\t\tdelta.local = { marks: [mark] };\n\t}\n\n\treturn delta;\n}\n\nexport const optionalChangeHandler: FieldChangeHandler<\n\tOptionalChangeset,\n\tOptionalFieldEditor\n> = {\n\trebaser: optionalChangeRebaser,\n\tcodecsFactory: makeOptionalFieldCodecFamily,\n\teditor: optionalFieldEditor,\n\n\tintoDelta: optionalFieldIntoDelta,\n\trelevantRemovedRoots,\n\n\tisEmpty: (change: OptionalChangeset) =>\n\t\tchange.childChanges.length === 0 &&\n\t\tchange.moves.length === 0 &&\n\t\tchange.valueReplace === undefined,\n\n\tgetNestedChanges,\n\n\tcreateEmpty: () => ({ moves: [], childChanges: [] }),\n\tgetCrossFieldKeys: (_change) => [],\n};\n\nfunction getNestedChanges(change: OptionalChangeset): NestedChangesIndices {\n\t// True iff the content of the field changes in some way\n\tconst isFieldContentChanged =\n\t\tchange.valueReplace !== undefined && change.valueReplace.src !== \"self\";\n\n\t// The node that is moved into the field (if any).\n\tconst nodeMovedIntoField = change.valueReplace?.src;\n\n\treturn change.childChanges.map(([register, nodeId]) => {\n\t\t// The node is removed in the input context iif register is not self.\n\t\tconst inputIndex = register === \"self\" ? 0 : undefined;\n\t\tconst outputIndex =\n\t\t\tregister === \"self\"\n\t\t\t\t? // If the node starts out as not-removed, it is removed in the output context iff the field content is changed\n\t\t\t\t\tisFieldContentChanged\n\t\t\t\t\t? undefined\n\t\t\t\t\t: 0\n\t\t\t\t: // If the node starts out as removed, then it remains removed in the output context iff it is not the node that is moved into the field\n\t\t\t\t\tareEqualRegisterIdsOpt(register, nodeMovedIntoField)\n\t\t\t\t\t? 0\n\t\t\t\t\t: undefined;\n\t\treturn [nodeId, inputIndex, outputIndex];\n\t});\n}\n\nfunction* relevantRemovedRoots(\n\tchange: OptionalChangeset,\n\trelevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,\n): Iterable<DeltaDetachedNodeId> {\n\tconst alreadyYielded = new RegisterMap<boolean>();\n\n\tfor (const [src] of change.moves) {\n\t\tif (!alreadyYielded.has(src)) {\n\t\t\talreadyYielded.set(src, true);\n\t\t\tyield nodeIdFromChangeAtom(src);\n\t\t}\n\t}\n\n\tfor (const [id, childChange] of change.childChanges) {\n\t\t// Child changes make the tree they apply to relevant unless that tree existed in the starting context of\n\t\t// of this change.\n\t\tif (id !== \"self\" && !alreadyYielded.has(id)) {\n\t\t\talreadyYielded.set(id, true);\n\t\t\tyield nodeIdFromChangeAtom(id);\n\t\t}\n\t\tyield* relevantRemovedRootsFromChild(childChange);\n\t}\n\n\tconst selfSrc = change.valueReplace?.src;\n\tif (selfSrc !== undefined && selfSrc !== \"self\" && !alreadyYielded.has(selfSrc)) {\n\t\tyield nodeIdFromChangeAtom(selfSrc);\n\t}\n}\n\ninterface Optional\n\textends FlexFieldKind<\n\t\tOptionalFieldEditor,\n\t\ttypeof optionalIdentifier,\n\t\tMultiplicity.Optional\n\t> {}\n\n/**\n * 0 or 1 items.\n */\nexport const optional: Optional = new FlexFieldKind(\n\toptionalIdentifier,\n\tMultiplicity.Optional,\n\t{\n\t\tchangeHandler: optionalChangeHandler,\n\t\tallowMonotonicUpgradeFrom: new Set([\n\t\t\tidentifierFieldIdentifier,\n\t\t\trequiredIdentifier,\n\t\t\tforbiddenFieldKindIdentifier,\n\t\t]),\n\t},\n);\n\nfunction filterEdits(\n\tchange: OptionalChangeset,\n\toptions: {\n\t\tfilterDetach: EditFilterFunc;\n\t\tfilterAttach: EditFilterFunc;\n\t\tpreserveOtherEdits: boolean;\n\t},\n): OptionalChangeset {\n\tconst filtered: Mutable<OptionalChangeset> = { ...change };\n\tif (filtered.valueReplace !== undefined) {\n\t\tif (isReplaceEffectful(filtered.valueReplace)) {\n\t\t\tconst detachId = getEffectfulDst(filtered.valueReplace);\n\t\t\tconst detachResult =\n\t\t\t\tdetachId === undefined ? undefined : options.filterDetach(detachId, 1).value;\n\n\t\t\tconst attachId = filtered.valueReplace.src;\n\t\t\tconst attachResult =\n\t\t\t\tattachId === undefined ? undefined : options.filterAttach(attachId, 1).value;\n\n\t\t\tif (detachResult === EditFilterStatus.Remove) {\n\t\t\t\tassert(\n\t\t\t\t\tattachId === undefined || attachResult === EditFilterStatus.Remove,\n\t\t\t\t\t\"Cannot remove detach without also removing attach\",\n\t\t\t\t);\n\n\t\t\t\tdelete filtered.valueReplace;\n\t\t\t} else if (attachResult === EditFilterStatus.Remove) {\n\t\t\t\tdelete filtered.valueReplace.src;\n\t\t\t}\n\t\t} else if (!options.preserveOtherEdits) {\n\t\t\tdelete filtered.valueReplace;\n\t\t}\n\t}\n\n\tif (!options.preserveOtherEdits) {\n\t\tfiltered.moves = [];\n\t}\n\treturn filtered;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { type EditFilterFunc } from "../modular-schema/index.js";
|
|
6
|
+
import { type Changeset } from "./types.js";
|
|
7
|
+
export declare function filterEdits(change: Changeset, options: {
|
|
8
|
+
filterDetach: EditFilterFunc;
|
|
9
|
+
filterAttach: EditFilterFunc;
|
|
10
|
+
preserveOtherEdits: boolean;
|
|
11
|
+
}): Changeset;
|
|
12
|
+
//# sourceMappingURL=filterEdits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterEdits.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/filterEdits.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEnF,OAAO,EAAgB,KAAK,SAAS,EAAa,MAAM,YAAY,CAAC;AAKrE,wBAAgB,WAAW,CAC1B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE;IACR,YAAY,EAAE,cAAc,CAAC;IAC7B,YAAY,EAAE,cAAc,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;CAC5B,GACC,SAAS,CAeX"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { EditFilterStatus } from "../modular-schema/index.js";
|
|
6
|
+
import { MarkListFactory } from "./markListFactory.js";
|
|
7
|
+
import { NoopMarkType } from "./types.js";
|
|
8
|
+
import { getDetachedNodeId, getDetachOutputCellId, omitMarkEffect } from "./utils.js";
|
|
9
|
+
import { MarkQueueBase } from "./markQueue.js";
|
|
10
|
+
import { unreachableCase } from "@fluidframework/core-utils/internal";
|
|
11
|
+
export function filterEdits(change, options) {
|
|
12
|
+
const factory = new MarkListFactory();
|
|
13
|
+
const queue = new MarkQueueBase(change);
|
|
14
|
+
for (let mark = queue.peek(); mark !== undefined; mark = queue.peek()) {
|
|
15
|
+
const filtered = filterMark(mark, options.filterDetach, options.filterAttach, options.preserveOtherEdits);
|
|
16
|
+
factory.push(filtered);
|
|
17
|
+
queue.dequeueUpTo(filtered.count);
|
|
18
|
+
}
|
|
19
|
+
return factory.list;
|
|
20
|
+
}
|
|
21
|
+
function filterMark(mark, filterDetach, filterAttach, preserveOtherEdits) {
|
|
22
|
+
const type = mark.type;
|
|
23
|
+
switch (type) {
|
|
24
|
+
case "Insert":
|
|
25
|
+
case "MoveIn": {
|
|
26
|
+
if (mark.cellId === undefined) {
|
|
27
|
+
return preserveOtherEdits ? mark : omitMarkEffect(mark);
|
|
28
|
+
}
|
|
29
|
+
const endpoint = mark.type === "MoveIn" ? mark.finalEndpoint : undefined;
|
|
30
|
+
const result = filterAttach(mark.cellId, mark.count, endpoint);
|
|
31
|
+
let filtered;
|
|
32
|
+
switch (result.value) {
|
|
33
|
+
case EditFilterStatus.Preserve: {
|
|
34
|
+
filtered = mark;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case EditFilterStatus.PreserveWithoutMove: {
|
|
38
|
+
// KLUDGE: PreserveWithoutMove requires us to return a mark which attaches the node
|
|
39
|
+
// using the detach ID of the move (the endpoint ID).
|
|
40
|
+
// Insert marks use the cell ID as the attach ID, so we must change the cell ID here.
|
|
41
|
+
// This could be a problem if there were references to the old cell ID outside this changeset,
|
|
42
|
+
// but PreserveWithoutMove is only used for transaction minimization, where that is not a problem.
|
|
43
|
+
const newCellId = endpoint ?? { revision: mark.revision, localId: mark.id };
|
|
44
|
+
filtered = {
|
|
45
|
+
type: "Insert",
|
|
46
|
+
count: result.length,
|
|
47
|
+
cellId: newCellId,
|
|
48
|
+
revision: mark.revision,
|
|
49
|
+
id: mark.id,
|
|
50
|
+
};
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case EditFilterStatus.Remove: {
|
|
54
|
+
filtered = omitMarkEffect(mark);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
default: {
|
|
58
|
+
unreachableCase(result.value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { ...filtered, count: result.length };
|
|
62
|
+
}
|
|
63
|
+
case "Remove":
|
|
64
|
+
case "MoveOut": {
|
|
65
|
+
const detachId = getDetachedNodeId(mark);
|
|
66
|
+
const endpoint = mark.type === "MoveOut" ? mark.finalEndpoint : undefined;
|
|
67
|
+
const result = filterDetach(detachId, mark.count, endpoint);
|
|
68
|
+
let filtered;
|
|
69
|
+
switch (result.value) {
|
|
70
|
+
case EditFilterStatus.Preserve: {
|
|
71
|
+
filtered = mark;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case EditFilterStatus.PreserveWithoutMove: {
|
|
75
|
+
const outputCellId = getDetachOutputCellId(mark);
|
|
76
|
+
filtered = {
|
|
77
|
+
type: "Remove",
|
|
78
|
+
count: mark.count,
|
|
79
|
+
revision: outputCellId.revision,
|
|
80
|
+
id: outputCellId.localId,
|
|
81
|
+
};
|
|
82
|
+
if (mark.changes !== undefined) {
|
|
83
|
+
filtered.changes = mark.changes;
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case EditFilterStatus.Remove: {
|
|
88
|
+
filtered = omitMarkEffect(mark);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
default: {
|
|
92
|
+
unreachableCase(result.value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { ...filtered, count: result.length };
|
|
96
|
+
}
|
|
97
|
+
case NoopMarkType:
|
|
98
|
+
case "Rename":
|
|
99
|
+
case "AttachAndDetach": {
|
|
100
|
+
return preserveOtherEdits ? mark : omitMarkEffect(mark);
|
|
101
|
+
}
|
|
102
|
+
default: {
|
|
103
|
+
unreachableCase(type);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=filterEdits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterEdits.js","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/filterEdits.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ChangeAtomId } from \"../../core/index.js\";\nimport type { RangeQueryResult } from \"../../util/index.js\";\nimport { EditFilterStatus, type EditFilterFunc } from \"../modular-schema/index.js\";\nimport { MarkListFactory } from \"./markListFactory.js\";\nimport { NoopMarkType, type Changeset, type Mark } from \"./types.js\";\nimport { getDetachedNodeId, getDetachOutputCellId, omitMarkEffect } from \"./utils.js\";\nimport { MarkQueueBase } from \"./markQueue.js\";\nimport { unreachableCase } from \"@fluidframework/core-utils/internal\";\n\nexport function filterEdits(\n\tchange: Changeset,\n\toptions: {\n\t\tfilterDetach: EditFilterFunc;\n\t\tfilterAttach: EditFilterFunc;\n\t\tpreserveOtherEdits: boolean;\n\t},\n): Changeset {\n\tconst factory = new MarkListFactory();\n\tconst queue = new MarkQueueBase(change);\n\tfor (let mark = queue.peek(); mark !== undefined; mark = queue.peek()) {\n\t\tconst filtered = filterMark(\n\t\t\tmark,\n\t\t\toptions.filterDetach,\n\t\t\toptions.filterAttach,\n\t\t\toptions.preserveOtherEdits,\n\t\t);\n\t\tfactory.push(filtered);\n\t\tqueue.dequeueUpTo(filtered.count);\n\t}\n\n\treturn factory.list;\n}\n\nfunction filterMark(\n\tmark: Mark,\n\tfilterDetach: (\n\t\tid: ChangeAtomId,\n\t\tcount: number,\n\t\tendpoint?: ChangeAtomId,\n\t) => RangeQueryResult<EditFilterStatus>,\n\tfilterAttach: (\n\t\tid: ChangeAtomId,\n\t\tcount: number,\n\t\tendpoint?: ChangeAtomId,\n\t) => RangeQueryResult<EditFilterStatus>,\n\tpreserveOtherEdits: boolean,\n): Mark {\n\tconst type = mark.type;\n\tswitch (type) {\n\t\tcase \"Insert\":\n\t\tcase \"MoveIn\": {\n\t\t\tif (mark.cellId === undefined) {\n\t\t\t\treturn preserveOtherEdits ? mark : omitMarkEffect(mark);\n\t\t\t}\n\n\t\t\tconst endpoint = mark.type === \"MoveIn\" ? mark.finalEndpoint : undefined;\n\t\t\tconst result = filterAttach(mark.cellId, mark.count, endpoint);\n\n\t\t\tlet filtered: Mark;\n\t\t\tswitch (result.value) {\n\t\t\t\tcase EditFilterStatus.Preserve: {\n\t\t\t\t\tfiltered = mark;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase EditFilterStatus.PreserveWithoutMove: {\n\t\t\t\t\t// KLUDGE: PreserveWithoutMove requires us to return a mark which attaches the node\n\t\t\t\t\t// using the detach ID of the move (the endpoint ID).\n\t\t\t\t\t// Insert marks use the cell ID as the attach ID, so we must change the cell ID here.\n\t\t\t\t\t// This could be a problem if there were references to the old cell ID outside this changeset,\n\t\t\t\t\t// but PreserveWithoutMove is only used for transaction minimization, where that is not a problem.\n\t\t\t\t\tconst newCellId = endpoint ?? { revision: mark.revision, localId: mark.id };\n\t\t\t\t\tfiltered = {\n\t\t\t\t\t\ttype: \"Insert\",\n\t\t\t\t\t\tcount: result.length,\n\t\t\t\t\t\tcellId: newCellId,\n\t\t\t\t\t\trevision: mark.revision,\n\t\t\t\t\t\tid: mark.id,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase EditFilterStatus.Remove: {\n\t\t\t\t\tfiltered = omitMarkEffect(mark);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(result.value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { ...filtered, count: result.length };\n\t\t}\n\t\tcase \"Remove\":\n\t\tcase \"MoveOut\": {\n\t\t\tconst detachId = getDetachedNodeId(mark);\n\t\t\tconst endpoint = mark.type === \"MoveOut\" ? mark.finalEndpoint : undefined;\n\t\t\tconst result = filterDetach(detachId, mark.count, endpoint);\n\n\t\t\tlet filtered: Mark;\n\t\t\tswitch (result.value) {\n\t\t\t\tcase EditFilterStatus.Preserve: {\n\t\t\t\t\tfiltered = mark;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase EditFilterStatus.PreserveWithoutMove: {\n\t\t\t\t\tconst outputCellId = getDetachOutputCellId(mark);\n\t\t\t\t\tfiltered = {\n\t\t\t\t\t\ttype: \"Remove\",\n\t\t\t\t\t\tcount: mark.count,\n\t\t\t\t\t\trevision: outputCellId.revision,\n\t\t\t\t\t\tid: outputCellId.localId,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (mark.changes !== undefined) {\n\t\t\t\t\t\tfiltered.changes = mark.changes;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase EditFilterStatus.Remove: {\n\t\t\t\t\tfiltered = omitMarkEffect(mark);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(result.value);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { ...filtered, count: result.length };\n\t\t}\n\t\tcase NoopMarkType:\n\t\tcase \"Rename\":\n\t\tcase \"AttachAndDetach\": {\n\t\t\treturn preserveOtherEdits ? mark : omitMarkEffect(mark);\n\t\t}\n\t\tdefault: {\n\t\t\tunreachableCase(type);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { type MoveEffectTable } from "./moveEffectTable.js";
|
|
6
6
|
import type { Mark } from "./types.js";
|
|
7
|
-
export declare class
|
|
7
|
+
export declare class MarkQueueBase {
|
|
8
8
|
private readonly list;
|
|
9
|
-
private readonly moveEffects;
|
|
10
9
|
private readonly stack;
|
|
11
10
|
private index;
|
|
12
|
-
constructor(list: readonly Mark[]
|
|
11
|
+
constructor(list: readonly Mark[]);
|
|
13
12
|
isEmpty(): boolean;
|
|
14
13
|
dequeue(): Mark;
|
|
15
14
|
tryDequeue(): Mark | undefined;
|
|
@@ -20,5 +19,11 @@ export declare class MarkQueue {
|
|
|
20
19
|
*/
|
|
21
20
|
dequeueUpTo(length: number): Mark;
|
|
22
21
|
peek(): Mark | undefined;
|
|
22
|
+
protected getLengthForSplit(mark: Mark): number;
|
|
23
|
+
}
|
|
24
|
+
export declare class MarkQueue extends MarkQueueBase {
|
|
25
|
+
private readonly moveEffects;
|
|
26
|
+
constructor(list: readonly Mark[], moveEffects: MoveEffectTable);
|
|
27
|
+
protected getLengthForSplit(mark: Mark): number;
|
|
23
28
|
}
|
|
24
29
|
//# sourceMappingURL=markQueue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markQueue.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/markQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"markQueue.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/markQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,qBAAa,aAAa;IAIN,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,KAAK,CAAK;gBAEkB,IAAI,EAAE,SAAS,IAAI,EAAE;IAIlD,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,IAAI;IAMf,UAAU,IAAI,IAAI,GAAG,SAAS;IAgBrC;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWjC,IAAI,IAAI,IAAI,GAAG,SAAS;IAQ/B,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;CAG/C;AAED,qBAAa,SAAU,SAAQ,aAAa;IAG1C,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAD5B,IAAI,EAAE,SAAS,IAAI,EAAE,EACJ,WAAW,EAAE,eAAe;cAK3B,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;CAGxD"}
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { assert
|
|
6
|
-
import {
|
|
5
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
6
|
+
import { getFirstMoveEffectLength } from "./moveEffectTable.js";
|
|
7
7
|
import { splitMark } from "./utils.js";
|
|
8
|
-
export class
|
|
9
|
-
constructor(list
|
|
8
|
+
export class MarkQueueBase {
|
|
9
|
+
constructor(list) {
|
|
10
10
|
this.list = list;
|
|
11
|
-
this.moveEffects = moveEffects;
|
|
12
11
|
this.stack = [];
|
|
13
12
|
this.index = 0;
|
|
14
13
|
this.list = list;
|
|
@@ -26,11 +25,13 @@ export class MarkQueue {
|
|
|
26
25
|
if (mark === undefined) {
|
|
27
26
|
return undefined;
|
|
28
27
|
}
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
const splitLength = this.getLengthForSplit(mark);
|
|
29
|
+
if (splitLength < mark.count) {
|
|
30
|
+
const [part1, part2] = splitMark(mark, splitLength);
|
|
31
|
+
this.stack.push(part2);
|
|
32
|
+
return part1;
|
|
32
33
|
}
|
|
33
|
-
return
|
|
34
|
+
return mark;
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* Dequeues the first `length` sized portion of the next mark,
|
|
@@ -53,5 +54,17 @@ export class MarkQueue {
|
|
|
53
54
|
}
|
|
54
55
|
return mark;
|
|
55
56
|
}
|
|
57
|
+
getLengthForSplit(mark) {
|
|
58
|
+
return mark.count;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class MarkQueue extends MarkQueueBase {
|
|
62
|
+
constructor(list, moveEffects) {
|
|
63
|
+
super(list);
|
|
64
|
+
this.moveEffects = moveEffects;
|
|
65
|
+
}
|
|
66
|
+
getLengthForSplit(mark) {
|
|
67
|
+
return getFirstMoveEffectLength(mark, mark.count, this.moveEffects);
|
|
68
|
+
}
|
|
56
69
|
}
|
|
57
70
|
//# sourceMappingURL=markQueue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markQueue.js","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/markQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"markQueue.js","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/markQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAwB,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,OAAO,aAAa;IAIzB,YAAoC,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;QAHxC,UAAK,GAAW,EAAE,CAAC;QAC5B,UAAK,GAAG,CAAC,CAAC;QAGjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC;IAClC,CAAC;IAEM,OAAO;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,UAAU;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAChF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,MAAc;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACd,CAAC;IAEM,IAAI;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAES,iBAAiB,CAAC,IAAU;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACD;AAED,MAAM,OAAO,SAAU,SAAQ,aAAa;IAC3C,YACC,IAAqB,EACJ,WAA4B;QAE7C,KAAK,CAAC,IAAI,CAAC,CAAC;QAFK,gBAAW,GAAX,WAAW,CAAiB;IAG9C,CAAC;IAEkB,iBAAiB,CAAC,IAAU;QAC9C,OAAO,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { getFirstMoveEffectLength, type MoveEffectTable } from \"./moveEffectTable.js\";\nimport type { Mark } from \"./types.js\";\nimport { splitMark } from \"./utils.js\";\n\nexport class MarkQueueBase {\n\tprivate readonly stack: Mark[] = [];\n\tprivate index = 0;\n\n\tpublic constructor(private readonly list: readonly Mark[]) {\n\t\tthis.list = list;\n\t}\n\n\tpublic isEmpty(): boolean {\n\t\treturn this.peek() === undefined;\n\t}\n\n\tpublic dequeue(): Mark {\n\t\tconst output = this.tryDequeue();\n\t\tassert(output !== undefined, 0x4e2 /* Unexpected end of mark queue */);\n\t\treturn output;\n\t}\n\n\tpublic tryDequeue(): Mark | undefined {\n\t\tconst mark = this.stack.length > 0 ? this.stack.pop() : this.list[this.index++];\n\t\tif (mark === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst splitLength = this.getLengthForSplit(mark);\n\t\tif (splitLength < mark.count) {\n\t\t\tconst [part1, part2] = splitMark(mark, splitLength);\n\t\t\tthis.stack.push(part2);\n\t\t\treturn part1;\n\t\t}\n\n\t\treturn mark;\n\t}\n\n\t/**\n\t * Dequeues the first `length` sized portion of the next mark,\n\t * or the entire next mark if `length` is longer than the mark's length.\n\t * @param length - The length to dequeue, measured in the input context.\n\t */\n\tpublic dequeueUpTo(length: number): Mark {\n\t\tconst mark = this.dequeue();\n\t\tif (mark.count <= length) {\n\t\t\treturn mark;\n\t\t}\n\n\t\tconst [mark1, mark2] = splitMark(mark, length);\n\t\tthis.stack.push(mark2);\n\t\treturn mark1;\n\t}\n\n\tpublic peek(): Mark | undefined {\n\t\tconst mark = this.tryDequeue();\n\t\tif (mark !== undefined) {\n\t\t\tthis.stack.push(mark);\n\t\t}\n\t\treturn mark;\n\t}\n\n\tprotected getLengthForSplit(mark: Mark): number {\n\t\treturn mark.count;\n\t}\n}\n\nexport class MarkQueue extends MarkQueueBase {\n\tpublic constructor(\n\t\tlist: readonly Mark[],\n\t\tprivate readonly moveEffects: MoveEffectTable,\n\t) {\n\t\tsuper(list);\n\t}\n\n\tprotected override getLengthForSplit(mark: Mark): number {\n\t\treturn getFirstMoveEffectLength(mark, mark.count, this.moveEffects);\n\t}\n}\n"]}
|
|
@@ -59,6 +59,6 @@ export declare function isMoveMark(effect: MarkEffect): effect is MoveMarkEffect
|
|
|
59
59
|
export declare function isMoveOut(effect: MarkEffect): effect is MoveOut;
|
|
60
60
|
export declare function isMoveIn(effect: MarkEffect): effect is MoveIn;
|
|
61
61
|
export declare function getMoveIn(effect: MarkEffect): MoveIn | undefined;
|
|
62
|
-
export declare function
|
|
62
|
+
export declare function getFirstMoveEffectLength(markEffect: MarkEffect, count: number, effects: MoveEffectTable): number;
|
|
63
63
|
export declare function getCrossFieldTargetFromMove(mark: MoveMarkEffect): CrossFieldTarget;
|
|
64
64
|
//# sourceMappingURL=moveEffectTable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moveEffectTable.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/moveEffectTable.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,KAAK,gBAAgB,EAAS,MAAM,qBAAqB,CAAC;AACnE,OAAO,EACN,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,KAAK,MAAM,EACX,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG9F,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IAExB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,CAAC;IAEjC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,YAAY,CAAC;CACzC;AAUD,oBAAY,OAAO;IAClB,MAAM,IAAA;IACN,IAAI,IAAA;CACJ;AAED,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IAGX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,aAAa,CAC5B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,UAAU,GAAE,OAAc,GACxB,IAAI,CAGN;AAED,wBAAgB,aAAa,CAC5B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,OAAc,GAC3B,gBAAgB,CAAC,UAAU,GAAG,SAAS,CAAC,CAK1C;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAEhD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,cAAc,CAEvE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,OAAO,CAE/D;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAYhE;AAkCD,wBAAgB,
|
|
1
|
+
{"version":3,"file":"moveEffectTable.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/sequence-field/moveEffectTable.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,KAAK,gBAAgB,EAAS,MAAM,qBAAqB,CAAC;AACnE,OAAO,EACN,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,KAAK,MAAM,EACX,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG9F,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IAExB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,CAAC;IAEjC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,YAAY,CAAC;CACzC;AAUD,oBAAY,OAAO;IAClB,MAAM,IAAA;IACN,IAAI,IAAA;CACJ;AAED,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IAGX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,aAAa,CAC5B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,UAAU,GAAE,OAAc,GACxB,IAAI,CAGN;AAED,wBAAgB,aAAa,CAC5B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,OAAc,GAC3B,gBAAgB,CAAC,UAAU,GAAG,SAAS,CAAC,CAK1C;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAEhD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,cAAc,CAEvE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,OAAO,CAE/D;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAYhE;AAkCD,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACtB,MAAM,CAiBR;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CAalF"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
|
|
6
6
|
import { brand } from "../../util/index.js";
|
|
7
7
|
import { CrossFieldTarget, } from "../modular-schema/index.js";
|
|
8
|
-
import { isAttachAndDetachEffect,
|
|
8
|
+
import { isAttachAndDetachEffect, splitMarkEffect } from "./utils.js";
|
|
9
9
|
export var MoveEnd;
|
|
10
10
|
(function (MoveEnd) {
|
|
11
11
|
MoveEnd[MoveEnd["Source"] = 0] = "Source";
|
|
@@ -65,11 +65,7 @@ function adjustMoveEffectBasis(effect, newBasis) {
|
|
|
65
65
|
}
|
|
66
66
|
return adjusted;
|
|
67
67
|
}
|
|
68
|
-
export function
|
|
69
|
-
const length = getFirstMoveEffectLength(mark, mark.count, effects);
|
|
70
|
-
return length < mark.count ? splitMark(mark, length) : [mark];
|
|
71
|
-
}
|
|
72
|
-
function getFirstMoveEffectLength(markEffect, count, effects) {
|
|
68
|
+
export function getFirstMoveEffectLength(markEffect, count, effects) {
|
|
73
69
|
if (isMoveMark(markEffect)) {
|
|
74
70
|
return getMoveEffect(effects, getCrossFieldTargetFromMove(markEffect), markEffect.revision, markEffect.id, count).length;
|
|
75
71
|
}
|