@manuscripts/track-changes-plugin 1.7.3 → 1.7.4
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/dist/cjs/ChangeSet.js +6 -7
- package/dist/cjs/change-steps/diffChangeSteps.js +1 -1
- package/dist/cjs/change-steps/processChangeSteps.js +7 -6
- package/dist/cjs/changes/applyChanges.js +7 -3
- package/dist/cjs/changes/findChanges.js +1 -1
- package/dist/cjs/changes/fixInconsistentChanges.js +2 -2
- package/dist/cjs/changes/updateChangeAttrs.js +1 -1
- package/dist/cjs/compute/nodeHelpers.js +2 -6
- package/dist/cjs/compute/setFragmentAsInserted.js +1 -1
- package/dist/cjs/compute/splitSliceIntoMergedParts.js +1 -3
- package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +4 -10
- package/dist/cjs/mutate/deleteNode.js +8 -10
- package/dist/cjs/plugin.js +14 -7
- package/dist/cjs/steps/trackReplaceAroundStep.js +2 -2
- package/dist/cjs/steps/trackReplaceStep.js +4 -2
- package/dist/cjs/steps/trackTransaction.js +5 -5
- package/dist/es/ChangeSet.js +6 -7
- package/dist/es/change-steps/diffChangeSteps.js +1 -1
- package/dist/es/change-steps/processChangeSteps.js +7 -6
- package/dist/es/changes/applyChanges.js +7 -3
- package/dist/es/changes/findChanges.js +1 -1
- package/dist/es/changes/fixInconsistentChanges.js +2 -2
- package/dist/es/changes/updateChangeAttrs.js +2 -2
- package/dist/es/compute/nodeHelpers.js +2 -6
- package/dist/es/compute/setFragmentAsInserted.js +1 -1
- package/dist/es/compute/splitSliceIntoMergedParts.js +1 -3
- package/dist/es/mutate/deleteAndMergeSplitNodes.js +4 -10
- package/dist/es/mutate/deleteNode.js +8 -10
- package/dist/es/plugin.js +14 -7
- package/dist/es/steps/trackReplaceAroundStep.js +2 -2
- package/dist/es/steps/trackReplaceStep.js +4 -2
- package/dist/es/steps/trackTransaction.js +5 -5
- package/dist/types/ChangeSet.d.ts +1 -1
- package/dist/types/mutate/deleteAndMergeSplitNodes.d.ts +1 -1
- package/dist/types/steps/trackReplaceAroundStep.d.ts +1 -1
- package/dist/types/steps/trackReplaceStep.d.ts +1 -1
- package/dist/types/types/change.d.ts +1 -0
- package/package.json +27 -5
package/dist/cjs/ChangeSet.js
CHANGED
|
@@ -36,14 +36,15 @@ class ChangeSet {
|
|
|
36
36
|
const rootNodes = [];
|
|
37
37
|
let currentNodeChange;
|
|
38
38
|
this.changes.forEach((c) => {
|
|
39
|
-
if (currentNodeChange &&
|
|
39
|
+
if (currentNodeChange &&
|
|
40
|
+
(c.from >= currentNodeChange.to ||
|
|
41
|
+
c.dataTracked.statusUpdateAt !== currentNodeChange.dataTracked.statusUpdateAt)) {
|
|
40
42
|
rootNodes.push(currentNodeChange);
|
|
41
43
|
currentNodeChange = undefined;
|
|
42
44
|
}
|
|
43
45
|
if (currentNodeChange &&
|
|
44
46
|
c.from < currentNodeChange.to &&
|
|
45
|
-
!(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) &&
|
|
46
|
-
__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
|
|
47
|
+
!(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) && __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
|
|
47
48
|
currentNodeChange.children.push(c);
|
|
48
49
|
}
|
|
49
50
|
else if (c.type === 'node-change') {
|
|
@@ -101,15 +102,13 @@ class ChangeSet {
|
|
|
101
102
|
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id);
|
|
102
103
|
}
|
|
103
104
|
getIn(ids) {
|
|
104
|
-
return ids
|
|
105
|
-
.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id))
|
|
106
|
-
.filter((c) => c !== undefined);
|
|
105
|
+
return ids.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id)).filter((c) => c !== undefined);
|
|
107
106
|
}
|
|
108
107
|
getNotIn(ids) {
|
|
109
108
|
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => ids.includes(c.id));
|
|
110
109
|
}
|
|
111
110
|
static flattenTreeToIds(changes) {
|
|
112
|
-
return changes.flatMap((c) => this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id);
|
|
111
|
+
return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
|
|
113
112
|
}
|
|
114
113
|
static shouldDeleteChange(change) {
|
|
115
114
|
const { status, operation } = change.dataTracked;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.diffChangeSteps = void 0;
|
|
4
4
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
5
|
-
const matchInserted_1 = require("./matchInserted");
|
|
6
5
|
const logger_1 = require("../utils/logger");
|
|
6
|
+
const matchInserted_1 = require("./matchInserted");
|
|
7
7
|
function cutFragment(matched, deleted, content) {
|
|
8
8
|
const newContent = [];
|
|
9
9
|
for (let i = 0; matched <= deleted && i < content.childCount; i += 1) {
|
|
@@ -36,12 +36,12 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
37
|
exports.processChangeSteps = void 0;
|
|
38
38
|
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
39
|
-
const
|
|
40
|
-
const change_1 = require("../types/change");
|
|
39
|
+
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
41
40
|
const deleteNode_1 = require("../mutate/deleteNode");
|
|
42
41
|
const deleteText_1 = require("../mutate/deleteText");
|
|
43
42
|
const mergeTrackedMarks_1 = require("../mutate/mergeTrackedMarks");
|
|
44
|
-
const
|
|
43
|
+
const change_1 = require("../types/change");
|
|
44
|
+
const logger_1 = require("../utils/logger");
|
|
45
45
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
46
46
|
function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
47
47
|
const mapping = new prosemirror_transform_1.Mapping();
|
|
@@ -52,13 +52,14 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
|
52
52
|
changes.forEach((c) => {
|
|
53
53
|
let step = newTr.steps[newTr.steps.length - 1];
|
|
54
54
|
switch (c.type) {
|
|
55
|
-
case
|
|
55
|
+
case 'delete-node':
|
|
56
56
|
deletesCounter++;
|
|
57
57
|
const trackedData = (0, nodeHelpers_1.getBlockInlineTrackedData)(c.node);
|
|
58
58
|
const inserted = trackedData === null || trackedData === void 0 ? void 0 : trackedData.find((d) => d.operation === change_1.CHANGE_OPERATION.insert);
|
|
59
59
|
isInserted = !!inserted || (!trackedData && isInserted);
|
|
60
|
-
if (isInserted && deletesCounter > 1)
|
|
60
|
+
if (isInserted && deletesCounter > 1) {
|
|
61
61
|
return false;
|
|
62
|
+
}
|
|
62
63
|
(0, deleteNode_1.deleteOrSetNodeDeleted)(c.node, mapping.map(c.pos), newTr, deleteAttrs);
|
|
63
64
|
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
64
65
|
if (step !== newestStep) {
|
|
@@ -67,7 +68,7 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
|
67
68
|
}
|
|
68
69
|
(0, mergeTrackedMarks_1.mergeTrackedMarks)(mapping.map(c.pos), newTr.doc, newTr, schema);
|
|
69
70
|
break;
|
|
70
|
-
case
|
|
71
|
+
case 'delete-text':
|
|
71
72
|
const node = newTr.doc.nodeAt(mapping.map(c.pos));
|
|
72
73
|
if (!node) {
|
|
73
74
|
logger_1.log.error(`processChangeSteps: no text node found for text-change`, c);
|
|
@@ -14,15 +14,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.applyAcceptedRejectedChanges = void 0;
|
|
15
15
|
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
16
16
|
const ChangeSet_1 = require("../ChangeSet");
|
|
17
|
-
const change_1 = require("../types/change");
|
|
18
|
-
const logger_1 = require("../utils/logger");
|
|
19
17
|
const deleteNode_1 = require("../mutate/deleteNode");
|
|
20
18
|
const mergeNode_1 = require("../mutate/mergeNode");
|
|
19
|
+
const change_1 = require("../types/change");
|
|
20
|
+
const logger_1 = require("../utils/logger");
|
|
21
21
|
const updateChangeAttrs_1 = require("./updateChangeAttrs");
|
|
22
22
|
function getUpdatedDataTracked(dataTracked, changeId) {
|
|
23
23
|
if (!dataTracked) {
|
|
24
24
|
return null;
|
|
25
25
|
}
|
|
26
|
+
console.log(dataTracked);
|
|
26
27
|
const newDataTracked = dataTracked.filter((c) => c.id !== changeId);
|
|
27
28
|
return newDataTracked.length ? newDataTracked : null;
|
|
28
29
|
}
|
|
@@ -42,7 +43,9 @@ function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prose
|
|
|
42
43
|
if (ChangeSet_1.ChangeSet.isNodeAttrChange(change)) {
|
|
43
44
|
const _a = change.newAttrs, { dataTracked } = _a, attrs = __rest(_a, ["dataTracked"]);
|
|
44
45
|
const changeLog = attrsChangesLog.get(node.attrs.id);
|
|
45
|
-
const newDataTracked = changeLog && changeLog.length
|
|
46
|
+
const newDataTracked = changeLog && changeLog.length
|
|
47
|
+
? dataTracked.filter((c) => !changeLog.includes(c.id))
|
|
48
|
+
: dataTracked;
|
|
46
49
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: newDataTracked.length ? newDataTracked : null }), node.marks);
|
|
47
50
|
}
|
|
48
51
|
return;
|
|
@@ -72,6 +75,7 @@ function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prose
|
|
|
72
75
|
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
73
76
|
}
|
|
74
77
|
else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
|
|
78
|
+
console.log('GETTING IN ---- CHANGE_STATUS.rejected');
|
|
75
79
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
76
80
|
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
77
81
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.findChanges = void 0;
|
|
4
4
|
const ChangeSet_1 = require("../ChangeSet");
|
|
5
|
-
const change_1 = require("../types/change");
|
|
6
5
|
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
6
|
+
const change_1 = require("../types/change");
|
|
7
7
|
function findChanges(state) {
|
|
8
8
|
const changes = [];
|
|
9
9
|
let current;
|
|
@@ -8,8 +8,8 @@ function fixInconsistentChanges(changeSet, currentUserID, newTr, schema) {
|
|
|
8
8
|
const iteratedIds = new Set();
|
|
9
9
|
let changed = false;
|
|
10
10
|
changeSet.invalidChanges.forEach((c) => {
|
|
11
|
-
const { id, authorID, operation, reviewedByID, status, createdAt, updatedAt } = c.dataTracked;
|
|
12
|
-
const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: (0, uuidv4_1.uuidv4)() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: change_1.CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() }));
|
|
11
|
+
const { id, authorID, operation, reviewedByID, status, createdAt, statusUpdateAt, updatedAt } = c.dataTracked;
|
|
12
|
+
const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: (0, uuidv4_1.uuidv4)() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: change_1.CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() })), (!statusUpdateAt && { statusUpdateAt: 0 }));
|
|
13
13
|
if (Object.keys(newAttrs).length > 0) {
|
|
14
14
|
(0, updateChangeAttrs_1.updateChangeAttrs)(newTr, c, Object.assign(Object.assign({}, c.dataTracked), newAttrs), schema);
|
|
15
15
|
changed = true;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.updateChangeChildrenAttributes = exports.updateChangeAttrs = void 0;
|
|
4
|
-
const logger_1 = require("../utils/logger");
|
|
5
4
|
const ChangeSet_1 = require("../ChangeSet");
|
|
6
5
|
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
7
|
function updateChangeAttrs(tr, change, trackedAttrs, schema) {
|
|
8
8
|
const node = tr.doc.nodeAt(change.from);
|
|
9
9
|
if (!node) {
|
|
@@ -18,9 +18,7 @@ function getTextNodeTrackedMarkData(node, schema) {
|
|
|
18
18
|
const marksTrackedData = [];
|
|
19
19
|
node.marks.forEach((mark) => {
|
|
20
20
|
if (mark.type === schema.marks.tracked_insert || mark.type === schema.marks.tracked_delete) {
|
|
21
|
-
const operation = mark.type === schema.marks.tracked_insert
|
|
22
|
-
? change_1.CHANGE_OPERATION.insert
|
|
23
|
-
: change_1.CHANGE_OPERATION.delete;
|
|
21
|
+
const operation = mark.type === schema.marks.tracked_insert ? change_1.CHANGE_OPERATION.insert : change_1.CHANGE_OPERATION.delete;
|
|
24
22
|
marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
|
|
25
23
|
}
|
|
26
24
|
});
|
|
@@ -65,9 +63,7 @@ function shouldMergeTrackedAttributes(left, right) {
|
|
|
65
63
|
});
|
|
66
64
|
return false;
|
|
67
65
|
}
|
|
68
|
-
return (left.status === right.status &&
|
|
69
|
-
left.operation === right.operation &&
|
|
70
|
-
left.authorID === right.authorID);
|
|
66
|
+
return (left.status === right.status && left.operation === right.operation && left.authorID === right.authorID);
|
|
71
67
|
}
|
|
72
68
|
exports.shouldMergeTrackedAttributes = shouldMergeTrackedAttributes;
|
|
73
69
|
function getMergeableMarkTrackedAttrs(node, attrs, schema) {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setFragmentAsInserted = void 0;
|
|
4
4
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
5
|
-
const logger_1 = require("../utils/logger");
|
|
6
5
|
const change_1 = require("../types/change");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
7
|
const nodeHelpers_1 = require("./nodeHelpers");
|
|
8
8
|
function markInlineNodeChange(node, newTrackAttrs, schema) {
|
|
9
9
|
const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
|
|
@@ -32,9 +32,7 @@ function splitSliceIntoMergedParts(insertSlice, mergeEqualSides = false) {
|
|
|
32
32
|
const { openStart, openEnd, content: { firstChild, lastChild, content: nodes }, } = insertSlice;
|
|
33
33
|
let updatedSliceNodes = nodes;
|
|
34
34
|
const mergeSides = openStart !== openEnd || mergeEqualSides;
|
|
35
|
-
const firstMergedNode = openStart > 0 && mergeSides && firstChild
|
|
36
|
-
? getMergedNode(firstChild, 1, openStart, true)
|
|
37
|
-
: undefined;
|
|
35
|
+
const firstMergedNode = openStart > 0 && mergeSides && firstChild ? getMergedNode(firstChild, 1, openStart, true) : undefined;
|
|
38
36
|
const lastMergedNode = openEnd > 0 && mergeSides && lastChild ? getMergedNode(lastChild, 1, openEnd, false) : undefined;
|
|
39
37
|
if (firstMergedNode) {
|
|
40
38
|
updatedSliceNodes = updatedSliceNodes.slice(1);
|
|
@@ -25,8 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.deleteAndMergeSplitNodes = void 0;
|
|
27
27
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
28
|
-
const splitSliceIntoMergedParts_1 = require("../compute/splitSliceIntoMergedParts");
|
|
29
28
|
const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
|
|
29
|
+
const splitSliceIntoMergedParts_1 = require("../compute/splitSliceIntoMergedParts");
|
|
30
30
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
31
31
|
function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackAttrs, insertSlice) {
|
|
32
32
|
const steps = [];
|
|
@@ -42,16 +42,12 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
|
|
|
42
42
|
let mergingStartSide = true;
|
|
43
43
|
startDoc.nodesBetween(from, to, (node, pos) => {
|
|
44
44
|
const nodeEnd = pos + node.nodeSize;
|
|
45
|
-
const wasWithinGap = gap &&
|
|
46
|
-
((!node.isText && pos >= gap.start) ||
|
|
47
|
-
(node.isText && pos >= gap.start && nodeEnd <= gap.end));
|
|
45
|
+
const wasWithinGap = gap && ((!node.isText && pos >= gap.start) || (node.isText && pos >= gap.start && nodeEnd <= gap.end));
|
|
48
46
|
if (nodeEnd > from && !wasWithinGap) {
|
|
49
47
|
const nodeCompletelyDeleted = pos >= from && nodeEnd <= to;
|
|
50
48
|
const endTokenDeleted = nodeEnd <= to;
|
|
51
49
|
const startTokenDeleted = pos >= from;
|
|
52
|
-
if (node.isText ||
|
|
53
|
-
(!endTokenDeleted && startTokenDeleted) ||
|
|
54
|
-
(endTokenDeleted && !startTokenDeleted)) {
|
|
50
|
+
if (node.isText || (!endTokenDeleted && startTokenDeleted) || (endTokenDeleted && !startTokenDeleted)) {
|
|
55
51
|
if (!endTokenDeleted && startTokenDeleted) {
|
|
56
52
|
mergingStartSide = false;
|
|
57
53
|
}
|
|
@@ -96,9 +92,7 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
|
|
|
96
92
|
});
|
|
97
93
|
return {
|
|
98
94
|
sliceWasSplit: !!(firstMergedNode || lastMergedNode),
|
|
99
|
-
newSliceContent: updatedSliceNodes
|
|
100
|
-
? prosemirror_model_1.Fragment.fromArray(updatedSliceNodes)
|
|
101
|
-
: insertSlice.content,
|
|
95
|
+
newSliceContent: updatedSliceNodes ? prosemirror_model_1.Fragment.fromArray(updatedSliceNodes) : insertSlice.content,
|
|
102
96
|
steps,
|
|
103
97
|
};
|
|
104
98
|
}
|
|
@@ -2,18 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.deleteOrSetNodeDeleted = exports.deleteNode = void 0;
|
|
4
4
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
5
|
-
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
6
|
-
const logger_1 = require("../utils/logger");
|
|
7
|
-
const change_1 = require("../types/change");
|
|
8
5
|
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
6
|
+
const change_1 = require("../types/change");
|
|
7
|
+
const logger_1 = require("../utils/logger");
|
|
9
8
|
function deleteNode(node, pos, tr) {
|
|
10
9
|
var _a;
|
|
11
10
|
const startPos = tr.doc.resolve(pos + 1);
|
|
12
|
-
const range = startPos.blockRange(tr.doc.resolve(startPos.pos - 2 + node.nodeSize));
|
|
13
|
-
const targetDepth = range && (0, prosemirror_transform_1.liftTarget)(range);
|
|
14
|
-
if (range && typeof targetDepth === 'number') {
|
|
15
|
-
return tr.lift(range, targetDepth);
|
|
16
|
-
}
|
|
17
11
|
const resPos = tr.doc.resolve(pos);
|
|
18
12
|
const canMergeToNodeAbove = resPos.parent !== tr.doc && resPos.nodeBefore && node.isBlock && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.isText);
|
|
19
13
|
if (canMergeToNodeAbove) {
|
|
@@ -26,14 +20,18 @@ function deleteNode(node, pos, tr) {
|
|
|
26
20
|
exports.deleteNode = deleteNode;
|
|
27
21
|
function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
|
|
28
22
|
const dataTracked = (0, nodeHelpers_1.getBlockInlineTrackedData)(node);
|
|
29
|
-
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert);
|
|
23
|
+
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert && d.status === change_1.CHANGE_STATUS.pending);
|
|
30
24
|
const deleted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.delete);
|
|
31
25
|
const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.set_node_attributes);
|
|
32
26
|
if (inserted && inserted.authorID === deleteAttrs.authorID) {
|
|
33
27
|
return deleteNode(node, pos, newTr);
|
|
34
28
|
}
|
|
35
29
|
if (!newTr.doc.nodeAt(pos)) {
|
|
36
|
-
logger_1.log.error(`deleteOrSetNodeDeleted: no node found for deletion`, {
|
|
30
|
+
logger_1.log.error(`deleteOrSetNodeDeleted: no node found for deletion`, {
|
|
31
|
+
pos,
|
|
32
|
+
node,
|
|
33
|
+
newTr,
|
|
34
|
+
});
|
|
37
35
|
return;
|
|
38
36
|
}
|
|
39
37
|
const newDeleted = deleted
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -14,14 +14,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.trackChangesPlugin = exports.trackChangesPluginKey = void 0;
|
|
15
15
|
const prosemirror_state_1 = require("prosemirror-state");
|
|
16
16
|
const actions_1 = require("./actions");
|
|
17
|
-
const ChangeSet_1 = require("./ChangeSet");
|
|
18
|
-
const logger_1 = require("./utils/logger");
|
|
19
17
|
const applyChanges_1 = require("./changes/applyChanges");
|
|
20
18
|
const findChanges_1 = require("./changes/findChanges");
|
|
21
19
|
const fixInconsistentChanges_1 = require("./changes/fixInconsistentChanges");
|
|
22
|
-
const trackTransaction_1 = require("./steps/trackTransaction");
|
|
23
20
|
const updateChangeAttrs_1 = require("./changes/updateChangeAttrs");
|
|
21
|
+
const ChangeSet_1 = require("./ChangeSet");
|
|
22
|
+
const trackTransaction_1 = require("./steps/trackTransaction");
|
|
24
23
|
const track_1 = require("./types/track");
|
|
24
|
+
const logger_1 = require("./utils/logger");
|
|
25
25
|
exports.trackChangesPluginKey = new prosemirror_state_1.PluginKey('track-changes');
|
|
26
26
|
const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
|
|
27
27
|
const { userID, debug, skipTrsWithMetas = [] } = opts;
|
|
@@ -82,18 +82,24 @@ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
|
|
|
82
82
|
trs.forEach((tr) => {
|
|
83
83
|
const wasAppended = tr.getMeta('appendedTransaction');
|
|
84
84
|
const skipMetaUsed = skipTrsWithMetas.some((m) => tr.getMeta(m) || (wasAppended === null || wasAppended === void 0 ? void 0 : wasAppended.getMeta(m)));
|
|
85
|
-
const skipTrackUsed = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.skipTrack) ||
|
|
86
|
-
|
|
85
|
+
const skipTrackUsed = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.skipTrack) ||
|
|
86
|
+
(wasAppended && (0, actions_1.getAction)(wasAppended, actions_1.TrackChangesAction.skipTrack));
|
|
87
|
+
if (tr.docChanged &&
|
|
88
|
+
!skipMetaUsed &&
|
|
89
|
+
!skipTrackUsed &&
|
|
90
|
+
!tr.getMeta('history$') &&
|
|
91
|
+
!(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
|
|
87
92
|
createdTr = (0, trackTransaction_1.trackTransaction)(tr, oldState, createdTr, userID);
|
|
88
93
|
}
|
|
89
94
|
docChanged = docChanged || tr.docChanged;
|
|
90
95
|
const setChangeStatuses = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.setChangeStatuses);
|
|
91
96
|
if (setChangeStatuses) {
|
|
92
97
|
const { status, ids } = setChangeStatuses;
|
|
98
|
+
const changeTime = new Date().getTime();
|
|
93
99
|
ids.forEach((changeId) => {
|
|
94
100
|
const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
|
|
95
101
|
if (change) {
|
|
96
|
-
createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, reviewedByID: userID }), oldState.schema);
|
|
102
|
+
createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
|
|
97
103
|
}
|
|
98
104
|
});
|
|
99
105
|
}
|
|
@@ -103,7 +109,8 @@ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
|
|
|
103
109
|
(0, actions_1.setAction)(createdTr, actions_1.TrackChangesAction.refreshChanges, true);
|
|
104
110
|
}
|
|
105
111
|
});
|
|
106
|
-
const changed = pluginState.changeSet.hasInconsistentData &&
|
|
112
|
+
const changed = pluginState.changeSet.hasInconsistentData &&
|
|
113
|
+
(0, fixInconsistentChanges_1.fixInconsistentChanges)(pluginState.changeSet, userID, createdTr, oldState.schema);
|
|
107
114
|
if (changed) {
|
|
108
115
|
logger_1.log.warn('had to fix inconsistent changes in', createdTr);
|
|
109
116
|
}
|
|
@@ -25,11 +25,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.trackReplaceAroundStep = void 0;
|
|
27
27
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
28
|
-
const
|
|
28
|
+
const actions_1 = require("../actions");
|
|
29
29
|
const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
|
|
30
|
+
const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
|
|
30
31
|
const logger_1 = require("../utils/logger");
|
|
31
32
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
32
|
-
const actions_1 = require("../actions");
|
|
33
33
|
function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
|
|
34
34
|
logger_1.log.info('###### ReplaceAroundStep ######');
|
|
35
35
|
const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
|
|
@@ -25,8 +25,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.trackReplaceStep = void 0;
|
|
27
27
|
const prosemirror_model_1 = require("prosemirror-model");
|
|
28
|
-
const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
|
|
29
28
|
const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
|
|
29
|
+
const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
|
|
30
30
|
const logger_1 = require("../utils/logger");
|
|
31
31
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
32
32
|
function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc) {
|
|
@@ -71,7 +71,9 @@ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepD
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
|
-
|
|
74
|
+
const isDeleteEvent = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete';
|
|
75
|
+
const isDeleteContentForward = ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward';
|
|
76
|
+
selectionPos = isDeleteEvent || isDeleteContentForward ? toA : fromA;
|
|
75
77
|
}
|
|
76
78
|
});
|
|
77
79
|
return [changeSteps, selectionPos];
|
|
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.trackTransaction = void 0;
|
|
4
4
|
const prosemirror_state_1 = require("prosemirror-state");
|
|
5
5
|
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
6
|
-
const
|
|
6
|
+
const diffChangeSteps_1 = require("../change-steps/diffChangeSteps");
|
|
7
|
+
const processChangeSteps_1 = require("../change-steps/processChangeSteps");
|
|
7
8
|
const change_1 = require("../types/change");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
8
10
|
const trackReplaceAroundStep_1 = require("./trackReplaceAroundStep");
|
|
9
11
|
const trackReplaceStep_1 = require("./trackReplaceStep");
|
|
10
|
-
const processChangeSteps_1 = require("../change-steps/processChangeSteps");
|
|
11
|
-
const diffChangeSteps_1 = require("../change-steps/diffChangeSteps");
|
|
12
12
|
const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
|
|
13
13
|
const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
|
|
14
14
|
function trackTransaction(tr, oldState, newTr, authorID) {
|
|
@@ -18,6 +18,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
18
18
|
reviewedByID: null,
|
|
19
19
|
createdAt: tr.time,
|
|
20
20
|
updatedAt: tr.time,
|
|
21
|
+
statusUpdateAt: 0,
|
|
21
22
|
status: change_1.CHANGE_STATUS.pending,
|
|
22
23
|
};
|
|
23
24
|
const wasNodeSelection = tr.selection instanceof prosemirror_state_1.NodeSelection;
|
|
@@ -39,8 +40,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
39
40
|
}
|
|
40
41
|
else if (step instanceof prosemirror_transform_1.ReplaceStep) {
|
|
41
42
|
const { slice } = step;
|
|
42
|
-
if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 &&
|
|
43
|
-
isHighlightMarkerNode(slice.content.content[0])) {
|
|
43
|
+
if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 && isHighlightMarkerNode(slice.content.content[0])) {
|
|
44
44
|
continue;
|
|
45
45
|
}
|
|
46
46
|
const newStep = step.invert(tr.docs[i]);
|
package/dist/es/ChangeSet.js
CHANGED
|
@@ -33,14 +33,15 @@ export class ChangeSet {
|
|
|
33
33
|
const rootNodes = [];
|
|
34
34
|
let currentNodeChange;
|
|
35
35
|
this.changes.forEach((c) => {
|
|
36
|
-
if (currentNodeChange &&
|
|
36
|
+
if (currentNodeChange &&
|
|
37
|
+
(c.from >= currentNodeChange.to ||
|
|
38
|
+
c.dataTracked.statusUpdateAt !== currentNodeChange.dataTracked.statusUpdateAt)) {
|
|
37
39
|
rootNodes.push(currentNodeChange);
|
|
38
40
|
currentNodeChange = undefined;
|
|
39
41
|
}
|
|
40
42
|
if (currentNodeChange &&
|
|
41
43
|
c.from < currentNodeChange.to &&
|
|
42
|
-
!(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) &&
|
|
43
|
-
__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
|
|
44
|
+
!(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) && __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
|
|
44
45
|
currentNodeChange.children.push(c);
|
|
45
46
|
}
|
|
46
47
|
else if (c.type === 'node-change') {
|
|
@@ -98,15 +99,13 @@ export class ChangeSet {
|
|
|
98
99
|
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id);
|
|
99
100
|
}
|
|
100
101
|
getIn(ids) {
|
|
101
|
-
return ids
|
|
102
|
-
.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id))
|
|
103
|
-
.filter((c) => c !== undefined);
|
|
102
|
+
return ids.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id)).filter((c) => c !== undefined);
|
|
104
103
|
}
|
|
105
104
|
getNotIn(ids) {
|
|
106
105
|
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => ids.includes(c.id));
|
|
107
106
|
}
|
|
108
107
|
static flattenTreeToIds(changes) {
|
|
109
|
-
return changes.flatMap((c) => this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id);
|
|
108
|
+
return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
|
|
110
109
|
}
|
|
111
110
|
static shouldDeleteChange(change) {
|
|
112
111
|
const { status, operation } = change.dataTracked;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment, Slice } from 'prosemirror-model';
|
|
2
|
-
import { matchInserted } from './matchInserted';
|
|
3
2
|
import { log } from '../utils/logger';
|
|
3
|
+
import { matchInserted } from './matchInserted';
|
|
4
4
|
function cutFragment(matched, deleted, content) {
|
|
5
5
|
const newContent = [];
|
|
6
6
|
for (let i = 0; matched <= deleted && i < content.childCount; i += 1) {
|
|
@@ -10,12 +10,12 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
12
|
import { Mapping, ReplaceStep } from 'prosemirror-transform';
|
|
13
|
-
import {
|
|
14
|
-
import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
|
|
13
|
+
import { addTrackIdIfDoesntExist, getBlockInlineTrackedData } from '../compute/nodeHelpers';
|
|
15
14
|
import { deleteOrSetNodeDeleted } from '../mutate/deleteNode';
|
|
16
15
|
import { deleteTextIfInserted } from '../mutate/deleteText';
|
|
17
16
|
import { mergeTrackedMarks } from '../mutate/mergeTrackedMarks';
|
|
18
|
-
import {
|
|
17
|
+
import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
|
|
18
|
+
import { log } from '../utils/logger';
|
|
19
19
|
import * as trackUtils from '../utils/track-utils';
|
|
20
20
|
export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
21
21
|
const mapping = new Mapping();
|
|
@@ -26,13 +26,14 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
|
|
|
26
26
|
changes.forEach((c) => {
|
|
27
27
|
let step = newTr.steps[newTr.steps.length - 1];
|
|
28
28
|
switch (c.type) {
|
|
29
|
-
case
|
|
29
|
+
case 'delete-node':
|
|
30
30
|
deletesCounter++;
|
|
31
31
|
const trackedData = getBlockInlineTrackedData(c.node);
|
|
32
32
|
const inserted = trackedData === null || trackedData === void 0 ? void 0 : trackedData.find((d) => d.operation === CHANGE_OPERATION.insert);
|
|
33
33
|
isInserted = !!inserted || (!trackedData && isInserted);
|
|
34
|
-
if (isInserted && deletesCounter > 1)
|
|
34
|
+
if (isInserted && deletesCounter > 1) {
|
|
35
35
|
return false;
|
|
36
|
+
}
|
|
36
37
|
deleteOrSetNodeDeleted(c.node, mapping.map(c.pos), newTr, deleteAttrs);
|
|
37
38
|
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
38
39
|
if (step !== newestStep) {
|
|
@@ -41,7 +42,7 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
|
|
|
41
42
|
}
|
|
42
43
|
mergeTrackedMarks(mapping.map(c.pos), newTr.doc, newTr, schema);
|
|
43
44
|
break;
|
|
44
|
-
case
|
|
45
|
+
case 'delete-text':
|
|
45
46
|
const node = newTr.doc.nodeAt(mapping.map(c.pos));
|
|
46
47
|
if (!node) {
|
|
47
48
|
log.error(`processChangeSteps: no text node found for text-change`, c);
|
|
@@ -11,15 +11,16 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { Mapping } from 'prosemirror-transform';
|
|
13
13
|
import { ChangeSet } from '../ChangeSet';
|
|
14
|
-
import { CHANGE_STATUS } from '../types/change';
|
|
15
|
-
import { log } from '../utils/logger';
|
|
16
14
|
import { deleteNode } from '../mutate/deleteNode';
|
|
17
15
|
import { mergeNode } from '../mutate/mergeNode';
|
|
16
|
+
import { CHANGE_STATUS } from '../types/change';
|
|
17
|
+
import { log } from '../utils/logger';
|
|
18
18
|
import { updateChangeChildrenAttributes } from './updateChangeAttrs';
|
|
19
19
|
function getUpdatedDataTracked(dataTracked, changeId) {
|
|
20
20
|
if (!dataTracked) {
|
|
21
21
|
return null;
|
|
22
22
|
}
|
|
23
|
+
console.log(dataTracked);
|
|
23
24
|
const newDataTracked = dataTracked.filter((c) => c.id !== changeId);
|
|
24
25
|
return newDataTracked.length ? newDataTracked : null;
|
|
25
26
|
}
|
|
@@ -39,7 +40,9 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = ne
|
|
|
39
40
|
if (ChangeSet.isNodeAttrChange(change)) {
|
|
40
41
|
const _a = change.newAttrs, { dataTracked } = _a, attrs = __rest(_a, ["dataTracked"]);
|
|
41
42
|
const changeLog = attrsChangesLog.get(node.attrs.id);
|
|
42
|
-
const newDataTracked = changeLog && changeLog.length
|
|
43
|
+
const newDataTracked = changeLog && changeLog.length
|
|
44
|
+
? dataTracked.filter((c) => !changeLog.includes(c.id))
|
|
45
|
+
: dataTracked;
|
|
43
46
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: newDataTracked.length ? newDataTracked : null }), node.marks);
|
|
44
47
|
}
|
|
45
48
|
return;
|
|
@@ -69,6 +72,7 @@ export function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = ne
|
|
|
69
72
|
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
70
73
|
}
|
|
71
74
|
else if (ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === CHANGE_STATUS.rejected) {
|
|
75
|
+
console.log('GETTING IN ---- CHANGE_STATUS.rejected');
|
|
72
76
|
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
73
77
|
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
74
78
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChangeSet } from '../ChangeSet';
|
|
2
|
+
import { equalMarks, getNodeTrackedData } from '../compute/nodeHelpers';
|
|
2
3
|
import { CHANGE_OPERATION, } from '../types/change';
|
|
3
|
-
import { getNodeTrackedData, equalMarks } from '../compute/nodeHelpers';
|
|
4
4
|
export function findChanges(state) {
|
|
5
5
|
const changes = [];
|
|
6
6
|
let current;
|
|
@@ -5,8 +5,8 @@ export function fixInconsistentChanges(changeSet, currentUserID, newTr, schema)
|
|
|
5
5
|
const iteratedIds = new Set();
|
|
6
6
|
let changed = false;
|
|
7
7
|
changeSet.invalidChanges.forEach((c) => {
|
|
8
|
-
const { id, authorID, operation, reviewedByID, status, createdAt, updatedAt } = c.dataTracked;
|
|
9
|
-
const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: uuidv4() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() }));
|
|
8
|
+
const { id, authorID, operation, reviewedByID, status, createdAt, statusUpdateAt, updatedAt } = c.dataTracked;
|
|
9
|
+
const newAttrs = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ((!id || iteratedIds.has(id) || id.length === 0) && { id: uuidv4() })), (!authorID && { authorID: currentUserID })), (!reviewedByID && { reviewedByID: null })), (!status && { status: CHANGE_STATUS.pending })), (!createdAt && { createdAt: Date.now() })), (!updatedAt && { updatedAt: Date.now() })), (!statusUpdateAt && { statusUpdateAt: 0 }));
|
|
10
10
|
if (Object.keys(newAttrs).length > 0) {
|
|
11
11
|
updateChangeAttrs(newTr, c, Object.assign(Object.assign({}, c.dataTracked), newAttrs), schema);
|
|
12
12
|
changed = true;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { log } from '../utils/logger';
|
|
2
1
|
import { ChangeSet } from '../ChangeSet';
|
|
3
|
-
import { getTextNodeTrackedMarkData,
|
|
2
|
+
import { getBlockInlineTrackedData, getTextNodeTrackedMarkData, } from '../compute/nodeHelpers';
|
|
3
|
+
import { log } from '../utils/logger';
|
|
4
4
|
export function updateChangeAttrs(tr, change, trackedAttrs, schema) {
|
|
5
5
|
const node = tr.doc.nodeAt(change.from);
|
|
6
6
|
if (!node) {
|
|
@@ -14,9 +14,7 @@ export function getTextNodeTrackedMarkData(node, schema) {
|
|
|
14
14
|
const marksTrackedData = [];
|
|
15
15
|
node.marks.forEach((mark) => {
|
|
16
16
|
if (mark.type === schema.marks.tracked_insert || mark.type === schema.marks.tracked_delete) {
|
|
17
|
-
const operation = mark.type === schema.marks.tracked_insert
|
|
18
|
-
? CHANGE_OPERATION.insert
|
|
19
|
-
: CHANGE_OPERATION.delete;
|
|
17
|
+
const operation = mark.type === schema.marks.tracked_insert ? CHANGE_OPERATION.insert : CHANGE_OPERATION.delete;
|
|
20
18
|
marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
|
|
21
19
|
}
|
|
22
20
|
});
|
|
@@ -57,9 +55,7 @@ export function shouldMergeTrackedAttributes(left, right) {
|
|
|
57
55
|
});
|
|
58
56
|
return false;
|
|
59
57
|
}
|
|
60
|
-
return (left.status === right.status &&
|
|
61
|
-
left.operation === right.operation &&
|
|
62
|
-
left.authorID === right.authorID);
|
|
58
|
+
return (left.status === right.status && left.operation === right.operation && left.authorID === right.authorID);
|
|
63
59
|
}
|
|
64
60
|
export function getMergeableMarkTrackedAttrs(node, attrs, schema) {
|
|
65
61
|
const nodeAttrs = getTextNodeTrackedMarkData(node, schema);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment } from 'prosemirror-model';
|
|
2
|
-
import { log } from '../utils/logger';
|
|
3
2
|
import { CHANGE_OPERATION } from '../types/change';
|
|
3
|
+
import { log } from '../utils/logger';
|
|
4
4
|
import { addTrackIdIfDoesntExist, equalMarks, getTextNodeTrackedMarkData } from './nodeHelpers';
|
|
5
5
|
function markInlineNodeChange(node, newTrackAttrs, schema) {
|
|
6
6
|
const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
|
|
@@ -29,9 +29,7 @@ export function splitSliceIntoMergedParts(insertSlice, mergeEqualSides = false)
|
|
|
29
29
|
const { openStart, openEnd, content: { firstChild, lastChild, content: nodes }, } = insertSlice;
|
|
30
30
|
let updatedSliceNodes = nodes;
|
|
31
31
|
const mergeSides = openStart !== openEnd || mergeEqualSides;
|
|
32
|
-
const firstMergedNode = openStart > 0 && mergeSides && firstChild
|
|
33
|
-
? getMergedNode(firstChild, 1, openStart, true)
|
|
34
|
-
: undefined;
|
|
32
|
+
const firstMergedNode = openStart > 0 && mergeSides && firstChild ? getMergedNode(firstChild, 1, openStart, true) : undefined;
|
|
35
33
|
const lastMergedNode = openEnd > 0 && mergeSides && lastChild ? getMergedNode(lastChild, 1, openEnd, false) : undefined;
|
|
36
34
|
if (firstMergedNode) {
|
|
37
35
|
updatedSliceNodes = updatedSliceNodes.slice(1);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment } from 'prosemirror-model';
|
|
2
|
-
import { splitSliceIntoMergedParts } from '../compute/splitSliceIntoMergedParts';
|
|
3
2
|
import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
|
|
3
|
+
import { splitSliceIntoMergedParts } from '../compute/splitSliceIntoMergedParts';
|
|
4
4
|
import * as trackUtils from '../utils/track-utils';
|
|
5
5
|
export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackAttrs, insertSlice) {
|
|
6
6
|
const steps = [];
|
|
@@ -16,16 +16,12 @@ export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema,
|
|
|
16
16
|
let mergingStartSide = true;
|
|
17
17
|
startDoc.nodesBetween(from, to, (node, pos) => {
|
|
18
18
|
const nodeEnd = pos + node.nodeSize;
|
|
19
|
-
const wasWithinGap = gap &&
|
|
20
|
-
((!node.isText && pos >= gap.start) ||
|
|
21
|
-
(node.isText && pos >= gap.start && nodeEnd <= gap.end));
|
|
19
|
+
const wasWithinGap = gap && ((!node.isText && pos >= gap.start) || (node.isText && pos >= gap.start && nodeEnd <= gap.end));
|
|
22
20
|
if (nodeEnd > from && !wasWithinGap) {
|
|
23
21
|
const nodeCompletelyDeleted = pos >= from && nodeEnd <= to;
|
|
24
22
|
const endTokenDeleted = nodeEnd <= to;
|
|
25
23
|
const startTokenDeleted = pos >= from;
|
|
26
|
-
if (node.isText ||
|
|
27
|
-
(!endTokenDeleted && startTokenDeleted) ||
|
|
28
|
-
(endTokenDeleted && !startTokenDeleted)) {
|
|
24
|
+
if (node.isText || (!endTokenDeleted && startTokenDeleted) || (endTokenDeleted && !startTokenDeleted)) {
|
|
29
25
|
if (!endTokenDeleted && startTokenDeleted) {
|
|
30
26
|
mergingStartSide = false;
|
|
31
27
|
}
|
|
@@ -70,9 +66,7 @@ export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema,
|
|
|
70
66
|
});
|
|
71
67
|
return {
|
|
72
68
|
sliceWasSplit: !!(firstMergedNode || lastMergedNode),
|
|
73
|
-
newSliceContent: updatedSliceNodes
|
|
74
|
-
? Fragment.fromArray(updatedSliceNodes)
|
|
75
|
-
: insertSlice.content,
|
|
69
|
+
newSliceContent: updatedSliceNodes ? Fragment.fromArray(updatedSliceNodes) : insertSlice.content,
|
|
76
70
|
steps,
|
|
77
71
|
};
|
|
78
72
|
}
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import { Fragment } from 'prosemirror-model';
|
|
2
|
-
import { liftTarget } from 'prosemirror-transform';
|
|
3
|
-
import { log } from '../utils/logger';
|
|
4
|
-
import { CHANGE_OPERATION } from '../types/change';
|
|
5
2
|
import { addTrackIdIfDoesntExist, getBlockInlineTrackedData } from '../compute/nodeHelpers';
|
|
3
|
+
import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
|
|
4
|
+
import { log } from '../utils/logger';
|
|
6
5
|
export function deleteNode(node, pos, tr) {
|
|
7
6
|
var _a;
|
|
8
7
|
const startPos = tr.doc.resolve(pos + 1);
|
|
9
|
-
const range = startPos.blockRange(tr.doc.resolve(startPos.pos - 2 + node.nodeSize));
|
|
10
|
-
const targetDepth = range && liftTarget(range);
|
|
11
|
-
if (range && typeof targetDepth === 'number') {
|
|
12
|
-
return tr.lift(range, targetDepth);
|
|
13
|
-
}
|
|
14
8
|
const resPos = tr.doc.resolve(pos);
|
|
15
9
|
const canMergeToNodeAbove = resPos.parent !== tr.doc && resPos.nodeBefore && node.isBlock && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.isText);
|
|
16
10
|
if (canMergeToNodeAbove) {
|
|
@@ -22,14 +16,18 @@ export function deleteNode(node, pos, tr) {
|
|
|
22
16
|
}
|
|
23
17
|
export function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
|
|
24
18
|
const dataTracked = getBlockInlineTrackedData(node);
|
|
25
|
-
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.insert);
|
|
19
|
+
const inserted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.insert && d.status === CHANGE_STATUS.pending);
|
|
26
20
|
const deleted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.delete);
|
|
27
21
|
const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === CHANGE_OPERATION.set_node_attributes);
|
|
28
22
|
if (inserted && inserted.authorID === deleteAttrs.authorID) {
|
|
29
23
|
return deleteNode(node, pos, newTr);
|
|
30
24
|
}
|
|
31
25
|
if (!newTr.doc.nodeAt(pos)) {
|
|
32
|
-
log.error(`deleteOrSetNodeDeleted: no node found for deletion`, {
|
|
26
|
+
log.error(`deleteOrSetNodeDeleted: no node found for deletion`, {
|
|
27
|
+
pos,
|
|
28
|
+
node,
|
|
29
|
+
newTr,
|
|
30
|
+
});
|
|
33
31
|
return;
|
|
34
32
|
}
|
|
35
33
|
const newDeleted = deleted
|
package/dist/es/plugin.js
CHANGED
|
@@ -11,14 +11,14 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { Plugin, PluginKey } from 'prosemirror-state';
|
|
13
13
|
import { getAction, setAction, TrackChangesAction } from './actions';
|
|
14
|
-
import { ChangeSet } from './ChangeSet';
|
|
15
|
-
import { log, enableDebug } from './utils/logger';
|
|
16
14
|
import { applyAcceptedRejectedChanges } from './changes/applyChanges';
|
|
17
15
|
import { findChanges } from './changes/findChanges';
|
|
18
16
|
import { fixInconsistentChanges } from './changes/fixInconsistentChanges';
|
|
19
|
-
import { trackTransaction } from './steps/trackTransaction';
|
|
20
17
|
import { updateChangeAttrs } from './changes/updateChangeAttrs';
|
|
18
|
+
import { ChangeSet } from './ChangeSet';
|
|
19
|
+
import { trackTransaction } from './steps/trackTransaction';
|
|
21
20
|
import { TrackChangesStatus } from './types/track';
|
|
21
|
+
import { enableDebug, log } from './utils/logger';
|
|
22
22
|
export const trackChangesPluginKey = new PluginKey('track-changes');
|
|
23
23
|
export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
|
|
24
24
|
const { userID, debug, skipTrsWithMetas = [] } = opts;
|
|
@@ -79,18 +79,24 @@ export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) =>
|
|
|
79
79
|
trs.forEach((tr) => {
|
|
80
80
|
const wasAppended = tr.getMeta('appendedTransaction');
|
|
81
81
|
const skipMetaUsed = skipTrsWithMetas.some((m) => tr.getMeta(m) || (wasAppended === null || wasAppended === void 0 ? void 0 : wasAppended.getMeta(m)));
|
|
82
|
-
const skipTrackUsed = getAction(tr, TrackChangesAction.skipTrack) ||
|
|
83
|
-
|
|
82
|
+
const skipTrackUsed = getAction(tr, TrackChangesAction.skipTrack) ||
|
|
83
|
+
(wasAppended && getAction(wasAppended, TrackChangesAction.skipTrack));
|
|
84
|
+
if (tr.docChanged &&
|
|
85
|
+
!skipMetaUsed &&
|
|
86
|
+
!skipTrackUsed &&
|
|
87
|
+
!tr.getMeta('history$') &&
|
|
88
|
+
!(wasAppended && tr.getMeta('origin') === 'paragraphs')) {
|
|
84
89
|
createdTr = trackTransaction(tr, oldState, createdTr, userID);
|
|
85
90
|
}
|
|
86
91
|
docChanged = docChanged || tr.docChanged;
|
|
87
92
|
const setChangeStatuses = getAction(tr, TrackChangesAction.setChangeStatuses);
|
|
88
93
|
if (setChangeStatuses) {
|
|
89
94
|
const { status, ids } = setChangeStatuses;
|
|
95
|
+
const changeTime = new Date().getTime();
|
|
90
96
|
ids.forEach((changeId) => {
|
|
91
97
|
const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
|
|
92
98
|
if (change) {
|
|
93
|
-
createdTr = updateChangeAttrs(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, reviewedByID: userID }), oldState.schema);
|
|
99
|
+
createdTr = updateChangeAttrs(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
|
|
94
100
|
}
|
|
95
101
|
});
|
|
96
102
|
}
|
|
@@ -100,7 +106,8 @@ export const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) =>
|
|
|
100
106
|
setAction(createdTr, TrackChangesAction.refreshChanges, true);
|
|
101
107
|
}
|
|
102
108
|
});
|
|
103
|
-
const changed = pluginState.changeSet.hasInconsistentData &&
|
|
109
|
+
const changed = pluginState.changeSet.hasInconsistentData &&
|
|
110
|
+
fixInconsistentChanges(pluginState.changeSet, userID, createdTr, oldState.schema);
|
|
104
111
|
if (changed) {
|
|
105
112
|
log.warn('had to fix inconsistent changes in', createdTr);
|
|
106
113
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Slice } from 'prosemirror-model';
|
|
2
|
-
import {
|
|
2
|
+
import { TrackChangesAction } from '../actions';
|
|
3
3
|
import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
|
|
4
|
+
import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
|
|
4
5
|
import { log } from '../utils/logger';
|
|
5
6
|
import * as trackUtils from '../utils/track-utils';
|
|
6
|
-
import { TrackChangesAction } from '../actions';
|
|
7
7
|
export function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
|
|
8
8
|
log.info('###### ReplaceAroundStep ######');
|
|
9
9
|
const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Slice } from 'prosemirror-model';
|
|
2
|
-
import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
|
|
3
2
|
import { setFragmentAsInserted } from '../compute/setFragmentAsInserted';
|
|
3
|
+
import { deleteAndMergeSplitNodes } from '../mutate/deleteAndMergeSplitNodes';
|
|
4
4
|
import { log } from '../utils/logger';
|
|
5
5
|
import * as trackUtils from '../utils/track-utils';
|
|
6
6
|
export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc) {
|
|
@@ -45,7 +45,9 @@ export function trackReplaceStep(step, oldState, newTr, attrs, stepResult, curre
|
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
|
-
|
|
48
|
+
const isDeleteEvent = ((_a = window.event) === null || _a === void 0 ? void 0 : _a.code) === 'Delete';
|
|
49
|
+
const isDeleteContentForward = ((_b = window.event) === null || _b === void 0 ? void 0 : _b.inputType) === 'deleteContentForward';
|
|
50
|
+
selectionPos = isDeleteEvent || isDeleteContentForward ? toA : fromA;
|
|
49
51
|
}
|
|
50
52
|
});
|
|
51
53
|
return [changeSteps, selectionPos];
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { NodeSelection as NodeSelectionClass } from 'prosemirror-state';
|
|
2
2
|
import { ReplaceAroundStep, ReplaceStep } from 'prosemirror-transform';
|
|
3
|
-
import {
|
|
3
|
+
import { diffChangeSteps } from '../change-steps/diffChangeSteps';
|
|
4
|
+
import { processChangeSteps } from '../change-steps/processChangeSteps';
|
|
4
5
|
import { CHANGE_STATUS } from '../types/change';
|
|
6
|
+
import { log } from '../utils/logger';
|
|
5
7
|
import { trackReplaceAroundStep } from './trackReplaceAroundStep';
|
|
6
8
|
import { trackReplaceStep } from './trackReplaceStep';
|
|
7
|
-
import { processChangeSteps } from '../change-steps/processChangeSteps';
|
|
8
|
-
import { diffChangeSteps } from '../change-steps/diffChangeSteps';
|
|
9
9
|
const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
|
|
10
10
|
const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
|
|
11
11
|
export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
@@ -15,6 +15,7 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
15
15
|
reviewedByID: null,
|
|
16
16
|
createdAt: tr.time,
|
|
17
17
|
updatedAt: tr.time,
|
|
18
|
+
statusUpdateAt: 0,
|
|
18
19
|
status: CHANGE_STATUS.pending,
|
|
19
20
|
};
|
|
20
21
|
const wasNodeSelection = tr.selection instanceof NodeSelectionClass;
|
|
@@ -36,8 +37,7 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
36
37
|
}
|
|
37
38
|
else if (step instanceof ReplaceStep) {
|
|
38
39
|
const { slice } = step;
|
|
39
|
-
if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 &&
|
|
40
|
-
isHighlightMarkerNode(slice.content.content[0])) {
|
|
40
|
+
if (((_b = (_a = slice === null || slice === void 0 ? void 0 : slice.content) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.length) === 1 && isHighlightMarkerNode(slice.content.content[0])) {
|
|
41
41
|
continue;
|
|
42
42
|
}
|
|
43
43
|
const newStep = step.invert(tr.docs[i]);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IncompleteChange, NodeAttrChange, NodeChange, TextChange, TrackedAttrs, TrackedChange } from './types/change';
|
|
2
2
|
export declare class ChangeSet {
|
|
3
3
|
#private;
|
|
4
4
|
constructor(changes?: (TrackedChange | IncompleteChange)[]);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Fragment, Node as PMNode, Schema } from 'prosemirror-model';
|
|
2
2
|
import type { Transaction } from 'prosemirror-state';
|
|
3
3
|
import { ExposedSlice } from '../types/pm';
|
|
4
|
-
import { NewEmptyAttrs } from '../types/track';
|
|
5
4
|
import { ChangeStep } from '../types/step';
|
|
5
|
+
import { NewEmptyAttrs } from '../types/track';
|
|
6
6
|
export declare function deleteAndMergeSplitNodes(from: number, to: number, gap: {
|
|
7
7
|
start: number;
|
|
8
8
|
end: number;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EditorState, Transaction } from 'prosemirror-state';
|
|
2
2
|
import { ReplaceAroundStep } from 'prosemirror-transform';
|
|
3
|
-
import { NewEmptyAttrs } from '../types/track';
|
|
4
3
|
import { ChangeStep } from '../types/step';
|
|
4
|
+
import { NewEmptyAttrs } from '../types/track';
|
|
5
5
|
export declare function trackReplaceAroundStep(step: ReplaceAroundStep, oldState: EditorState, tr: Transaction, newTr: Transaction, attrs: NewEmptyAttrs): ChangeStep[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Node as PMNode } from 'prosemirror-model';
|
|
2
2
|
import type { EditorState, Transaction } from 'prosemirror-state';
|
|
3
3
|
import { ReplaceStep, StepResult } from 'prosemirror-transform';
|
|
4
|
-
import { NewEmptyAttrs } from '../types/track';
|
|
5
4
|
import { ChangeStep } from '../types/step';
|
|
5
|
+
import { NewEmptyAttrs } from '../types/track';
|
|
6
6
|
export declare function trackReplaceStep(step: ReplaceStep, oldState: EditorState, newTr: Transaction, attrs: NewEmptyAttrs, stepResult: StepResult, currentStepDoc: PMNode): [ChangeStep[], number];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manuscripts/track-changes-plugin",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.4",
|
|
4
4
|
"author": "Atypon Systems LLC",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/Atypon-OpenSource/manuscripts-track-changes-plugin",
|
|
@@ -15,27 +15,47 @@
|
|
|
15
15
|
"build": "npm-run-all --parallel 'build:* --project tsconfig.json'",
|
|
16
16
|
"build:cjs": "tsc --outDir dist/cjs --module commonjs",
|
|
17
17
|
"build:es": "tsc --outDir dist/es --declarationDir dist/types --declaration",
|
|
18
|
-
"dev": "npm-run-all --parallel 'build:* --project tsconfig.
|
|
18
|
+
"dev": "npm-run-all --parallel 'build:* --project tsconfig.json --watch'",
|
|
19
19
|
"test": "jest --runInBand",
|
|
20
|
+
"test-rs": "jest -i test/diff/diff.test.ts",
|
|
20
21
|
"format": "prettier --write \"*.+(js|json|yml|yaml|ts|md|graphql|mdx)\" src/ test/",
|
|
21
22
|
"typecheck": "tsc --project tsconfig.test.json --noEmit",
|
|
22
23
|
"lint": "eslint --cache --ext .js,.ts, ./src ./test",
|
|
23
|
-
"lint:fix": "eslint --fix --ext .js,.ts, ./src ./test"
|
|
24
|
+
"lint:fix": "eslint --fix --ext .js,.ts, ./src ./test",
|
|
25
|
+
"prepare": "husky install"
|
|
24
26
|
},
|
|
25
27
|
"devDependencies": {
|
|
28
|
+
"@manuscripts/eslint-config": "^0.5.1",
|
|
26
29
|
"@manuscripts/transform": "^1.5.1",
|
|
27
30
|
"@types/debug": "^4.1.7",
|
|
28
31
|
"@types/jest": "27.5.1",
|
|
29
32
|
"@types/node": "^18.7.18",
|
|
33
|
+
"@typescript-eslint/eslint-plugin": "^5.47.0",
|
|
34
|
+
"@typescript-eslint/parser": "^5.47.0",
|
|
35
|
+
"eslint": "^8.46.0",
|
|
36
|
+
"eslint-config-prettier": "^8.5.0",
|
|
37
|
+
"eslint-plugin-header": "^3.1.1",
|
|
38
|
+
"eslint-plugin-import": "^2.26.0",
|
|
39
|
+
"eslint-plugin-jest": "^27.1.7",
|
|
40
|
+
"eslint-plugin-jsx-a11y": "^6.6.1",
|
|
41
|
+
"eslint-plugin-mdx": "2.0.4",
|
|
42
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
43
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
44
|
+
"eslint-plugin-react": "^7.31.11",
|
|
45
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
46
|
+
"eslint-plugin-simple-import-sort": "^8.0.0",
|
|
47
|
+
"husky": "^8.0.1",
|
|
30
48
|
"jest": "27.5.1",
|
|
31
49
|
"jest-environment-jsdom": "27.5.1",
|
|
32
50
|
"jsdom": "^20.0.0",
|
|
33
51
|
"npm-run-all": "^4.1.5",
|
|
52
|
+
"prettier": "^2.8.1",
|
|
34
53
|
"ts-jest": "27.1.4",
|
|
35
54
|
"tslib": "^2.4.0",
|
|
36
55
|
"typescript": "^4.8.3"
|
|
37
56
|
},
|
|
38
57
|
"dependencies": {
|
|
58
|
+
"debug": "^4.3.4",
|
|
39
59
|
"prosemirror-commands": "^1.5.0",
|
|
40
60
|
"prosemirror-example-setup": "^1.2.1",
|
|
41
61
|
"prosemirror-history": "^1.3.0",
|
|
@@ -44,7 +64,9 @@
|
|
|
44
64
|
"prosemirror-schema-list": "^1.2.2",
|
|
45
65
|
"prosemirror-state": "^1.4.2",
|
|
46
66
|
"prosemirror-transform": "^1.7.0",
|
|
47
|
-
"prosemirror-view": "^1.29.1"
|
|
48
|
-
|
|
67
|
+
"prosemirror-view": "^1.29.1"
|
|
68
|
+
},
|
|
69
|
+
"resolutions": {
|
|
70
|
+
"eslint-mdx": "2.0.5"
|
|
49
71
|
}
|
|
50
72
|
}
|