@fluidframework/merge-tree 2.70.0-360753 → 2.70.0-361092

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.
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkBH;;;;;;GAMG;AACU,QAAA,wBAAwB,GAAG;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC;CACP,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { ISegment } from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IMergeTreeGroupMsg, IMergeTreeOp, MergeTreeDeltaType } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationType =\n\t| typeof MergeTreeDeltaType.ANNOTATE\n\t| typeof MergeTreeDeltaType.INSERT\n\t| typeof MergeTreeDeltaType.REMOVE\n\t| typeof MergeTreeDeltaType.OBLITERATE;\n\n/**\n * Enum-like constant defining the types of \"maintenance\" events on a merge tree.\n * Maintenance events correspond to structural segment changes or acks of pending segments.\n *\n * Note: these values are assigned negative integers to avoid clashing with `MergeTreeDeltaType`.\n * @legacy @beta\n */\nexport const MergeTreeMaintenanceType = {\n\t/**\n\t * Notification that a segment \"append\" has occurred, i.e. two adjacent segments have been merged.\n\t * BEWARE: `deltaSegments` on the corresponding event will contain both the merged segment and the latter\n\t * segment, pre-merge.\n\t * For example, if the merge tree originally had two adjacent segments [A][B] and called A.append(B) to get\n\t * segment [AB], `deltaSegments` would contain [AB] and [B].\n\t */\n\tAPPEND: -1,\n\t/**\n\t * Notification that a segment has been split in two.\n\t * `deltaSegments` on the corresponding event will contain the resulting two segments.\n\t */\n\tSPLIT: -2,\n\t/**\n\t * Notification that a segment has been unlinked (i.e. removed) from the MergeTree.\n\t * This occurs on leaf segments during Zamboni when the segment's tracking collection is empty\n\t * (e.g., not being tracked for undo/redo).\n\t * It also occurs on internal merge tree segments when re-packing children to maintain tree balancing invariants.\n\t */\n\tUNLINK: -3,\n\t/**\n\t * Notification that a local change has been acknowledged by the server.\n\t * This means that it has made the round trip to the server and has had a sequence number assigned.\n\t */\n\tACKNOWLEDGED: -4,\n} as const;\n/**\n * @legacy @beta\n */\nexport type MergeTreeMaintenanceType =\n\t(typeof MergeTreeMaintenanceType)[keyof typeof MergeTreeMaintenanceType];\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationTypes =\n\t| MergeTreeDeltaOperationType\n\t| MergeTreeMaintenanceType;\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaCallbackArgs<\n\tTOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType,\n> {\n\t/**\n\t * The type of operation that affected segments in the merge-tree.\n\t * The affected segments can be accessed via {@link IMergeTreeDeltaCallbackArgs.deltaSegments|deltaSegments}.\n\t *\n\t * See {@link MergeTreeDeltaOperationType} and {@link (MergeTreeMaintenanceType:type)} for possible values.\n\t */\n\treadonly operation: TOperationType;\n\n\t/**\n\t * A list of deltas describing actions taken on segments.\n\t *\n\t * Deltas are not guaranteed to be in any particular order.\n\t */\n\treadonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeSegmentDelta {\n\t/**\n\t * The segment this delta affected.\n\t */\n\tsegment: ISegment;\n\n\t/**\n\t * A property set containing changes to properties on this segment.\n\t *\n\t * @remarks - Deleting a property is represented using `null` as the value.\n\t * @example\n\t *\n\t * An annotation change which deleted the property \"foo\" and set \"bar\" to 5 would be represented as:\n\t * `{ foo: null, bar: 5 }`.\n\t */\n\tpropertyDeltas?: PropertySet;\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaOpArgs {\n\t/**\n\t * The group op which contains the operation\n\t * if there operation is part of a group op.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\treadonly groupOp?: IMergeTreeGroupMsg;\n\n\t/**\n\t * The {@link IMergeTreeOp} corresponding to the delta.\n\t *\n\t * @remarks - This is useful for determining the type of change (see {@link (MergeTreeDeltaType:type)}).\n\t */\n\treadonly op: IMergeTreeOp;\n\n\t/**\n\t * The {@link @fluidframework/protocol-definitions#ISequencedDocumentMessage} corresponding to this acknowledged change.\n\t *\n\t * This field is omitted for deltas corresponding to unacknowledged changes.\n\t */\n\treadonly sequencedMessage?: ISequencedDocumentMessage;\n\n\t/**\n\t * Set to true if this delta is being performed as part of a rollback of unsent local changes.\n\t */\n\treadonly rollback?: true;\n}\n\n/**\n * @internal\n */\nexport type MergeTreeDeltaCallback = (\n\topArgs: IMergeTreeDeltaOpArgs,\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n) => void;\n\n/**\n * @legacy @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs\n\textends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}\n\n/**\n * @internal\n */\nexport type MergeTreeMaintenanceCallback = (\n\tMaintenanceArgs: IMergeTreeMaintenanceCallbackArgs,\n\topArgs: IMergeTreeDeltaOpArgs | undefined,\n) => void;\n"]}
1
+ {"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkBH;;;;;;GAMG;AACU,QAAA,wBAAwB,GAAG;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC;CACP,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { ISegment } from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IMergeTreeGroupMsg, IMergeTreeOp, MergeTreeDeltaType } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationType =\n\t| typeof MergeTreeDeltaType.ANNOTATE\n\t| typeof MergeTreeDeltaType.INSERT\n\t| typeof MergeTreeDeltaType.REMOVE\n\t| typeof MergeTreeDeltaType.OBLITERATE;\n\n/**\n * Enum-like constant defining the types of \"maintenance\" events on a merge tree.\n * Maintenance events correspond to structural segment changes or acks of pending segments.\n *\n * Note: these values are assigned negative integers to avoid clashing with `MergeTreeDeltaType`.\n * @legacy @beta\n */\nexport const MergeTreeMaintenanceType = {\n\t/**\n\t * Notification that a segment \"append\" has occurred, i.e. two adjacent segments have been merged.\n\t * BEWARE: `deltaSegments` on the corresponding event will contain both the merged segment and the latter\n\t * segment, pre-merge.\n\t * For example, if the merge tree originally had two adjacent segments [A][B] and called A.append(B) to get\n\t * segment [AB], `deltaSegments` would contain [AB] and [B].\n\t */\n\tAPPEND: -1,\n\t/**\n\t * Notification that a segment has been split in two.\n\t * `deltaSegments` on the corresponding event will contain the resulting two segments.\n\t */\n\tSPLIT: -2,\n\t/**\n\t * Notification that a segment has been unlinked (i.e. removed) from the MergeTree.\n\t * This occurs on leaf segments during Zamboni when the segment's tracking collection is empty\n\t * (e.g., not being tracked for undo/redo).\n\t * It also occurs on internal merge tree segments when re-packing children to maintain tree balancing invariants.\n\t */\n\tUNLINK: -3,\n\t/**\n\t * Notification that a local change has been acknowledged by the server.\n\t * This means that it has made the round trip to the server and has had a sequence number assigned.\n\t */\n\tACKNOWLEDGED: -4,\n} as const;\n/**\n * @legacy @beta\n */\nexport type MergeTreeMaintenanceType =\n\t(typeof MergeTreeMaintenanceType)[keyof typeof MergeTreeMaintenanceType];\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationTypes =\n\t| MergeTreeDeltaOperationType\n\t| MergeTreeMaintenanceType;\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaCallbackArgs<\n\tTOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType,\n> {\n\t/**\n\t * The type of operation that affected segments in the merge-tree.\n\t * The affected segments can be accessed via {@link IMergeTreeDeltaCallbackArgs.deltaSegments|deltaSegments}.\n\t *\n\t * See {@link MergeTreeDeltaOperationType} and {@link (MergeTreeMaintenanceType:type)} for possible values.\n\t */\n\treadonly operation: TOperationType;\n\n\t/**\n\t * A list of deltas describing actions taken on segments.\n\t *\n\t * Deltas are not guaranteed to be in any particular order.\n\t */\n\treadonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeSegmentDelta {\n\t/**\n\t * The segment this delta affected.\n\t */\n\tsegment: ISegment;\n\n\t/**\n\t * A property set containing changes to properties on this segment.\n\t *\n\t * @remarks - Deleting a property is represented using `null` as the value.\n\t * @example\n\t *\n\t * An annotation change which deleted the property \"foo\" and set \"bar\" to 5 would be represented as:\n\t * `{ foo: null, bar: 5 }`.\n\t */\n\tpropertyDeltas?: PropertySet;\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaOpArgs {\n\t/**\n\t * The group op which contains the operation\n\t * if there operation is part of a group op.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\treadonly groupOp?: IMergeTreeGroupMsg;\n\n\t/**\n\t * The {@link IMergeTreeOp} corresponding to the delta.\n\t *\n\t * @remarks - This is useful for determining the type of change (see {@link (MergeTreeDeltaType:type)}).\n\t */\n\treadonly op: IMergeTreeOp;\n\n\t/**\n\t * The {@link @fluidframework/protocol-definitions#ISequencedDocumentMessage} corresponding to this acknowledged change.\n\t *\n\t * This field is omitted for deltas corresponding to unacknowledged changes.\n\t */\n\treadonly sequencedMessage?: ISequencedDocumentMessage;\n\n\t/**\n\t * Set to true if this delta is being performed as part of a rollback of unsent local changes.\n\t */\n\treadonly rollback?: true;\n}\n\n/**\n * @internal\n */\nexport type MergeTreeDeltaCallback = (\n\topArgs: IMergeTreeDeltaOpArgs,\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n) => void;\n\n/**\n * @legacy @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs\n\textends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}\n\n/**\n * @internal\n */\nexport type MergeTreeMaintenanceCallback = (\n\tMaintenanceArgs: IMergeTreeMaintenanceCallbackArgs,\n\topArgs: IMergeTreeDeltaOpArgs | undefined,\n) => void;\n"]}
@@ -26,7 +26,7 @@ const testClientLogger_js_1 = require("./testClientLogger.js");
26
26
  * be merged with the implementation that lives there
27
27
  */
28
28
  function spyOnMethod(
29
- // eslint-disable-next-line @typescript-eslint/ban-types
29
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/ban-types
30
30
  methodClass, methodName, spy) {
31
31
  const { prototype } = methodClass;
32
32
  const method = prototype[methodName];
@@ -1 +1 @@
1
- {"version":3,"file":"revertibles.spec.js","sourceRoot":"","sources":["../../src/test/revertibles.spec.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\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { strict as assert } from \"node:assert\";\n\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\n/**\n * Run a custom \"spy function\" every time the given method is invoked.\n * @param methodClass - the class that has the method\n * @param methodName - the name of the method\n * @param spy - the spy function to run alongside the method\n * @returns a function which will remove the spy function when invoked. Should be called exactly once\n * after the spy is no longer needed.\n *\n * This method is duplicated between shared-tree test code, and should eventually\n * be merged with the implementation that lives there\n */\nexport function spyOnMethod(\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\tmethodClass: Function,\n\tmethodName: string,\n\tspy: () => void,\n): () => void {\n\tconst { prototype } = methodClass;\n\tconst method = prototype[methodName];\n\tassert(typeof method === \"function\", `Method does not exist: ${methodName}`);\n\n\tconst methodSpy = function (this: unknown, ...args: unknown[]): unknown {\n\t\tspy();\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\treturn method.call(this, ...args);\n\t};\n\tprototype[methodName] = methodSpy;\n\n\treturn () => {\n\t\tprototype[methodName] = method;\n\t};\n}\n\ndescribe(\"MergeTree.Revertibles\", () => {\n\tit(\"revert insert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"BB123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"has reasonable asymptotics in face of remove\", () => {\n\t\tconst length = 100;\n\n\t\t// track the amount of tracking group linking that occurs\n\t\tlet linkCount = 0;\n\t\tlet unlinkCount = 0;\n\n\t\tconst unspy1 = spyOnMethod(TrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy2 = spyOnMethod(TrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\t\tconst unspy3 = spyOnMethod(UnorderedTrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy4 = spyOnMethod(UnorderedTrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\n\t\ttry {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\tfor (let i = 1; i <= length; i++) {\n\t\t\t\tconst insertOp = clients.A.insertTextLocal(i - 1, \"a\");\n\t\t\t\tclients.A.applyMsg(\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tinsertOp,\n\t\t\t\t\t\t/* seq */ i + 1,\n\t\t\t\t\t\t/* refSeq */ i,\n\t\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t\t/* minSeq */ 1,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tclients.A.on(\"delta\", (_op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t});\n\n\t\t\tconst op = clients.A.removeRangeLocal(0, length - 1);\n\n\t\t\tclients.A.applyMsg(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\top,\n\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// the below checks act as a proxy for the asymptotics of undo-redo\n\t\t\t// linking. they are perhaps a bit more strict than necessary. if these\n\t\t\t// tests are failing and the number of calls is still within a sane limit,\n\t\t\t// it should be fine to update these checks to allow a larger number of\n\t\t\t// calls\n\t\t\tassert(\n\t\t\t\tlinkCount <= length * 3,\n\t\t\t\t`expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${\n\t\t\t\t\tlength * 3\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tunlinkCount <= length * 2,\n\t\t\t\t`expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${\n\t\t\t\t\tlength * 2\n\t\t\t\t}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tunspy1();\n\t\t\tunspy2();\n\t\t\tunspy3();\n\t\t\tunspy4();\n\t\t}\n\t});\n\n\tit(\"revert remove\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tfor (const { name, removeStart, removeEnd, expectedPostRemove } of [\n\t\t{\n\t\t\tname: \"revert overlapping remove\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 1,\n\t\t\texpectedPostRemove: \"23\",\n\t\t},\n\t\t{\n\t\t\tname: \"revert overlapping remove of multiple segments\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 2,\n\t\t\texpectedPreRemove: \"23\",\n\t\t},\n\t]) {\n\t\tit(name, () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"1-23\", options: {} },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tlet seq = 0;\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t});\n\n\t\t\tops.push(\n\t\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: expectedPostRemove });\n\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: \"123\" });\n\t\t});\n\t}\n\n\tit(\"revert two overlapping removes\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tconst clientC_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientCDriver = createRevertDriver(clients.C);\n\t\tclientCDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.C.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tclients.C.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientC_Revertibles);\n\t\t});\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\trevertMergeTreeDeltaRevertibles(clientCDriver, clientC_Revertibles.splice(0));\n\n\t\t// \"123\" would be the ideal final state, but due to current limitations,\n\t\t// the eventual consistent state is \"1123\"\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"1123\" });\n\t});\n\n\tit(\"revert annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Remove All Original Text and Insert then Revert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-2--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t// the test logger uses these callbacks, so preserve it\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"12\" });\n\t});\n\n\tit(\"Re-Insert at position 0 in empty string\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"BBC-\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BB\"), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"BBC\" });\n\t});\n\n\tit(\"Revert remove to empty with annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-23--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Revert Local annotate and remove with intersecting remote annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1234-----\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (\n\t\t\top: IMergeTreeDeltaOpArgs,\n\t\t\tdelta: IMergeTreeDeltaCallbackArgs,\n\t\t): void => {\n\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t}\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: \"B\" }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.push(\n\t\t\tclients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: \"C\" }), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"134\" });\n\n\t\ttry {\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t} catch (error) {\n\t\t\tthrow logger.addLogsToError(error);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1234\" });\n\t});\n\n\tdescribe(\"Revertibles work as expected when a pair of markers and text is involved\", () => {\n\t\tfor (const options of generatePairwiseOptions({\n\t\t\trevertMarkerInsert: [true, undefined],\n\t\t\tackMarkerInsert: [true, undefined],\n\t\t\tsplitInsertTextRevertible: [true, undefined],\n\t\t\tackTextInsert: [true, undefined],\n\t\t\tsplitRemoveRevertible: [true, undefined],\n\t\t\tackTextRemove: [true, undefined],\n\t\t\tackUndo: [true, undefined],\n\t\t})) {\n\t\t\tit(JSON.stringify(options), () => {\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{ initialState: \"\", options: {} },\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t);\n\n\t\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[][] = [];\n\t\t\t\tconst openNewUndoRedoTransaction = (): number => clientB_Revertibles.unshift([]);\n\t\t\t\t// the test logger uses these callbacks, so preserve it\n\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\t\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\t\tif (op.sequencedMessage === undefined && clientB_Revertibles.length > 0) {\n\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet afterUndoBaseText: string | undefined;\n\t\t\t\tif (options.revertMarkerInsert) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ReferenceType.Simple), ++seq),\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\n\t\t\t\tif (options.ackMarkerInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitInsertTextRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq));\n\t\t\t\tif (options.ackTextInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitRemoveRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\t\t\t\tif (options.ackTextRemove) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"\" });\n\t\t\t\t}\n\n\t\t\t\tconst afterRevertBaseTest = clients.B.getText();\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tif (options.ackUndo) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\tlogger.validate({ baseText: afterRevertBaseTest });\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"revertibles.spec.js","sourceRoot":"","sources":["../../src/test/revertibles.spec.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\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { strict as assert } from \"node:assert\";\n\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\n/**\n * Run a custom \"spy function\" every time the given method is invoked.\n * @param methodClass - the class that has the method\n * @param methodName - the name of the method\n * @param spy - the spy function to run alongside the method\n * @returns a function which will remove the spy function when invoked. Should be called exactly once\n * after the spy is no longer needed.\n *\n * This method is duplicated between shared-tree test code, and should eventually\n * be merged with the implementation that lives there\n */\nexport function spyOnMethod(\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/ban-types\n\tmethodClass: Function,\n\tmethodName: string,\n\tspy: () => void,\n): () => void {\n\tconst { prototype } = methodClass;\n\tconst method = prototype[methodName];\n\tassert(typeof method === \"function\", `Method does not exist: ${methodName}`);\n\n\tconst methodSpy = function (this: unknown, ...args: unknown[]): unknown {\n\t\tspy();\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\treturn method.call(this, ...args);\n\t};\n\tprototype[methodName] = methodSpy;\n\n\treturn () => {\n\t\tprototype[methodName] = method;\n\t};\n}\n\ndescribe(\"MergeTree.Revertibles\", () => {\n\tit(\"revert insert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"BB123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"has reasonable asymptotics in face of remove\", () => {\n\t\tconst length = 100;\n\n\t\t// track the amount of tracking group linking that occurs\n\t\tlet linkCount = 0;\n\t\tlet unlinkCount = 0;\n\n\t\tconst unspy1 = spyOnMethod(TrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy2 = spyOnMethod(TrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\t\tconst unspy3 = spyOnMethod(UnorderedTrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy4 = spyOnMethod(UnorderedTrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\n\t\ttry {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\tfor (let i = 1; i <= length; i++) {\n\t\t\t\tconst insertOp = clients.A.insertTextLocal(i - 1, \"a\");\n\t\t\t\tclients.A.applyMsg(\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tinsertOp,\n\t\t\t\t\t\t/* seq */ i + 1,\n\t\t\t\t\t\t/* refSeq */ i,\n\t\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t\t/* minSeq */ 1,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tclients.A.on(\"delta\", (_op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t});\n\n\t\t\tconst op = clients.A.removeRangeLocal(0, length - 1);\n\n\t\t\tclients.A.applyMsg(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\top,\n\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// the below checks act as a proxy for the asymptotics of undo-redo\n\t\t\t// linking. they are perhaps a bit more strict than necessary. if these\n\t\t\t// tests are failing and the number of calls is still within a sane limit,\n\t\t\t// it should be fine to update these checks to allow a larger number of\n\t\t\t// calls\n\t\t\tassert(\n\t\t\t\tlinkCount <= length * 3,\n\t\t\t\t`expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${\n\t\t\t\t\tlength * 3\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tunlinkCount <= length * 2,\n\t\t\t\t`expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${\n\t\t\t\t\tlength * 2\n\t\t\t\t}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tunspy1();\n\t\t\tunspy2();\n\t\t\tunspy3();\n\t\t\tunspy4();\n\t\t}\n\t});\n\n\tit(\"revert remove\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tfor (const { name, removeStart, removeEnd, expectedPostRemove } of [\n\t\t{\n\t\t\tname: \"revert overlapping remove\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 1,\n\t\t\texpectedPostRemove: \"23\",\n\t\t},\n\t\t{\n\t\t\tname: \"revert overlapping remove of multiple segments\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 2,\n\t\t\texpectedPreRemove: \"23\",\n\t\t},\n\t]) {\n\t\tit(name, () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"1-23\", options: {} },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tlet seq = 0;\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t});\n\n\t\t\tops.push(\n\t\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: expectedPostRemove });\n\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: \"123\" });\n\t\t});\n\t}\n\n\tit(\"revert two overlapping removes\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tconst clientC_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientCDriver = createRevertDriver(clients.C);\n\t\tclientCDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.C.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tclients.C.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientC_Revertibles);\n\t\t});\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\trevertMergeTreeDeltaRevertibles(clientCDriver, clientC_Revertibles.splice(0));\n\n\t\t// \"123\" would be the ideal final state, but due to current limitations,\n\t\t// the eventual consistent state is \"1123\"\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"1123\" });\n\t});\n\n\tit(\"revert annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Remove All Original Text and Insert then Revert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-2--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t// the test logger uses these callbacks, so preserve it\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"12\" });\n\t});\n\n\tit(\"Re-Insert at position 0 in empty string\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"BBC-\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BB\"), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"BBC\" });\n\t});\n\n\tit(\"Revert remove to empty with annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-23--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Revert Local annotate and remove with intersecting remote annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1234-----\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (\n\t\t\top: IMergeTreeDeltaOpArgs,\n\t\t\tdelta: IMergeTreeDeltaCallbackArgs,\n\t\t): void => {\n\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t}\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: \"B\" }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.push(\n\t\t\tclients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: \"C\" }), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"134\" });\n\n\t\ttry {\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t} catch (error) {\n\t\t\tthrow logger.addLogsToError(error);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1234\" });\n\t});\n\n\tdescribe(\"Revertibles work as expected when a pair of markers and text is involved\", () => {\n\t\tfor (const options of generatePairwiseOptions({\n\t\t\trevertMarkerInsert: [true, undefined],\n\t\t\tackMarkerInsert: [true, undefined],\n\t\t\tsplitInsertTextRevertible: [true, undefined],\n\t\t\tackTextInsert: [true, undefined],\n\t\t\tsplitRemoveRevertible: [true, undefined],\n\t\t\tackTextRemove: [true, undefined],\n\t\t\tackUndo: [true, undefined],\n\t\t})) {\n\t\t\tit(JSON.stringify(options), () => {\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{ initialState: \"\", options: {} },\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t);\n\n\t\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[][] = [];\n\t\t\t\tconst openNewUndoRedoTransaction = (): number => clientB_Revertibles.unshift([]);\n\t\t\t\t// the test logger uses these callbacks, so preserve it\n\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\t\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\t\tif (op.sequencedMessage === undefined && clientB_Revertibles.length > 0) {\n\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet afterUndoBaseText: string | undefined;\n\t\t\t\tif (options.revertMarkerInsert) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ReferenceType.Simple), ++seq),\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\n\t\t\t\tif (options.ackMarkerInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitInsertTextRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq));\n\t\t\t\tif (options.ackTextInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitRemoveRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\t\t\t\tif (options.ackTextRemove) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"\" });\n\t\t\t\t}\n\n\t\t\t\tconst afterRevertBaseTest = clients.B.getText();\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tif (options.ackUndo) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\tlogger.validate({ baseText: afterRevertBaseTest });\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC;CACP,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { ISegment } from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IMergeTreeGroupMsg, IMergeTreeOp, MergeTreeDeltaType } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationType =\n\t| typeof MergeTreeDeltaType.ANNOTATE\n\t| typeof MergeTreeDeltaType.INSERT\n\t| typeof MergeTreeDeltaType.REMOVE\n\t| typeof MergeTreeDeltaType.OBLITERATE;\n\n/**\n * Enum-like constant defining the types of \"maintenance\" events on a merge tree.\n * Maintenance events correspond to structural segment changes or acks of pending segments.\n *\n * Note: these values are assigned negative integers to avoid clashing with `MergeTreeDeltaType`.\n * @legacy @beta\n */\nexport const MergeTreeMaintenanceType = {\n\t/**\n\t * Notification that a segment \"append\" has occurred, i.e. two adjacent segments have been merged.\n\t * BEWARE: `deltaSegments` on the corresponding event will contain both the merged segment and the latter\n\t * segment, pre-merge.\n\t * For example, if the merge tree originally had two adjacent segments [A][B] and called A.append(B) to get\n\t * segment [AB], `deltaSegments` would contain [AB] and [B].\n\t */\n\tAPPEND: -1,\n\t/**\n\t * Notification that a segment has been split in two.\n\t * `deltaSegments` on the corresponding event will contain the resulting two segments.\n\t */\n\tSPLIT: -2,\n\t/**\n\t * Notification that a segment has been unlinked (i.e. removed) from the MergeTree.\n\t * This occurs on leaf segments during Zamboni when the segment's tracking collection is empty\n\t * (e.g., not being tracked for undo/redo).\n\t * It also occurs on internal merge tree segments when re-packing children to maintain tree balancing invariants.\n\t */\n\tUNLINK: -3,\n\t/**\n\t * Notification that a local change has been acknowledged by the server.\n\t * This means that it has made the round trip to the server and has had a sequence number assigned.\n\t */\n\tACKNOWLEDGED: -4,\n} as const;\n/**\n * @legacy @beta\n */\nexport type MergeTreeMaintenanceType =\n\t(typeof MergeTreeMaintenanceType)[keyof typeof MergeTreeMaintenanceType];\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationTypes =\n\t| MergeTreeDeltaOperationType\n\t| MergeTreeMaintenanceType;\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaCallbackArgs<\n\tTOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType,\n> {\n\t/**\n\t * The type of operation that affected segments in the merge-tree.\n\t * The affected segments can be accessed via {@link IMergeTreeDeltaCallbackArgs.deltaSegments|deltaSegments}.\n\t *\n\t * See {@link MergeTreeDeltaOperationType} and {@link (MergeTreeMaintenanceType:type)} for possible values.\n\t */\n\treadonly operation: TOperationType;\n\n\t/**\n\t * A list of deltas describing actions taken on segments.\n\t *\n\t * Deltas are not guaranteed to be in any particular order.\n\t */\n\treadonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeSegmentDelta {\n\t/**\n\t * The segment this delta affected.\n\t */\n\tsegment: ISegment;\n\n\t/**\n\t * A property set containing changes to properties on this segment.\n\t *\n\t * @remarks - Deleting a property is represented using `null` as the value.\n\t * @example\n\t *\n\t * An annotation change which deleted the property \"foo\" and set \"bar\" to 5 would be represented as:\n\t * `{ foo: null, bar: 5 }`.\n\t */\n\tpropertyDeltas?: PropertySet;\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaOpArgs {\n\t/**\n\t * The group op which contains the operation\n\t * if there operation is part of a group op.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\treadonly groupOp?: IMergeTreeGroupMsg;\n\n\t/**\n\t * The {@link IMergeTreeOp} corresponding to the delta.\n\t *\n\t * @remarks - This is useful for determining the type of change (see {@link (MergeTreeDeltaType:type)}).\n\t */\n\treadonly op: IMergeTreeOp;\n\n\t/**\n\t * The {@link @fluidframework/protocol-definitions#ISequencedDocumentMessage} corresponding to this acknowledged change.\n\t *\n\t * This field is omitted for deltas corresponding to unacknowledged changes.\n\t */\n\treadonly sequencedMessage?: ISequencedDocumentMessage;\n\n\t/**\n\t * Set to true if this delta is being performed as part of a rollback of unsent local changes.\n\t */\n\treadonly rollback?: true;\n}\n\n/**\n * @internal\n */\nexport type MergeTreeDeltaCallback = (\n\topArgs: IMergeTreeDeltaOpArgs,\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n) => void;\n\n/**\n * @legacy @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs\n\textends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}\n\n/**\n * @internal\n */\nexport type MergeTreeMaintenanceCallback = (\n\tMaintenanceArgs: IMergeTreeMaintenanceCallbackArgs,\n\topArgs: IMergeTreeDeltaOpArgs | undefined,\n) => void;\n"]}
1
+ {"version":3,"file":"mergeTreeDeltaCallback.js","sourceRoot":"","sources":["../src/mergeTreeDeltaCallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,YAAY,EAAE,CAAC,CAAC;CACP,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { ISegment } from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IMergeTreeGroupMsg, IMergeTreeOp, MergeTreeDeltaType } from \"./ops.js\";\nimport type { PropertySet } from \"./properties.js\";\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationType =\n\t| typeof MergeTreeDeltaType.ANNOTATE\n\t| typeof MergeTreeDeltaType.INSERT\n\t| typeof MergeTreeDeltaType.REMOVE\n\t| typeof MergeTreeDeltaType.OBLITERATE;\n\n/**\n * Enum-like constant defining the types of \"maintenance\" events on a merge tree.\n * Maintenance events correspond to structural segment changes or acks of pending segments.\n *\n * Note: these values are assigned negative integers to avoid clashing with `MergeTreeDeltaType`.\n * @legacy @beta\n */\nexport const MergeTreeMaintenanceType = {\n\t/**\n\t * Notification that a segment \"append\" has occurred, i.e. two adjacent segments have been merged.\n\t * BEWARE: `deltaSegments` on the corresponding event will contain both the merged segment and the latter\n\t * segment, pre-merge.\n\t * For example, if the merge tree originally had two adjacent segments [A][B] and called A.append(B) to get\n\t * segment [AB], `deltaSegments` would contain [AB] and [B].\n\t */\n\tAPPEND: -1,\n\t/**\n\t * Notification that a segment has been split in two.\n\t * `deltaSegments` on the corresponding event will contain the resulting two segments.\n\t */\n\tSPLIT: -2,\n\t/**\n\t * Notification that a segment has been unlinked (i.e. removed) from the MergeTree.\n\t * This occurs on leaf segments during Zamboni when the segment's tracking collection is empty\n\t * (e.g., not being tracked for undo/redo).\n\t * It also occurs on internal merge tree segments when re-packing children to maintain tree balancing invariants.\n\t */\n\tUNLINK: -3,\n\t/**\n\t * Notification that a local change has been acknowledged by the server.\n\t * This means that it has made the round trip to the server and has had a sequence number assigned.\n\t */\n\tACKNOWLEDGED: -4,\n} as const;\n/**\n * @legacy @beta\n */\nexport type MergeTreeMaintenanceType =\n\t(typeof MergeTreeMaintenanceType)[keyof typeof MergeTreeMaintenanceType];\n\n/**\n * @legacy @beta\n */\nexport type MergeTreeDeltaOperationTypes =\n\t| MergeTreeDeltaOperationType\n\t| MergeTreeMaintenanceType;\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaCallbackArgs<\n\tTOperationType extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType,\n> {\n\t/**\n\t * The type of operation that affected segments in the merge-tree.\n\t * The affected segments can be accessed via {@link IMergeTreeDeltaCallbackArgs.deltaSegments|deltaSegments}.\n\t *\n\t * See {@link MergeTreeDeltaOperationType} and {@link (MergeTreeMaintenanceType:type)} for possible values.\n\t */\n\treadonly operation: TOperationType;\n\n\t/**\n\t * A list of deltas describing actions taken on segments.\n\t *\n\t * Deltas are not guaranteed to be in any particular order.\n\t */\n\treadonly deltaSegments: IMergeTreeSegmentDelta[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeSegmentDelta {\n\t/**\n\t * The segment this delta affected.\n\t */\n\tsegment: ISegment;\n\n\t/**\n\t * A property set containing changes to properties on this segment.\n\t *\n\t * @remarks - Deleting a property is represented using `null` as the value.\n\t * @example\n\t *\n\t * An annotation change which deleted the property \"foo\" and set \"bar\" to 5 would be represented as:\n\t * `{ foo: null, bar: 5 }`.\n\t */\n\tpropertyDeltas?: PropertySet;\n}\n\n/**\n * @legacy @beta\n */\nexport interface IMergeTreeDeltaOpArgs {\n\t/**\n\t * The group op which contains the operation\n\t * if there operation is part of a group op.\n\t */\n\t// eslint-disable-next-line import/no-deprecated\n\treadonly groupOp?: IMergeTreeGroupMsg;\n\n\t/**\n\t * The {@link IMergeTreeOp} corresponding to the delta.\n\t *\n\t * @remarks - This is useful for determining the type of change (see {@link (MergeTreeDeltaType:type)}).\n\t */\n\treadonly op: IMergeTreeOp;\n\n\t/**\n\t * The {@link @fluidframework/protocol-definitions#ISequencedDocumentMessage} corresponding to this acknowledged change.\n\t *\n\t * This field is omitted for deltas corresponding to unacknowledged changes.\n\t */\n\treadonly sequencedMessage?: ISequencedDocumentMessage;\n\n\t/**\n\t * Set to true if this delta is being performed as part of a rollback of unsent local changes.\n\t */\n\treadonly rollback?: true;\n}\n\n/**\n * @internal\n */\nexport type MergeTreeDeltaCallback = (\n\topArgs: IMergeTreeDeltaOpArgs,\n\tdeltaArgs: IMergeTreeDeltaCallbackArgs,\n) => void;\n\n/**\n * @legacy @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface\nexport interface IMergeTreeMaintenanceCallbackArgs\n\textends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}\n\n/**\n * @internal\n */\nexport type MergeTreeMaintenanceCallback = (\n\tMaintenanceArgs: IMergeTreeMaintenanceCallbackArgs,\n\topArgs: IMergeTreeDeltaOpArgs | undefined,\n) => void;\n"]}
@@ -23,7 +23,7 @@ import { TestClientLogger, createClientsAtInitialState } from "./testClientLogge
23
23
  * be merged with the implementation that lives there
24
24
  */
25
25
  export function spyOnMethod(
26
- // eslint-disable-next-line @typescript-eslint/ban-types
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/ban-types
27
27
  methodClass, methodName, spy) {
28
28
  const { prototype } = methodClass;
29
29
  const method = prototype[methodName];
@@ -1 +1 @@
1
- {"version":3,"file":"revertibles.spec.js","sourceRoot":"","sources":["../../src/test/revertibles.spec.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\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { strict as assert } from \"node:assert\";\n\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\n/**\n * Run a custom \"spy function\" every time the given method is invoked.\n * @param methodClass - the class that has the method\n * @param methodName - the name of the method\n * @param spy - the spy function to run alongside the method\n * @returns a function which will remove the spy function when invoked. Should be called exactly once\n * after the spy is no longer needed.\n *\n * This method is duplicated between shared-tree test code, and should eventually\n * be merged with the implementation that lives there\n */\nexport function spyOnMethod(\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\tmethodClass: Function,\n\tmethodName: string,\n\tspy: () => void,\n): () => void {\n\tconst { prototype } = methodClass;\n\tconst method = prototype[methodName];\n\tassert(typeof method === \"function\", `Method does not exist: ${methodName}`);\n\n\tconst methodSpy = function (this: unknown, ...args: unknown[]): unknown {\n\t\tspy();\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\treturn method.call(this, ...args);\n\t};\n\tprototype[methodName] = methodSpy;\n\n\treturn () => {\n\t\tprototype[methodName] = method;\n\t};\n}\n\ndescribe(\"MergeTree.Revertibles\", () => {\n\tit(\"revert insert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"BB123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"has reasonable asymptotics in face of remove\", () => {\n\t\tconst length = 100;\n\n\t\t// track the amount of tracking group linking that occurs\n\t\tlet linkCount = 0;\n\t\tlet unlinkCount = 0;\n\n\t\tconst unspy1 = spyOnMethod(TrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy2 = spyOnMethod(TrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\t\tconst unspy3 = spyOnMethod(UnorderedTrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy4 = spyOnMethod(UnorderedTrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\n\t\ttry {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\tfor (let i = 1; i <= length; i++) {\n\t\t\t\tconst insertOp = clients.A.insertTextLocal(i - 1, \"a\");\n\t\t\t\tclients.A.applyMsg(\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tinsertOp,\n\t\t\t\t\t\t/* seq */ i + 1,\n\t\t\t\t\t\t/* refSeq */ i,\n\t\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t\t/* minSeq */ 1,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tclients.A.on(\"delta\", (_op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t});\n\n\t\t\tconst op = clients.A.removeRangeLocal(0, length - 1);\n\n\t\t\tclients.A.applyMsg(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\top,\n\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// the below checks act as a proxy for the asymptotics of undo-redo\n\t\t\t// linking. they are perhaps a bit more strict than necessary. if these\n\t\t\t// tests are failing and the number of calls is still within a sane limit,\n\t\t\t// it should be fine to update these checks to allow a larger number of\n\t\t\t// calls\n\t\t\tassert(\n\t\t\t\tlinkCount <= length * 3,\n\t\t\t\t`expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${\n\t\t\t\t\tlength * 3\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tunlinkCount <= length * 2,\n\t\t\t\t`expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${\n\t\t\t\t\tlength * 2\n\t\t\t\t}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tunspy1();\n\t\t\tunspy2();\n\t\t\tunspy3();\n\t\t\tunspy4();\n\t\t}\n\t});\n\n\tit(\"revert remove\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tfor (const { name, removeStart, removeEnd, expectedPostRemove } of [\n\t\t{\n\t\t\tname: \"revert overlapping remove\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 1,\n\t\t\texpectedPostRemove: \"23\",\n\t\t},\n\t\t{\n\t\t\tname: \"revert overlapping remove of multiple segments\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 2,\n\t\t\texpectedPreRemove: \"23\",\n\t\t},\n\t]) {\n\t\tit(name, () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"1-23\", options: {} },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tlet seq = 0;\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t});\n\n\t\t\tops.push(\n\t\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: expectedPostRemove });\n\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: \"123\" });\n\t\t});\n\t}\n\n\tit(\"revert two overlapping removes\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tconst clientC_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientCDriver = createRevertDriver(clients.C);\n\t\tclientCDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.C.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tclients.C.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientC_Revertibles);\n\t\t});\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\trevertMergeTreeDeltaRevertibles(clientCDriver, clientC_Revertibles.splice(0));\n\n\t\t// \"123\" would be the ideal final state, but due to current limitations,\n\t\t// the eventual consistent state is \"1123\"\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"1123\" });\n\t});\n\n\tit(\"revert annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Remove All Original Text and Insert then Revert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-2--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t// the test logger uses these callbacks, so preserve it\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"12\" });\n\t});\n\n\tit(\"Re-Insert at position 0 in empty string\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"BBC-\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BB\"), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"BBC\" });\n\t});\n\n\tit(\"Revert remove to empty with annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-23--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Revert Local annotate and remove with intersecting remote annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1234-----\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (\n\t\t\top: IMergeTreeDeltaOpArgs,\n\t\t\tdelta: IMergeTreeDeltaCallbackArgs,\n\t\t): void => {\n\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t}\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: \"B\" }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.push(\n\t\t\tclients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: \"C\" }), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"134\" });\n\n\t\ttry {\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t} catch (error) {\n\t\t\tthrow logger.addLogsToError(error);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1234\" });\n\t});\n\n\tdescribe(\"Revertibles work as expected when a pair of markers and text is involved\", () => {\n\t\tfor (const options of generatePairwiseOptions({\n\t\t\trevertMarkerInsert: [true, undefined],\n\t\t\tackMarkerInsert: [true, undefined],\n\t\t\tsplitInsertTextRevertible: [true, undefined],\n\t\t\tackTextInsert: [true, undefined],\n\t\t\tsplitRemoveRevertible: [true, undefined],\n\t\t\tackTextRemove: [true, undefined],\n\t\t\tackUndo: [true, undefined],\n\t\t})) {\n\t\t\tit(JSON.stringify(options), () => {\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{ initialState: \"\", options: {} },\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t);\n\n\t\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[][] = [];\n\t\t\t\tconst openNewUndoRedoTransaction = (): number => clientB_Revertibles.unshift([]);\n\t\t\t\t// the test logger uses these callbacks, so preserve it\n\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\t\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\t\tif (op.sequencedMessage === undefined && clientB_Revertibles.length > 0) {\n\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet afterUndoBaseText: string | undefined;\n\t\t\t\tif (options.revertMarkerInsert) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ReferenceType.Simple), ++seq),\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\n\t\t\t\tif (options.ackMarkerInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitInsertTextRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq));\n\t\t\t\tif (options.ackTextInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitRemoveRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\t\t\t\tif (options.ackTextRemove) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"\" });\n\t\t\t\t}\n\n\t\t\t\tconst afterRevertBaseTest = clients.B.getText();\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tif (options.ackUndo) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\tlogger.validate({ baseText: afterRevertBaseTest });\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"revertibles.spec.js","sourceRoot":"","sources":["../../src/test/revertibles.spec.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\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { strict as assert } from \"node:assert\";\n\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\n/**\n * Run a custom \"spy function\" every time the given method is invoked.\n * @param methodClass - the class that has the method\n * @param methodName - the name of the method\n * @param spy - the spy function to run alongside the method\n * @returns a function which will remove the spy function when invoked. Should be called exactly once\n * after the spy is no longer needed.\n *\n * This method is duplicated between shared-tree test code, and should eventually\n * be merged with the implementation that lives there\n */\nexport function spyOnMethod(\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/ban-types\n\tmethodClass: Function,\n\tmethodName: string,\n\tspy: () => void,\n): () => void {\n\tconst { prototype } = methodClass;\n\tconst method = prototype[methodName];\n\tassert(typeof method === \"function\", `Method does not exist: ${methodName}`);\n\n\tconst methodSpy = function (this: unknown, ...args: unknown[]): unknown {\n\t\tspy();\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\treturn method.call(this, ...args);\n\t};\n\tprototype[methodName] = methodSpy;\n\n\treturn () => {\n\t\tprototype[methodName] = method;\n\t};\n}\n\ndescribe(\"MergeTree.Revertibles\", () => {\n\tit(\"revert insert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"BB123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"has reasonable asymptotics in face of remove\", () => {\n\t\tconst length = 100;\n\n\t\t// track the amount of tracking group linking that occurs\n\t\tlet linkCount = 0;\n\t\tlet unlinkCount = 0;\n\n\t\tconst unspy1 = spyOnMethod(TrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy2 = spyOnMethod(TrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\t\tconst unspy3 = spyOnMethod(UnorderedTrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy4 = spyOnMethod(UnorderedTrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\n\t\ttry {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\tfor (let i = 1; i <= length; i++) {\n\t\t\t\tconst insertOp = clients.A.insertTextLocal(i - 1, \"a\");\n\t\t\t\tclients.A.applyMsg(\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tinsertOp,\n\t\t\t\t\t\t/* seq */ i + 1,\n\t\t\t\t\t\t/* refSeq */ i,\n\t\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t\t/* minSeq */ 1,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tclients.A.on(\"delta\", (_op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t});\n\n\t\t\tconst op = clients.A.removeRangeLocal(0, length - 1);\n\n\t\t\tclients.A.applyMsg(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\top,\n\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// the below checks act as a proxy for the asymptotics of undo-redo\n\t\t\t// linking. they are perhaps a bit more strict than necessary. if these\n\t\t\t// tests are failing and the number of calls is still within a sane limit,\n\t\t\t// it should be fine to update these checks to allow a larger number of\n\t\t\t// calls\n\t\t\tassert(\n\t\t\t\tlinkCount <= length * 3,\n\t\t\t\t`expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${\n\t\t\t\t\tlength * 3\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tunlinkCount <= length * 2,\n\t\t\t\t`expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${\n\t\t\t\t\tlength * 2\n\t\t\t\t}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tunspy1();\n\t\t\tunspy2();\n\t\t\tunspy3();\n\t\t\tunspy4();\n\t\t}\n\t});\n\n\tit(\"revert remove\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tfor (const { name, removeStart, removeEnd, expectedPostRemove } of [\n\t\t{\n\t\t\tname: \"revert overlapping remove\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 1,\n\t\t\texpectedPostRemove: \"23\",\n\t\t},\n\t\t{\n\t\t\tname: \"revert overlapping remove of multiple segments\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 2,\n\t\t\texpectedPreRemove: \"23\",\n\t\t},\n\t]) {\n\t\tit(name, () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"1-23\", options: {} },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tlet seq = 0;\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t});\n\n\t\t\tops.push(\n\t\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: expectedPostRemove });\n\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: \"123\" });\n\t\t});\n\t}\n\n\tit(\"revert two overlapping removes\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tconst clientC_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientCDriver = createRevertDriver(clients.C);\n\t\tclientCDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.C.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tclients.C.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientC_Revertibles);\n\t\t});\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\trevertMergeTreeDeltaRevertibles(clientCDriver, clientC_Revertibles.splice(0));\n\n\t\t// \"123\" would be the ideal final state, but due to current limitations,\n\t\t// the eventual consistent state is \"1123\"\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"1123\" });\n\t});\n\n\tit(\"revert annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Remove All Original Text and Insert then Revert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-2--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t// the test logger uses these callbacks, so preserve it\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"12\" });\n\t});\n\n\tit(\"Re-Insert at position 0 in empty string\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"BBC-\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BB\"), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"BBC\" });\n\t});\n\n\tit(\"Revert remove to empty with annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-23--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Revert Local annotate and remove with intersecting remote annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1234-----\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (\n\t\t\top: IMergeTreeDeltaOpArgs,\n\t\t\tdelta: IMergeTreeDeltaCallbackArgs,\n\t\t): void => {\n\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t}\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: \"B\" }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.push(\n\t\t\tclients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: \"C\" }), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"134\" });\n\n\t\ttry {\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t} catch (error) {\n\t\t\tthrow logger.addLogsToError(error);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1234\" });\n\t});\n\n\tdescribe(\"Revertibles work as expected when a pair of markers and text is involved\", () => {\n\t\tfor (const options of generatePairwiseOptions({\n\t\t\trevertMarkerInsert: [true, undefined],\n\t\t\tackMarkerInsert: [true, undefined],\n\t\t\tsplitInsertTextRevertible: [true, undefined],\n\t\t\tackTextInsert: [true, undefined],\n\t\t\tsplitRemoveRevertible: [true, undefined],\n\t\t\tackTextRemove: [true, undefined],\n\t\t\tackUndo: [true, undefined],\n\t\t})) {\n\t\t\tit(JSON.stringify(options), () => {\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{ initialState: \"\", options: {} },\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t);\n\n\t\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[][] = [];\n\t\t\t\tconst openNewUndoRedoTransaction = (): number => clientB_Revertibles.unshift([]);\n\t\t\t\t// the test logger uses these callbacks, so preserve it\n\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\t\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\t\tif (op.sequencedMessage === undefined && clientB_Revertibles.length > 0) {\n\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet afterUndoBaseText: string | undefined;\n\t\t\t\tif (options.revertMarkerInsert) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ReferenceType.Simple), ++seq),\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\n\t\t\t\tif (options.ackMarkerInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitInsertTextRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq));\n\t\t\t\tif (options.ackTextInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitRemoveRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\t\t\t\tif (options.ackTextRemove) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"\" });\n\t\t\t\t}\n\n\t\t\t\tconst afterRevertBaseTest = clients.B.getText();\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tif (options.ackUndo) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\tlogger.validate({ baseText: afterRevertBaseTest });\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/merge-tree",
3
- "version": "2.70.0-360753",
3
+ "version": "2.70.0-361092",
4
4
  "description": "Merge tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -81,30 +81,30 @@
81
81
  "temp-directory": "nyc/.nyc_output"
82
82
  },
83
83
  "dependencies": {
84
- "@fluid-internal/client-utils": "2.70.0-360753",
85
- "@fluidframework/container-definitions": "2.70.0-360753",
86
- "@fluidframework/core-interfaces": "2.70.0-360753",
87
- "@fluidframework/core-utils": "2.70.0-360753",
88
- "@fluidframework/datastore-definitions": "2.70.0-360753",
89
- "@fluidframework/driver-definitions": "2.70.0-360753",
90
- "@fluidframework/runtime-definitions": "2.70.0-360753",
91
- "@fluidframework/runtime-utils": "2.70.0-360753",
92
- "@fluidframework/shared-object-base": "2.70.0-360753",
93
- "@fluidframework/telemetry-utils": "2.70.0-360753"
84
+ "@fluid-internal/client-utils": "2.70.0-361092",
85
+ "@fluidframework/container-definitions": "2.70.0-361092",
86
+ "@fluidframework/core-interfaces": "2.70.0-361092",
87
+ "@fluidframework/core-utils": "2.70.0-361092",
88
+ "@fluidframework/datastore-definitions": "2.70.0-361092",
89
+ "@fluidframework/driver-definitions": "2.70.0-361092",
90
+ "@fluidframework/runtime-definitions": "2.70.0-361092",
91
+ "@fluidframework/runtime-utils": "2.70.0-361092",
92
+ "@fluidframework/shared-object-base": "2.70.0-361092",
93
+ "@fluidframework/telemetry-utils": "2.70.0-361092"
94
94
  },
95
95
  "devDependencies": {
96
96
  "@arethetypeswrong/cli": "^0.17.1",
97
97
  "@biomejs/biome": "~1.9.3",
98
- "@fluid-internal/mocha-test-setup": "2.70.0-360753",
99
- "@fluid-private/stochastic-test-utils": "2.70.0-360753",
100
- "@fluid-private/test-pairwise-generator": "2.70.0-360753",
98
+ "@fluid-internal/mocha-test-setup": "2.70.0-361092",
99
+ "@fluid-private/stochastic-test-utils": "2.70.0-361092",
100
+ "@fluid-private/test-pairwise-generator": "2.70.0-361092",
101
101
  "@fluid-tools/benchmark": "^0.51.0",
102
102
  "@fluid-tools/build-cli": "^0.58.3",
103
103
  "@fluidframework/build-common": "^2.0.3",
104
104
  "@fluidframework/build-tools": "^0.58.3",
105
- "@fluidframework/eslint-config-fluid": "^6.0.0",
105
+ "@fluidframework/eslint-config-fluid": "^6.1.0",
106
106
  "@fluidframework/merge-tree-previous": "npm:@fluidframework/merge-tree@2.63.0",
107
- "@fluidframework/test-runtime-utils": "2.70.0-360753",
107
+ "@fluidframework/test-runtime-utils": "2.70.0-361092",
108
108
  "@microsoft/api-extractor": "7.52.11",
109
109
  "@types/diff": "^3.5.1",
110
110
  "@types/mocha": "^10.0.10",
@@ -114,7 +114,7 @@
114
114
  "copyfiles": "^2.4.1",
115
115
  "cross-env": "^7.0.3",
116
116
  "diff": "^3.5.0",
117
- "eslint": "~8.55.0",
117
+ "eslint": "~8.57.1",
118
118
  "mocha": "^10.8.2",
119
119
  "mocha-multi-reporters": "^1.5.1",
120
120
  "rimraf": "^4.4.0",
@@ -151,7 +151,7 @@ export type MergeTreeDeltaCallback = (
151
151
  /**
152
152
  * @legacy @beta
153
153
  */
154
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
154
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface
155
155
  export interface IMergeTreeMaintenanceCallbackArgs
156
156
  extends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> {}
157
157