@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.
Files changed (118) hide show
  1. package/dist/cjs/ChangeSet.js +155 -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 +141 -0
  6. package/dist/cjs/changes/applyChanges.js +81 -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 +77 -0
  12. package/dist/cjs/compute/setFragmentAsInserted.js +53 -0
  13. package/dist/cjs/compute/splitSliceIntoMergedParts.js +57 -0
  14. package/dist/cjs/index.js +41 -0
  15. package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +105 -0
  16. package/dist/cjs/mutate/deleteNode.js +43 -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 +118 -0
  21. package/dist/cjs/steps/trackReplaceAroundStep.js +72 -0
  22. package/dist/cjs/steps/trackReplaceStep.js +79 -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 +151 -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 +114 -0
  36. package/dist/es/changes/applyChanges.js +77 -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 +67 -0
  42. package/dist/es/compute/setFragmentAsInserted.js +49 -0
  43. package/dist/es/compute/splitSliceIntoMergedParts.js +53 -0
  44. package/dist/es/index.js +7 -0
  45. package/dist/es/mutate/deleteAndMergeSplitNodes.js +78 -0
  46. package/dist/es/mutate/deleteNode.js +38 -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 +114 -0
  51. package/dist/es/steps/trackReplaceAroundStep.js +45 -0
  52. package/dist/es/steps/trackReplaceStep.js +52 -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 +61 -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 +18 -39
  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,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateChangeChildrenAttributes = exports.updateChangeAttrs = void 0;
4
+ const logger_1 = require("../utils/logger");
5
+ const ChangeSet_1 = require("../ChangeSet");
6
+ const nodeHelpers_1 = require("../compute/nodeHelpers");
7
+ function updateChangeAttrs(tr, change, trackedAttrs, schema) {
8
+ const node = tr.doc.nodeAt(change.from);
9
+ if (!node) {
10
+ logger_1.log.error('updateChangeAttrs: no node at the from of change ', change);
11
+ return tr;
12
+ }
13
+ const { operation } = trackedAttrs;
14
+ const oldTrackData = change.type === 'text-change' ? (0, nodeHelpers_1.getTextNodeTrackedMarkData)(node, schema) : (0, nodeHelpers_1.getBlockInlineTrackedData)(node);
15
+ if (!operation) {
16
+ logger_1.log.warn('updateChangeAttrs: unable to determine operation of change ', change);
17
+ }
18
+ else if (!oldTrackData) {
19
+ logger_1.log.warn('updateChangeAttrs: no old dataTracked for change ', change);
20
+ }
21
+ if (change.type === 'text-change') {
22
+ const oldMark = node.marks.find((m) => m.type === schema.marks.tracked_insert || m.type === schema.marks.tracked_delete);
23
+ if (!oldMark) {
24
+ logger_1.log.warn('updateChangeAttrs: no track marks for a text-change ', change);
25
+ return tr;
26
+ }
27
+ tr.addMark(change.from, change.to, oldMark.type.create(Object.assign(Object.assign({}, oldMark.attrs), { dataTracked: Object.assign(Object.assign({}, oldTrackData), trackedAttrs) })));
28
+ }
29
+ else if ((change.type === 'node-change' || change.type === 'node-attr-change') && !operation) {
30
+ tr.setNodeMarkup(change.from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: null }), node.marks);
31
+ }
32
+ else if (change.type === 'node-change' || change.type === 'node-attr-change') {
33
+ const trackedDataSource = (0, nodeHelpers_1.getBlockInlineTrackedData)(node) || [];
34
+ const targetDataTracked = trackedDataSource.find((t) => change.id === t.id);
35
+ const newDataTracked = trackedDataSource.map((oldTrack) => {
36
+ if (targetDataTracked) {
37
+ if (oldTrack.id === targetDataTracked.id) {
38
+ return Object.assign(Object.assign({}, oldTrack), trackedAttrs);
39
+ }
40
+ return oldTrack;
41
+ }
42
+ if (oldTrack.operation === operation) {
43
+ return Object.assign(Object.assign({}, oldTrack), trackedAttrs);
44
+ }
45
+ return oldTrack;
46
+ });
47
+ tr.setNodeMarkup(change.from, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: newDataTracked.length === 0 ? null : newDataTracked }), node.marks);
48
+ }
49
+ return tr;
50
+ }
51
+ exports.updateChangeAttrs = updateChangeAttrs;
52
+ function updateChangeChildrenAttributes(changes, tr, mapping) {
53
+ changes.forEach((c) => {
54
+ if (c.type === 'node-change' && !ChangeSet_1.ChangeSet.shouldDeleteChange(c)) {
55
+ const from = mapping.map(c.from);
56
+ const node = tr.doc.nodeAt(from);
57
+ if (!node) {
58
+ return;
59
+ }
60
+ const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: null });
61
+ tr.setNodeMarkup(from, undefined, attrs, node.marks);
62
+ }
63
+ });
64
+ }
65
+ exports.updateChangeChildrenAttributes = updateChangeChildrenAttributes;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.refreshChanges = exports.applyAndRemoveChanges = exports.setUserID = exports.setChangeStatuses = exports.setTrackingStatus = void 0;
4
+ const actions_1 = require("./actions");
5
+ const plugin_1 = require("./plugin");
6
+ const track_1 = require("./types/track");
7
+ const setTrackingStatus = (status) => (state, dispatch) => {
8
+ var _a;
9
+ const currentStatus = (_a = plugin_1.trackChangesPluginKey.getState(state)) === null || _a === void 0 ? void 0 : _a.status;
10
+ if (currentStatus) {
11
+ let newStatus = status;
12
+ if (newStatus === undefined) {
13
+ newStatus =
14
+ currentStatus === track_1.TrackChangesStatus.enabled
15
+ ? track_1.TrackChangesStatus.disabled
16
+ : track_1.TrackChangesStatus.enabled;
17
+ }
18
+ dispatch && dispatch((0, actions_1.setAction)(state.tr, actions_1.TrackChangesAction.setPluginStatus, newStatus));
19
+ return true;
20
+ }
21
+ return false;
22
+ };
23
+ exports.setTrackingStatus = setTrackingStatus;
24
+ const setChangeStatuses = (status, ids) => (state, dispatch) => {
25
+ dispatch &&
26
+ dispatch((0, actions_1.setAction)(state.tr, actions_1.TrackChangesAction.setChangeStatuses, {
27
+ status,
28
+ ids,
29
+ }));
30
+ return true;
31
+ };
32
+ exports.setChangeStatuses = setChangeStatuses;
33
+ const setUserID = (userID) => (state, dispatch) => {
34
+ dispatch && dispatch((0, actions_1.setAction)(state.tr, actions_1.TrackChangesAction.setUserID, userID));
35
+ return true;
36
+ };
37
+ exports.setUserID = setUserID;
38
+ const applyAndRemoveChanges = () => (state, dispatch) => {
39
+ dispatch && dispatch((0, actions_1.setAction)(state.tr, actions_1.TrackChangesAction.applyAndRemoveChanges, true));
40
+ return true;
41
+ };
42
+ exports.applyAndRemoveChanges = applyAndRemoveChanges;
43
+ const refreshChanges = () => (state, dispatch) => {
44
+ dispatch && dispatch((0, actions_1.setAction)(state.tr, actions_1.TrackChangesAction.refreshChanges, true));
45
+ return true;
46
+ };
47
+ exports.refreshChanges = refreshChanges;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMergeableMarkTrackedAttrs = exports.shouldMergeTrackedAttributes = exports.equalMarks = exports.getNodeTrackedData = exports.getBlockInlineTrackedData = exports.getTextNodeTrackedMarkData = exports.addTrackIdIfDoesntExist = void 0;
4
+ const change_1 = require("../types/change");
5
+ const logger_1 = require("../utils/logger");
6
+ const uuidv4_1 = require("../utils/uuidv4");
7
+ function addTrackIdIfDoesntExist(attrs) {
8
+ if (!attrs.id) {
9
+ return Object.assign({ id: (0, uuidv4_1.uuidv4)() }, attrs);
10
+ }
11
+ return attrs;
12
+ }
13
+ exports.addTrackIdIfDoesntExist = addTrackIdIfDoesntExist;
14
+ function getTextNodeTrackedMarkData(node, schema) {
15
+ if (!node || !node.isText) {
16
+ return undefined;
17
+ }
18
+ const marksTrackedData = [];
19
+ node.marks.forEach((mark) => {
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;
24
+ marksTrackedData.push(Object.assign(Object.assign({}, mark.attrs.dataTracked), { operation }));
25
+ }
26
+ });
27
+ if (marksTrackedData.length > 1) {
28
+ logger_1.log.warn('inline node with more than 1 of tracked marks', marksTrackedData);
29
+ }
30
+ return marksTrackedData[0] || undefined;
31
+ }
32
+ exports.getTextNodeTrackedMarkData = getTextNodeTrackedMarkData;
33
+ function getBlockInlineTrackedData(node) {
34
+ const { dataTracked } = node.attrs;
35
+ if (dataTracked && !Array.isArray(dataTracked)) {
36
+ return [dataTracked];
37
+ }
38
+ return dataTracked;
39
+ }
40
+ exports.getBlockInlineTrackedData = getBlockInlineTrackedData;
41
+ function getNodeTrackedData(node, schema) {
42
+ let tracked;
43
+ if (node && !node.isText) {
44
+ tracked = getBlockInlineTrackedData(node);
45
+ }
46
+ else if (node === null || node === void 0 ? void 0 : node.isText) {
47
+ tracked = getTextNodeTrackedMarkData(node, schema);
48
+ }
49
+ if (tracked && !Array.isArray(tracked)) {
50
+ tracked = [tracked];
51
+ }
52
+ return tracked;
53
+ }
54
+ exports.getNodeTrackedData = getNodeTrackedData;
55
+ function equalMarks(n1, n2) {
56
+ return (n1.marks.length === n2.marks.length &&
57
+ n1.marks.every((mark) => n1.marks.find((m) => m.type === mark.type)));
58
+ }
59
+ exports.equalMarks = equalMarks;
60
+ function shouldMergeTrackedAttributes(left, right) {
61
+ if (!left || !right) {
62
+ logger_1.log.warn('passed undefined dataTracked attributes to shouldMergeTrackedAttributes', {
63
+ left,
64
+ right,
65
+ });
66
+ return false;
67
+ }
68
+ return (left.status === right.status &&
69
+ left.operation === right.operation &&
70
+ left.authorID === right.authorID);
71
+ }
72
+ exports.shouldMergeTrackedAttributes = shouldMergeTrackedAttributes;
73
+ function getMergeableMarkTrackedAttrs(node, attrs, schema) {
74
+ const nodeAttrs = getTextNodeTrackedMarkData(node, schema);
75
+ return nodeAttrs && shouldMergeTrackedAttributes(nodeAttrs, attrs) ? nodeAttrs : null;
76
+ }
77
+ exports.getMergeableMarkTrackedAttrs = getMergeableMarkTrackedAttrs;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setFragmentAsInserted = void 0;
4
+ const prosemirror_model_1 = require("prosemirror-model");
5
+ const logger_1 = require("../utils/logger");
6
+ const change_1 = require("../types/change");
7
+ const nodeHelpers_1 = require("./nodeHelpers");
8
+ function markInlineNodeChange(node, newTrackAttrs, schema) {
9
+ const filtered = node.marks.filter((m) => m.type !== schema.marks.tracked_insert && m.type !== schema.marks.tracked_delete);
10
+ const mark = newTrackAttrs.operation === change_1.CHANGE_OPERATION.insert
11
+ ? schema.marks.tracked_insert
12
+ : schema.marks.tracked_delete;
13
+ const createdMark = mark.create({
14
+ dataTracked: (0, nodeHelpers_1.addTrackIdIfDoesntExist)(newTrackAttrs),
15
+ });
16
+ return node.mark(filtered.concat(createdMark));
17
+ }
18
+ function loopContentAndMergeText(content, newTrackAttrs, schema) {
19
+ var _a;
20
+ const updatedChildren = [];
21
+ for (let i = 0; i < content.childCount; i += 1) {
22
+ const recursed = recurseNodeContent(content.child(i), newTrackAttrs, schema);
23
+ const prev = i > 0 ? updatedChildren[i - 1] : null;
24
+ if ((prev === null || prev === void 0 ? void 0 : prev.isText) &&
25
+ recursed.isText &&
26
+ (0, nodeHelpers_1.equalMarks)(prev, recursed) &&
27
+ ((_a = (0, nodeHelpers_1.getTextNodeTrackedMarkData)(prev, schema)) === null || _a === void 0 ? void 0 : _a.operation) === change_1.CHANGE_OPERATION.insert) {
28
+ updatedChildren.splice(i - 1, 1, schema.text('' + prev.text + recursed.text, prev.marks));
29
+ }
30
+ else {
31
+ updatedChildren.push(recursed);
32
+ }
33
+ }
34
+ return updatedChildren;
35
+ }
36
+ function recurseNodeContent(node, newTrackAttrs, schema) {
37
+ if (node.isText) {
38
+ return markInlineNodeChange(node, newTrackAttrs, schema);
39
+ }
40
+ else if (node.isBlock || node.isInline) {
41
+ const updatedChildren = loopContentAndMergeText(node.content, newTrackAttrs, schema);
42
+ return node.type.create(Object.assign(Object.assign({}, node.attrs), { dataTracked: [(0, nodeHelpers_1.addTrackIdIfDoesntExist)(newTrackAttrs)] }), prosemirror_model_1.Fragment.fromArray(updatedChildren), node.marks);
43
+ }
44
+ else {
45
+ logger_1.log.error(`unhandled node type: "${node.type.name}"`, node);
46
+ return node;
47
+ }
48
+ }
49
+ function setFragmentAsInserted(inserted, insertAttrs, schema) {
50
+ const updatedInserted = loopContentAndMergeText(inserted, insertAttrs, schema);
51
+ return updatedInserted.length === 0 ? prosemirror_model_1.Fragment.empty : prosemirror_model_1.Fragment.fromArray(updatedInserted);
52
+ }
53
+ exports.setFragmentAsInserted = setFragmentAsInserted;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.splitSliceIntoMergedParts = void 0;
4
+ const prosemirror_model_1 = require("prosemirror-model");
5
+ function getMergedNode(node, currentDepth, depth, first) {
6
+ if (currentDepth === depth) {
7
+ return {
8
+ mergedNodeContent: node.content,
9
+ unmergedContent: undefined,
10
+ };
11
+ }
12
+ const result = [];
13
+ let merged = prosemirror_model_1.Fragment.empty;
14
+ node.content.forEach((n, _, i) => {
15
+ if ((first && i === 0) || (!first && i === node.childCount - 1)) {
16
+ const { mergedNodeContent, unmergedContent } = getMergedNode(n, currentDepth + 1, depth, first);
17
+ merged = mergedNodeContent;
18
+ if (unmergedContent) {
19
+ result.push(...unmergedContent.content);
20
+ }
21
+ }
22
+ else {
23
+ result.push(n);
24
+ }
25
+ });
26
+ return {
27
+ mergedNodeContent: merged,
28
+ unmergedContent: result.length > 0 ? prosemirror_model_1.Fragment.fromArray(result) : undefined,
29
+ };
30
+ }
31
+ function splitSliceIntoMergedParts(insertSlice, mergeEqualSides = false) {
32
+ const { openStart, openEnd, content: { firstChild, lastChild, content: nodes }, } = insertSlice;
33
+ let updatedSliceNodes = nodes;
34
+ const mergeSides = openStart !== openEnd || mergeEqualSides;
35
+ const firstMergedNode = openStart > 0 && mergeSides && firstChild
36
+ ? getMergedNode(firstChild, 1, openStart, true)
37
+ : undefined;
38
+ const lastMergedNode = openEnd > 0 && mergeSides && lastChild ? getMergedNode(lastChild, 1, openEnd, false) : undefined;
39
+ if (firstMergedNode) {
40
+ updatedSliceNodes = updatedSliceNodes.slice(1);
41
+ if (firstMergedNode.unmergedContent) {
42
+ updatedSliceNodes = [...firstMergedNode.unmergedContent.content, ...updatedSliceNodes];
43
+ }
44
+ }
45
+ if (lastMergedNode) {
46
+ updatedSliceNodes = updatedSliceNodes.slice(0, -1);
47
+ if (lastMergedNode.unmergedContent) {
48
+ updatedSliceNodes = [...updatedSliceNodes, ...lastMergedNode.unmergedContent.content];
49
+ }
50
+ }
51
+ return {
52
+ updatedSliceNodes,
53
+ firstMergedNode,
54
+ lastMergedNode,
55
+ };
56
+ }
57
+ exports.splitSliceIntoMergedParts = splitSliceIntoMergedParts;
@@ -0,0 +1,41 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
26
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.ChangeSet = exports.enableDebug = exports.trackCommands = exports.skipTracking = exports.trackChangesPlugin = exports.trackChangesPluginKey = void 0;
30
+ var plugin_1 = require("./plugin");
31
+ Object.defineProperty(exports, "trackChangesPluginKey", { enumerable: true, get: function () { return plugin_1.trackChangesPluginKey; } });
32
+ Object.defineProperty(exports, "trackChangesPlugin", { enumerable: true, get: function () { return plugin_1.trackChangesPlugin; } });
33
+ var actions_1 = require("./actions");
34
+ Object.defineProperty(exports, "skipTracking", { enumerable: true, get: function () { return actions_1.skipTracking; } });
35
+ exports.trackCommands = __importStar(require("./commands"));
36
+ var logger_1 = require("./utils/logger");
37
+ Object.defineProperty(exports, "enableDebug", { enumerable: true, get: function () { return logger_1.enableDebug; } });
38
+ var ChangeSet_1 = require("./ChangeSet");
39
+ Object.defineProperty(exports, "ChangeSet", { enumerable: true, get: function () { return ChangeSet_1.ChangeSet; } });
40
+ __exportStar(require("./types/change"), exports);
41
+ __exportStar(require("./types/track"), exports);
@@ -0,0 +1,105 @@
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.deleteAndMergeSplitNodes = void 0;
27
+ const prosemirror_model_1 = require("prosemirror-model");
28
+ const splitSliceIntoMergedParts_1 = require("../compute/splitSliceIntoMergedParts");
29
+ const setFragmentAsInserted_1 = require("../compute/setFragmentAsInserted");
30
+ const trackUtils = __importStar(require("../utils/track-utils"));
31
+ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackAttrs, insertSlice) {
32
+ const steps = [];
33
+ if (from === to) {
34
+ return {
35
+ newSliceContent: insertSlice.content,
36
+ sliceWasSplit: false,
37
+ steps,
38
+ };
39
+ }
40
+ const { openStart, openEnd } = insertSlice;
41
+ const { updatedSliceNodes, firstMergedNode, lastMergedNode } = (0, splitSliceIntoMergedParts_1.splitSliceIntoMergedParts)(insertSlice, gap !== undefined);
42
+ let mergingStartSide = true;
43
+ startDoc.nodesBetween(from, to, (node, pos) => {
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));
48
+ if (nodeEnd > from && !wasWithinGap) {
49
+ const nodeCompletelyDeleted = pos >= from && nodeEnd <= to;
50
+ const endTokenDeleted = nodeEnd <= to;
51
+ const startTokenDeleted = pos >= from;
52
+ if (node.isText ||
53
+ (!endTokenDeleted && startTokenDeleted) ||
54
+ (endTokenDeleted && !startTokenDeleted)) {
55
+ if (!endTokenDeleted && startTokenDeleted) {
56
+ mergingStartSide = false;
57
+ }
58
+ const depth = newTr.doc.resolve(pos).depth;
59
+ const mergeContent = mergingStartSide
60
+ ? firstMergedNode === null || firstMergedNode === void 0 ? void 0 : firstMergedNode.mergedNodeContent
61
+ : lastMergedNode === null || lastMergedNode === void 0 ? void 0 : lastMergedNode.mergedNodeContent;
62
+ const mergeStartNode = endTokenDeleted && openStart > 0 && depth === openStart && mergeContent !== undefined;
63
+ const mergeEndNode = startTokenDeleted && openEnd > 0 && depth === openEnd && mergeContent !== undefined;
64
+ if (mergeStartNode || mergeEndNode) {
65
+ steps.push({
66
+ type: 'merge-fragment',
67
+ pos,
68
+ mergePos: mergeStartNode ? nodeEnd - openStart : pos + openEnd,
69
+ from,
70
+ to,
71
+ node,
72
+ fragment: (0, setFragmentAsInserted_1.setFragmentAsInserted)(mergeContent, trackUtils.createNewInsertAttrs(trackAttrs), schema),
73
+ });
74
+ }
75
+ else if (node.isText) {
76
+ steps.push({
77
+ type: 'delete-text',
78
+ pos,
79
+ from: Math.max(pos, from),
80
+ to: Math.min(nodeEnd, to),
81
+ node,
82
+ });
83
+ }
84
+ else if (startTokenDeleted) {
85
+ }
86
+ }
87
+ else if (nodeCompletelyDeleted) {
88
+ steps.push({
89
+ type: 'delete-node',
90
+ pos,
91
+ nodeEnd,
92
+ node,
93
+ });
94
+ }
95
+ }
96
+ });
97
+ return {
98
+ sliceWasSplit: !!(firstMergedNode || lastMergedNode),
99
+ newSliceContent: updatedSliceNodes
100
+ ? prosemirror_model_1.Fragment.fromArray(updatedSliceNodes)
101
+ : insertSlice.content,
102
+ steps,
103
+ };
104
+ }
105
+ exports.deleteAndMergeSplitNodes = deleteAndMergeSplitNodes;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteOrSetNodeDeleted = exports.deleteNode = void 0;
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
+ const nodeHelpers_1 = require("../compute/nodeHelpers");
9
+ function deleteNode(node, pos, tr) {
10
+ var _a;
11
+ 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
+ const resPos = tr.doc.resolve(pos);
18
+ const canMergeToNodeAbove = resPos.parent !== tr.doc && resPos.nodeBefore && node.isBlock && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.isText);
19
+ if (canMergeToNodeAbove) {
20
+ return tr.replaceWith(pos - 1, pos + 1, prosemirror_model_1.Fragment.empty);
21
+ }
22
+ else {
23
+ return tr.delete(pos, pos + node.nodeSize);
24
+ }
25
+ }
26
+ exports.deleteNode = deleteNode;
27
+ function deleteOrSetNodeDeleted(node, pos, newTr, deleteAttrs) {
28
+ 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);
30
+ const deleted = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.delete);
31
+ const updated = dataTracked === null || dataTracked === void 0 ? void 0 : dataTracked.find((d) => d.operation === change_1.CHANGE_OPERATION.set_node_attributes);
32
+ if (inserted && inserted.authorID === deleteAttrs.authorID) {
33
+ return deleteNode(node, pos, newTr);
34
+ }
35
+ if (!newTr.doc.nodeAt(pos)) {
36
+ logger_1.log.error(`deleteOrSetNodeDeleted: no node found for deletion`, { pos, node, newTr });
37
+ return;
38
+ }
39
+ const newDeleted = deleted
40
+ ? Object.assign(Object.assign({}, deleted), { updatedAt: deleteAttrs.updatedAt }) : (0, nodeHelpers_1.addTrackIdIfDoesntExist)(deleteAttrs);
41
+ newTr.setNodeMarkup(pos, undefined, Object.assign(Object.assign({}, node.attrs), { dataTracked: updated ? [newDeleted, updated] : [newDeleted] }), node.marks);
42
+ }
43
+ exports.deleteOrSetNodeDeleted = deleteOrSetNodeDeleted;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteTextIfInserted = void 0;
4
+ const prosemirror_model_1 = require("prosemirror-model");
5
+ const nodeHelpers_1 = require("../compute/nodeHelpers");
6
+ function deleteTextIfInserted(node, pos, newTr, schema, deleteAttrs, from, to) {
7
+ const start = from ? Math.max(pos, from) : pos;
8
+ const nodeEnd = pos + node.nodeSize;
9
+ const end = to ? Math.min(nodeEnd, to) : nodeEnd;
10
+ if (node.marks.find((m) => m.type === schema.marks.tracked_insert)) {
11
+ newTr.replaceWith(start, end, prosemirror_model_1.Fragment.empty);
12
+ return start;
13
+ }
14
+ else {
15
+ const leftNode = newTr.doc.resolve(start).nodeBefore;
16
+ const leftMarks = (0, nodeHelpers_1.getMergeableMarkTrackedAttrs)(leftNode, deleteAttrs, schema);
17
+ const rightNode = newTr.doc.resolve(end).nodeAfter;
18
+ const rightMarks = (0, nodeHelpers_1.getMergeableMarkTrackedAttrs)(rightNode, deleteAttrs, schema);
19
+ const fromStartOfMark = start - (leftNode && leftMarks ? leftNode.nodeSize : 0);
20
+ const toEndOfMark = end + (rightNode && rightMarks ? rightNode.nodeSize : 0);
21
+ const createdAt = Math.min((leftMarks === null || leftMarks === void 0 ? void 0 : leftMarks.createdAt) || Number.MAX_VALUE, (rightMarks === null || rightMarks === void 0 ? void 0 : rightMarks.createdAt) || Number.MAX_VALUE, deleteAttrs.createdAt);
22
+ const dataTracked = (0, nodeHelpers_1.addTrackIdIfDoesntExist)(Object.assign(Object.assign(Object.assign(Object.assign({}, leftMarks), rightMarks), deleteAttrs), { createdAt }));
23
+ newTr.addMark(fromStartOfMark, toEndOfMark, schema.marks.tracked_delete.create({
24
+ dataTracked,
25
+ }));
26
+ return toEndOfMark;
27
+ }
28
+ }
29
+ exports.deleteTextIfInserted = deleteTextIfInserted;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeNode = void 0;
4
+ const prosemirror_model_1 = require("prosemirror-model");
5
+ const prosemirror_transform_1 = require("prosemirror-transform");
6
+ function mergeNode(node, pos, tr) {
7
+ var _a;
8
+ if ((0, prosemirror_transform_1.canJoin)(tr.doc, pos)) {
9
+ return tr.join(pos);
10
+ }
11
+ else if (!tr.doc.resolve(pos).nodeBefore) {
12
+ return undefined;
13
+ }
14
+ const resPos = tr.doc.resolve(pos);
15
+ const canMergeToNodeAbove = (resPos.parent !== tr.doc || resPos.nodeBefore) && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.isText);
16
+ if (canMergeToNodeAbove) {
17
+ return tr.replaceWith(pos - 1, pos + 1, prosemirror_model_1.Fragment.empty);
18
+ }
19
+ return undefined;
20
+ }
21
+ exports.mergeNode = mergeNode;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeTrackedMarks = void 0;
4
+ const nodeHelpers_1 = require("../compute/nodeHelpers");
5
+ function mergeTrackedMarks(pos, doc, newTr, schema) {
6
+ const resolved = doc.resolve(pos);
7
+ const { nodeAfter, nodeBefore } = resolved;
8
+ const leftMark = nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.marks.filter((m) => m.type === schema.marks.tracked_insert || m.type === schema.marks.tracked_delete)[0];
9
+ const rightMark = nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.marks.filter((m) => m.type === schema.marks.tracked_insert || m.type === schema.marks.tracked_delete)[0];
10
+ if (!nodeAfter || !nodeBefore || !leftMark || !rightMark || leftMark.type !== rightMark.type) {
11
+ return;
12
+ }
13
+ const leftDataTracked = leftMark.attrs.dataTracked;
14
+ const rightDataTracked = rightMark.attrs.dataTracked;
15
+ if (!(0, nodeHelpers_1.shouldMergeTrackedAttributes)(leftDataTracked, rightDataTracked)) {
16
+ return;
17
+ }
18
+ const isLeftOlder = (leftDataTracked.createdAt || 0) < (rightDataTracked.createdAt || 0);
19
+ const ancestorAttrs = isLeftOlder ? leftDataTracked : rightDataTracked;
20
+ const dataTracked = Object.assign(Object.assign({}, ancestorAttrs), { updatedAt: Date.now() });
21
+ const fromStartOfMark = pos - nodeBefore.nodeSize;
22
+ const toEndOfMark = pos + nodeAfter.nodeSize;
23
+ newTr.addMark(fromStartOfMark, toEndOfMark, leftMark.type.create(Object.assign(Object.assign({}, leftMark.attrs), { dataTracked })));
24
+ }
25
+ exports.mergeTrackedMarks = mergeTrackedMarks;