@atlaskit/editor-plugin-show-diff 14.0.4 → 14.1.1

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/pm-plugins/calculateDiff/calculateDiffDecorations.js +215 -103
  3. package/dist/cjs/pm-plugins/calculateDiff/diffBySteps.js +20 -9
  4. package/dist/cjs/pm-plugins/calculateDiff/simplifyChangesWithAttribution.js +89 -0
  5. package/dist/cjs/pm-plugins/calculateDiff/simplifySteps.js +81 -4
  6. package/dist/cjs/pm-plugins/decorations/colorSchemes/attributions.js +68 -0
  7. package/dist/cjs/pm-plugins/decorations/colorSchemes/schemes.js +26 -2
  8. package/dist/cjs/pm-plugins/decorations/colorSchemes/types.js +5 -1
  9. package/dist/cjs/pm-plugins/decorations/createBlockChangedDecoration.js +7 -2
  10. package/dist/cjs/pm-plugins/decorations/createChangedRowDecorationWidgets.js +2 -2
  11. package/dist/cjs/pm-plugins/decorations/createInlineChangedDecoration.js +4 -2
  12. package/dist/cjs/pm-plugins/decorations/utils/getAttrChangeRanges.js +59 -30
  13. package/dist/cjs/pm-plugins/decorations/utils/wrapBlockNodeViewStyles.js +14 -10
  14. package/dist/cjs/pm-plugins/main.js +1 -0
  15. package/dist/cjs/showDiffPlugin.js +36 -14
  16. package/dist/es2019/pm-plugins/calculateDiff/calculateDiffDecorations.js +130 -22
  17. package/dist/es2019/pm-plugins/calculateDiff/diffBySteps.js +17 -9
  18. package/dist/es2019/pm-plugins/calculateDiff/simplifyChangesWithAttribution.js +64 -0
  19. package/dist/es2019/pm-plugins/calculateDiff/simplifySteps.js +64 -1
  20. package/dist/es2019/pm-plugins/decorations/colorSchemes/attributions.js +37 -0
  21. package/dist/es2019/pm-plugins/decorations/colorSchemes/schemes.js +19 -2
  22. package/dist/es2019/pm-plugins/decorations/colorSchemes/types.js +1 -0
  23. package/dist/es2019/pm-plugins/decorations/createBlockChangedDecoration.js +6 -3
  24. package/dist/es2019/pm-plugins/decorations/createChangedRowDecorationWidgets.js +3 -3
  25. package/dist/es2019/pm-plugins/decorations/createInlineChangedDecoration.js +6 -3
  26. package/dist/es2019/pm-plugins/decorations/utils/getAttrChangeRanges.js +55 -30
  27. package/dist/es2019/pm-plugins/decorations/utils/wrapBlockNodeViewStyles.js +12 -9
  28. package/dist/es2019/pm-plugins/main.js +1 -0
  29. package/dist/es2019/showDiffPlugin.js +23 -1
  30. package/dist/esm/pm-plugins/calculateDiff/calculateDiffDecorations.js +216 -104
  31. package/dist/esm/pm-plugins/calculateDiff/diffBySteps.js +20 -9
  32. package/dist/esm/pm-plugins/calculateDiff/simplifyChangesWithAttribution.js +82 -0
  33. package/dist/esm/pm-plugins/calculateDiff/simplifySteps.js +79 -5
  34. package/dist/esm/pm-plugins/decorations/colorSchemes/attributions.js +61 -0
  35. package/dist/esm/pm-plugins/decorations/colorSchemes/schemes.js +24 -1
  36. package/dist/esm/pm-plugins/decorations/colorSchemes/types.js +1 -0
  37. package/dist/esm/pm-plugins/decorations/createBlockChangedDecoration.js +8 -3
  38. package/dist/esm/pm-plugins/decorations/createChangedRowDecorationWidgets.js +3 -3
  39. package/dist/esm/pm-plugins/decorations/createInlineChangedDecoration.js +5 -3
  40. package/dist/esm/pm-plugins/decorations/utils/getAttrChangeRanges.js +59 -30
  41. package/dist/esm/pm-plugins/decorations/utils/wrapBlockNodeViewStyles.js +14 -9
  42. package/dist/esm/pm-plugins/main.js +1 -0
  43. package/dist/esm/showDiffPlugin.js +36 -14
  44. package/dist/types/entry-points/show-diff-plugin-type.d.ts +1 -1
  45. package/dist/types/pm-plugins/calculateDiff/diffBySteps.d.ts +2 -1
  46. package/dist/types/pm-plugins/calculateDiff/simplifyChangesWithAttribution.d.ts +7 -0
  47. package/dist/types/pm-plugins/calculateDiff/simplifySteps.d.ts +10 -0
  48. package/dist/types/pm-plugins/decorations/colorSchemes/attributions.d.ts +12 -0
  49. package/dist/types/pm-plugins/decorations/colorSchemes/schemes.d.ts +5 -3
  50. package/dist/types/pm-plugins/decorations/colorSchemes/types.d.ts +6 -1
  51. package/dist/types/pm-plugins/decorations/createBlockChangedDecoration.d.ts +2 -1
  52. package/dist/types/pm-plugins/decorations/createChangedRowDecorationWidgets.d.ts +2 -1
  53. package/dist/types/pm-plugins/decorations/createInlineChangedDecoration.d.ts +2 -1
  54. package/dist/types/pm-plugins/decorations/createNodeChangedDecorationWidget.d.ts +2 -1
  55. package/dist/types/pm-plugins/decorations/utils/getAttrChangeRanges.d.ts +12 -2
  56. package/dist/types/pm-plugins/decorations/utils/wrapBlockNodeView.d.ts +2 -1
  57. package/dist/types/pm-plugins/decorations/utils/wrapBlockNodeViewStyles.d.ts +2 -1
  58. package/dist/types/pm-plugins/main.d.ts +3 -1
  59. package/dist/types/showDiffPluginType.d.ts +29 -1
  60. package/package.json +10 -7
@@ -11,6 +11,7 @@ import memoizeOne from 'memoize-one';
11
11
  import { ChangeSet, simplifyChanges } from 'prosemirror-changeset';
12
12
  import { isExperimentEnabled } from '@atlaskit/editor-common/deprecated-platform-feature-experiments';
13
13
  import { areNodesEqualIgnoreAttrs } from '@atlaskit/editor-common/utils/document';
14
+ import { Mapping } from '@atlaskit/editor-prosemirror/transform';
14
15
  import { DecorationSet } from '@atlaskit/editor-prosemirror/view';
15
16
  import { fg } from '@atlaskit/platform-feature-flags/fg';
16
17
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
@@ -19,6 +20,7 @@ import { createDocMarginAnchorWidget } from '../decorations/createAnchorDecorati
19
20
  import { createBlockChangedDecoration } from '../decorations/createBlockChangedDecoration';
20
21
  import { createInlineChangedDecoration } from '../decorations/createInlineChangedDecoration';
21
22
  import { createNodeChangedDecorationWidget } from '../decorations/createNodeChangedDecorationWidget';
23
+ import { createAttributionColorMap, getAttributionKey, getColorSchemeForChange, isAttributionColoringEnabled } from '../decorations/colorSchemes/attributions';
22
24
  import { extractDiffDescriptors } from '../decorations/decorationKeys';
23
25
  import { getAttrChangeRanges, stepIsValidAttrChange } from '../decorations/utils/getAttrChangeRanges';
24
26
  import { getMarkChangeRanges } from '../decorations/utils/getMarkChangeRanges';
@@ -27,7 +29,8 @@ import { attrAwareTokenEncoder } from './attrAwareTokenEncoder';
27
29
  import { diffBySteps } from './diffBySteps';
28
30
  import { groupChangesByBlock } from './groupChangesByBlock';
29
31
  import { optimizeChanges } from './optimizeChanges';
30
- import { simplifySteps } from './simplifySteps';
32
+ import { simplifyChangesWithAttribution } from './simplifyChangesWithAttribution';
33
+ import { simplifySteps, simplifyStepsWithAttribution } from './simplifySteps';
31
34
  import { classifySmartChanges } from './smart/classifySmartChanges';
32
35
  import { smartChangeLevel } from './smart/helpers';
33
36
  var getChanges = function getChanges(_ref) {
@@ -65,6 +68,34 @@ var getChanges = function getChanges(_ref) {
65
68
  var changes = simplifyChanges(changeset.changes, tr.doc);
66
69
  return optimizeChanges(changes);
67
70
  };
71
+ var getAttributedChanges = function getAttributedChanges(_ref2) {
72
+ var attributedChanges = _ref2.attributedChanges,
73
+ changeset = _ref2.changeset,
74
+ originalDoc = _ref2.originalDoc,
75
+ steppedDoc = _ref2.steppedDoc,
76
+ diffType = _ref2.diffType,
77
+ tr = _ref2.tr,
78
+ intl = _ref2.intl,
79
+ smartThresholds = _ref2.smartThresholds;
80
+ if (isExtendedEnabled(diffType)) {
81
+ if (diffType === 'smart' && fg('platform_editor_ai_smart_diff')) {
82
+ return classifySmartChanges({
83
+ changes: simplifyChangesWithAttribution(attributedChanges, tr.doc),
84
+ originalDoc: originalDoc,
85
+ newDoc: tr.doc,
86
+ locale: intl.locale,
87
+ thresholds: smartThresholds
88
+ });
89
+ }
90
+ if (diffType === 'step') {
91
+ return attributedChanges;
92
+ }
93
+ if (diffType === 'block') {
94
+ return groupChangesByBlock(changeset.changes, originalDoc, steppedDoc);
95
+ }
96
+ }
97
+ return simplifyChangesWithAttribution(attributedChanges, tr.doc);
98
+ };
68
99
 
69
100
  /**
70
101
  * Collect the inline-content ranges of every leaf text-bearing block (paragraph, heading, …)
@@ -123,28 +154,28 @@ var tableRanges = function tableRanges(doc, from, to) {
123
154
  return ranges;
124
155
  };
125
156
  var isInsideTable = function isInsideTable(tables, pos) {
126
- return tables.some(function (_ref2) {
127
- var _ref3 = _slicedToArray(_ref2, 2),
128
- tFrom = _ref3[0],
129
- tTo = _ref3[1];
157
+ return tables.some(function (_ref3) {
158
+ var _ref4 = _slicedToArray(_ref3, 2),
159
+ tFrom = _ref4[0],
160
+ tTo = _ref4[1];
130
161
  return pos >= tFrom && pos < tTo;
131
162
  });
132
163
  };
133
- var calculateNodesForBlockDecoration = function calculateNodesForBlockDecoration(_ref4) {
134
- var doc = _ref4.doc,
135
- from = _ref4.from,
136
- to = _ref4.to,
137
- colorScheme = _ref4.colorScheme,
138
- _ref4$isInserted = _ref4.isInserted,
139
- isInserted = _ref4$isInserted === void 0 ? true : _ref4$isInserted,
140
- activeIndexPos = _ref4.activeIndexPos,
141
- _ref4$shouldHideDelet = _ref4.shouldHideDeleted,
142
- shouldHideDeleted = _ref4$shouldHideDelet === void 0 ? false : _ref4$shouldHideDelet,
143
- _ref4$showIndicators = _ref4.showIndicators,
144
- showIndicators = _ref4$showIndicators === void 0 ? false : _ref4$showIndicators,
145
- diffType = _ref4.diffType,
146
- _ref4$coarseTableCell = _ref4.coarseTableCellsOnly,
147
- coarseTableCellsOnly = _ref4$coarseTableCell === void 0 ? false : _ref4$coarseTableCell;
164
+ var calculateNodesForBlockDecoration = function calculateNodesForBlockDecoration(_ref5) {
165
+ var doc = _ref5.doc,
166
+ from = _ref5.from,
167
+ to = _ref5.to,
168
+ colorScheme = _ref5.colorScheme,
169
+ _ref5$isInserted = _ref5.isInserted,
170
+ isInserted = _ref5$isInserted === void 0 ? true : _ref5$isInserted,
171
+ activeIndexPos = _ref5.activeIndexPos,
172
+ _ref5$shouldHideDelet = _ref5.shouldHideDeleted,
173
+ shouldHideDeleted = _ref5$shouldHideDelet === void 0 ? false : _ref5$shouldHideDelet,
174
+ _ref5$showIndicators = _ref5.showIndicators,
175
+ showIndicators = _ref5$showIndicators === void 0 ? false : _ref5$showIndicators,
176
+ diffType = _ref5.diffType,
177
+ _ref5$coarseTableCell = _ref5.coarseTableCellsOnly,
178
+ coarseTableCellsOnly = _ref5$coarseTableCell === void 0 ? false : _ref5$coarseTableCell;
148
179
  var decorations = [];
149
180
  // Coarse path: inside the large table, only cell/header overlays are kept — the
150
181
  // table/row/paragraph decorations there are redundant and cause expensive per-cell
@@ -190,10 +221,10 @@ var calculateNodesForBlockDecoration = function calculateNodesForBlockDecoration
190
221
  *
191
222
  * Callers are responsible for the `smart` diffType and gate checks.
192
223
  */
193
- export var isDeletedContentPlacedBelow = function isDeletedContentPlacedBelow(_ref5) {
194
- var change = _ref5.change,
195
- deletedDiffPlacement = _ref5.deletedDiffPlacement,
196
- inlineDeletedDiffPlacement = _ref5.inlineDeletedDiffPlacement;
224
+ export var isDeletedContentPlacedBelow = function isDeletedContentPlacedBelow(_ref6) {
225
+ var change = _ref6.change,
226
+ deletedDiffPlacement = _ref6.deletedDiffPlacement,
227
+ inlineDeletedDiffPlacement = _ref6.inlineDeletedDiffPlacement;
197
228
  var level = smartChangeLevel(change);
198
229
  if (level === 'node' || level === 'paragraph') {
199
230
  return deletedDiffPlacement === 'bottom';
@@ -202,31 +233,32 @@ export var isDeletedContentPlacedBelow = function isDeletedContentPlacedBelow(_r
202
233
  // Inline-level (undefined) and sentence-level changes.
203
234
  return inlineDeletedDiffPlacement === 'after';
204
235
  };
205
- var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6) {
206
- var state = _ref6.state,
207
- pluginState = _ref6.pluginState,
208
- nodeViewSerializer = _ref6.nodeViewSerializer,
209
- colorScheme = _ref6.colorScheme,
210
- intl = _ref6.intl,
211
- activeIndexPos = _ref6.activeIndexPos,
212
- api = _ref6.api,
213
- _ref6$isInverted = _ref6.isInverted,
214
- isInverted = _ref6$isInverted === void 0 ? false : _ref6$isInverted,
215
- _ref6$diffType = _ref6.diffType,
216
- diffType = _ref6$diffType === void 0 ? getDefaultDiffType() : _ref6$diffType,
217
- _ref6$hideDeletedDiff = _ref6.hideDeletedDiffs,
218
- hideDeletedDiffs = _ref6$hideDeletedDiff === void 0 ? false : _ref6$hideDeletedDiff,
219
- _ref6$hideAddedDiffsU = _ref6.hideAddedDiffsUnderline,
220
- hideAddedDiffsUnderlineParam = _ref6$hideAddedDiffsU === void 0 ? false : _ref6$hideAddedDiffsU,
221
- _ref6$showIndicators = _ref6.showIndicators,
222
- showIndicators = _ref6$showIndicators === void 0 ? false : _ref6$showIndicators,
223
- smartThresholds = _ref6.smartThresholds,
224
- _ref6$deletedDiffPlac = _ref6.deletedDiffPlacement,
225
- deletedDiffPlacement = _ref6$deletedDiffPlac === void 0 ? 'top' : _ref6$deletedDiffPlac,
226
- _ref6$inlineDeletedDi = _ref6.inlineDeletedDiffPlacement,
227
- inlineDeletedDiffPlacement = _ref6$inlineDeletedDi === void 0 ? 'before' : _ref6$inlineDeletedDi;
236
+ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref7) {
237
+ var state = _ref7.state,
238
+ pluginState = _ref7.pluginState,
239
+ nodeViewSerializer = _ref7.nodeViewSerializer,
240
+ colorScheme = _ref7.colorScheme,
241
+ intl = _ref7.intl,
242
+ activeIndexPos = _ref7.activeIndexPos,
243
+ api = _ref7.api,
244
+ _ref7$isInverted = _ref7.isInverted,
245
+ isInverted = _ref7$isInverted === void 0 ? false : _ref7$isInverted,
246
+ _ref7$diffType = _ref7.diffType,
247
+ diffType = _ref7$diffType === void 0 ? getDefaultDiffType() : _ref7$diffType,
248
+ _ref7$hideDeletedDiff = _ref7.hideDeletedDiffs,
249
+ hideDeletedDiffs = _ref7$hideDeletedDiff === void 0 ? false : _ref7$hideDeletedDiff,
250
+ _ref7$hideAddedDiffsU = _ref7.hideAddedDiffsUnderline,
251
+ hideAddedDiffsUnderlineParam = _ref7$hideAddedDiffsU === void 0 ? false : _ref7$hideAddedDiffsU,
252
+ _ref7$showIndicators = _ref7.showIndicators,
253
+ showIndicators = _ref7$showIndicators === void 0 ? false : _ref7$showIndicators,
254
+ smartThresholds = _ref7.smartThresholds,
255
+ _ref7$deletedDiffPlac = _ref7.deletedDiffPlacement,
256
+ deletedDiffPlacement = _ref7$deletedDiffPlac === void 0 ? 'top' : _ref7$deletedDiffPlac,
257
+ _ref7$inlineDeletedDi = _ref7.inlineDeletedDiffPlacement,
258
+ inlineDeletedDiffPlacement = _ref7$inlineDeletedDi === void 0 ? 'before' : _ref7$inlineDeletedDi;
228
259
  var originalDoc = pluginState.originalDoc,
229
260
  steps = pluginState.steps,
261
+ stepAttributions = pluginState.stepAttributions,
230
262
  isDisplayingChanges = pluginState.isDisplayingChanges;
231
263
  if (!originalDoc || !isDisplayingChanges) {
232
264
  return {
@@ -240,8 +272,23 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
240
272
  var hideAddedDiffsUnderline = hideAddedDiffsUnderlineParam && fg('platform_editor_ai_smart_diff');
241
273
  var tr = state.tr;
242
274
  var steppedDoc = originalDoc;
243
- var attrSteps = [];
244
- var simplifiedSteps = simplifySteps(steps, originalDoc);
275
+ var attributionColoringEnabled = isAttributionColoringEnabled(stepAttributions);
276
+ var simplifiedSteps;
277
+ var simplifiedStepAttributions = [];
278
+ if (attributionColoringEnabled) {
279
+ var simplifiedStepsWithAttribution = simplifyStepsWithAttribution(steps, stepAttributions !== null && stepAttributions !== void 0 ? stepAttributions : [], originalDoc);
280
+ simplifiedSteps = simplifiedStepsWithAttribution.map(function (_ref8) {
281
+ var step = _ref8.step;
282
+ return step;
283
+ });
284
+ simplifiedStepAttributions = simplifiedStepsWithAttribution.map(function (_ref9) {
285
+ var stepAttribution = _ref9.stepAttribution;
286
+ return stepAttribution;
287
+ });
288
+ } else {
289
+ simplifiedSteps = simplifySteps(steps, originalDoc);
290
+ }
291
+ var pendingAttrSteps = [];
245
292
  var stepMaps = [];
246
293
  var _iterator = _createForOfIteratorHelper(simplifiedSteps),
247
294
  _step;
@@ -251,20 +298,56 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
251
298
  var result = step.apply(steppedDoc);
252
299
  if (result.failed === null && result.doc) {
253
300
  if (stepIsValidAttrChange(step, steppedDoc, result.doc)) {
254
- attrSteps.push(step);
301
+ pendingAttrSteps.push({
302
+ afterNode: result.doc.nodeAt(step.pos),
303
+ beforeNode: steppedDoc.nodeAt(step.pos),
304
+ mapIndex: stepMaps.length,
305
+ step: step
306
+ });
255
307
  }
256
308
  stepMaps.push(step.getMap());
257
309
  steppedDoc = result.doc;
258
310
  }
259
311
  }
260
-
261
- // Rather than using .eq() we use a custom function that only checks for structural
262
- // changes and ignores differences in attributes which don't affect decoration positions
312
+ // Gate the complete attribution fix: mapped positions and step-time nodes are used together.
313
+ // The fallback deliberately preserves the legacy raw-position lookups for rollout safety.
263
314
  } catch (err) {
264
315
  _iterator.e(err);
265
316
  } finally {
266
317
  _iterator.f();
267
318
  }
319
+ var attrStepContexts = fg('platform_editor_reduce_diff_attr_sensitivity') ? pendingAttrSteps.flatMap(function (_ref0) {
320
+ var afterNode = _ref0.afterNode,
321
+ beforeNode = _ref0.beforeNode,
322
+ mapIndex = _ref0.mapIndex,
323
+ step = _ref0.step;
324
+ var finalPosition = new Mapping(stepMaps.slice(mapIndex + 1)).mapResult(step.pos);
325
+ if (finalPosition.deleted) {
326
+ return [];
327
+ }
328
+ var originalPosition = new Mapping(stepMaps.slice(0, mapIndex)).invert().mapResult(step.pos);
329
+ return [_objectSpread(_objectSpread({
330
+ afterNode: afterNode,
331
+ beforeNode: beforeNode,
332
+ finalPos: finalPosition.pos
333
+ }, originalPosition.deleted ? {} : {
334
+ originalPos: originalPosition.pos
335
+ }), {}, {
336
+ step: step
337
+ })];
338
+ }) : pendingAttrSteps.map(function (_ref1) {
339
+ var step = _ref1.step;
340
+ return {
341
+ afterNode: tr.doc.nodeAt(step.pos),
342
+ beforeNode: originalDoc.nodeAt(step.pos),
343
+ finalPos: step.pos,
344
+ originalPos: step.pos,
345
+ step: step
346
+ };
347
+ });
348
+
349
+ // Rather than using .eq() we use a custom function that only checks for structural
350
+ // changes and ignores differences in attributes which don't affect decoration positions
268
351
  if (!areNodesEqualIgnoreAttrs(steppedDoc, tr.doc)) {
269
352
  var _api$analytics;
270
353
  var recoveredViaContentEquality = areDocsEqualByBlockStructureAndText(steppedDoc, tr.doc);
@@ -289,17 +372,45 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
289
372
  // gated with it; other diff types keep the library default so their output is
290
373
  // unchanged.
291
374
  var tokenEncoder = diffType === 'smart' && fg('platform_editor_ai_smart_diff') ? attrAwareTokenEncoder : undefined;
292
- var changeset = ChangeSet.create(originalDoc, undefined, tokenEncoder).addSteps(steppedDoc, stepMaps, tr.doc);
293
- var changes = getChanges({
294
- changeset: changeset,
295
- originalDoc: originalDoc,
296
- steppedDoc: steppedDoc,
297
- diffType: diffType,
298
- tr: tr,
299
- steps: steps,
300
- intl: intl,
301
- smartThresholds: smartThresholds
302
- });
375
+ var changes;
376
+ var attributedChanges = [];
377
+ var attributionColors;
378
+ if (attributionColoringEnabled) {
379
+ var changeset = ChangeSet.create(originalDoc, function (left, right) {
380
+ return getAttributionKey(left) === getAttributionKey(right) ? left.stepIndex > right.stepIndex ? left : right :
381
+ // `prosemirror-changeset` uses null as its incompatible-data sentinel even
382
+ // though its public combine callback is typed as returning Data.
383
+ null;
384
+ }, tokenEncoder).addSteps(steppedDoc, stepMaps, simplifiedStepAttributions.map(function (attribution, stepIndex) {
385
+ return _objectSpread(_objectSpread({}, attribution), {}, {
386
+ stepIndex: stepIndex
387
+ });
388
+ }));
389
+ attributedChanges = diffBySteps(originalDoc, simplifiedSteps, simplifiedStepAttributions);
390
+ changes = getAttributedChanges({
391
+ changeset: changeset,
392
+ originalDoc: originalDoc,
393
+ steppedDoc: steppedDoc,
394
+ diffType: diffType,
395
+ tr: tr,
396
+ attributedChanges: attributedChanges,
397
+ intl: intl,
398
+ smartThresholds: smartThresholds
399
+ });
400
+ attributionColors = createAttributionColorMap(simplifiedStepAttributions);
401
+ } else {
402
+ var _changeset = ChangeSet.create(originalDoc, undefined, tokenEncoder).addSteps(steppedDoc, stepMaps, tr.doc);
403
+ changes = getChanges({
404
+ changeset: _changeset,
405
+ originalDoc: originalDoc,
406
+ steppedDoc: steppedDoc,
407
+ diffType: diffType,
408
+ tr: tr,
409
+ steps: simplifiedSteps,
410
+ intl: intl,
411
+ smartThresholds: smartThresholds
412
+ });
413
+ }
303
414
  var decorations = [];
304
415
 
305
416
  /**
@@ -312,6 +423,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
312
423
  // Our default operations are insertions, so it should match the opposite of isInverted.
313
424
  var isInserted = !isInverted;
314
425
  var createDecorationsForChange = function createDecorationsForChange(change) {
426
+ var changeColorScheme = attributionColors ? getColorSchemeForChange(change, attributedChanges, attributionColors, colorScheme) : colorScheme;
315
427
  var isActive = activeIndexPos && change.fromB === activeIndexPos.from && change.toB === activeIndexPos.to;
316
428
 
317
429
  // Hoisted because it decides BOTH where the deleted widget is anchored and — since the
@@ -366,7 +478,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
366
478
  toB: to
367
479
  },
368
480
  doc: tr.doc,
369
- colorScheme: colorScheme,
481
+ colorScheme: changeColorScheme,
370
482
  isActive: isActive,
371
483
  diffType: diffType
372
484
  }, isExtendedEnabled(diffType) && {
@@ -387,7 +499,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
387
499
  decorations.push.apply(decorations, _toConsumableArray(createInlineChangedDecoration(_objectSpread({
388
500
  change: change,
389
501
  doc: tr.doc,
390
- colorScheme: colorScheme,
502
+ colorScheme: changeColorScheme,
391
503
  isActive: isActive,
392
504
  diffType: diffType
393
505
  }, isExtendedEnabled(diffType) && {
@@ -403,7 +515,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
403
515
  doc: tr.doc,
404
516
  from: change.fromB,
405
517
  to: change.toB,
406
- colorScheme: colorScheme
518
+ colorScheme: changeColorScheme
407
519
  }, isExtendedEnabled(diffType) && {
408
520
  isInserted: isInserted,
409
521
  shouldHideDeleted: shouldHideDeleted,
@@ -422,7 +534,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
422
534
  change: change,
423
535
  doc: originalDoc,
424
536
  nodeViewSerializer: nodeViewSerializer,
425
- colorScheme: colorScheme,
537
+ colorScheme: changeColorScheme,
426
538
  newDoc: tr.doc,
427
539
  intl: intl,
428
540
  activeIndexPos: activeIndexPos
@@ -449,7 +561,7 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
449
561
  isInserted: true
450
562
  })));
451
563
  });
452
- getAttrChangeRanges(tr.doc, attrSteps, originalDoc).forEach(function (change) {
564
+ getAttrChangeRanges(tr.doc, attrStepContexts, originalDoc).forEach(function (change) {
453
565
  if (change.isInline) {
454
566
  // Inline nodes (e.g. date, emoji, mention, status) need an inline decoration rather than a block decoration
455
567
  var isActive = activeIndexPos && change.fromB === activeIndexPos.from && change.toB === activeIndexPos.to;
@@ -539,42 +651,42 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref6
539
651
  };
540
652
  export var calculateDiffDecorations = memoizeOne(calculateDiffDecorationsInner,
541
653
  // Cache results unless relevant inputs change
542
- function (_ref7, _ref8) {
543
- var _ref10;
544
- var _ref9 = _slicedToArray(_ref7, 1),
545
- _ref9$ = _ref9[0],
546
- pluginState = _ref9$.pluginState,
547
- state = _ref9$.state,
548
- colorScheme = _ref9$.colorScheme,
549
- intl = _ref9$.intl,
550
- activeIndexPos = _ref9$.activeIndexPos,
551
- isInverted = _ref9$.isInverted,
552
- diffType = _ref9$.diffType,
553
- hideDeletedDiffs = _ref9$.hideDeletedDiffs,
554
- hideAddedDiffsUnderline = _ref9$.hideAddedDiffsUnderline,
555
- showIndicators = _ref9$.showIndicators,
556
- smartThresholds = _ref9$.smartThresholds,
557
- deletedDiffPlacement = _ref9$.deletedDiffPlacement,
558
- inlineDeletedDiffPlacement = _ref9$.inlineDeletedDiffPlacement;
559
- var _ref0 = _slicedToArray(_ref8, 1),
560
- _ref0$ = _ref0[0],
561
- lastPluginState = _ref0$.pluginState,
562
- lastState = _ref0$.state,
563
- lastColorScheme = _ref0$.colorScheme,
564
- lastIntl = _ref0$.intl,
565
- lastActiveIndexPos = _ref0$.activeIndexPos,
566
- lastIsInverted = _ref0$.isInverted,
567
- lastDiffType = _ref0$.diffType,
568
- lastHideDeletedDiffs = _ref0$.hideDeletedDiffs,
569
- lastHideAddedDiffsUnderline = _ref0$.hideAddedDiffsUnderline,
570
- lastShowIndicators = _ref0$.showIndicators,
571
- lastSmartThresholds = _ref0$.smartThresholds,
572
- lastDeletedDiffPlacement = _ref0$.deletedDiffPlacement,
573
- lastInlineDeletedDiffPlacement = _ref0$.inlineDeletedDiffPlacement;
654
+ function (_ref10, _ref11) {
655
+ var _ref15;
656
+ var _ref12 = _slicedToArray(_ref10, 1),
657
+ _ref12$ = _ref12[0],
658
+ pluginState = _ref12$.pluginState,
659
+ state = _ref12$.state,
660
+ colorScheme = _ref12$.colorScheme,
661
+ intl = _ref12$.intl,
662
+ activeIndexPos = _ref12$.activeIndexPos,
663
+ isInverted = _ref12$.isInverted,
664
+ diffType = _ref12$.diffType,
665
+ hideDeletedDiffs = _ref12$.hideDeletedDiffs,
666
+ hideAddedDiffsUnderline = _ref12$.hideAddedDiffsUnderline,
667
+ showIndicators = _ref12$.showIndicators,
668
+ smartThresholds = _ref12$.smartThresholds,
669
+ deletedDiffPlacement = _ref12$.deletedDiffPlacement,
670
+ inlineDeletedDiffPlacement = _ref12$.inlineDeletedDiffPlacement;
671
+ var _ref13 = _slicedToArray(_ref11, 1),
672
+ _ref13$ = _ref13[0],
673
+ lastPluginState = _ref13$.pluginState,
674
+ lastState = _ref13$.state,
675
+ lastColorScheme = _ref13$.colorScheme,
676
+ lastIntl = _ref13$.intl,
677
+ lastActiveIndexPos = _ref13$.activeIndexPos,
678
+ lastIsInverted = _ref13$.isInverted,
679
+ lastDiffType = _ref13$.diffType,
680
+ lastHideDeletedDiffs = _ref13$.hideDeletedDiffs,
681
+ lastHideAddedDiffsUnderline = _ref13$.hideAddedDiffsUnderline,
682
+ lastShowIndicators = _ref13$.showIndicators,
683
+ lastSmartThresholds = _ref13$.smartThresholds,
684
+ lastDeletedDiffPlacement = _ref13$.deletedDiffPlacement,
685
+ lastInlineDeletedDiffPlacement = _ref13$.inlineDeletedDiffPlacement;
574
686
  var originalDocIsSame = lastPluginState.originalDoc && pluginState.originalDoc && pluginState.originalDoc.eq(lastPluginState.originalDoc);
575
687
  if (isExtendedEnabled(diffType)) {
576
- var _ref1;
577
- return (_ref1 = colorScheme === lastColorScheme && intl.locale === lastIntl.locale && isInverted === lastIsInverted && diffType === lastDiffType && isEqual(activeIndexPos, lastActiveIndexPos) && originalDocIsSame && isEqual(pluginState.steps, lastPluginState.steps) && state.doc.eq(lastState.doc) && hideDeletedDiffs === lastHideDeletedDiffs && hideAddedDiffsUnderline === lastHideAddedDiffsUnderline && showIndicators === lastShowIndicators && isEqual(smartThresholds, lastSmartThresholds) && deletedDiffPlacement === lastDeletedDiffPlacement && inlineDeletedDiffPlacement === lastInlineDeletedDiffPlacement) !== null && _ref1 !== void 0 ? _ref1 : false;
688
+ var _ref14;
689
+ return (_ref14 = colorScheme === lastColorScheme && intl.locale === lastIntl.locale && isInverted === lastIsInverted && diffType === lastDiffType && isEqual(activeIndexPos, lastActiveIndexPos) && originalDocIsSame && isEqual(pluginState.steps, lastPluginState.steps) && isEqual(pluginState.stepAttributions, lastPluginState.stepAttributions) && state.doc.eq(lastState.doc) && hideDeletedDiffs === lastHideDeletedDiffs && hideAddedDiffsUnderline === lastHideAddedDiffsUnderline && showIndicators === lastShowIndicators && isEqual(smartThresholds, lastSmartThresholds) && deletedDiffPlacement === lastDeletedDiffPlacement && inlineDeletedDiffPlacement === lastInlineDeletedDiffPlacement) !== null && _ref14 !== void 0 ? _ref14 : false;
578
690
  }
579
- return (_ref10 = originalDocIsSame && isEqual(pluginState.steps, lastPluginState.steps) && state.doc.eq(lastState.doc) && colorScheme === lastColorScheme && intl.locale === lastIntl.locale && isEqual(activeIndexPos, lastActiveIndexPos) && hideDeletedDiffs === lastHideDeletedDiffs) !== null && _ref10 !== void 0 ? _ref10 : false;
691
+ return (_ref15 = originalDocIsSame && isEqual(pluginState.steps, lastPluginState.steps) && isEqual(pluginState.stepAttributions, lastPluginState.stepAttributions) && state.doc.eq(lastState.doc) && colorScheme === lastColorScheme && intl.locale === lastIntl.locale && isEqual(activeIndexPos, lastActiveIndexPos) && hideDeletedDiffs === lastHideDeletedDiffs) !== null && _ref15 !== void 0 ? _ref15 : false;
580
692
  });
@@ -1,3 +1,4 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
3
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
4
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -8,6 +9,7 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
8
9
  import { simplifyChanges, ChangeSet } from 'prosemirror-changeset';
9
10
  import { Mark } from '@atlaskit/editor-prosemirror/model';
10
11
  import { Mapping, ReplaceStep } from '@atlaskit/editor-prosemirror/transform';
12
+ import { getAttributionKey } from '../decorations/colorSchemes/attributions';
11
13
  import { attrAwareTokenEncoder } from './attrAwareTokenEncoder';
12
14
  import { optimizeChanges } from './optimizeChanges';
13
15
  var WORD_CHAR_REGEX = /(?:[0-9A-Z_a-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDD40-\uDD65\uDD6F-\uDD85\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDED0-\uDEE3\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0\uDFF0-\uDFF9]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDDB0-\uDDDB\uDDE0-\uDDE9\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDF50-\uDF59\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D\uDD30-\uDD39]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDD70-\uDD79\uDE40-\uDE96\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2-\uDFF6]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD833[\uDCF0-\uDCF9]|\uD834[\uDEC0-\uDED3\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDCD0-\uDCEB\uDCF0-\uDCF9\uDDD0-\uDDED\uDDF0-\uDDFA\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])/;
@@ -198,9 +200,10 @@ var createMapping = function createMapping(maps) {
198
200
  return mapping;
199
201
  };
200
202
  var createSpans = function createSpans(length) {
203
+ var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
201
204
  return length > 0 ? [{
202
205
  length: length,
203
- data: null
206
+ data: data
204
207
  }] : [];
205
208
  };
206
209
  var mergeOverlappingByNewDocRange = function mergeOverlappingByNewDocRange(changes) {
@@ -213,8 +216,11 @@ var mergeOverlappingByNewDocRange = function mergeOverlappingByNewDocRange(chang
213
216
  var merged = [];
214
217
  var current = _objectSpread({}, sortedChanges[0]);
215
218
  for (var i = 1; i < sortedChanges.length; i++) {
219
+ var _, _2;
216
220
  var next = sortedChanges[i];
217
- var isOverlapping = next.fromB <= current.toB;
221
+ var currentIdentity = getAttributionKey((_ = [].concat(_toConsumableArray(current.deleted), _toConsumableArray(current.inserted))[0]) === null || _ === void 0 ? void 0 : _.data);
222
+ var nextIdentity = getAttributionKey((_2 = [].concat(_toConsumableArray(next.deleted), _toConsumableArray(next.inserted))[0]) === null || _2 === void 0 ? void 0 : _2.data);
223
+ var isOverlapping = next.fromB <= current.toB && currentIdentity === nextIdentity;
218
224
  if (isOverlapping) {
219
225
  current = {
220
226
  fromA: Math.min(current.fromA, next.fromA),
@@ -268,16 +274,18 @@ var shouldCheckGranularDiff = function shouldCheckGranularDiff(step, before, fro
268
274
  var isTextContentEqual = (replacedNode === null || replacedNode === void 0 ? void 0 : replacedNode.textContent) === (replacingNode === null || replacingNode === void 0 ? void 0 : replacingNode.textContent);
269
275
  return !isTextContentEqual || isTextContentEqual && hasSameChildMarks(replacedNode, replacingNode);
270
276
  };
271
- export var diffBySteps = function diffBySteps(originalDoc, steps) {
277
+ export var diffBySteps = function diffBySteps(originalDoc, steps, stepAttributions) {
272
278
  var changes = [];
273
279
  var currentDoc = originalDoc;
274
280
  var successfulStepMaps = [];
275
281
  var rangedSteps = [];
276
- var _iterator2 = _createForOfIteratorHelper(steps),
282
+ var _iterator2 = _createForOfIteratorHelper(steps.entries()),
277
283
  _step2;
278
284
  try {
279
285
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
280
- var step = _step2.value;
286
+ var _step2$value = _slicedToArray(_step2.value, 2),
287
+ stepIndex = _step2$value[0],
288
+ step = _step2$value[1];
281
289
  var before = currentDoc;
282
290
  var result = step.apply(currentDoc);
283
291
  if (result.failed !== null || !result.doc) {
@@ -292,6 +300,9 @@ export var diffBySteps = function diffBySteps(originalDoc, steps) {
292
300
  from: rangeStep.from,
293
301
  to: rangeStep.to,
294
302
  mapIndex: successfulStepMaps.length,
303
+ stepAttribution: stepAttributions !== null && stepAttributions !== void 0 && stepAttributions[stepIndex] ? _objectSpread(_objectSpread({}, stepAttributions[stepIndex]), {}, {
304
+ stepIndex: stepIndex
305
+ }) : null,
295
306
  step: step,
296
307
  stepMap: stepMap
297
308
  });
@@ -377,8 +388,8 @@ export var diffBySteps = function diffBySteps(originalDoc, steps) {
377
388
  toA: granularToA,
378
389
  fromB: granularFromB,
379
390
  toB: granularToB,
380
- deleted: createSpans(Math.max(0, granularToA - granularFromA)),
381
- inserted: createSpans(Math.max(0, granularToB - granularFromB))
391
+ deleted: createSpans(Math.max(0, granularToA - granularFromA), rangedStep.stepAttribution),
392
+ inserted: createSpans(Math.max(0, granularToB - granularFromB), rangedStep.stepAttribution)
382
393
  });
383
394
  }
384
395
  } catch (err) {
@@ -393,8 +404,8 @@ export var diffBySteps = function diffBySteps(originalDoc, steps) {
393
404
  toA: toA,
394
405
  fromB: fromB,
395
406
  toB: toB,
396
- deleted: createSpans(Math.max(0, toA - fromA)),
397
- inserted: createSpans(Math.max(0, toB - fromB))
407
+ deleted: createSpans(Math.max(0, toA - fromA), rangedStep.stepAttribution),
408
+ inserted: createSpans(Math.max(0, toB - fromB), rangedStep.stepAttribution)
398
409
  });
399
410
  }
400
411
  return mergeOverlappingByNewDocRange(changes);
@@ -0,0 +1,82 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ 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; } } }; }
4
+ 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; } }
5
+ 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; }
6
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
+ import { simplifyChanges } from 'prosemirror-changeset';
9
+ import { getAttributionKey } from '../decorations/colorSchemes/attributions';
10
+ import { optimizeChanges } from './optimizeChanges';
11
+ var getAttributionIdentity = function getAttributionIdentity(change) {
12
+ var identities = new Set();
13
+ for (var _i = 0, _arr = [].concat(_toConsumableArray(change.deleted), _toConsumableArray(change.inserted)); _i < _arr.length; _i++) {
14
+ var span = _arr[_i];
15
+ identities.add(getAttributionKey(span.data));
16
+ }
17
+ if (identities.size > 1) {
18
+ return {
19
+ key: undefined,
20
+ mergeable: false
21
+ };
22
+ }
23
+ return {
24
+ key: identities.values().next().value,
25
+ mergeable: true
26
+ };
27
+ };
28
+
29
+ /**
30
+ * Simplifies and optimizes consecutive changes without crossing an attribution boundary.
31
+ * A change which already contains more than one identity is deliberately kept isolated.
32
+ */
33
+ export var simplifyChangesWithAttribution = function simplifyChangesWithAttribution(changes, doc) {
34
+ var result = [];
35
+ var run = [];
36
+ var runIdentity;
37
+ var flush = function flush() {
38
+ if (run.length > 0) {
39
+ // Some show-diff producers use structurally compatible Change objects rather than the
40
+ // library class. `simplifyChanges` reads runtime `lenA`/`lenB` getters even though they
41
+ // are intentionally omitted from its public declarations, so add equivalent getters
42
+ // without calling the library's internal constructor.
43
+ var normalizedRun = run.map(function (change) {
44
+ return _objectSpread(_objectSpread({}, change), {}, {
45
+ get lenA() {
46
+ return change.toA - change.fromA;
47
+ },
48
+ get lenB() {
49
+ return change.toB - change.fromB;
50
+ }
51
+ });
52
+ });
53
+ result.push.apply(result, _toConsumableArray(optimizeChanges(simplifyChanges(normalizedRun, doc))));
54
+ }
55
+ run = [];
56
+ runIdentity = undefined;
57
+ };
58
+ var _iterator = _createForOfIteratorHelper(changes),
59
+ _step;
60
+ try {
61
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
62
+ var _runIdentity;
63
+ var change = _step.value;
64
+ var identity = getAttributionIdentity(change);
65
+ var canJoinRun = ((_runIdentity = runIdentity) === null || _runIdentity === void 0 ? void 0 : _runIdentity.mergeable) === true && identity.mergeable && runIdentity.key === identity.key;
66
+ if (run.length > 0 && !canJoinRun) {
67
+ flush();
68
+ }
69
+ run.push(change);
70
+ runIdentity = identity;
71
+ if (!identity.mergeable) {
72
+ flush();
73
+ }
74
+ }
75
+ } catch (err) {
76
+ _iterator.e(err);
77
+ } finally {
78
+ _iterator.f();
79
+ }
80
+ flush();
81
+ return result;
82
+ };