@manuscripts/track-changes-plugin 1.7.2 → 1.7.3
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 +155 -0
- package/dist/cjs/actions.js +23 -0
- package/dist/cjs/change-steps/diffChangeSteps.js +63 -0
- package/dist/cjs/change-steps/matchInserted.js +70 -0
- package/dist/cjs/change-steps/processChangeSteps.js +141 -0
- package/dist/cjs/changes/applyChanges.js +81 -0
- package/dist/cjs/changes/findChanges.js +72 -0
- package/dist/cjs/changes/fixInconsistentChanges.js +21 -0
- package/dist/cjs/changes/updateChangeAttrs.js +65 -0
- package/dist/cjs/commands.js +47 -0
- package/dist/cjs/compute/nodeHelpers.js +77 -0
- package/dist/cjs/compute/setFragmentAsInserted.js +53 -0
- package/dist/cjs/compute/splitSliceIntoMergedParts.js +57 -0
- package/dist/cjs/index.js +41 -0
- package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +105 -0
- package/dist/cjs/mutate/deleteNode.js +43 -0
- package/dist/cjs/mutate/deleteText.js +29 -0
- package/dist/cjs/mutate/mergeNode.js +21 -0
- package/dist/cjs/mutate/mergeTrackedMarks.js +25 -0
- package/dist/cjs/plugin.js +118 -0
- package/dist/cjs/steps/trackReplaceAroundStep.js +72 -0
- package/dist/cjs/steps/trackReplaceStep.js +79 -0
- package/dist/cjs/steps/trackTransaction.js +88 -0
- package/dist/cjs/types/change.js +15 -0
- package/dist/cjs/types/pm.js +2 -0
- package/dist/cjs/types/step.js +2 -0
- package/dist/cjs/types/track.js +9 -0
- package/dist/cjs/utils/logger.js +43 -0
- package/dist/cjs/utils/track-utils.js +28 -0
- package/dist/cjs/utils/uuidv4.js +10 -0
- package/dist/es/ChangeSet.js +151 -0
- package/dist/es/actions.js +17 -0
- package/dist/es/change-steps/diffChangeSteps.js +59 -0
- package/dist/es/change-steps/matchInserted.js +66 -0
- package/dist/es/change-steps/processChangeSteps.js +114 -0
- package/dist/es/changes/applyChanges.js +77 -0
- package/dist/es/changes/findChanges.js +68 -0
- package/dist/es/changes/fixInconsistentChanges.js +17 -0
- package/dist/es/changes/updateChangeAttrs.js +60 -0
- package/dist/es/commands.js +39 -0
- package/dist/es/compute/nodeHelpers.js +67 -0
- package/dist/es/compute/setFragmentAsInserted.js +49 -0
- package/dist/es/compute/splitSliceIntoMergedParts.js +53 -0
- package/dist/es/index.js +7 -0
- package/dist/es/mutate/deleteAndMergeSplitNodes.js +78 -0
- package/dist/es/mutate/deleteNode.js +38 -0
- package/dist/es/mutate/deleteText.js +25 -0
- package/dist/es/mutate/mergeNode.js +17 -0
- package/dist/es/mutate/mergeTrackedMarks.js +21 -0
- package/dist/es/plugin.js +114 -0
- package/dist/es/steps/trackReplaceAroundStep.js +45 -0
- package/dist/es/steps/trackReplaceStep.js +52 -0
- package/dist/es/steps/trackTransaction.js +84 -0
- package/dist/es/types/change.js +12 -0
- package/dist/es/types/pm.js +1 -0
- package/dist/es/types/step.js +1 -0
- package/dist/es/types/track.js +6 -0
- package/dist/es/utils/logger.js +36 -0
- package/dist/es/utils/track-utils.js +22 -0
- package/dist/es/utils/uuidv4.js +6 -0
- package/dist/types/ChangeSet.d.ts +28 -0
- package/dist/{actions.d.ts → types/actions.d.ts} +27 -60
- package/dist/{change-steps → types/change-steps}/diffChangeSteps.d.ts +2 -2
- package/dist/types/change-steps/matchInserted.d.ts +3 -0
- package/dist/types/change-steps/processChangeSteps.d.ts +6 -0
- package/dist/types/changes/applyChanges.d.ts +5 -0
- package/dist/types/changes/findChanges.d.ts +3 -0
- package/dist/types/changes/fixInconsistentChanges.d.ts +4 -0
- package/dist/types/changes/updateChangeAttrs.d.ts +6 -0
- package/dist/types/commands.d.ts +8 -0
- package/dist/{compute → types/compute}/nodeHelpers.d.ts +13 -28
- package/dist/types/compute/setFragmentAsInserted.d.ts +3 -0
- package/dist/types/compute/splitSliceIntoMergedParts.d.ts +13 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/mutate/deleteAndMergeSplitNodes.d.ts +13 -0
- package/dist/types/mutate/deleteNode.d.ts +5 -0
- package/dist/types/mutate/deleteText.d.ts +4 -0
- package/dist/types/mutate/mergeNode.d.ts +3 -0
- package/dist/types/mutate/mergeTrackedMarks.d.ts +3 -0
- package/dist/types/plugin.d.ts +4 -0
- package/dist/{steps → types/steps}/trackReplaceAroundStep.d.ts +5 -5
- package/dist/types/steps/trackReplaceStep.d.ts +6 -0
- package/dist/types/steps/trackTransaction.d.ts +2 -0
- package/dist/types/types/change.d.ts +61 -0
- package/dist/types/types/pm.d.ts +12 -0
- package/dist/types/{step.d.ts → types/step.d.ts} +38 -53
- package/dist/types/types/track.d.ts +30 -0
- package/dist/types/utils/logger.d.ts +8 -0
- package/dist/{utils → types/utils}/track-utils.d.ts +4 -4
- package/dist/types/utils/uuidv4.d.ts +1 -0
- package/package.json +18 -39
- package/LICENSE +0 -201
- package/dist/ChangeSet.d.ts +0 -71
- package/dist/change-steps/matchInserted.d.ts +0 -13
- package/dist/change-steps/processChangeSteps.d.ts +0 -21
- package/dist/changes/applyChanges.d.ts +0 -28
- package/dist/changes/findChanges.d.ts +0 -27
- package/dist/changes/fixInconsistentChanges.d.ts +0 -29
- package/dist/changes/updateChangeAttrs.d.ts +0 -21
- package/dist/commands.d.ts +0 -47
- package/dist/compute/setFragmentAsInserted.d.ts +0 -18
- package/dist/compute/splitSliceIntoMergedParts.d.ts +0 -41
- package/dist/index.cjs +0 -2026
- package/dist/index.d.ts +0 -22
- package/dist/index.js +0 -2013
- package/dist/mutate/deleteAndMergeSplitNodes.d.ts +0 -53
- package/dist/mutate/deleteNode.d.ts +0 -36
- package/dist/mutate/deleteText.d.ts +0 -33
- package/dist/mutate/mergeNode.d.ts +0 -25
- package/dist/mutate/mergeTrackedMarks.d.ts +0 -29
- package/dist/plugin.d.ts +0 -25
- package/dist/steps/trackReplaceStep.d.ts +0 -21
- package/dist/steps/trackTransaction.d.ts +0 -17
- package/dist/types/change.d.ts +0 -76
- package/dist/types/pm.d.ts +0 -27
- package/dist/types/track.d.ts +0 -45
- package/dist/utils/logger.d.ts +0 -27
- package/dist/utils/uuidv4.d.ts +0 -16
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _ChangeSet_instances, _ChangeSet_changes, _ChangeSet_isSameNodeChange, _ChangeSet_isNotPendingOrDeleted;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ChangeSet = void 0;
|
|
16
|
+
const change_1 = require("./types/change");
|
|
17
|
+
const logger_1 = require("./utils/logger");
|
|
18
|
+
class ChangeSet {
|
|
19
|
+
constructor(changes = []) {
|
|
20
|
+
_ChangeSet_instances.add(this);
|
|
21
|
+
_ChangeSet_changes.set(this, void 0);
|
|
22
|
+
__classPrivateFieldSet(this, _ChangeSet_changes, changes, "f");
|
|
23
|
+
}
|
|
24
|
+
get changes() {
|
|
25
|
+
const iteratedIds = new Set();
|
|
26
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => {
|
|
27
|
+
const valid = !iteratedIds.has(c.dataTracked.id) && ChangeSet.isValidDataTracked(c.dataTracked);
|
|
28
|
+
iteratedIds.add(c.dataTracked.id);
|
|
29
|
+
return valid;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
get invalidChanges() {
|
|
33
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => !this.changes.find((cc) => c.id === cc.id));
|
|
34
|
+
}
|
|
35
|
+
get changeTree() {
|
|
36
|
+
const rootNodes = [];
|
|
37
|
+
let currentNodeChange;
|
|
38
|
+
this.changes.forEach((c) => {
|
|
39
|
+
if (currentNodeChange && c.from >= currentNodeChange.to) {
|
|
40
|
+
rootNodes.push(currentNodeChange);
|
|
41
|
+
currentNodeChange = undefined;
|
|
42
|
+
}
|
|
43
|
+
if (currentNodeChange &&
|
|
44
|
+
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
|
+
currentNodeChange.children.push(c);
|
|
48
|
+
}
|
|
49
|
+
else if (c.type === 'node-change') {
|
|
50
|
+
currentNodeChange = Object.assign(Object.assign({}, c), { children: [] });
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
rootNodes.push(c);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
if (currentNodeChange) {
|
|
57
|
+
rootNodes.push(currentNodeChange);
|
|
58
|
+
}
|
|
59
|
+
return rootNodes;
|
|
60
|
+
}
|
|
61
|
+
get pending() {
|
|
62
|
+
return this.changeTree.filter((c) => c.dataTracked.status === change_1.CHANGE_STATUS.pending);
|
|
63
|
+
}
|
|
64
|
+
get accepted() {
|
|
65
|
+
return this.changeTree.filter((c) => c.dataTracked.status === change_1.CHANGE_STATUS.accepted);
|
|
66
|
+
}
|
|
67
|
+
get rejected() {
|
|
68
|
+
return this.changeTree.filter((c) => c.dataTracked.status === change_1.CHANGE_STATUS.rejected);
|
|
69
|
+
}
|
|
70
|
+
get textChanges() {
|
|
71
|
+
return this.changes.filter((c) => c.type === 'text-change');
|
|
72
|
+
}
|
|
73
|
+
get nodeChanges() {
|
|
74
|
+
return this.changes.filter((c) => c.type === 'node-change');
|
|
75
|
+
}
|
|
76
|
+
get nodeAttrChanges() {
|
|
77
|
+
return this.changes.filter((c) => c.type === 'node-attr-change');
|
|
78
|
+
}
|
|
79
|
+
get bothNodeChanges() {
|
|
80
|
+
return this.changes.filter((c) => c.type === 'node-change' || c.type === 'node-attr-change');
|
|
81
|
+
}
|
|
82
|
+
get isEmpty() {
|
|
83
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").length === 0;
|
|
84
|
+
}
|
|
85
|
+
get hasInconsistentData() {
|
|
86
|
+
return this.hasDuplicateIds || this.hasIncompleteAttrs;
|
|
87
|
+
}
|
|
88
|
+
get hasDuplicateIds() {
|
|
89
|
+
const iterated = new Set();
|
|
90
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").some((c) => {
|
|
91
|
+
if (iterated.has(c.id)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
iterated.add(c.id);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
get hasIncompleteAttrs() {
|
|
98
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").some((c) => !ChangeSet.isValidDataTracked(c.dataTracked));
|
|
99
|
+
}
|
|
100
|
+
get(id) {
|
|
101
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id);
|
|
102
|
+
}
|
|
103
|
+
getIn(ids) {
|
|
104
|
+
return ids
|
|
105
|
+
.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id))
|
|
106
|
+
.filter((c) => c !== undefined);
|
|
107
|
+
}
|
|
108
|
+
getNotIn(ids) {
|
|
109
|
+
return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => ids.includes(c.id));
|
|
110
|
+
}
|
|
111
|
+
static flattenTreeToIds(changes) {
|
|
112
|
+
return changes.flatMap((c) => this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id);
|
|
113
|
+
}
|
|
114
|
+
static shouldDeleteChange(change) {
|
|
115
|
+
const { status, operation } = change.dataTracked;
|
|
116
|
+
return ((operation === change_1.CHANGE_OPERATION.insert && status === change_1.CHANGE_STATUS.rejected) ||
|
|
117
|
+
(operation === change_1.CHANGE_OPERATION.delete && status === change_1.CHANGE_STATUS.accepted));
|
|
118
|
+
}
|
|
119
|
+
static isValidDataTracked(dataTracked = {}) {
|
|
120
|
+
if ('dataTracked' in dataTracked) {
|
|
121
|
+
logger_1.log.warn('passed "dataTracked" as property to isValidTrackedAttrs()', dataTracked);
|
|
122
|
+
}
|
|
123
|
+
const trackedKeys = [
|
|
124
|
+
'id',
|
|
125
|
+
'authorID',
|
|
126
|
+
'operation',
|
|
127
|
+
'status',
|
|
128
|
+
'createdAt',
|
|
129
|
+
'updatedAt',
|
|
130
|
+
];
|
|
131
|
+
const optionalKeys = ['reviewedByID'];
|
|
132
|
+
const entries = Object.entries(dataTracked).filter(([key, val]) => trackedKeys.includes(key));
|
|
133
|
+
const optionalEntries = Object.entries(dataTracked).filter(([key, val]) => optionalKeys.includes(key));
|
|
134
|
+
return (entries.length === trackedKeys.length &&
|
|
135
|
+
entries.every(([key, val]) => trackedKeys.includes(key) && val !== undefined) &&
|
|
136
|
+
optionalEntries.every(([key, val]) => optionalKeys.includes(key) && val !== undefined) &&
|
|
137
|
+
(dataTracked.id || '').length > 0);
|
|
138
|
+
}
|
|
139
|
+
static isTextChange(change) {
|
|
140
|
+
return change.type === 'text-change';
|
|
141
|
+
}
|
|
142
|
+
static isNodeChange(change) {
|
|
143
|
+
return change.type === 'node-change';
|
|
144
|
+
}
|
|
145
|
+
static isNodeAttrChange(change) {
|
|
146
|
+
return change.type === 'node-attr-change';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.ChangeSet = ChangeSet;
|
|
150
|
+
_ChangeSet_changes = new WeakMap(), _ChangeSet_instances = new WeakSet(), _ChangeSet_isSameNodeChange = function _ChangeSet_isSameNodeChange(currentChange, nextChange) {
|
|
151
|
+
return currentChange.from === nextChange.from && currentChange.to === nextChange.to;
|
|
152
|
+
}, _ChangeSet_isNotPendingOrDeleted = function _ChangeSet_isNotPendingOrDeleted(change) {
|
|
153
|
+
return (change.dataTracked.operation !== change_1.CHANGE_OPERATION.delete &&
|
|
154
|
+
change.dataTracked.status !== change_1.CHANGE_STATUS.pending);
|
|
155
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.skipTracking = exports.setAction = exports.getAction = exports.TrackChangesAction = void 0;
|
|
4
|
+
var TrackChangesAction;
|
|
5
|
+
(function (TrackChangesAction) {
|
|
6
|
+
TrackChangesAction["skipTrack"] = "track-changes-skip-tracking";
|
|
7
|
+
TrackChangesAction["setUserID"] = "track-changes-set-user-id";
|
|
8
|
+
TrackChangesAction["setPluginStatus"] = "track-changes-set-track-status";
|
|
9
|
+
TrackChangesAction["setChangeStatuses"] = "track-changes-set-change-statuses";
|
|
10
|
+
TrackChangesAction["refreshChanges"] = "track-changes-refresh-changes";
|
|
11
|
+
TrackChangesAction["applyAndRemoveChanges"] = "track-changes-apply-remove-changes";
|
|
12
|
+
TrackChangesAction["updateMetaNode"] = "track-changes-update-meta-node";
|
|
13
|
+
})(TrackChangesAction = exports.TrackChangesAction || (exports.TrackChangesAction = {}));
|
|
14
|
+
function getAction(tr, action) {
|
|
15
|
+
return tr.getMeta(action);
|
|
16
|
+
}
|
|
17
|
+
exports.getAction = getAction;
|
|
18
|
+
function setAction(tr, action, payload) {
|
|
19
|
+
return tr.setMeta(action, payload);
|
|
20
|
+
}
|
|
21
|
+
exports.setAction = setAction;
|
|
22
|
+
const skipTracking = (tr) => setAction(tr, TrackChangesAction.skipTrack, true);
|
|
23
|
+
exports.skipTracking = skipTracking;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diffChangeSteps = void 0;
|
|
4
|
+
const prosemirror_model_1 = require("prosemirror-model");
|
|
5
|
+
const matchInserted_1 = require("./matchInserted");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
function cutFragment(matched, deleted, content) {
|
|
8
|
+
const newContent = [];
|
|
9
|
+
for (let i = 0; matched <= deleted && i < content.childCount; i += 1) {
|
|
10
|
+
const child = content.child(i);
|
|
11
|
+
if (!child.isText && child.content.size > 0) {
|
|
12
|
+
const cut = cutFragment(matched + 1, deleted, child.content);
|
|
13
|
+
matched = cut[0];
|
|
14
|
+
newContent.push(...cut[1].content);
|
|
15
|
+
}
|
|
16
|
+
else if (child.isText && matched + child.nodeSize > deleted) {
|
|
17
|
+
if (deleted - matched > 0) {
|
|
18
|
+
newContent.push(child.cut(deleted - matched));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
newContent.push(child);
|
|
22
|
+
}
|
|
23
|
+
matched = deleted + 1;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
matched += child.nodeSize;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [matched, prosemirror_model_1.Fragment.fromArray(newContent)];
|
|
30
|
+
}
|
|
31
|
+
function diffChangeSteps(deleted, inserted) {
|
|
32
|
+
const updated = [];
|
|
33
|
+
let updatedDeleted = [...deleted];
|
|
34
|
+
inserted.forEach((ins) => {
|
|
35
|
+
logger_1.log.info('DIFF ins ', ins);
|
|
36
|
+
if (ins.sliceWasSplit) {
|
|
37
|
+
updated.push(ins);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const deleteStart = updatedDeleted.reduce((acc, cur) => {
|
|
41
|
+
if (cur.type === 'delete-node') {
|
|
42
|
+
return Math.min(acc, cur.pos);
|
|
43
|
+
}
|
|
44
|
+
else if (cur.type === 'delete-text') {
|
|
45
|
+
return Math.min(acc, cur.from);
|
|
46
|
+
}
|
|
47
|
+
return acc;
|
|
48
|
+
}, Number.MAX_SAFE_INTEGER);
|
|
49
|
+
const [matchedDeleted, updatedDel] = (0, matchInserted_1.matchInserted)(deleteStart, updatedDeleted, ins.slice.content);
|
|
50
|
+
if (matchedDeleted === deleteStart) {
|
|
51
|
+
updated.push(ins);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
updatedDeleted = updatedDel;
|
|
55
|
+
const [_, newInserted] = cutFragment(0, matchedDeleted - deleteStart, ins.slice.content);
|
|
56
|
+
if (newInserted.size > 0) {
|
|
57
|
+
updated.push(Object.assign(Object.assign({}, ins), { slice: new prosemirror_model_1.Slice(newInserted, ins.slice.openStart, ins.slice.openEnd) }));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
logger_1.log.info('FINISH DIFF: ', [...updatedDeleted, ...updated]);
|
|
61
|
+
return [...updatedDeleted, ...updated];
|
|
62
|
+
}
|
|
63
|
+
exports.diffChangeSteps = diffChangeSteps;
|
|
@@ -0,0 +1,70 @@
|
|
|
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.matchInserted = void 0;
|
|
15
|
+
function matchText(adjDeleted, insNode, offset, matchedDeleted, deleted) {
|
|
16
|
+
const { pos, from, to, node: delNode } = adjDeleted;
|
|
17
|
+
let j = offset, d = from - pos, maxSteps = to - Math.max(pos, from);
|
|
18
|
+
for (; maxSteps !== j && insNode.text[j] !== undefined && insNode.text[j] === delNode.text[d]; j += 1, d += 1) {
|
|
19
|
+
matchedDeleted += 1;
|
|
20
|
+
}
|
|
21
|
+
deleted = deleted.filter((d) => d !== adjDeleted);
|
|
22
|
+
if (maxSteps !== j) {
|
|
23
|
+
deleted.push({
|
|
24
|
+
pos,
|
|
25
|
+
from: from + j - offset,
|
|
26
|
+
to,
|
|
27
|
+
type: 'delete-text',
|
|
28
|
+
node: delNode,
|
|
29
|
+
});
|
|
30
|
+
return [matchedDeleted, deleted];
|
|
31
|
+
}
|
|
32
|
+
const nextTextDelete = deleted.find((d) => d.type === 'delete-text' && d.pos === to);
|
|
33
|
+
if (nextTextDelete) {
|
|
34
|
+
return matchText(nextTextDelete, insNode, j, matchedDeleted, deleted);
|
|
35
|
+
}
|
|
36
|
+
return [matchedDeleted, deleted];
|
|
37
|
+
}
|
|
38
|
+
function matchInserted(matchedDeleted, deleted, inserted) {
|
|
39
|
+
var _a;
|
|
40
|
+
let matched = [matchedDeleted, deleted];
|
|
41
|
+
for (let i = 0;; i += 1) {
|
|
42
|
+
if (inserted.childCount === i) {
|
|
43
|
+
return matched;
|
|
44
|
+
}
|
|
45
|
+
const insNode = inserted.child(i);
|
|
46
|
+
const adjDeleted = matched[1].find((d) => (d.type === 'delete-text' && Math.max(d.pos, d.from) === matched[0]) ||
|
|
47
|
+
(d.type === 'delete-node' && d.pos === matched[0]));
|
|
48
|
+
if (insNode.type !== ((_a = adjDeleted === null || adjDeleted === void 0 ? void 0 : adjDeleted.node) === null || _a === void 0 ? void 0 : _a.type)) {
|
|
49
|
+
return matched;
|
|
50
|
+
}
|
|
51
|
+
else if (insNode.isText && (adjDeleted === null || adjDeleted === void 0 ? void 0 : adjDeleted.node)) {
|
|
52
|
+
matched = matchText(adjDeleted, insNode, 0, matched[0], matched[1]);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
else if (insNode.content.size > 0 || (adjDeleted === null || adjDeleted === void 0 ? void 0 : adjDeleted.node.content.size) > 0) {
|
|
56
|
+
matched = matchInserted(matched[0] + 1, matched[1].filter((d) => d !== adjDeleted), insNode.content);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
matched = [matched[0] + insNode.nodeSize, matched[1].filter((d) => d !== adjDeleted)];
|
|
60
|
+
}
|
|
61
|
+
const _b = insNode.attrs || {}, { dataTracked } = _b, newAttrs = __rest(_b, ["dataTracked"]);
|
|
62
|
+
matched[1].push({
|
|
63
|
+
pos: adjDeleted.pos,
|
|
64
|
+
type: 'update-node-attrs',
|
|
65
|
+
node: adjDeleted.node,
|
|
66
|
+
newAttrs,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.matchInserted = matchInserted;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
26
|
+
var t = {};
|
|
27
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
28
|
+
t[p] = s[p];
|
|
29
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
30
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
31
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
32
|
+
t[p[i]] = s[p[i]];
|
|
33
|
+
}
|
|
34
|
+
return t;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.processChangeSteps = void 0;
|
|
38
|
+
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
39
|
+
const logger_1 = require("../utils/logger");
|
|
40
|
+
const change_1 = require("../types/change");
|
|
41
|
+
const deleteNode_1 = require("../mutate/deleteNode");
|
|
42
|
+
const deleteText_1 = require("../mutate/deleteText");
|
|
43
|
+
const mergeTrackedMarks_1 = require("../mutate/mergeTrackedMarks");
|
|
44
|
+
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
45
|
+
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
46
|
+
function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
47
|
+
const mapping = new prosemirror_transform_1.Mapping();
|
|
48
|
+
const deleteAttrs = trackUtils.createNewDeleteAttrs(emptyAttrs);
|
|
49
|
+
let selectionPos = startPos;
|
|
50
|
+
let deletesCounter = 0;
|
|
51
|
+
let isInserted = false;
|
|
52
|
+
changes.forEach((c) => {
|
|
53
|
+
let step = newTr.steps[newTr.steps.length - 1];
|
|
54
|
+
switch (c.type) {
|
|
55
|
+
case "delete-node":
|
|
56
|
+
deletesCounter++;
|
|
57
|
+
const trackedData = (0, nodeHelpers_1.getBlockInlineTrackedData)(c.node);
|
|
58
|
+
const inserted = trackedData === null || trackedData === void 0 ? void 0 : trackedData.find((d) => d.operation === change_1.CHANGE_OPERATION.insert);
|
|
59
|
+
isInserted = !!inserted || (!trackedData && isInserted);
|
|
60
|
+
if (isInserted && deletesCounter > 1)
|
|
61
|
+
return false;
|
|
62
|
+
(0, deleteNode_1.deleteOrSetNodeDeleted)(c.node, mapping.map(c.pos), newTr, deleteAttrs);
|
|
63
|
+
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
64
|
+
if (step !== newestStep) {
|
|
65
|
+
mapping.appendMap(newestStep.getMap());
|
|
66
|
+
step = newestStep;
|
|
67
|
+
}
|
|
68
|
+
(0, mergeTrackedMarks_1.mergeTrackedMarks)(mapping.map(c.pos), newTr.doc, newTr, schema);
|
|
69
|
+
break;
|
|
70
|
+
case "delete-text":
|
|
71
|
+
const node = newTr.doc.nodeAt(mapping.map(c.pos));
|
|
72
|
+
if (!node) {
|
|
73
|
+
logger_1.log.error(`processChangeSteps: no text node found for text-change`, c);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const where = (0, deleteText_1.deleteTextIfInserted)(node, mapping.map(c.pos), newTr, schema, deleteAttrs, mapping.map(c.from), mapping.map(c.to));
|
|
77
|
+
(0, mergeTrackedMarks_1.mergeTrackedMarks)(where, newTr.doc, newTr, schema);
|
|
78
|
+
break;
|
|
79
|
+
case 'merge-fragment':
|
|
80
|
+
let insertPos = mapping.map(c.mergePos);
|
|
81
|
+
if (c.node.isText) {
|
|
82
|
+
insertPos = (0, deleteText_1.deleteTextIfInserted)(c.node, mapping.map(c.pos), newTr, schema, deleteAttrs, mapping.map(c.from), mapping.map(c.to));
|
|
83
|
+
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
84
|
+
if (step !== newestStep) {
|
|
85
|
+
mapping.appendMap(newestStep.getMap());
|
|
86
|
+
step = newestStep;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (c.fragment.size > 0) {
|
|
90
|
+
newTr.insert(insertPos, c.fragment);
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
case 'insert-slice':
|
|
94
|
+
const newStep = new prosemirror_transform_1.ReplaceStep(mapping.map(c.from), mapping.map(c.to), c.slice, false);
|
|
95
|
+
const stepResult = newTr.maybeStep(newStep);
|
|
96
|
+
if (stepResult.failed) {
|
|
97
|
+
logger_1.log.error(`processChangeSteps: insert-slice ReplaceStep failed "${stepResult.failed}"`, newStep);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
(0, mergeTrackedMarks_1.mergeTrackedMarks)(mapping.map(c.from), newTr.doc, newTr, schema);
|
|
101
|
+
const to = mapping.map(c.to) + c.slice.size;
|
|
102
|
+
(0, mergeTrackedMarks_1.mergeTrackedMarks)(mapping.map(c.to) + (to < newTr.doc.nodeSize ? c.slice.size : 0), newTr.doc, newTr, schema);
|
|
103
|
+
selectionPos = mapping.map(c.to) + c.slice.size;
|
|
104
|
+
break;
|
|
105
|
+
case 'update-node-attrs':
|
|
106
|
+
const oldDataTracked = (0, nodeHelpers_1.getBlockInlineTrackedData)(c.node) || [];
|
|
107
|
+
const oldUpdate = oldDataTracked.reverse().find((d) => {
|
|
108
|
+
if (d.operation === change_1.CHANGE_OPERATION.set_node_attributes &&
|
|
109
|
+
(d.status === change_1.CHANGE_STATUS.pending || d.status === change_1.CHANGE_STATUS.rejected)) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
});
|
|
114
|
+
const lastChangeRejected = oldUpdate && oldUpdate.status === change_1.CHANGE_STATUS.rejected;
|
|
115
|
+
const sourceAttrs = (oldUpdate === null || oldUpdate === void 0 ? void 0 : oldUpdate.oldAttrs) || c.node.attrs;
|
|
116
|
+
const { dataTracked } = sourceAttrs, restAttrs = __rest(sourceAttrs, ["dataTracked"]);
|
|
117
|
+
const oldAttrs = lastChangeRejected ? oldUpdate.oldAttrs : restAttrs;
|
|
118
|
+
const newDataTracked = [
|
|
119
|
+
...oldDataTracked.filter((d) => !oldUpdate || d.id !== oldUpdate.id || lastChangeRejected),
|
|
120
|
+
];
|
|
121
|
+
const newUpdate = oldUpdate && oldUpdate.status !== change_1.CHANGE_STATUS.rejected
|
|
122
|
+
? Object.assign(Object.assign({}, oldUpdate), { updatedAt: emptyAttrs.updatedAt }) : (0, nodeHelpers_1.addTrackIdIfDoesntExist)(trackUtils.createNewUpdateAttrs(emptyAttrs, lastChangeRejected ? oldAttrs : c.node.attrs));
|
|
123
|
+
if ((JSON.stringify(oldAttrs) !== JSON.stringify(c.newAttrs) ||
|
|
124
|
+
c.node.type === c.node.type.schema.nodes.citation) &&
|
|
125
|
+
!oldDataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.insert && d.status === change_1.CHANGE_STATUS.pending)) {
|
|
126
|
+
newDataTracked.push(newUpdate);
|
|
127
|
+
}
|
|
128
|
+
newTr.setNodeMarkup(mapping.map(c.pos), undefined, Object.assign(Object.assign({}, c.newAttrs), { dataTracked: newDataTracked.length > 0 ? newDataTracked : null }), c.node.marks);
|
|
129
|
+
break;
|
|
130
|
+
default:
|
|
131
|
+
logger_1.log.error(`processChangeSteps: unknown change type`, c);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
135
|
+
if (step !== newestStep) {
|
|
136
|
+
mapping.appendMap(newestStep.getMap());
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return [mapping, selectionPos];
|
|
140
|
+
}
|
|
141
|
+
exports.processChangeSteps = processChangeSteps;
|
|
@@ -0,0 +1,81 @@
|
|
|
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.applyAcceptedRejectedChanges = void 0;
|
|
15
|
+
const prosemirror_transform_1 = require("prosemirror-transform");
|
|
16
|
+
const ChangeSet_1 = require("../ChangeSet");
|
|
17
|
+
const change_1 = require("../types/change");
|
|
18
|
+
const logger_1 = require("../utils/logger");
|
|
19
|
+
const deleteNode_1 = require("../mutate/deleteNode");
|
|
20
|
+
const mergeNode_1 = require("../mutate/mergeNode");
|
|
21
|
+
const updateChangeAttrs_1 = require("./updateChangeAttrs");
|
|
22
|
+
function getUpdatedDataTracked(dataTracked, changeId) {
|
|
23
|
+
if (!dataTracked) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const newDataTracked = dataTracked.filter((c) => c.id !== changeId);
|
|
27
|
+
return newDataTracked.length ? newDataTracked : null;
|
|
28
|
+
}
|
|
29
|
+
function applyAcceptedRejectedChanges(tr, schema, changes, deleteMap = new prosemirror_transform_1.Mapping()) {
|
|
30
|
+
const attrsChangesLog = new Map();
|
|
31
|
+
function addAttrLog(nodeId, changeId) {
|
|
32
|
+
const arr = attrsChangesLog.get(nodeId) || attrsChangesLog.set(nodeId, []).get(nodeId);
|
|
33
|
+
arr.push(changeId);
|
|
34
|
+
}
|
|
35
|
+
changes.forEach((change) => {
|
|
36
|
+
const { pos: from, deleted } = deleteMap.mapResult(change.from), node = tr.doc.nodeAt(from), noChangeNeeded = deleted || !ChangeSet_1.ChangeSet.shouldDeleteChange(change);
|
|
37
|
+
if (!node) {
|
|
38
|
+
!deleted && logger_1.log.warn('no node found to update for change', change);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (change.dataTracked.status === change_1.CHANGE_STATUS.pending) {
|
|
42
|
+
if (ChangeSet_1.ChangeSet.isNodeAttrChange(change)) {
|
|
43
|
+
const _a = change.newAttrs, { dataTracked } = _a, attrs = __rest(_a, ["dataTracked"]);
|
|
44
|
+
const changeLog = attrsChangesLog.get(node.attrs.id);
|
|
45
|
+
const newDataTracked = changeLog && changeLog.length ? dataTracked.filter((c) => !changeLog.includes(c.id)) : dataTracked;
|
|
46
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, attrs), { dataTracked: newDataTracked.length ? newDataTracked : null }), node.marks);
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (ChangeSet_1.ChangeSet.isTextChange(change) && noChangeNeeded) {
|
|
51
|
+
tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_insert);
|
|
52
|
+
tr.removeMark(from, deleteMap.map(change.to), schema.marks.tracked_delete);
|
|
53
|
+
}
|
|
54
|
+
else if (ChangeSet_1.ChangeSet.isTextChange(change)) {
|
|
55
|
+
tr.delete(from, deleteMap.map(change.to));
|
|
56
|
+
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
57
|
+
}
|
|
58
|
+
else if (ChangeSet_1.ChangeSet.isNodeChange(change) && noChangeNeeded) {
|
|
59
|
+
const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: null });
|
|
60
|
+
tr.setNodeMarkup(from, undefined, attrs, node.marks);
|
|
61
|
+
(0, updateChangeAttrs_1.updateChangeChildrenAttributes)(change.children, tr, deleteMap);
|
|
62
|
+
}
|
|
63
|
+
else if (ChangeSet_1.ChangeSet.isNodeChange(change)) {
|
|
64
|
+
const merged = (0, mergeNode_1.mergeNode)(node, from, tr);
|
|
65
|
+
if (merged === undefined) {
|
|
66
|
+
(0, deleteNode_1.deleteNode)(node, from, tr);
|
|
67
|
+
}
|
|
68
|
+
deleteMap.appendMap(tr.steps[tr.steps.length - 1].getMap());
|
|
69
|
+
}
|
|
70
|
+
else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.accepted) {
|
|
71
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.newAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
72
|
+
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
73
|
+
}
|
|
74
|
+
else if (ChangeSet_1.ChangeSet.isNodeAttrChange(change) && change.dataTracked.status === change_1.CHANGE_STATUS.rejected) {
|
|
75
|
+
tr.setNodeMarkup(from, undefined, Object.assign(Object.assign({}, change.oldAttrs), { dataTracked: getUpdatedDataTracked(node.attrs.dataTracked, change.id) }), node.marks);
|
|
76
|
+
addAttrLog(node.attrs.id, change.dataTracked.id);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return deleteMap;
|
|
80
|
+
}
|
|
81
|
+
exports.applyAcceptedRejectedChanges = applyAcceptedRejectedChanges;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findChanges = void 0;
|
|
4
|
+
const ChangeSet_1 = require("../ChangeSet");
|
|
5
|
+
const change_1 = require("../types/change");
|
|
6
|
+
const nodeHelpers_1 = require("../compute/nodeHelpers");
|
|
7
|
+
function findChanges(state) {
|
|
8
|
+
const changes = [];
|
|
9
|
+
let current;
|
|
10
|
+
state.doc.descendants((node, pos) => {
|
|
11
|
+
const tracked = (0, nodeHelpers_1.getNodeTrackedData)(node, state.schema) || [];
|
|
12
|
+
for (let i = 0; i < tracked.length; i += 1) {
|
|
13
|
+
const dataTracked = tracked[i];
|
|
14
|
+
const id = dataTracked.id || '';
|
|
15
|
+
if (current &&
|
|
16
|
+
current.change.id === id &&
|
|
17
|
+
current.node.isText &&
|
|
18
|
+
node.isText &&
|
|
19
|
+
!(0, nodeHelpers_1.equalMarks)(node, current.node)) {
|
|
20
|
+
current.change.to = pos + node.nodeSize;
|
|
21
|
+
current.node = node;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
current && changes.push(current.change);
|
|
25
|
+
let change;
|
|
26
|
+
if (node.isText) {
|
|
27
|
+
change = {
|
|
28
|
+
id,
|
|
29
|
+
type: 'text-change',
|
|
30
|
+
from: pos,
|
|
31
|
+
to: pos + node.nodeSize,
|
|
32
|
+
dataTracked,
|
|
33
|
+
text: node.text,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
else if (dataTracked.operation === change_1.CHANGE_OPERATION.set_node_attributes) {
|
|
37
|
+
change = {
|
|
38
|
+
id,
|
|
39
|
+
type: 'node-attr-change',
|
|
40
|
+
from: pos,
|
|
41
|
+
to: pos + node.nodeSize,
|
|
42
|
+
dataTracked,
|
|
43
|
+
nodeType: node.type.name,
|
|
44
|
+
newAttrs: node.attrs,
|
|
45
|
+
oldAttrs: dataTracked.oldAttrs,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
change = {
|
|
50
|
+
id,
|
|
51
|
+
type: 'node-change',
|
|
52
|
+
from: pos,
|
|
53
|
+
to: pos + node.nodeSize,
|
|
54
|
+
dataTracked,
|
|
55
|
+
nodeType: node.type.name,
|
|
56
|
+
children: [],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
current = {
|
|
60
|
+
change,
|
|
61
|
+
node,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (tracked.length === 0 && current) {
|
|
65
|
+
changes.push(current.change);
|
|
66
|
+
current = undefined;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
current && changes.push(current.change);
|
|
70
|
+
return new ChangeSet_1.ChangeSet(changes);
|
|
71
|
+
}
|
|
72
|
+
exports.findChanges = findChanges;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fixInconsistentChanges = void 0;
|
|
4
|
+
const change_1 = require("../types/change");
|
|
5
|
+
const uuidv4_1 = require("../utils/uuidv4");
|
|
6
|
+
const updateChangeAttrs_1 = require("./updateChangeAttrs");
|
|
7
|
+
function fixInconsistentChanges(changeSet, currentUserID, newTr, schema) {
|
|
8
|
+
const iteratedIds = new Set();
|
|
9
|
+
let changed = false;
|
|
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() }));
|
|
13
|
+
if (Object.keys(newAttrs).length > 0) {
|
|
14
|
+
(0, updateChangeAttrs_1.updateChangeAttrs)(newTr, c, Object.assign(Object.assign({}, c.dataTracked), newAttrs), schema);
|
|
15
|
+
changed = true;
|
|
16
|
+
}
|
|
17
|
+
iteratedIds.add(newAttrs.id || id);
|
|
18
|
+
});
|
|
19
|
+
return changed;
|
|
20
|
+
}
|
|
21
|
+
exports.fixInconsistentChanges = fixInconsistentChanges;
|