@manuscripts/track-changes-plugin 1.7.2 → 1.7.3-LEAN-2832-v4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/cjs/ChangeSet.js +154 -0
  2. package/dist/cjs/actions.js +23 -0
  3. package/dist/cjs/change-steps/diffChangeSteps.js +63 -0
  4. package/dist/cjs/change-steps/matchInserted.js +70 -0
  5. package/dist/cjs/change-steps/processChangeSteps.js +142 -0
  6. package/dist/cjs/changes/applyChanges.js +85 -0
  7. package/dist/cjs/changes/findChanges.js +72 -0
  8. package/dist/cjs/changes/fixInconsistentChanges.js +21 -0
  9. package/dist/cjs/changes/updateChangeAttrs.js +65 -0
  10. package/dist/cjs/commands.js +47 -0
  11. package/dist/cjs/compute/nodeHelpers.js +73 -0
  12. package/dist/cjs/compute/setFragmentAsInserted.js +53 -0
  13. package/dist/cjs/compute/splitSliceIntoMergedParts.js +55 -0
  14. package/dist/cjs/index.js +41 -0
  15. package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +99 -0
  16. package/dist/cjs/mutate/deleteNode.js +41 -0
  17. package/dist/cjs/mutate/deleteText.js +29 -0
  18. package/dist/cjs/mutate/mergeNode.js +21 -0
  19. package/dist/cjs/mutate/mergeTrackedMarks.js +25 -0
  20. package/dist/cjs/plugin.js +125 -0
  21. package/dist/cjs/steps/trackReplaceAroundStep.js +72 -0
  22. package/dist/cjs/steps/trackReplaceStep.js +81 -0
  23. package/dist/cjs/steps/trackTransaction.js +88 -0
  24. package/dist/cjs/types/change.js +15 -0
  25. package/dist/cjs/types/pm.js +2 -0
  26. package/dist/cjs/types/step.js +2 -0
  27. package/dist/cjs/types/track.js +9 -0
  28. package/dist/cjs/utils/logger.js +43 -0
  29. package/dist/cjs/utils/track-utils.js +28 -0
  30. package/dist/cjs/utils/uuidv4.js +10 -0
  31. package/dist/es/ChangeSet.js +150 -0
  32. package/dist/es/actions.js +17 -0
  33. package/dist/es/change-steps/diffChangeSteps.js +59 -0
  34. package/dist/es/change-steps/matchInserted.js +66 -0
  35. package/dist/es/change-steps/processChangeSteps.js +115 -0
  36. package/dist/es/changes/applyChanges.js +81 -0
  37. package/dist/es/changes/findChanges.js +68 -0
  38. package/dist/es/changes/fixInconsistentChanges.js +17 -0
  39. package/dist/es/changes/updateChangeAttrs.js +60 -0
  40. package/dist/es/commands.js +39 -0
  41. package/dist/es/compute/nodeHelpers.js +63 -0
  42. package/dist/es/compute/setFragmentAsInserted.js +49 -0
  43. package/dist/es/compute/splitSliceIntoMergedParts.js +51 -0
  44. package/dist/es/index.js +7 -0
  45. package/dist/es/mutate/deleteAndMergeSplitNodes.js +72 -0
  46. package/dist/es/mutate/deleteNode.js +36 -0
  47. package/dist/es/mutate/deleteText.js +25 -0
  48. package/dist/es/mutate/mergeNode.js +17 -0
  49. package/dist/es/mutate/mergeTrackedMarks.js +21 -0
  50. package/dist/es/plugin.js +121 -0
  51. package/dist/es/steps/trackReplaceAroundStep.js +45 -0
  52. package/dist/es/steps/trackReplaceStep.js +54 -0
  53. package/dist/es/steps/trackTransaction.js +84 -0
  54. package/dist/es/types/change.js +12 -0
  55. package/dist/es/types/pm.js +1 -0
  56. package/dist/es/types/step.js +1 -0
  57. package/dist/es/types/track.js +6 -0
  58. package/dist/es/utils/logger.js +36 -0
  59. package/dist/es/utils/track-utils.js +22 -0
  60. package/dist/es/utils/uuidv4.js +6 -0
  61. package/dist/types/ChangeSet.d.ts +28 -0
  62. package/dist/{actions.d.ts → types/actions.d.ts} +27 -60
  63. package/dist/{change-steps → types/change-steps}/diffChangeSteps.d.ts +2 -2
  64. package/dist/types/change-steps/matchInserted.d.ts +3 -0
  65. package/dist/types/change-steps/processChangeSteps.d.ts +6 -0
  66. package/dist/types/changes/applyChanges.d.ts +5 -0
  67. package/dist/types/changes/findChanges.d.ts +3 -0
  68. package/dist/types/changes/fixInconsistentChanges.d.ts +4 -0
  69. package/dist/types/changes/updateChangeAttrs.d.ts +6 -0
  70. package/dist/types/commands.d.ts +8 -0
  71. package/dist/{compute → types/compute}/nodeHelpers.d.ts +13 -28
  72. package/dist/types/compute/setFragmentAsInserted.d.ts +3 -0
  73. package/dist/types/compute/splitSliceIntoMergedParts.d.ts +13 -0
  74. package/dist/types/index.d.ts +7 -0
  75. package/dist/types/mutate/deleteAndMergeSplitNodes.d.ts +13 -0
  76. package/dist/types/mutate/deleteNode.d.ts +5 -0
  77. package/dist/types/mutate/deleteText.d.ts +4 -0
  78. package/dist/types/mutate/mergeNode.d.ts +3 -0
  79. package/dist/types/mutate/mergeTrackedMarks.d.ts +3 -0
  80. package/dist/types/plugin.d.ts +4 -0
  81. package/dist/{steps → types/steps}/trackReplaceAroundStep.d.ts +5 -5
  82. package/dist/types/steps/trackReplaceStep.d.ts +6 -0
  83. package/dist/types/steps/trackTransaction.d.ts +2 -0
  84. package/dist/types/types/change.d.ts +62 -0
  85. package/dist/types/types/pm.d.ts +12 -0
  86. package/dist/types/{step.d.ts → types/step.d.ts} +38 -53
  87. package/dist/types/types/track.d.ts +30 -0
  88. package/dist/types/utils/logger.d.ts +8 -0
  89. package/dist/{utils → types/utils}/track-utils.d.ts +4 -4
  90. package/dist/types/utils/uuidv4.d.ts +1 -0
  91. package/package.json +41 -40
  92. package/LICENSE +0 -201
  93. package/dist/ChangeSet.d.ts +0 -71
  94. package/dist/change-steps/matchInserted.d.ts +0 -13
  95. package/dist/change-steps/processChangeSteps.d.ts +0 -21
  96. package/dist/changes/applyChanges.d.ts +0 -28
  97. package/dist/changes/findChanges.d.ts +0 -27
  98. package/dist/changes/fixInconsistentChanges.d.ts +0 -29
  99. package/dist/changes/updateChangeAttrs.d.ts +0 -21
  100. package/dist/commands.d.ts +0 -47
  101. package/dist/compute/setFragmentAsInserted.d.ts +0 -18
  102. package/dist/compute/splitSliceIntoMergedParts.d.ts +0 -41
  103. package/dist/index.cjs +0 -2026
  104. package/dist/index.d.ts +0 -22
  105. package/dist/index.js +0 -2013
  106. package/dist/mutate/deleteAndMergeSplitNodes.d.ts +0 -53
  107. package/dist/mutate/deleteNode.d.ts +0 -36
  108. package/dist/mutate/deleteText.d.ts +0 -33
  109. package/dist/mutate/mergeNode.d.ts +0 -25
  110. package/dist/mutate/mergeTrackedMarks.d.ts +0 -29
  111. package/dist/plugin.d.ts +0 -25
  112. package/dist/steps/trackReplaceStep.d.ts +0 -21
  113. package/dist/steps/trackTransaction.d.ts +0 -17
  114. package/dist/types/change.d.ts +0 -76
  115. package/dist/types/pm.d.ts +0 -27
  116. package/dist/types/track.d.ts +0 -45
  117. package/dist/utils/logger.d.ts +0 -27
  118. package/dist/utils/uuidv4.d.ts +0 -16
@@ -0,0 +1,125 @@
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.trackChangesPlugin = exports.trackChangesPluginKey = void 0;
15
+ const prosemirror_state_1 = require("prosemirror-state");
16
+ const actions_1 = require("./actions");
17
+ const applyChanges_1 = require("./changes/applyChanges");
18
+ const findChanges_1 = require("./changes/findChanges");
19
+ const fixInconsistentChanges_1 = require("./changes/fixInconsistentChanges");
20
+ const updateChangeAttrs_1 = require("./changes/updateChangeAttrs");
21
+ const ChangeSet_1 = require("./ChangeSet");
22
+ const trackTransaction_1 = require("./steps/trackTransaction");
23
+ const track_1 = require("./types/track");
24
+ const logger_1 = require("./utils/logger");
25
+ exports.trackChangesPluginKey = new prosemirror_state_1.PluginKey('track-changes');
26
+ const trackChangesPlugin = (opts = { userID: 'anonymous:Anonymous' }) => {
27
+ const { userID, debug, skipTrsWithMetas = [] } = opts;
28
+ let editorView;
29
+ if (debug) {
30
+ (0, logger_1.enableDebug)(true);
31
+ }
32
+ return new prosemirror_state_1.Plugin({
33
+ key: exports.trackChangesPluginKey,
34
+ props: {
35
+ editable(state) {
36
+ var _a;
37
+ return ((_a = exports.trackChangesPluginKey.getState(state)) === null || _a === void 0 ? void 0 : _a.status) !== track_1.TrackChangesStatus.viewSnapshots;
38
+ },
39
+ },
40
+ state: {
41
+ init(_config, state) {
42
+ return {
43
+ status: track_1.TrackChangesStatus.enabled,
44
+ userID,
45
+ changeSet: (0, findChanges_1.findChanges)(state),
46
+ };
47
+ },
48
+ apply(tr, pluginState, _oldState, newState) {
49
+ const setUserID = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.setUserID);
50
+ const setStatus = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.setPluginStatus);
51
+ if (setUserID) {
52
+ return Object.assign(Object.assign({}, pluginState), { userID: setUserID });
53
+ }
54
+ else if (setStatus) {
55
+ return Object.assign(Object.assign({}, pluginState), { status: setStatus, changeSet: setStatus === track_1.TrackChangesStatus.disabled ? new ChangeSet_1.ChangeSet() : (0, findChanges_1.findChanges)(newState) });
56
+ }
57
+ else if (pluginState.status === track_1.TrackChangesStatus.disabled) {
58
+ return Object.assign(Object.assign({}, pluginState), { changeSet: new ChangeSet_1.ChangeSet() });
59
+ }
60
+ let { changeSet } = pluginState, rest = __rest(pluginState, ["changeSet"]);
61
+ if ((0, actions_1.getAction)(tr, actions_1.TrackChangesAction.refreshChanges)) {
62
+ changeSet = (0, findChanges_1.findChanges)(newState);
63
+ }
64
+ return Object.assign({ changeSet }, rest);
65
+ },
66
+ },
67
+ view(p) {
68
+ editorView = p;
69
+ return {
70
+ update: undefined,
71
+ destroy: undefined,
72
+ };
73
+ },
74
+ appendTransaction(trs, oldState, newState) {
75
+ const pluginState = exports.trackChangesPluginKey.getState(newState);
76
+ if (!pluginState || pluginState.status === track_1.TrackChangesStatus.disabled || !(editorView === null || editorView === void 0 ? void 0 : editorView.editable)) {
77
+ return null;
78
+ }
79
+ const { userID, changeSet } = pluginState;
80
+ let createdTr = newState.tr, docChanged = false;
81
+ logger_1.log.info('TRS', trs);
82
+ trs.forEach((tr) => {
83
+ const wasAppended = tr.getMeta('appendedTransaction');
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
+ (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')) {
92
+ createdTr = (0, trackTransaction_1.trackTransaction)(tr, oldState, createdTr, userID);
93
+ }
94
+ docChanged = docChanged || tr.docChanged;
95
+ const setChangeStatuses = (0, actions_1.getAction)(tr, actions_1.TrackChangesAction.setChangeStatuses);
96
+ if (setChangeStatuses) {
97
+ const { status, ids } = setChangeStatuses;
98
+ const changeTime = new Date().getTime();
99
+ ids.forEach((changeId) => {
100
+ const change = changeSet === null || changeSet === void 0 ? void 0 : changeSet.get(changeId);
101
+ if (change) {
102
+ createdTr = (0, updateChangeAttrs_1.updateChangeAttrs)(createdTr, change, Object.assign(Object.assign({}, change.dataTracked), { status, statusUpdateAt: changeTime, reviewedByID: userID }), oldState.schema);
103
+ }
104
+ });
105
+ }
106
+ else if ((0, actions_1.getAction)(tr, actions_1.TrackChangesAction.applyAndRemoveChanges)) {
107
+ const mapping = (0, applyChanges_1.applyAcceptedRejectedChanges)(createdTr, oldState.schema, changeSet.bothNodeChanges);
108
+ (0, applyChanges_1.applyAcceptedRejectedChanges)(createdTr, oldState.schema, changeSet.textChanges, mapping);
109
+ (0, actions_1.setAction)(createdTr, actions_1.TrackChangesAction.refreshChanges, true);
110
+ }
111
+ });
112
+ const changed = pluginState.changeSet.hasInconsistentData &&
113
+ (0, fixInconsistentChanges_1.fixInconsistentChanges)(pluginState.changeSet, userID, createdTr, oldState.schema);
114
+ if (changed) {
115
+ logger_1.log.warn('had to fix inconsistent changes in', createdTr);
116
+ }
117
+ if (docChanged || createdTr.docChanged || changed) {
118
+ createdTr.setMeta('origin', exports.trackChangesPluginKey);
119
+ return (0, actions_1.setAction)(createdTr, actions_1.TrackChangesAction.refreshChanges, true);
120
+ }
121
+ return null;
122
+ },
123
+ });
124
+ };
125
+ exports.trackChangesPlugin = trackChangesPlugin;
@@ -0,0 +1,72 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.trackReplaceAroundStep = void 0;
27
+ const prosemirror_model_1 = require("prosemirror-model");
28
+ const actions_1 = require("../actions");
29
+ const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
30
+ const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
31
+ const logger_1 = require("../utils/logger");
32
+ const trackUtils = __importStar(require("../utils/track-utils"));
33
+ function trackReplaceAroundStep(step, oldState, tr, newTr, attrs) {
34
+ logger_1.log.info('###### ReplaceAroundStep ######');
35
+ const { from, to, gapFrom, gapTo, insert, slice, structure, } = step;
36
+ const newStep = step.invert(oldState.doc);
37
+ const stepResult = newTr.maybeStep(newStep);
38
+ if (stepResult.failed) {
39
+ logger_1.log.error(`inverting ReplaceAroundStep failed: "${stepResult.failed}"`, newStep);
40
+ return [];
41
+ }
42
+ const gap = oldState.doc.slice(gapFrom, gapTo);
43
+ logger_1.log.info('RETAINED GAP CONTENT', gap);
44
+ const { sliceWasSplit, newSliceContent, steps: deleteSteps, } = (0, deleteAndMergeSplitNodes_1.deleteAndMergeSplitNodes)(from, to, { start: gapFrom, end: gapTo }, newTr.doc, newTr, oldState.schema, attrs, slice);
45
+ const steps = deleteSteps;
46
+ logger_1.log.info('TR: new steps after applying delete', [...newTr.steps]);
47
+ logger_1.log.info('DELETE STEPS: ', deleteSteps);
48
+ if (gap.size > 0 ||
49
+ (!structure && newSliceContent.size > 0) ||
50
+ tr.getMeta(actions_1.TrackChangesAction.updateMetaNode)) {
51
+ logger_1.log.info('newSliceContent', newSliceContent);
52
+ const openStart = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openStart;
53
+ const openEnd = slice.openStart !== slice.openEnd || newSliceContent.size === 0 ? 0 : slice.openEnd;
54
+ let insertedSlice = new prosemirror_model_1.Slice((0, setFragmentAsInserted_1.setFragmentAsInserted)(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema), openStart, openEnd);
55
+ if (gap.size > 0 || tr.getMeta(actions_1.TrackChangesAction.updateMetaNode)) {
56
+ logger_1.log.info('insertedSlice before inserted gap', insertedSlice);
57
+ insertedSlice = insertedSlice.insertAt(insertedSlice.size === 0 ? 0 : insert, gap.content);
58
+ logger_1.log.info('insertedSlice after inserted gap', insertedSlice);
59
+ }
60
+ deleteSteps.push({
61
+ type: 'insert-slice',
62
+ from: gapFrom,
63
+ to: gapTo,
64
+ slice: insertedSlice,
65
+ sliceWasSplit,
66
+ });
67
+ }
68
+ else {
69
+ }
70
+ return steps;
71
+ }
72
+ exports.trackReplaceAroundStep = trackReplaceAroundStep;
@@ -0,0 +1,81 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.trackReplaceStep = void 0;
27
+ const prosemirror_model_1 = require("prosemirror-model");
28
+ const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
29
+ const deleteAndMergeSplitNodes_1 = require("../mutate/deleteAndMergeSplitNodes");
30
+ const logger_1 = require("../utils/logger");
31
+ const trackUtils = __importStar(require("../utils/track-utils"));
32
+ function trackReplaceStep(step, oldState, newTr, attrs, stepResult, currentStepDoc) {
33
+ logger_1.log.info('###### ReplaceStep ######');
34
+ let selectionPos = 0;
35
+ const changeSteps = [];
36
+ step.getMap().forEach((fromA, toA, fromB, toB) => {
37
+ var _a, _b;
38
+ logger_1.log.info(`changed ranges: ${fromA} ${toA} ${fromB} ${toB}`);
39
+ const { slice } = step;
40
+ logger_1.log.info('TR: steps before applying delete', [...newTr.steps]);
41
+ if (stepResult.failed) {
42
+ logger_1.log.error(`invert ReplaceStep failed: "${stepResult.failed}"`);
43
+ return;
44
+ }
45
+ const { sliceWasSplit, newSliceContent, steps: deleteSteps, } = (0, deleteAndMergeSplitNodes_1.deleteAndMergeSplitNodes)(fromA, toA, undefined, currentStepDoc, newTr, oldState.schema, attrs, slice);
46
+ changeSteps.push(...deleteSteps);
47
+ logger_1.log.info('TR: steps after applying delete', [...newTr.steps]);
48
+ logger_1.log.info('DELETE STEPS: ', changeSteps);
49
+ function sameThingBackSpaced() {
50
+ if (changeSteps.length == 2 && newSliceContent.size > 0) {
51
+ const correspondingDeletion = changeSteps.find((step) => step.node.text === newSliceContent.content[0].text);
52
+ return correspondingDeletion;
53
+ }
54
+ return undefined;
55
+ }
56
+ const backSpacedText = sameThingBackSpaced();
57
+ if (backSpacedText) {
58
+ changeSteps.splice(changeSteps.indexOf(backSpacedText));
59
+ }
60
+ const textWasDeleted = !!changeSteps.length;
61
+ if (!backSpacedText && newSliceContent.size > 0) {
62
+ logger_1.log.info('newSliceContent', newSliceContent);
63
+ const openStart = slice.openStart !== slice.openEnd ? 0 : slice.openStart;
64
+ const openEnd = slice.openStart !== slice.openEnd ? 0 : slice.openEnd;
65
+ changeSteps.push({
66
+ type: 'insert-slice',
67
+ from: textWasDeleted ? fromB : toA,
68
+ to: textWasDeleted ? toB - 1 : toA,
69
+ sliceWasSplit,
70
+ slice: new prosemirror_model_1.Slice((0, setFragmentAsInserted_1.setFragmentAsInserted)(newSliceContent, trackUtils.createNewInsertAttrs(attrs), oldState.schema), openStart, openEnd),
71
+ });
72
+ }
73
+ else {
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;
77
+ }
78
+ });
79
+ return [changeSteps, selectionPos];
80
+ }
81
+ exports.trackReplaceStep = trackReplaceStep;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.trackTransaction = void 0;
4
+ const prosemirror_state_1 = require("prosemirror-state");
5
+ const prosemirror_transform_1 = require("prosemirror-transform");
6
+ const diffChangeSteps_1 = require("../change-steps/diffChangeSteps");
7
+ const processChangeSteps_1 = require("../change-steps/processChangeSteps");
8
+ const change_1 = require("../types/change");
9
+ const logger_1 = require("../utils/logger");
10
+ const trackReplaceAroundStep_1 = require("./trackReplaceAroundStep");
11
+ const trackReplaceStep_1 = require("./trackReplaceStep");
12
+ const getSelectionStaticConstructor = (sel) => Object.getPrototypeOf(sel).constructor;
13
+ const isHighlightMarkerNode = (node) => node && node.type === node.type.schema.nodes.highlight_marker;
14
+ function trackTransaction(tr, oldState, newTr, authorID) {
15
+ var _a, _b, _c, _d;
16
+ const emptyAttrs = {
17
+ authorID,
18
+ reviewedByID: null,
19
+ createdAt: tr.time,
20
+ updatedAt: tr.time,
21
+ statusUpdateAt: 0,
22
+ status: change_1.CHANGE_STATUS.pending,
23
+ };
24
+ const wasNodeSelection = tr.selection instanceof prosemirror_state_1.NodeSelection;
25
+ let iters = 0;
26
+ logger_1.log.info('ORIGINAL transaction', tr);
27
+ for (let i = tr.steps.length - 1; i >= 0; i--) {
28
+ const step = tr.steps[i];
29
+ logger_1.log.info('transaction step', step);
30
+ iters += 1;
31
+ if (iters > 20) {
32
+ console.error('@manuscripts/track-changes-plugin: Possible infinite loop in iterating tr.steps, tracking skipped!\n' +
33
+ 'This is probably an error with the library, please report back to maintainers with a reproduction if possible', newTr);
34
+ continue;
35
+ }
36
+ else if (!(step instanceof prosemirror_transform_1.ReplaceStep) && step.constructor.name === 'ReplaceStep') {
37
+ console.error('@manuscripts/track-changes-plugin: Multiple prosemirror-transform packages imported, alias/dedupe them ' +
38
+ 'or instanceof checks fail as well as creating new steps');
39
+ continue;
40
+ }
41
+ else if (step instanceof prosemirror_transform_1.ReplaceStep) {
42
+ const { slice } = step;
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
+ continue;
45
+ }
46
+ const newStep = step.invert(tr.docs[i]);
47
+ const stepResult = newTr.maybeStep(newStep);
48
+ let [steps, startPos] = (0, trackReplaceStep_1.trackReplaceStep)(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i]);
49
+ if (steps.length === 1) {
50
+ const step = steps[0];
51
+ if (isHighlightMarkerNode((step === null || step === void 0 ? void 0 : step.node) || ((_d = (_c = step === null || step === void 0 ? void 0 : step.slice) === null || _c === void 0 ? void 0 : _c.content) === null || _d === void 0 ? void 0 : _d.content[0]))) {
52
+ continue;
53
+ }
54
+ }
55
+ logger_1.log.info('CHANGES: ', steps);
56
+ const deleted = steps.filter((s) => s.type !== 'insert-slice');
57
+ const inserted = steps.filter((s) => s.type === 'insert-slice');
58
+ steps = (0, diffChangeSteps_1.diffChangeSteps)(deleted, inserted);
59
+ logger_1.log.info('DIFFED STEPS: ', steps);
60
+ const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(steps, startPos || tr.selection.head, newTr, emptyAttrs, oldState.schema);
61
+ if (!wasNodeSelection) {
62
+ const sel = getSelectionStaticConstructor(tr.selection);
63
+ const near = sel.near(newTr.doc.resolve(selectionPos), -1);
64
+ newTr.setSelection(near);
65
+ }
66
+ }
67
+ else if (step instanceof prosemirror_transform_1.ReplaceAroundStep) {
68
+ let steps = (0, trackReplaceAroundStep_1.trackReplaceAroundStep)(step, oldState, tr, newTr, emptyAttrs);
69
+ const deleted = steps.filter((s) => s.type !== 'insert-slice');
70
+ const inserted = steps.filter((s) => s.type === 'insert-slice');
71
+ logger_1.log.info('INSERT STEPS: ', inserted);
72
+ steps = (0, diffChangeSteps_1.diffChangeSteps)(deleted, inserted);
73
+ logger_1.log.info('DIFFED STEPS: ', steps);
74
+ const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(steps, tr.selection.from, newTr, emptyAttrs, oldState.schema);
75
+ }
76
+ tr.getMeta('inputType') && newTr.setMeta('inputType', tr.getMeta('inputType'));
77
+ tr.getMeta('uiEvent') && newTr.setMeta('uiEvent', tr.getMeta('uiEvent'));
78
+ }
79
+ if (wasNodeSelection) {
80
+ console.log('%c Getting into node select! ', 'background: #222; color: #bada55');
81
+ const mappedPos = newTr.mapping.map(tr.selection.from, -1);
82
+ const sel = getSelectionStaticConstructor(tr.selection);
83
+ newTr.setSelection(sel.create(newTr.doc, mappedPos));
84
+ }
85
+ logger_1.log.info('NEW transaction', newTr);
86
+ return newTr;
87
+ }
88
+ exports.trackTransaction = trackTransaction;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CHANGE_STATUS = exports.CHANGE_OPERATION = void 0;
4
+ var CHANGE_OPERATION;
5
+ (function (CHANGE_OPERATION) {
6
+ CHANGE_OPERATION["insert"] = "insert";
7
+ CHANGE_OPERATION["delete"] = "delete";
8
+ CHANGE_OPERATION["set_node_attributes"] = "set_attrs";
9
+ })(CHANGE_OPERATION = exports.CHANGE_OPERATION || (exports.CHANGE_OPERATION = {}));
10
+ var CHANGE_STATUS;
11
+ (function (CHANGE_STATUS) {
12
+ CHANGE_STATUS["accepted"] = "accepted";
13
+ CHANGE_STATUS["rejected"] = "rejected";
14
+ CHANGE_STATUS["pending"] = "pending";
15
+ })(CHANGE_STATUS = exports.CHANGE_STATUS || (exports.CHANGE_STATUS = {}));
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrackChangesStatus = void 0;
4
+ var TrackChangesStatus;
5
+ (function (TrackChangesStatus) {
6
+ TrackChangesStatus["enabled"] = "enabled";
7
+ TrackChangesStatus["viewSnapshots"] = "view-snapshots";
8
+ TrackChangesStatus["disabled"] = "disabled";
9
+ })(TrackChangesStatus = exports.TrackChangesStatus || (exports.TrackChangesStatus = {}));
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enableDebug = exports.log = exports.logger = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ exports.logger = (0, debug_1.default)('track');
9
+ exports.log = {
10
+ info(str, obj) {
11
+ if (obj) {
12
+ (0, exports.logger)(str, obj);
13
+ }
14
+ else {
15
+ (0, exports.logger)(str);
16
+ }
17
+ },
18
+ warn(str, obj) {
19
+ if (obj) {
20
+ (0, exports.logger)(`%c WARNING ${str}`, 'color: #f3f32c', obj);
21
+ }
22
+ else {
23
+ (0, exports.logger)(`%c WARNING ${str}`, 'color: #f3f32c');
24
+ }
25
+ },
26
+ error(str, obj) {
27
+ if (obj) {
28
+ (0, exports.logger)(`%c ERROR ${str}`, 'color: #ff4242', obj);
29
+ }
30
+ else {
31
+ (0, exports.logger)(`%c ERROR ${str}`, 'color: #ff4242');
32
+ }
33
+ },
34
+ };
35
+ const enableDebug = (enabled) => {
36
+ if (enabled) {
37
+ debug_1.default.enable('track');
38
+ }
39
+ else {
40
+ debug_1.default.disable();
41
+ }
42
+ };
43
+ exports.enableDebug = enableDebug;
@@ -0,0 +1,28 @@
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.createNewUpdateAttrs = exports.createNewDeleteAttrs = exports.createNewInsertAttrs = void 0;
15
+ const change_1 = require("../types/change");
16
+ function createNewInsertAttrs(attrs) {
17
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.insert });
18
+ }
19
+ exports.createNewInsertAttrs = createNewInsertAttrs;
20
+ function createNewDeleteAttrs(attrs) {
21
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.delete });
22
+ }
23
+ exports.createNewDeleteAttrs = createNewDeleteAttrs;
24
+ function createNewUpdateAttrs(attrs, oldAttrs) {
25
+ const { dataTracked } = oldAttrs, restAttrs = __rest(oldAttrs, ["dataTracked"]);
26
+ return Object.assign(Object.assign({}, attrs), { operation: change_1.CHANGE_OPERATION.set_node_attributes, oldAttrs: JSON.parse(JSON.stringify(restAttrs)) });
27
+ }
28
+ exports.createNewUpdateAttrs = createNewUpdateAttrs;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uuidv4 = void 0;
4
+ function uuidv4() {
5
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
6
+ const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
7
+ return v.toString(16);
8
+ });
9
+ }
10
+ exports.uuidv4 = uuidv4;
@@ -0,0 +1,150 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ 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");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ 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");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ChangeSet_instances, _ChangeSet_changes, _ChangeSet_isSameNodeChange, _ChangeSet_isNotPendingOrDeleted;
13
+ import { CHANGE_OPERATION, CHANGE_STATUS, } from './types/change';
14
+ import { log } from './utils/logger';
15
+ export class ChangeSet {
16
+ constructor(changes = []) {
17
+ _ChangeSet_instances.add(this);
18
+ _ChangeSet_changes.set(this, void 0);
19
+ __classPrivateFieldSet(this, _ChangeSet_changes, changes, "f");
20
+ }
21
+ get changes() {
22
+ const iteratedIds = new Set();
23
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => {
24
+ const valid = !iteratedIds.has(c.dataTracked.id) && ChangeSet.isValidDataTracked(c.dataTracked);
25
+ iteratedIds.add(c.dataTracked.id);
26
+ return valid;
27
+ });
28
+ }
29
+ get invalidChanges() {
30
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => !this.changes.find((cc) => c.id === cc.id));
31
+ }
32
+ get changeTree() {
33
+ const rootNodes = [];
34
+ let currentNodeChange;
35
+ this.changes.forEach((c) => {
36
+ if (currentNodeChange &&
37
+ (c.from >= currentNodeChange.to ||
38
+ c.dataTracked.statusUpdateAt !== currentNodeChange.dataTracked.statusUpdateAt)) {
39
+ rootNodes.push(currentNodeChange);
40
+ currentNodeChange = undefined;
41
+ }
42
+ if (currentNodeChange &&
43
+ c.from < currentNodeChange.to &&
44
+ !(__classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isSameNodeChange).call(this, currentNodeChange, c) && __classPrivateFieldGet(this, _ChangeSet_instances, "m", _ChangeSet_isNotPendingOrDeleted).call(this, currentNodeChange))) {
45
+ currentNodeChange.children.push(c);
46
+ }
47
+ else if (c.type === 'node-change') {
48
+ currentNodeChange = Object.assign(Object.assign({}, c), { children: [] });
49
+ }
50
+ else {
51
+ rootNodes.push(c);
52
+ }
53
+ });
54
+ if (currentNodeChange) {
55
+ rootNodes.push(currentNodeChange);
56
+ }
57
+ return rootNodes;
58
+ }
59
+ get pending() {
60
+ return this.changeTree.filter((c) => c.dataTracked.status === CHANGE_STATUS.pending);
61
+ }
62
+ get accepted() {
63
+ return this.changeTree.filter((c) => c.dataTracked.status === CHANGE_STATUS.accepted);
64
+ }
65
+ get rejected() {
66
+ return this.changeTree.filter((c) => c.dataTracked.status === CHANGE_STATUS.rejected);
67
+ }
68
+ get textChanges() {
69
+ return this.changes.filter((c) => c.type === 'text-change');
70
+ }
71
+ get nodeChanges() {
72
+ return this.changes.filter((c) => c.type === 'node-change');
73
+ }
74
+ get nodeAttrChanges() {
75
+ return this.changes.filter((c) => c.type === 'node-attr-change');
76
+ }
77
+ get bothNodeChanges() {
78
+ return this.changes.filter((c) => c.type === 'node-change' || c.type === 'node-attr-change');
79
+ }
80
+ get isEmpty() {
81
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").length === 0;
82
+ }
83
+ get hasInconsistentData() {
84
+ return this.hasDuplicateIds || this.hasIncompleteAttrs;
85
+ }
86
+ get hasDuplicateIds() {
87
+ const iterated = new Set();
88
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").some((c) => {
89
+ if (iterated.has(c.id)) {
90
+ return true;
91
+ }
92
+ iterated.add(c.id);
93
+ });
94
+ }
95
+ get hasIncompleteAttrs() {
96
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").some((c) => !ChangeSet.isValidDataTracked(c.dataTracked));
97
+ }
98
+ get(id) {
99
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id);
100
+ }
101
+ getIn(ids) {
102
+ return ids.map((id) => __classPrivateFieldGet(this, _ChangeSet_changes, "f").find((c) => c.id === id)).filter((c) => c !== undefined);
103
+ }
104
+ getNotIn(ids) {
105
+ return __classPrivateFieldGet(this, _ChangeSet_changes, "f").filter((c) => ids.includes(c.id));
106
+ }
107
+ static flattenTreeToIds(changes) {
108
+ return changes.flatMap((c) => (this.isNodeChange(c) ? [c.id, ...c.children.map((c) => c.id)] : c.id));
109
+ }
110
+ static shouldDeleteChange(change) {
111
+ const { status, operation } = change.dataTracked;
112
+ return ((operation === CHANGE_OPERATION.insert && status === CHANGE_STATUS.rejected) ||
113
+ (operation === CHANGE_OPERATION.delete && status === CHANGE_STATUS.accepted));
114
+ }
115
+ static isValidDataTracked(dataTracked = {}) {
116
+ if ('dataTracked' in dataTracked) {
117
+ log.warn('passed "dataTracked" as property to isValidTrackedAttrs()', dataTracked);
118
+ }
119
+ const trackedKeys = [
120
+ 'id',
121
+ 'authorID',
122
+ 'operation',
123
+ 'status',
124
+ 'createdAt',
125
+ 'updatedAt',
126
+ ];
127
+ const optionalKeys = ['reviewedByID'];
128
+ const entries = Object.entries(dataTracked).filter(([key, val]) => trackedKeys.includes(key));
129
+ const optionalEntries = Object.entries(dataTracked).filter(([key, val]) => optionalKeys.includes(key));
130
+ return (entries.length === trackedKeys.length &&
131
+ entries.every(([key, val]) => trackedKeys.includes(key) && val !== undefined) &&
132
+ optionalEntries.every(([key, val]) => optionalKeys.includes(key) && val !== undefined) &&
133
+ (dataTracked.id || '').length > 0);
134
+ }
135
+ static isTextChange(change) {
136
+ return change.type === 'text-change';
137
+ }
138
+ static isNodeChange(change) {
139
+ return change.type === 'node-change';
140
+ }
141
+ static isNodeAttrChange(change) {
142
+ return change.type === 'node-attr-change';
143
+ }
144
+ }
145
+ _ChangeSet_changes = new WeakMap(), _ChangeSet_instances = new WeakSet(), _ChangeSet_isSameNodeChange = function _ChangeSet_isSameNodeChange(currentChange, nextChange) {
146
+ return currentChange.from === nextChange.from && currentChange.to === nextChange.to;
147
+ }, _ChangeSet_isNotPendingOrDeleted = function _ChangeSet_isNotPendingOrDeleted(change) {
148
+ return (change.dataTracked.operation !== CHANGE_OPERATION.delete &&
149
+ change.dataTracked.status !== CHANGE_STATUS.pending);
150
+ };
@@ -0,0 +1,17 @@
1
+ export var TrackChangesAction;
2
+ (function (TrackChangesAction) {
3
+ TrackChangesAction["skipTrack"] = "track-changes-skip-tracking";
4
+ TrackChangesAction["setUserID"] = "track-changes-set-user-id";
5
+ TrackChangesAction["setPluginStatus"] = "track-changes-set-track-status";
6
+ TrackChangesAction["setChangeStatuses"] = "track-changes-set-change-statuses";
7
+ TrackChangesAction["refreshChanges"] = "track-changes-refresh-changes";
8
+ TrackChangesAction["applyAndRemoveChanges"] = "track-changes-apply-remove-changes";
9
+ TrackChangesAction["updateMetaNode"] = "track-changes-update-meta-node";
10
+ })(TrackChangesAction || (TrackChangesAction = {}));
11
+ export function getAction(tr, action) {
12
+ return tr.getMeta(action);
13
+ }
14
+ export function setAction(tr, action, payload) {
15
+ return tr.setMeta(action, payload);
16
+ }
17
+ export const skipTracking = (tr) => setAction(tr, TrackChangesAction.skipTrack, true);