@atlaskit/editor-plugin-show-diff 3.2.5 → 3.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/cjs/pm-plugins/calculateDiffDecorations.js +4 -25
- package/dist/cjs/pm-plugins/simplifyChanges.js +79 -0
- package/dist/es2019/pm-plugins/calculateDiffDecorations.js +4 -23
- package/dist/es2019/pm-plugins/simplifyChanges.js +60 -0
- package/dist/esm/pm-plugins/calculateDiffDecorations.js +4 -25
- package/dist/esm/pm-plugins/simplifyChanges.js +74 -0
- package/dist/types/pm-plugins/simplifyChanges.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/simplifyChanges.d.ts +3 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-show-diff
|
|
2
2
|
|
|
3
|
+
## 3.2.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`bc52c059565f2`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/bc52c059565f2) -
|
|
8
|
+
Fix issue with simplify changes being too aggressive and dropping steps causing diffs to fail.
|
|
9
|
+
|
|
10
|
+
## 3.2.6
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- [`05ee61c6ace09`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/05ee61c6ace09) -
|
|
15
|
+
Improve performance of show diff by increasing merge of steps
|
|
16
|
+
- Updated dependencies
|
|
17
|
+
|
|
3
18
|
## 3.2.5
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
@@ -11,12 +11,12 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
|
|
|
11
11
|
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
12
12
|
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
|
|
13
13
|
var _prosemirrorChangeset = require("prosemirror-changeset");
|
|
14
|
-
var _steps = require("@atlaskit/adf-schema/steps");
|
|
15
14
|
var _document = require("@atlaskit/editor-common/utils/document");
|
|
16
15
|
var _view = require("@atlaskit/editor-prosemirror/view");
|
|
17
16
|
var _attributeDecorations = require("./attributeDecorations");
|
|
18
17
|
var _decorations = require("./decorations");
|
|
19
18
|
var _markDecorations = require("./markDecorations");
|
|
19
|
+
var _simplifyChanges = require("./simplifyChanges");
|
|
20
20
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
21
21
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
22
22
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
@@ -69,27 +69,6 @@ function optimizeChanges(changes) {
|
|
|
69
69
|
optimized.push(current);
|
|
70
70
|
return optimized;
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
// Simplifies the steps to improve performance and reduce fragmentation in diffs
|
|
74
|
-
function simplifySteps(steps) {
|
|
75
|
-
return steps
|
|
76
|
-
// Remove steps that don't affect document structure or content
|
|
77
|
-
.filter(function (step) {
|
|
78
|
-
return !(step instanceof _steps.AnalyticsStep);
|
|
79
|
-
})
|
|
80
|
-
// Merge consecutive steps where possible
|
|
81
|
-
.reduce(function (acc, step) {
|
|
82
|
-
var _lastStep$merge;
|
|
83
|
-
var lastStep = acc[acc.length - 1];
|
|
84
|
-
var merged = lastStep === null || lastStep === void 0 || (_lastStep$merge = lastStep.merge) === null || _lastStep$merge === void 0 ? void 0 : _lastStep$merge.call(lastStep, step);
|
|
85
|
-
if (merged) {
|
|
86
|
-
acc[acc.length - 1] = merged;
|
|
87
|
-
} else {
|
|
88
|
-
acc.push(step);
|
|
89
|
-
}
|
|
90
|
-
return acc;
|
|
91
|
-
}, []);
|
|
92
|
-
}
|
|
93
72
|
var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref) {
|
|
94
73
|
var state = _ref.state,
|
|
95
74
|
pluginState = _ref.pluginState,
|
|
@@ -97,8 +76,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref)
|
|
|
97
76
|
colourScheme = _ref.colourScheme,
|
|
98
77
|
intl = _ref.intl;
|
|
99
78
|
var originalDoc = pluginState.originalDoc,
|
|
100
|
-
|
|
101
|
-
var steps = simplifySteps(rawSteps);
|
|
79
|
+
steps = pluginState.steps;
|
|
102
80
|
if (!originalDoc || !pluginState.isDisplayingChanges) {
|
|
103
81
|
return _view.DecorationSet.empty;
|
|
104
82
|
}
|
|
@@ -106,7 +84,8 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref)
|
|
|
106
84
|
var steppedDoc = originalDoc;
|
|
107
85
|
var attrSteps = [];
|
|
108
86
|
var changeset = _prosemirrorChangeset.ChangeSet.create(originalDoc);
|
|
109
|
-
var
|
|
87
|
+
var simplifiedSteps = (0, _simplifyChanges.simplifySteps)(steps, originalDoc);
|
|
88
|
+
var _iterator = _createForOfIteratorHelper(simplifiedSteps),
|
|
110
89
|
_step;
|
|
111
90
|
try {
|
|
112
91
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.simplifySteps = simplifySteps;
|
|
7
|
+
var _steps = require("@atlaskit/adf-schema/steps");
|
|
8
|
+
var _document = require("@atlaskit/editor-common/utils/document");
|
|
9
|
+
var _transform = require("@atlaskit/editor-prosemirror/transform");
|
|
10
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
11
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
12
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
13
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
14
|
+
/**
|
|
15
|
+
* Attempts to merge two consecutive ReplaceStep operations.
|
|
16
|
+
* This merges steps where:
|
|
17
|
+
* - Both steps replace content at the same starting position
|
|
18
|
+
* - The second step's range encompasses the first step's range
|
|
19
|
+
* - The second step has content to insert
|
|
20
|
+
* Returns null if steps cannot be merged.
|
|
21
|
+
*/
|
|
22
|
+
function mergeReplaceSteps(step1, step2) {
|
|
23
|
+
if (!(step1 instanceof _transform.ReplaceStep) || !(step2 instanceof _transform.ReplaceStep)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
// Confirm the step overlaps exactly with the previous
|
|
27
|
+
var step2Length = step2.to - step2.from;
|
|
28
|
+
if (step1.from === step2.from && step2.to >= step1.to && step2.slice.size >= step2Length && step2Length === step1.slice.size && step2.slice.size >= step1.slice.size && step1.slice.openEnd === step2.slice.openEnd && step1.slice.openStart === step2.slice.openStart) {
|
|
29
|
+
return new _transform.ReplaceStep(step1.from, step1.to, step2.slice);
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Simplifies the steps to improve performance and reduce fragmentation in diffs
|
|
35
|
+
function simplifySteps(steps, originalDoc) {
|
|
36
|
+
var stepsToFilter = (0, _platformFeatureFlags.fg)('platform_editor_ai_aifc_patch_ga') ? removeUnusedSteps(steps, originalDoc) : steps;
|
|
37
|
+
return stepsToFilter
|
|
38
|
+
// Remove steps that don't affect document structure or content
|
|
39
|
+
.filter(function (step) {
|
|
40
|
+
return !(step instanceof _steps.AnalyticsStep);
|
|
41
|
+
})
|
|
42
|
+
// Merge consecutive steps where possible
|
|
43
|
+
.reduce(function (acc, step) {
|
|
44
|
+
var _lastStep$merge, _lastStep$merge2, _lastStep$merge3;
|
|
45
|
+
var lastStep = acc[acc.length - 1];
|
|
46
|
+
var merged = (0, _platformFeatureFlags.fg)('platform_editor_ai_aifc_patch_ga') ? (_lastStep$merge = lastStep === null || lastStep === void 0 || (_lastStep$merge2 = lastStep.merge) === null || _lastStep$merge2 === void 0 ? void 0 : _lastStep$merge2.call(lastStep, step)) !== null && _lastStep$merge !== void 0 ? _lastStep$merge : mergeReplaceSteps(lastStep, step) : lastStep === null || lastStep === void 0 || (_lastStep$merge3 = lastStep.merge) === null || _lastStep$merge3 === void 0 ? void 0 : _lastStep$merge3.call(lastStep, step);
|
|
47
|
+
if (merged) {
|
|
48
|
+
acc[acc.length - 1] = merged;
|
|
49
|
+
} else {
|
|
50
|
+
acc.push(step);
|
|
51
|
+
}
|
|
52
|
+
return acc;
|
|
53
|
+
}, []);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Does a first pass to remove steps that don't impact the document
|
|
58
|
+
*/
|
|
59
|
+
function removeUnusedSteps(steps, originalDoc) {
|
|
60
|
+
var finalSteps = [];
|
|
61
|
+
var firstPassDoc = originalDoc;
|
|
62
|
+
var _iterator = _createForOfIteratorHelper(steps),
|
|
63
|
+
_step;
|
|
64
|
+
try {
|
|
65
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
66
|
+
var step = _step.value;
|
|
67
|
+
var result = step.apply(firstPassDoc);
|
|
68
|
+
if (result.failed === null && result.doc && !(0, _document.areNodesEqualIgnoreAttrs)(firstPassDoc, result.doc, ['localId'])) {
|
|
69
|
+
finalSteps.push(step);
|
|
70
|
+
firstPassDoc = result.doc;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
} catch (err) {
|
|
74
|
+
_iterator.e(err);
|
|
75
|
+
} finally {
|
|
76
|
+
_iterator.f();
|
|
77
|
+
}
|
|
78
|
+
return finalSteps;
|
|
79
|
+
}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import isEqual from 'lodash/isEqual';
|
|
3
3
|
import memoizeOne from 'memoize-one';
|
|
4
4
|
import { ChangeSet, simplifyChanges } from 'prosemirror-changeset';
|
|
5
|
-
import { AnalyticsStep } from '@atlaskit/adf-schema/steps';
|
|
6
5
|
import { areNodesEqualIgnoreAttrs } from '@atlaskit/editor-common/utils/document';
|
|
7
6
|
import { DecorationSet } from '@atlaskit/editor-prosemirror/view';
|
|
8
7
|
import { getAttrChangeRanges, stepIsValidAttrChange } from './attributeDecorations';
|
|
9
8
|
import { createInlineChangedDecoration, createDeletedContentDecoration, createBlockChangedDecoration } from './decorations';
|
|
10
9
|
import { getMarkChangeRanges } from './markDecorations';
|
|
10
|
+
import { simplifySteps } from './simplifyChanges';
|
|
11
11
|
const calculateNodesForBlockDecoration = (doc, from, to, colourScheme) => {
|
|
12
12
|
const decorations = [];
|
|
13
13
|
// Iterate over the document nodes within the range
|
|
@@ -59,25 +59,6 @@ function optimizeChanges(changes) {
|
|
|
59
59
|
optimized.push(current);
|
|
60
60
|
return optimized;
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
// Simplifies the steps to improve performance and reduce fragmentation in diffs
|
|
64
|
-
function simplifySteps(steps) {
|
|
65
|
-
return steps
|
|
66
|
-
// Remove steps that don't affect document structure or content
|
|
67
|
-
.filter(step => !(step instanceof AnalyticsStep))
|
|
68
|
-
// Merge consecutive steps where possible
|
|
69
|
-
.reduce((acc, step) => {
|
|
70
|
-
var _lastStep$merge;
|
|
71
|
-
const lastStep = acc[acc.length - 1];
|
|
72
|
-
const merged = lastStep === null || lastStep === void 0 ? void 0 : (_lastStep$merge = lastStep.merge) === null || _lastStep$merge === void 0 ? void 0 : _lastStep$merge.call(lastStep, step);
|
|
73
|
-
if (merged) {
|
|
74
|
-
acc[acc.length - 1] = merged;
|
|
75
|
-
} else {
|
|
76
|
-
acc.push(step);
|
|
77
|
-
}
|
|
78
|
-
return acc;
|
|
79
|
-
}, []);
|
|
80
|
-
}
|
|
81
62
|
const calculateDiffDecorationsInner = ({
|
|
82
63
|
state,
|
|
83
64
|
pluginState,
|
|
@@ -87,9 +68,8 @@ const calculateDiffDecorationsInner = ({
|
|
|
87
68
|
}) => {
|
|
88
69
|
const {
|
|
89
70
|
originalDoc,
|
|
90
|
-
steps
|
|
71
|
+
steps
|
|
91
72
|
} = pluginState;
|
|
92
|
-
const steps = simplifySteps(rawSteps);
|
|
93
73
|
if (!originalDoc || !pluginState.isDisplayingChanges) {
|
|
94
74
|
return DecorationSet.empty;
|
|
95
75
|
}
|
|
@@ -99,7 +79,8 @@ const calculateDiffDecorationsInner = ({
|
|
|
99
79
|
let steppedDoc = originalDoc;
|
|
100
80
|
const attrSteps = [];
|
|
101
81
|
let changeset = ChangeSet.create(originalDoc);
|
|
102
|
-
|
|
82
|
+
const simplifiedSteps = simplifySteps(steps, originalDoc);
|
|
83
|
+
for (const step of simplifiedSteps) {
|
|
103
84
|
const result = step.apply(steppedDoc);
|
|
104
85
|
if (result.failed === null && result.doc) {
|
|
105
86
|
if (stepIsValidAttrChange(step, steppedDoc, result.doc)) {
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { AnalyticsStep } from '@atlaskit/adf-schema/steps';
|
|
2
|
+
import { areNodesEqualIgnoreAttrs } from '@atlaskit/editor-common/utils/document';
|
|
3
|
+
import { ReplaceStep } from '@atlaskit/editor-prosemirror/transform';
|
|
4
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Attempts to merge two consecutive ReplaceStep operations.
|
|
8
|
+
* This merges steps where:
|
|
9
|
+
* - Both steps replace content at the same starting position
|
|
10
|
+
* - The second step's range encompasses the first step's range
|
|
11
|
+
* - The second step has content to insert
|
|
12
|
+
* Returns null if steps cannot be merged.
|
|
13
|
+
*/
|
|
14
|
+
function mergeReplaceSteps(step1, step2) {
|
|
15
|
+
if (!(step1 instanceof ReplaceStep) || !(step2 instanceof ReplaceStep)) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
// Confirm the step overlaps exactly with the previous
|
|
19
|
+
const step2Length = step2.to - step2.from;
|
|
20
|
+
if (step1.from === step2.from && step2.to >= step1.to && step2.slice.size >= step2Length && step2Length === step1.slice.size && step2.slice.size >= step1.slice.size && step1.slice.openEnd === step2.slice.openEnd && step1.slice.openStart === step2.slice.openStart) {
|
|
21
|
+
return new ReplaceStep(step1.from, step1.to, step2.slice);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Simplifies the steps to improve performance and reduce fragmentation in diffs
|
|
27
|
+
export function simplifySteps(steps, originalDoc) {
|
|
28
|
+
const stepsToFilter = fg('platform_editor_ai_aifc_patch_ga') ? removeUnusedSteps(steps, originalDoc) : steps;
|
|
29
|
+
return stepsToFilter
|
|
30
|
+
// Remove steps that don't affect document structure or content
|
|
31
|
+
.filter(step => !(step instanceof AnalyticsStep))
|
|
32
|
+
// Merge consecutive steps where possible
|
|
33
|
+
.reduce((acc, step) => {
|
|
34
|
+
var _lastStep$merge, _lastStep$merge2, _lastStep$merge3;
|
|
35
|
+
const lastStep = acc[acc.length - 1];
|
|
36
|
+
const merged = fg('platform_editor_ai_aifc_patch_ga') ? (_lastStep$merge = lastStep === null || lastStep === void 0 ? void 0 : (_lastStep$merge2 = lastStep.merge) === null || _lastStep$merge2 === void 0 ? void 0 : _lastStep$merge2.call(lastStep, step)) !== null && _lastStep$merge !== void 0 ? _lastStep$merge : mergeReplaceSteps(lastStep, step) : lastStep === null || lastStep === void 0 ? void 0 : (_lastStep$merge3 = lastStep.merge) === null || _lastStep$merge3 === void 0 ? void 0 : _lastStep$merge3.call(lastStep, step);
|
|
37
|
+
if (merged) {
|
|
38
|
+
acc[acc.length - 1] = merged;
|
|
39
|
+
} else {
|
|
40
|
+
acc.push(step);
|
|
41
|
+
}
|
|
42
|
+
return acc;
|
|
43
|
+
}, []);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Does a first pass to remove steps that don't impact the document
|
|
48
|
+
*/
|
|
49
|
+
function removeUnusedSteps(steps, originalDoc) {
|
|
50
|
+
const finalSteps = [];
|
|
51
|
+
let firstPassDoc = originalDoc;
|
|
52
|
+
for (const step of steps) {
|
|
53
|
+
const result = step.apply(firstPassDoc);
|
|
54
|
+
if (result.failed === null && result.doc && !areNodesEqualIgnoreAttrs(firstPassDoc, result.doc, ['localId'])) {
|
|
55
|
+
finalSteps.push(step);
|
|
56
|
+
firstPassDoc = result.doc;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return finalSteps;
|
|
60
|
+
}
|
|
@@ -10,12 +10,12 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
10
10
|
import isEqual from 'lodash/isEqual';
|
|
11
11
|
import memoizeOne from 'memoize-one';
|
|
12
12
|
import { ChangeSet, simplifyChanges } from 'prosemirror-changeset';
|
|
13
|
-
import { AnalyticsStep } from '@atlaskit/adf-schema/steps';
|
|
14
13
|
import { areNodesEqualIgnoreAttrs } from '@atlaskit/editor-common/utils/document';
|
|
15
14
|
import { DecorationSet } from '@atlaskit/editor-prosemirror/view';
|
|
16
15
|
import { getAttrChangeRanges, stepIsValidAttrChange } from './attributeDecorations';
|
|
17
16
|
import { createInlineChangedDecoration, createDeletedContentDecoration, createBlockChangedDecoration } from './decorations';
|
|
18
17
|
import { getMarkChangeRanges } from './markDecorations';
|
|
18
|
+
import { simplifySteps } from './simplifyChanges';
|
|
19
19
|
var calculateNodesForBlockDecoration = function calculateNodesForBlockDecoration(doc, from, to, colourScheme) {
|
|
20
20
|
var decorations = [];
|
|
21
21
|
// Iterate over the document nodes within the range
|
|
@@ -63,27 +63,6 @@ function optimizeChanges(changes) {
|
|
|
63
63
|
optimized.push(current);
|
|
64
64
|
return optimized;
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
// Simplifies the steps to improve performance and reduce fragmentation in diffs
|
|
68
|
-
function simplifySteps(steps) {
|
|
69
|
-
return steps
|
|
70
|
-
// Remove steps that don't affect document structure or content
|
|
71
|
-
.filter(function (step) {
|
|
72
|
-
return !(step instanceof AnalyticsStep);
|
|
73
|
-
})
|
|
74
|
-
// Merge consecutive steps where possible
|
|
75
|
-
.reduce(function (acc, step) {
|
|
76
|
-
var _lastStep$merge;
|
|
77
|
-
var lastStep = acc[acc.length - 1];
|
|
78
|
-
var merged = lastStep === null || lastStep === void 0 || (_lastStep$merge = lastStep.merge) === null || _lastStep$merge === void 0 ? void 0 : _lastStep$merge.call(lastStep, step);
|
|
79
|
-
if (merged) {
|
|
80
|
-
acc[acc.length - 1] = merged;
|
|
81
|
-
} else {
|
|
82
|
-
acc.push(step);
|
|
83
|
-
}
|
|
84
|
-
return acc;
|
|
85
|
-
}, []);
|
|
86
|
-
}
|
|
87
66
|
var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref) {
|
|
88
67
|
var state = _ref.state,
|
|
89
68
|
pluginState = _ref.pluginState,
|
|
@@ -91,8 +70,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref)
|
|
|
91
70
|
colourScheme = _ref.colourScheme,
|
|
92
71
|
intl = _ref.intl;
|
|
93
72
|
var originalDoc = pluginState.originalDoc,
|
|
94
|
-
|
|
95
|
-
var steps = simplifySteps(rawSteps);
|
|
73
|
+
steps = pluginState.steps;
|
|
96
74
|
if (!originalDoc || !pluginState.isDisplayingChanges) {
|
|
97
75
|
return DecorationSet.empty;
|
|
98
76
|
}
|
|
@@ -100,7 +78,8 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref)
|
|
|
100
78
|
var steppedDoc = originalDoc;
|
|
101
79
|
var attrSteps = [];
|
|
102
80
|
var changeset = ChangeSet.create(originalDoc);
|
|
103
|
-
var
|
|
81
|
+
var simplifiedSteps = simplifySteps(steps, originalDoc);
|
|
82
|
+
var _iterator = _createForOfIteratorHelper(simplifiedSteps),
|
|
104
83
|
_step;
|
|
105
84
|
try {
|
|
106
85
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
2
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
3
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
4
|
+
import { AnalyticsStep } from '@atlaskit/adf-schema/steps';
|
|
5
|
+
import { areNodesEqualIgnoreAttrs } from '@atlaskit/editor-common/utils/document';
|
|
6
|
+
import { ReplaceStep } from '@atlaskit/editor-prosemirror/transform';
|
|
7
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Attempts to merge two consecutive ReplaceStep operations.
|
|
11
|
+
* This merges steps where:
|
|
12
|
+
* - Both steps replace content at the same starting position
|
|
13
|
+
* - The second step's range encompasses the first step's range
|
|
14
|
+
* - The second step has content to insert
|
|
15
|
+
* Returns null if steps cannot be merged.
|
|
16
|
+
*/
|
|
17
|
+
function mergeReplaceSteps(step1, step2) {
|
|
18
|
+
if (!(step1 instanceof ReplaceStep) || !(step2 instanceof ReplaceStep)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
// Confirm the step overlaps exactly with the previous
|
|
22
|
+
var step2Length = step2.to - step2.from;
|
|
23
|
+
if (step1.from === step2.from && step2.to >= step1.to && step2.slice.size >= step2Length && step2Length === step1.slice.size && step2.slice.size >= step1.slice.size && step1.slice.openEnd === step2.slice.openEnd && step1.slice.openStart === step2.slice.openStart) {
|
|
24
|
+
return new ReplaceStep(step1.from, step1.to, step2.slice);
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Simplifies the steps to improve performance and reduce fragmentation in diffs
|
|
30
|
+
export function simplifySteps(steps, originalDoc) {
|
|
31
|
+
var stepsToFilter = fg('platform_editor_ai_aifc_patch_ga') ? removeUnusedSteps(steps, originalDoc) : steps;
|
|
32
|
+
return stepsToFilter
|
|
33
|
+
// Remove steps that don't affect document structure or content
|
|
34
|
+
.filter(function (step) {
|
|
35
|
+
return !(step instanceof AnalyticsStep);
|
|
36
|
+
})
|
|
37
|
+
// Merge consecutive steps where possible
|
|
38
|
+
.reduce(function (acc, step) {
|
|
39
|
+
var _lastStep$merge, _lastStep$merge2, _lastStep$merge3;
|
|
40
|
+
var lastStep = acc[acc.length - 1];
|
|
41
|
+
var merged = fg('platform_editor_ai_aifc_patch_ga') ? (_lastStep$merge = lastStep === null || lastStep === void 0 || (_lastStep$merge2 = lastStep.merge) === null || _lastStep$merge2 === void 0 ? void 0 : _lastStep$merge2.call(lastStep, step)) !== null && _lastStep$merge !== void 0 ? _lastStep$merge : mergeReplaceSteps(lastStep, step) : lastStep === null || lastStep === void 0 || (_lastStep$merge3 = lastStep.merge) === null || _lastStep$merge3 === void 0 ? void 0 : _lastStep$merge3.call(lastStep, step);
|
|
42
|
+
if (merged) {
|
|
43
|
+
acc[acc.length - 1] = merged;
|
|
44
|
+
} else {
|
|
45
|
+
acc.push(step);
|
|
46
|
+
}
|
|
47
|
+
return acc;
|
|
48
|
+
}, []);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Does a first pass to remove steps that don't impact the document
|
|
53
|
+
*/
|
|
54
|
+
function removeUnusedSteps(steps, originalDoc) {
|
|
55
|
+
var finalSteps = [];
|
|
56
|
+
var firstPassDoc = originalDoc;
|
|
57
|
+
var _iterator = _createForOfIteratorHelper(steps),
|
|
58
|
+
_step;
|
|
59
|
+
try {
|
|
60
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
61
|
+
var step = _step.value;
|
|
62
|
+
var result = step.apply(firstPassDoc);
|
|
63
|
+
if (result.failed === null && result.doc && !areNodesEqualIgnoreAttrs(firstPassDoc, result.doc, ['localId'])) {
|
|
64
|
+
finalSteps.push(step);
|
|
65
|
+
firstPassDoc = result.doc;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
} catch (err) {
|
|
69
|
+
_iterator.e(err);
|
|
70
|
+
} finally {
|
|
71
|
+
_iterator.f();
|
|
72
|
+
}
|
|
73
|
+
return finalSteps;
|
|
74
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-show-diff",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.7",
|
|
4
4
|
"description": "ShowDiff plugin for @atlaskit/editor-core",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
"@atlaskit/editor-prosemirror": "7.0.0",
|
|
33
33
|
"@atlaskit/editor-tables": "^2.9.0",
|
|
34
34
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
35
|
-
"@atlaskit/tokens": "^8.
|
|
35
|
+
"@atlaskit/tokens": "^8.3.0",
|
|
36
36
|
"@babel/runtime": "^7.0.0",
|
|
37
37
|
"lodash": "^4.17.21",
|
|
38
38
|
"memoize-one": "^6.0.0",
|
|
39
39
|
"prosemirror-changeset": "^2.2.1"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"@atlaskit/editor-common": "^110.
|
|
42
|
+
"@atlaskit/editor-common": "^110.35.0",
|
|
43
43
|
"react": "^18.2.0"
|
|
44
44
|
},
|
|
45
45
|
"techstack": {
|