@manuscripts/track-changes-plugin 2.1.1 → 2.2.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 (122) hide show
  1. package/dist/cjs/ChangeSet.js +23 -9
  2. package/dist/cjs/actions.js +3 -1
  3. package/dist/cjs/{changes/applyChanges.js → applyChanges.js} +16 -16
  4. package/dist/cjs/{changes → changeHelpers}/revertChange.js +3 -4
  5. package/dist/cjs/{mutate/dropStructureChange.js → changeHelpers/structureChange.js} +23 -17
  6. package/dist/cjs/{changes → changeHelpers}/updateChangeAttrs.js +4 -5
  7. package/dist/cjs/{changes → changeHelpers}/updateChangesStatus.js +5 -5
  8. package/dist/cjs/{changes/findChanges.js → findChanges.js} +5 -5
  9. package/dist/cjs/helpers/attributes.js +157 -0
  10. package/dist/cjs/{compute/setFragmentAsInserted.js → helpers/fragment.js} +71 -79
  11. package/dist/cjs/helpers/mark.js +19 -0
  12. package/dist/cjs/plugin.js +13 -22
  13. package/dist/cjs/trackChanges.js +47 -0
  14. package/dist/cjs/{change-steps → tracking/change-step}/diffChangeSteps.js +23 -28
  15. package/dist/cjs/{utils/mapChangeStep.js → tracking/change-step/mapChangeSteps.js} +1 -1
  16. package/dist/cjs/{change-steps → tracking/change-step}/processChangeSteps.js +14 -48
  17. package/dist/cjs/tracking/fixAndHandleSelection.js +54 -0
  18. package/dist/cjs/{mutate → tracking/lib}/deleteAndMergeSplitNodes.js +7 -40
  19. package/dist/cjs/{mutate → tracking/lib}/deleteNode.js +8 -9
  20. package/dist/cjs/{mutate/deleteText.js → tracking/lib/deleteTextIfInserted.js} +4 -4
  21. package/dist/cjs/{change-steps → tracking/lib}/matchInserted.js +15 -23
  22. package/dist/cjs/{mutate → tracking/lib}/mergeTrackedMarks.js +3 -3
  23. package/dist/cjs/tracking/lib/processStepsBeforeTracking.js +17 -0
  24. package/dist/cjs/{steps/utils.js → tracking/steps-trackers/qualifiers.js} +37 -10
  25. package/dist/cjs/{steps/trackAttrsChange.js → tracking/steps-trackers/trackAttrsChangeStep.js} +3 -3
  26. package/dist/cjs/{steps → tracking/steps-trackers}/trackMarkSteps.js +14 -11
  27. package/dist/cjs/{steps → tracking/steps-trackers}/trackReplaceAroundStep.js +12 -46
  28. package/dist/cjs/tracking/steps-trackers/trackReplaceStep.js +85 -0
  29. package/dist/cjs/tracking/trackTransaction.js +93 -0
  30. package/dist/cjs/tracking/transactionProcessing.js +164 -0
  31. package/dist/cjs/tracking/types.js +17 -0
  32. package/dist/es/ChangeSet.js +23 -9
  33. package/dist/es/actions.js +1 -0
  34. package/dist/es/{changes/applyChanges.js → applyChanges.js} +10 -10
  35. package/dist/es/{changes → changeHelpers}/revertChange.js +1 -2
  36. package/dist/es/{mutate/dropStructureChange.js → changeHelpers/structureChange.js} +10 -5
  37. package/dist/es/{changes → changeHelpers}/updateChangeAttrs.js +2 -3
  38. package/dist/es/{changes → changeHelpers}/updateChangesStatus.js +4 -4
  39. package/dist/es/{changes/findChanges.js → findChanges.js} +3 -3
  40. package/dist/es/helpers/attributes.js +136 -0
  41. package/dist/es/{compute/setFragmentAsInserted.js → helpers/fragment.js} +66 -42
  42. package/dist/es/helpers/mark.js +15 -0
  43. package/dist/es/plugin.js +12 -21
  44. package/dist/es/trackChanges.js +44 -0
  45. package/dist/es/{change-steps → tracking/change-step}/diffChangeSteps.js +23 -28
  46. package/dist/es/{utils/mapChangeStep.js → tracking/change-step/mapChangeSteps.js} +1 -1
  47. package/dist/es/{change-steps → tracking/change-step}/processChangeSteps.js +10 -11
  48. package/dist/es/tracking/fixAndHandleSelection.js +49 -0
  49. package/dist/es/{mutate → tracking/lib}/deleteAndMergeSplitNodes.js +7 -7
  50. package/dist/es/{mutate → tracking/lib}/deleteNode.js +4 -5
  51. package/dist/es/{mutate/deleteText.js → tracking/lib/deleteTextIfInserted.js} +1 -1
  52. package/dist/es/{change-steps → tracking/lib}/matchInserted.js +15 -23
  53. package/dist/es/{mutate → tracking/lib}/mergeTrackedMarks.js +2 -2
  54. package/dist/es/tracking/lib/processStepsBeforeTracking.js +14 -0
  55. package/dist/es/{steps/utils.js → tracking/steps-trackers/qualifiers.js} +32 -7
  56. package/dist/es/{steps/trackAttrsChange.js → tracking/steps-trackers/trackAttrsChangeStep.js} +3 -3
  57. package/dist/es/{steps → tracking/steps-trackers}/trackMarkSteps.js +6 -3
  58. package/dist/es/{steps → tracking/steps-trackers}/trackReplaceAroundStep.js +9 -10
  59. package/dist/es/{steps → tracking/steps-trackers}/trackReplaceStep.js +34 -26
  60. package/dist/es/tracking/trackTransaction.js +87 -0
  61. package/dist/es/tracking/transactionProcessing.js +153 -0
  62. package/dist/es/tracking/types.js +16 -0
  63. package/dist/types/ChangeSet.d.ts +4 -1
  64. package/dist/types/actions.d.ts +1 -0
  65. package/dist/types/applyChanges.d.ts +6 -0
  66. package/dist/types/{mutate/dropStructureChange.d.ts → changeHelpers/structureChange.d.ts} +2 -1
  67. package/dist/types/{changes/findChanges.d.ts → findChanges.d.ts} +1 -1
  68. package/dist/types/helpers/attributes.d.ts +47 -0
  69. package/dist/types/{compute/setFragmentAsInserted.d.ts → helpers/fragment.d.ts} +3 -1
  70. package/dist/types/helpers/mark.d.ts +3 -0
  71. package/dist/types/trackChanges.d.ts +17 -0
  72. package/dist/types/tracking/change-step/diffChangeSteps.d.ts +17 -0
  73. package/dist/types/{utils/mapChangeStep.d.ts → tracking/change-step/mapChangeSteps.d.ts} +2 -2
  74. package/dist/types/tracking/change-step/processChangeSteps.d.ts +6 -0
  75. package/dist/types/tracking/fixAndHandleSelection.d.ts +20 -0
  76. package/dist/types/{mutate → tracking/lib}/deleteAndMergeSplitNodes.d.ts +4 -5
  77. package/dist/types/{mutate → tracking/lib}/deleteNode.d.ts +2 -2
  78. package/dist/types/{mutate/deleteText.d.ts → tracking/lib/deleteTextIfInserted.d.ts} +1 -1
  79. package/dist/types/tracking/lib/matchInserted.d.ts +18 -0
  80. package/dist/types/tracking/lib/processStepsBeforeTracking.d.ts +4 -0
  81. package/dist/types/{compute → tracking/lib}/splitSliceIntoMergedParts.d.ts +1 -1
  82. package/dist/types/{steps/utils.d.ts → tracking/steps-trackers/qualifiers.d.ts} +5 -3
  83. package/dist/types/{steps/trackAttrsChange.d.ts → tracking/steps-trackers/trackAttrsChangeStep.d.ts} +4 -4
  84. package/dist/types/{steps → tracking/steps-trackers}/trackMarkSteps.d.ts +1 -1
  85. package/dist/types/{steps → tracking/steps-trackers}/trackReplaceAroundStep.d.ts +2 -2
  86. package/dist/types/tracking/steps-trackers/trackReplaceStep.d.ts +5 -0
  87. package/dist/types/tracking/trackTransaction.d.ts +4 -0
  88. package/dist/types/tracking/transactionProcessing.d.ts +12 -0
  89. package/dist/types/tracking/types.d.ts +65 -0
  90. package/dist/types/types/change.d.ts +1 -1
  91. package/dist/types/types/track.d.ts +0 -30
  92. package/package.json +17 -14
  93. package/dist/cjs/compute/nodeHelpers.js +0 -83
  94. package/dist/cjs/steps/trackReplaceStep.js +0 -110
  95. package/dist/cjs/steps/trackTransaction.js +0 -162
  96. package/dist/cjs/types/step.js +0 -2
  97. package/dist/cjs/utils/track-utils.js +0 -239
  98. package/dist/es/compute/nodeHelpers.js +0 -73
  99. package/dist/es/steps/trackTransaction.js +0 -156
  100. package/dist/es/types/step.js +0 -1
  101. package/dist/es/utils/track-utils.js +0 -217
  102. package/dist/types/change-steps/diffChangeSteps.d.ts +0 -2
  103. package/dist/types/change-steps/matchInserted.d.ts +0 -3
  104. package/dist/types/change-steps/processChangeSteps.d.ts +0 -6
  105. package/dist/types/changes/applyChanges.d.ts +0 -6
  106. package/dist/types/compute/nodeHelpers.d.ts +0 -14
  107. package/dist/types/steps/trackReplaceStep.d.ts +0 -6
  108. package/dist/types/steps/trackTransaction.d.ts +0 -3
  109. package/dist/types/types/step.d.ts +0 -40
  110. package/dist/types/utils/track-utils.d.ts +0 -24
  111. /package/dist/cjs/{changes → changeHelpers}/fixInconsistentChanges.js +0 -0
  112. /package/dist/cjs/{mutate → tracking/lib}/mergeNode.js +0 -0
  113. /package/dist/cjs/{compute → tracking/lib}/splitSliceIntoMergedParts.js +0 -0
  114. /package/dist/es/{changes → changeHelpers}/fixInconsistentChanges.js +0 -0
  115. /package/dist/es/{mutate → tracking/lib}/mergeNode.js +0 -0
  116. /package/dist/es/{compute → tracking/lib}/splitSliceIntoMergedParts.js +0 -0
  117. /package/dist/types/{changes → changeHelpers}/fixInconsistentChanges.d.ts +0 -0
  118. /package/dist/types/{changes → changeHelpers}/revertChange.d.ts +0 -0
  119. /package/dist/types/{changes → changeHelpers}/updateChangeAttrs.d.ts +0 -0
  120. /package/dist/types/{changes → changeHelpers}/updateChangesStatus.d.ts +0 -0
  121. /package/dist/types/{mutate → tracking/lib}/mergeNode.d.ts +0 -0
  122. /package/dist/types/{mutate → tracking/lib}/mergeTrackedMarks.d.ts +0 -0
@@ -15,7 +15,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.ChangeSet = void 0;
16
16
  const change_1 = require("./types/change");
17
17
  const logger_1 = require("./utils/logger");
18
- const track_utils_1 = require("./utils/track-utils");
19
18
  class ChangeSet {
20
19
  constructor(changes = []) {
21
20
  _ChangeSet_instances.add(this);
@@ -172,9 +171,8 @@ class ChangeSet {
172
171
  if (!nextChange) {
173
172
  return false;
174
173
  }
175
- const isInline = (c) => c.type === 'text-change' || (c.type === 'node-change' && c.node.isInline) || (0, track_utils_1.isInlineMarkChange)(c);
176
- return (isInline(change) &&
177
- isInline(nextChange) &&
174
+ return (ChangeSet.isInline(change) &&
175
+ ChangeSet.isInline(nextChange) &&
178
176
  change.to === nextChange.from &&
179
177
  (change.dataTracked.operation === nextChange.dataTracked.operation ||
180
178
  this.areMatchingWrapOperations(change, nextChange) ||
@@ -199,11 +197,13 @@ class ChangeSet {
199
197
  }
200
198
  static shouldDeleteChange(change) {
201
199
  const { status, operation } = change.dataTracked;
202
- return (((operation === change_1.CHANGE_OPERATION.insert ||
203
- operation === change_1.CHANGE_OPERATION.node_split ||
204
- operation === change_1.CHANGE_OPERATION.wrap_with_node ||
205
- operation === change_1.CHANGE_OPERATION.move) &&
206
- status === change_1.CHANGE_STATUS.rejected) ||
200
+ const allowedRejectedForDeletion = [
201
+ change_1.CHANGE_OPERATION.insert,
202
+ change_1.CHANGE_OPERATION.node_split,
203
+ change_1.CHANGE_OPERATION.wrap_with_node,
204
+ change_1.CHANGE_OPERATION.move,
205
+ ];
206
+ return ((allowedRejectedForDeletion.includes(operation) && status === change_1.CHANGE_STATUS.rejected) ||
207
207
  (operation === change_1.CHANGE_OPERATION.delete && status === change_1.CHANGE_STATUS.accepted));
208
208
  }
209
209
  static isValidDataTracked(dataTracked = {}) {
@@ -226,6 +226,17 @@ class ChangeSet {
226
226
  optionalEntries.every(([key, val]) => optionalKeys.includes(key) && val !== undefined) &&
227
227
  (dataTracked.id || '').length > 0);
228
228
  }
229
+ static isInlineMarkChange(change) {
230
+ if (ChangeSet.isMarkChange(change)) {
231
+ return change.nodeType.isInline || change.nodeType.isText;
232
+ }
233
+ return false;
234
+ }
235
+ static isInline(c) {
236
+ return (c.type === 'text-change' ||
237
+ (c.type === 'node-change' && c.node.isInline) ||
238
+ ChangeSet.isInlineMarkChange(c));
239
+ }
229
240
  static isTextChange(change) {
230
241
  return change.type === 'text-change';
231
242
  }
@@ -241,6 +252,9 @@ class ChangeSet {
241
252
  static isReferenceChange(change) {
242
253
  return change.type === 'reference-change';
243
254
  }
255
+ static isPendingChange(trackedAttrs, operation) {
256
+ return !!(trackedAttrs === null || trackedAttrs === void 0 ? void 0 : trackedAttrs.some((t) => t.operation === operation));
257
+ }
244
258
  }
245
259
  exports.ChangeSet = ChangeSet;
246
260
  _ChangeSet_changes = new WeakMap(), _ChangeSet_instances = new WeakSet(), _ChangeSet_isSameNodeChange = function _ChangeSet_isSameNodeChange(currentChange, nextChange) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.skipTracking = exports.TrackChangesAction = void 0;
3
+ exports.isIndentationAction = exports.skipTracking = exports.TrackChangesAction = void 0;
4
4
  exports.hasAction = hasAction;
5
5
  exports.getAction = getAction;
6
6
  exports.setAction = setAction;
@@ -26,3 +26,5 @@ function setAction(tr, action, payload) {
26
26
  }
27
27
  const skipTracking = (tr) => setAction(tr, TrackChangesAction.skipTrack, true);
28
28
  exports.skipTracking = skipTracking;
29
+ const isIndentationAction = (action) => action === 'indent' || action === 'unindent';
30
+ exports.isIndentationAction = isIndentationAction;
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyAcceptedRejectedChanges = applyAcceptedRejectedChanges;
3
+ exports.applyChanges = applyChanges;
4
4
  const prosemirror_transform_1 = require("prosemirror-transform");
5
- const ChangeSet_1 = require("../ChangeSet");
6
- const deleteNode_1 = require("../mutate/deleteNode");
7
- const mergeNode_1 = require("../mutate/mergeNode");
8
- const change_1 = require("../types/change");
9
- const logger_1 = require("../utils/logger");
10
- const track_utils_1 = require("../utils/track-utils");
11
- const revertChange_1 = require("./revertChange");
12
- const updateChangeAttrs_1 = require("./updateChangeAttrs");
5
+ const revertChange_1 = require("./changeHelpers/revertChange");
6
+ const updateChangeAttrs_1 = require("./changeHelpers/updateChangeAttrs");
7
+ const ChangeSet_1 = require("./ChangeSet");
8
+ const attributes_1 = require("./helpers/attributes");
9
+ const deleteNode_1 = require("./tracking/lib/deleteNode");
10
+ const mergeNode_1 = require("./tracking/lib/mergeNode");
11
+ const change_1 = require("./types/change");
12
+ const logger_1 = require("./utils/logger");
13
13
  function collectMoveNodeIds(containerNode, primaryMoveNodeId) {
14
14
  const moveNodeIds = new Set();
15
15
  moveNodeIds.add(primaryMoveNodeId);
@@ -25,7 +25,7 @@ function collectMoveNodeIds(containerNode, primaryMoveNodeId) {
25
25
  });
26
26
  return moveNodeIds;
27
27
  }
28
- function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap = new prosemirror_transform_1.Mapping()) {
28
+ function applyChanges(tr, schema, changes, changeSet, deleteMap = new prosemirror_transform_1.Mapping()) {
29
29
  changes.sort((c1, c2) => {
30
30
  if ((c1.type === 'node-change' && c1.node.type === schema.nodes.list) ||
31
31
  (c2.type === 'node-change' && c2.node.type === schema.nodes.list)) {
@@ -84,23 +84,23 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
84
84
  deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
85
85
  }
86
86
  else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
87
- tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.newAttrs), { dataTracked: (0, track_utils_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
87
+ tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.newAttrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
88
88
  }
89
89
  else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
90
- tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: (0, track_utils_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
90
+ tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
91
91
  }
92
92
  else if (ChangeSet_1.ChangeSet.isReferenceChange(change)) {
93
- tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: (0, track_utils_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
93
+ tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) }), node.marks);
94
94
  }
95
95
  else if (ChangeSet_1.ChangeSet.isMarkChange(change)) {
96
96
  const newMark = change.mark.type.create({
97
- dataTracked: (0, track_utils_1.excludeFromTracked)(change.mark.attrs.dataTracked, change.id),
97
+ dataTracked: (0, attributes_1.excludeFromTracked)(change.mark.attrs.dataTracked, change.id),
98
98
  });
99
99
  const isInsert = change.dataTracked.operation === change_1.CHANGE_OPERATION.insert;
100
100
  const isDelete = change.dataTracked.operation === change_1.CHANGE_OPERATION.delete;
101
101
  const toBeRestored = (change.dataTracked.status === change_1.CHANGE_STATUS.accepted && isInsert) ||
102
102
  (change.dataTracked.status === change_1.CHANGE_STATUS.rejected && isDelete);
103
- if ((0, track_utils_1.isInlineMarkChange)(change)) {
103
+ if (ChangeSet_1.ChangeSet.isInlineMarkChange(change)) {
104
104
  tr.removeMark(change.from, change.to, change.mark);
105
105
  if (toBeRestored) {
106
106
  tr.addMark(change.from, change.to, newMark);
@@ -128,7 +128,7 @@ function applyAcceptedRejectedChanges(tr, schema, changes, changeSet, deleteMap
128
128
  return;
129
129
  }
130
130
  if (change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
131
- const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: (0, track_utils_1.excludeFromTracked)(node.attrs.dataTracked, change.id) });
131
+ const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, change.id) });
132
132
  tr.setNodeMarkup(from, undefined, attrs, node.marks);
133
133
  const originalChanges = changeSet.changes.filter((c) => c.dataTracked.moveNodeId === change.dataTracked.moveNodeId &&
134
134
  c.dataTracked.operation === change_1.CHANGE_OPERATION.delete);
@@ -4,8 +4,7 @@ exports.revertSplitNodeChange = revertSplitNodeChange;
4
4
  exports.revertWrapNodeChange = revertWrapNodeChange;
5
5
  const prosemirror_model_1 = require("prosemirror-model");
6
6
  const prosemirror_transform_1 = require("prosemirror-transform");
7
- const nodeHelpers_1 = require("../compute/nodeHelpers");
8
- const track_utils_1 = require("../utils/track-utils");
7
+ const attributes_1 = require("../helpers/attributes");
9
8
  function revertSplitNodeChange(tr, change, changeSet) {
10
9
  const sourceChange = changeSet.changes.find((c) => c.dataTracked.operation === 'reference' && c.dataTracked.referenceId === change.id);
11
10
  const node = tr.doc.nodeAt(tr.mapping.map(change.from));
@@ -17,14 +16,14 @@ function revertSplitNodeChange(tr, change, changeSet) {
17
16
  const childSource = changeSet.changes.find((c) => c.from === change.from && c.dataTracked.operation === 'reference');
18
17
  if (childSource) {
19
18
  const node = tr.doc.nodeAt(tr.mapping.map(sourceChange.from));
20
- const data = (0, nodeHelpers_1.getBlockInlineTrackedData)(node) || [];
19
+ const data = (0, attributes_1.getBlockInlineTrackedData)(node) || [];
21
20
  const dataTracked = data.map((c) => (c.operation === 'reference' ? childSource.dataTracked : c));
22
21
  tr.setNodeMarkup(tr.mapping.map(sourceChange.from), undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked }), node.marks);
23
22
  }
24
23
  const deleteChange = changeSet.changes.find((c) => c.dataTracked.operation == 'delete' && c.from === sourceChange.from);
25
24
  if (deleteChange) {
26
25
  const node = tr.doc.nodeAt(tr.mapping.map(deleteChange.from));
27
- tr.setNodeMarkup(tr.mapping.map(deleteChange.from), undefined, (0, track_utils_1.excludeFromTracked)(node.attrs.dataTracked, deleteChange.id));
26
+ tr.setNodeMarkup(tr.mapping.map(deleteChange.from), undefined, (0, attributes_1.excludeFromTracked)(node.attrs.dataTracked, deleteChange.id));
28
27
  }
29
28
  }
30
29
  function revertWrapNodeChange(tr, change, deleteMap) {
@@ -11,15 +11,16 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.joinStructureChanges = exports.dropOrphanChanges = exports.dropStructuralChangeShadow = void 0;
14
+ exports.isStructuralChange = exports.joinStructureChanges = exports.dropOrphanChanges = exports.dropStructuralChangeShadow = void 0;
15
15
  const prosemirror_model_1 = require("prosemirror-model");
16
16
  const prosemirror_state_1 = require("prosemirror-state");
17
- const findChanges_1 = require("../changes/findChanges");
18
- const updateChangeAttrs_1 = require("../changes/updateChangeAttrs");
19
- const nodeHelpers_1 = require("../compute/nodeHelpers");
20
- const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
17
+ const prosemirror_transform_1 = require("prosemirror-transform");
18
+ const actions_1 = require("../actions");
19
+ const findChanges_1 = require("../findChanges");
20
+ const attributes_1 = require("../helpers/attributes");
21
+ const fragment_1 = require("../helpers/fragment");
21
22
  const change_1 = require("../types/change");
22
- const track_utils_1 = require("../utils/track-utils");
23
+ const updateChangeAttrs_1 = require("./updateChangeAttrs");
23
24
  const dropStructuralChangeShadow = (moveNodeId, tr) => {
24
25
  const changeSet = (0, findChanges_1.findChanges)(prosemirror_state_1.EditorState.create({ doc: tr.doc }));
25
26
  const changes = changeSet.changes.filter((c) => c.type === 'node-change' && c.dataTracked.moveNodeId === moveNodeId);
@@ -61,18 +62,18 @@ const dropOrphanChanges = (newTr) => {
61
62
  if (c.dataTracked.operation === change_1.CHANGE_OPERATION.reference &&
62
63
  !changesIds.has(c.dataTracked.referenceId)) {
63
64
  const node = newTr.doc.nodeAt(c.from);
64
- const dataTracked = node && ((0, nodeHelpers_1.getBlockInlineTrackedData)(node) || []).filter((d) => d.id !== c.id);
65
+ const dataTracked = node && ((0, attributes_1.getBlockInlineTrackedData)(node) || []).filter((d) => d.id !== c.id);
65
66
  newTr.setNodeMarkup(c.from, undefined, Object.assign(Object.assign({}, node === null || node === void 0 ? void 0 : node.attrs), { dataTracked }));
66
67
  }
67
68
  if (c.type === 'node-change' &&
68
69
  c.dataTracked.operation === change_1.CHANGE_OPERATION.node_split &&
69
70
  !referenceIds.has(c.id)) {
70
71
  const _a = c.dataTracked, { id } = _a, attrs = __rest(_a, ["id"]);
71
- newTr.replaceWith(c.from, c.to, (0, setFragmentAsInserted_1.setFragmentAsInserted)(prosemirror_model_1.Fragment.from(c.node), (0, track_utils_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema));
72
- const referenceChanges = ((0, nodeHelpers_1.getBlockInlineTrackedData)(c.node) || []).filter((d) => d.operation === change_1.CHANGE_OPERATION.reference);
72
+ newTr.replaceWith(c.from, c.to, (0, fragment_1.setFragmentAsInserted)(prosemirror_model_1.Fragment.from(c.node), (0, attributes_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema));
73
+ const referenceChanges = ((0, attributes_1.getBlockInlineTrackedData)(c.node) || []).filter((d) => d.operation === change_1.CHANGE_OPERATION.reference);
73
74
  if (referenceChanges.length) {
74
75
  const node = newTr.doc.nodeAt(c.from);
75
- const dataTracked = (node && (0, nodeHelpers_1.getBlockInlineTrackedData)(node)) || [];
76
+ const dataTracked = (node && (0, attributes_1.getBlockInlineTrackedData)(node)) || [];
76
77
  newTr.setNodeMarkup(c.from, undefined, Object.assign(Object.assign({}, node === null || node === void 0 ? void 0 : node.attrs), { dataTracked: [...dataTracked, ...referenceChanges] }));
77
78
  }
78
79
  }
@@ -88,7 +89,7 @@ const dropOrphanChanges = (newTr) => {
88
89
  }
89
90
  else if (c.type === 'node-change') {
90
91
  const _b = c.dataTracked, { id, moveNodeId } = _b, attrs = __rest(_b, ["id", "moveNodeId"]);
91
- newTr.replaceWith(c.from, c.to, (0, setFragmentAsInserted_1.setFragmentAsInserted)(prosemirror_model_1.Fragment.from(c.node), (0, track_utils_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema));
92
+ newTr.replaceWith(c.from, c.to, (0, fragment_1.setFragmentAsInserted)(prosemirror_model_1.Fragment.from(c.node), (0, attributes_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema));
92
93
  }
93
94
  }
94
95
  });
@@ -104,7 +105,7 @@ const groupStructureChanges = (tr, toNode) => {
104
105
  .append(fromNodes)
105
106
  .descendants((node) => {
106
107
  var _a;
107
- const moveNodeId = (_a = ((0, nodeHelpers_1.getBlockInlineTrackedData)(node) || []).find((c) => c.operation === change_1.CHANGE_OPERATION.structure)) === null || _a === void 0 ? void 0 : _a.moveNodeId;
108
+ const moveNodeId = (_a = ((0, attributes_1.getBlockInlineTrackedData)(node) || []).find((c) => c.operation === change_1.CHANGE_OPERATION.structure)) === null || _a === void 0 ? void 0 : _a.moveNodeId;
108
109
  moveNodeId && moveNodeIds.add(moveNodeId);
109
110
  });
110
111
  return moveNodeIds;
@@ -118,14 +119,19 @@ const joinStructureChanges = (attrs, sliceContent, content, tr, newTr) => {
118
119
  const changeSet = (0, findChanges_1.findChanges)(prosemirror_state_1.EditorState.create({ doc: newTr.doc }));
119
120
  const relatedChanges = changeSet.changes.filter((c) => c.dataTracked.moveNodeId && idsSet.has(c.dataTracked.moveNodeId));
120
121
  relatedChanges.map((c) => (0, updateChangeAttrs_1.updateChangeAttrs)(newTr, c, Object.assign(Object.assign({}, c.dataTracked), { moveNodeId }), newTr.doc.type.schema));
121
- const toInsertChange = toNode && ((_b = (0, nodeHelpers_1.getBlockInlineTrackedData)(toNode)) === null || _b === void 0 ? void 0 : _b.find((c) => c.operation === change_1.CHANGE_OPERATION.insert));
122
+ const toInsertChange = toNode && ((_b = (0, attributes_1.getBlockInlineTrackedData)(toNode)) === null || _b === void 0 ? void 0 : _b.find((c) => c.operation === change_1.CHANGE_OPERATION.insert));
122
123
  const fromInsertChange = sliceContent.firstChild &&
123
- ((_c = (0, nodeHelpers_1.getBlockInlineTrackedData)(sliceContent.firstChild)) === null || _c === void 0 ? void 0 : _c.find((c) => c.operation === change_1.CHANGE_OPERATION.insert));
124
+ ((_c = (0, attributes_1.getBlockInlineTrackedData)(sliceContent.firstChild)) === null || _c === void 0 ? void 0 : _c.find((c) => c.operation === change_1.CHANGE_OPERATION.insert));
124
125
  if (toInsertChange || fromInsertChange) {
125
- return (0, setFragmentAsInserted_1.setFragmentAsInserted)(content, (0, track_utils_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema);
126
+ return (0, fragment_1.setFragmentAsInserted)(content, (0, attributes_1.createNewInsertAttrs)(attrs), newTr.doc.type.schema);
126
127
  }
127
- return (0, track_utils_1.updateBlockNodesAttrs)(sliceContent, (_, node) => {
128
- return Object.assign(Object.assign({}, _), { dataTracked: [(0, nodeHelpers_1.addTrackIdIfDoesntExist)((0, track_utils_1.createNewStructureAttrs)(Object.assign(Object.assign({}, attrs), { moveNodeId })))] });
128
+ return (0, attributes_1.updateBlockNodesAttrs)(sliceContent, (_, node) => {
129
+ return Object.assign(Object.assign({}, _), { dataTracked: [(0, attributes_1.addTrackIdIfDoesntExist)((0, attributes_1.createNewStructureAttrs)(Object.assign(Object.assign({}, attrs), { moveNodeId })))] });
129
130
  });
130
131
  };
131
132
  exports.joinStructureChanges = joinStructureChanges;
133
+ const isStructuralChange = (tr) => tr.getMeta(actions_1.TrackChangesAction.structuralChangeAction) &&
134
+ tr.steps.length === 2 &&
135
+ tr.steps[0] instanceof prosemirror_transform_1.ReplaceStep &&
136
+ tr.steps[1] instanceof prosemirror_transform_1.ReplaceStep;
137
+ exports.isStructuralChange = isStructuralChange;
@@ -4,10 +4,9 @@ exports.updateChangeAttrs = updateChangeAttrs;
4
4
  exports.updateChangeChildrenAttributes = updateChangeChildrenAttributes;
5
5
  exports.restoreNode = restoreNode;
6
6
  const ChangeSet_1 = require("../ChangeSet");
7
- const nodeHelpers_1 = require("../compute/nodeHelpers");
7
+ const attributes_1 = require("../helpers/attributes");
8
8
  const change_1 = require("../types/change");
9
9
  const logger_1 = require("../utils/logger");
10
- const track_utils_1 = require("../utils/track-utils");
11
10
  function updateChangeAttrs(tr, change, trackedAttrs, schema) {
12
11
  const node = tr.doc.nodeAt(change.from);
13
12
  if (!node) {
@@ -15,7 +14,7 @@ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
15
14
  return tr;
16
15
  }
17
16
  const { operation } = trackedAttrs;
18
- const oldTrackData = change.type === 'text-change' ? (0, nodeHelpers_1.getTextNodeTrackedMarkData)(node, schema) : (0, nodeHelpers_1.getBlockInlineTrackedData)(node);
17
+ const oldTrackData = change.type === 'text-change' ? (0, attributes_1.getTextNodeTrackedMarkData)(node, schema) : (0, attributes_1.getBlockInlineTrackedData)(node);
19
18
  if (!operation) {
20
19
  logger_1.log.warn('updateChangeAttrs: unable to determine operation of change ', change);
21
20
  }
@@ -44,7 +43,7 @@ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
44
43
  trackedAttrs.status === change_1.CHANGE_STATUS.rejected) {
45
44
  restoredAttrs = trackedAttrs.oldAttrs;
46
45
  }
47
- const trackedDataSource = (0, nodeHelpers_1.getBlockInlineTrackedData)(node) || [];
46
+ const trackedDataSource = (0, attributes_1.getBlockInlineTrackedData)(node) || [];
48
47
  const targetDataTracked = trackedDataSource.find((t) => change.id === t.id);
49
48
  const newDataTracked = trackedDataSource
50
49
  .map((oldTrack) => {
@@ -83,7 +82,7 @@ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
83
82
  return dt;
84
83
  });
85
84
  const newMark = markChange.mark.type.create(Object.assign(Object.assign({}, markChange.mark.attrs), { dataTracked: newDT }));
86
- if ((0, track_utils_1.isInlineMarkChange)(markChange)) {
85
+ if (ChangeSet_1.ChangeSet.isInlineMarkChange(markChange)) {
87
86
  tr.removeMark(markChange.from, markChange.to, markChange.mark);
88
87
  tr.addMark(markChange.from, markChange.to, newMark);
89
88
  }
@@ -17,10 +17,10 @@
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.updateChangesStatus = updateChangesStatus;
19
19
  const prosemirror_history_1 = require("prosemirror-history");
20
+ const applyChanges_1 = require("../applyChanges");
20
21
  const ChangeSet_1 = require("../ChangeSet");
21
- const dropStructureChange_1 = require("../mutate/dropStructureChange");
22
22
  const change_1 = require("../types/change");
23
- const applyChanges_1 = require("./applyChanges");
23
+ const structureChange_1 = require("./structureChange");
24
24
  const updateChangeAttrs_1 = require("./updateChangeAttrs");
25
25
  function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState) {
26
26
  const change = changeSet.get(ids[0]);
@@ -61,9 +61,9 @@ function updateChangesStatus(createdTr, changeSet, ids, status, userID, oldState
61
61
  }
62
62
  }
63
63
  });
64
- const mapping = (0, applyChanges_1.applyAcceptedRejectedChanges)(createdTr, oldState.schema, nonTextChanges, changeSet);
65
- (0, applyChanges_1.applyAcceptedRejectedChanges)(createdTr, oldState.schema, textChanges, changeSet, mapping);
66
- (0, dropStructureChange_1.dropOrphanChanges)(createdTr);
64
+ const mapping = (0, applyChanges_1.applyChanges)(createdTr, oldState.schema, nonTextChanges, changeSet);
65
+ (0, applyChanges_1.applyChanges)(createdTr, oldState.schema, textChanges, changeSet, mapping);
66
+ (0, structureChange_1.dropOrphanChanges)(createdTr);
67
67
  }
68
68
  else {
69
69
  ids.forEach((changeId) => {
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findChanges = findChanges;
4
- const ChangeSet_1 = require("../ChangeSet");
5
- const nodeHelpers_1 = require("../compute/nodeHelpers");
6
- const change_1 = require("../types/change");
4
+ const ChangeSet_1 = require("./ChangeSet");
5
+ const attributes_1 = require("./helpers/attributes");
6
+ const change_1 = require("./types/change");
7
7
  function findChanges(state) {
8
8
  const changes = [];
9
9
  let current;
10
10
  state.doc.descendants((node, pos) => {
11
- const tracked = (0, nodeHelpers_1.getNodeTrackedData)(node, state.schema) || [];
12
- const marksWithTrackChanges = (0, nodeHelpers_1.getMarkTrackedData)(node);
11
+ const tracked = (0, attributes_1.getNodeTrackedData)(node, state.schema) || [];
12
+ const marksWithTrackChanges = (0, attributes_1.getMarkTrackedData)(node);
13
13
  marksWithTrackChanges === null || marksWithTrackChanges === void 0 ? void 0 : marksWithTrackChanges.forEach((trackAttrs, mark) => {
14
14
  trackAttrs.forEach((c) => {
15
15
  const ch = {
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.updateBlockNodesAttrs = void 0;
15
+ exports.createNewInsertAttrs = createNewInsertAttrs;
16
+ exports.createNewWrapAttrs = createNewWrapAttrs;
17
+ exports.createNewSplitAttrs = createNewSplitAttrs;
18
+ exports.createNewReferenceAttrs = createNewReferenceAttrs;
19
+ exports.createNewDeleteAttrs = createNewDeleteAttrs;
20
+ exports.createNewMoveAttrs = createNewMoveAttrs;
21
+ exports.createNewUpdateAttrs = createNewUpdateAttrs;
22
+ exports.createNewStructureAttrs = createNewStructureAttrs;
23
+ exports.createNewPendingAttrs = createNewPendingAttrs;
24
+ exports.addTrackIdIfDoesntExist = addTrackIdIfDoesntExist;
25
+ exports.getTextNodeTrackedMarkData = getTextNodeTrackedMarkData;
26
+ exports.getBlockInlineTrackedData = getBlockInlineTrackedData;
27
+ exports.getMarkTrackedData = getMarkTrackedData;
28
+ exports.getNodeTrackedData = getNodeTrackedData;
29
+ exports.shouldMergeTrackedAttributes = shouldMergeTrackedAttributes;
30
+ exports.getMergeableMarkTrackedAttrs = getMergeableMarkTrackedAttrs;
31
+ exports.excludeFromTracked = excludeFromTracked;
32
+ const prosemirror_model_1 = require("prosemirror-model");
33
+ const change_1 = require("../types/change");
34
+ const logger_1 = require("../utils/logger");
35
+ const uuidv4_1 = require("../utils/uuidv4");
36
+ const mark_1 = require("./mark");
37
+ function createNewInsertAttrs(attrs) {
38
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.insert });
39
+ }
40
+ function createNewWrapAttrs(attrs) {
41
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.wrap_with_node });
42
+ }
43
+ function createNewSplitAttrs(attrs) {
44
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.node_split });
45
+ }
46
+ function createNewReferenceAttrs(attrs, id) {
47
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.reference, referenceId: id });
48
+ }
49
+ function createNewDeleteAttrs(attrs) {
50
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.delete });
51
+ }
52
+ function createNewMoveAttrs(attrs, indentationType) {
53
+ return Object.assign(Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.move }), (indentationType && { indentationType }));
54
+ }
55
+ function createNewUpdateAttrs(attrs, oldAttrs) {
56
+ const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
57
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
58
+ }
59
+ function createNewStructureAttrs(attrs) {
60
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.structure });
61
+ }
62
+ function createNewPendingAttrs(time, authorID) {
63
+ return {
64
+ authorID,
65
+ reviewedByID: null,
66
+ createdAt: time,
67
+ updatedAt: time,
68
+ statusUpdateAt: 0,
69
+ status: change_1.CHANGE_STATUS.pending,
70
+ };
71
+ }
72
+ function addTrackIdIfDoesntExist(attrs) {
73
+ if (!attrs.id) {
74
+ return Object.assign({ id: (0, uuidv4_1.uuidv4)() }, attrs);
75
+ }
76
+ return attrs;
77
+ }
78
+ function getTextNodeTrackedMarkData(node, schema) {
79
+ if (!node || !node.isText) {
80
+ return undefined;
81
+ }
82
+ const marksTrackedData = [];
83
+ node.marks.forEach((mark) => {
84
+ if (mark.type === schema.marks.tracked_insert || mark.type === schema.marks.tracked_delete) {
85
+ const operation = mark.type === schema.marks.tracked_insert ? change_1.CHANGE_OPERATION.insert : change_1.CHANGE_OPERATION.delete;
86
+ marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
87
+ }
88
+ });
89
+ if (marksTrackedData.length > 1) {
90
+ logger_1.log.warn('inline node with more than 1 of tracked marks', marksTrackedData);
91
+ }
92
+ return marksTrackedData[0] || undefined;
93
+ }
94
+ function getBlockInlineTrackedData(node) {
95
+ const { dataTracked } = node.attrs;
96
+ if (dataTracked && !Array.isArray(dataTracked)) {
97
+ return [dataTracked];
98
+ }
99
+ return dataTracked || [];
100
+ }
101
+ function getMarkTrackedData(node) {
102
+ const tracked = node === null || node === void 0 ? void 0 : node.marks.reduce((acc, current) => {
103
+ if ((0, mark_1.isValidTrackableMark)(current) && current.attrs.dataTracked) {
104
+ acc.set(current, current.attrs.dataTracked);
105
+ }
106
+ return acc;
107
+ }, new Map());
108
+ return tracked || new Map();
109
+ }
110
+ function getNodeTrackedData(node, schema) {
111
+ let tracked;
112
+ if (node && !node.isText) {
113
+ tracked = getBlockInlineTrackedData(node);
114
+ }
115
+ else if (node === null || node === void 0 ? void 0 : node.isText) {
116
+ tracked = getTextNodeTrackedMarkData(node, schema);
117
+ }
118
+ if (tracked && !Array.isArray(tracked)) {
119
+ tracked = [tracked];
120
+ }
121
+ return tracked;
122
+ }
123
+ function shouldMergeTrackedAttributes(left, right) {
124
+ if (!left || !right) {
125
+ logger_1.log.warn('passed undefined dataTracked attributes to shouldMergeTrackedAttributes', {
126
+ left,
127
+ right,
128
+ });
129
+ return false;
130
+ }
131
+ return (left.status === right.status && left.operation === right.operation && left.authorID === right.authorID);
132
+ }
133
+ function getMergeableMarkTrackedAttrs(node, attrs, schema) {
134
+ const nodeAttrs = getTextNodeTrackedMarkData(node, schema);
135
+ return nodeAttrs && shouldMergeTrackedAttributes(nodeAttrs, attrs) ? nodeAttrs : null;
136
+ }
137
+ const updateBlockNodesAttrs = (fragment, predicate) => {
138
+ const updatedNodes = [];
139
+ fragment.forEach((child) => {
140
+ if (!child.isBlock) {
141
+ updatedNodes.push(child);
142
+ return;
143
+ }
144
+ const newContent = child.content.size ? (0, exports.updateBlockNodesAttrs)(child.content, predicate) : child.content;
145
+ const newAttrs = predicate(child.attrs, child);
146
+ updatedNodes.push(child.type.create(newAttrs, newContent, child.marks));
147
+ });
148
+ return prosemirror_model_1.Fragment.fromArray(updatedNodes);
149
+ };
150
+ exports.updateBlockNodesAttrs = updateBlockNodesAttrs;
151
+ function excludeFromTracked(dataTracked, changeIdToExclude) {
152
+ if (!dataTracked) {
153
+ return null;
154
+ }
155
+ const newDataTracked = dataTracked.filter((c) => c.id !== changeIdToExclude);
156
+ return newDataTracked.length ? newDataTracked : null;
157
+ }