@pierre/diffs 1.1.0-beta.9 → 1.1.0
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/README.md +7 -18
- package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/AdvancedVirtualizedFileDiff.js +2 -7
- package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -1
- package/dist/components/AdvancedVirtualizer.js +1 -1
- package/dist/components/AdvancedVirtualizer.js.map +1 -1
- package/dist/components/File.d.ts +17 -7
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +111 -54
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +32 -14
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +156 -81
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +60 -0
- package/dist/components/UnresolvedFile.d.ts.map +1 -0
- package/dist/components/UnresolvedFile.js +280 -0
- package/dist/components/UnresolvedFile.js.map +1 -0
- package/dist/components/VirtualizedFile.js +8 -5
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +15 -11
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +3 -1
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +50 -24
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -1
- package/dist/constants.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts +4 -2
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +15 -7
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.js +8 -6
- package/dist/managers/InteractionManager.d.ts +146 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -0
- package/dist/managers/InteractionManager.js +813 -0
- package/dist/managers/InteractionManager.js.map +1 -0
- package/dist/managers/ResizeManager.d.ts +0 -2
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +43 -32
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/react/File.d.ts +2 -0
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +3 -1
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +2 -0
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +3 -1
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +2 -0
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +3 -1
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +2 -0
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +3 -1
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +36 -0
- package/dist/react/UnresolvedFile.d.ts.map +1 -0
- package/dist/react/UnresolvedFile.js +42 -0
- package/dist/react/UnresolvedFile.js.map +1 -0
- package/dist/react/constants.d.ts +3 -2
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/constants.js +3 -2
- package/dist/react/constants.js.map +1 -1
- package/dist/react/index.d.ts +4 -3
- package/dist/react/index.js +3 -2
- package/dist/react/types.d.ts +11 -2
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +16 -5
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +34 -7
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +5 -1
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +13 -7
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts +1 -2
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +2 -2
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts +1 -2
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts +33 -0
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -0
- package/dist/react/utils/useUnresolvedFileInstance.js +87 -0
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -0
- package/dist/renderers/DiffHunksRenderer.d.ts +50 -6
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +145 -45
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.js +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +46 -0
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -0
- package/dist/renderers/UnresolvedFileHunksRenderer.js +207 -0
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -0
- package/dist/shiki-stream/stream.d.ts +1 -1
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts +1 -1
- package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
- package/dist/shiki-stream/tokenizer.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +1 -1
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/sprite.d.ts +2 -2
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +3 -0
- package/dist/sprite.js.map +1 -1
- package/dist/ssr/index.d.ts +3 -3
- package/dist/ssr/index.js +2 -2
- package/dist/ssr/preloadDiffs.d.ts +23 -14
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +40 -14
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +29 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts +7 -0
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -0
- package/dist/utils/areMergeConflictActionsEqual.js +11 -0
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -0
- package/dist/utils/arePrePropertiesEqual.js +10 -1
- package/dist/utils/arePrePropertiesEqual.js.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts +7 -0
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -0
- package/dist/utils/areSelectionPointsEqual.js +8 -0
- package/dist/utils/areSelectionPointsEqual.js.map +1 -0
- package/dist/utils/areSelectionsEqual.d.ts +1 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.js.map +1 -1
- package/dist/utils/createFileHeaderElement.js +5 -2
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts +5 -0
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -0
- package/dist/utils/createGutterUtilityContentNode.js +15 -0
- package/dist/utils/createGutterUtilityContentNode.js.map +1 -0
- package/dist/utils/createGutterUtilityElement.d.ts +7 -0
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -0
- package/dist/utils/createGutterUtilityElement.js +20 -0
- package/dist/utils/createGutterUtilityElement.js.map +1 -0
- package/dist/utils/createPreElement.d.ts +2 -1
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.js +2 -1
- package/dist/utils/createPreElement.js.map +1 -1
- package/dist/utils/createSeparator.js +1 -1
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +12 -11
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts +7 -2
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +3 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts +16 -0
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -0
- package/dist/utils/getMergeConflictActionSlotName.js +8 -0
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -0
- package/dist/utils/getMergeConflictLineTypes.d.ts +15 -0
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -0
- package/dist/utils/getMergeConflictLineTypes.js +81 -0
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -0
- package/dist/utils/getOrCreateCodeNode.d.ts +3 -1
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.js +5 -3
- package/dist/utils/getOrCreateCodeNode.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +2 -2
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +3 -2
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts +26 -0
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -0
- package/dist/utils/parseMergeConflictDiffFromFile.js +143 -0
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -0
- package/dist/utils/resolveMergeConflict.d.ts +7 -0
- package/dist/utils/resolveMergeConflict.d.ts.map +1 -0
- package/dist/utils/resolveMergeConflict.js +30 -0
- package/dist/utils/resolveMergeConflict.js.map +1 -0
- package/dist/utils/resolveVirtualFileMetrics.js +1 -0
- package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts +2 -1
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +5 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +4 -2
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +16 -9
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/types.d.ts +3 -1
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/wasm-BlUZCxHM.js +10 -0
- package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
- package/dist/worker/worker-portable.js +10546 -10106
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +27 -19
- package/dist/worker/worker.js.map +1 -1
- package/package.json +3 -7
- package/dist/managers/LineSelectionManager.d.ts +0 -64
- package/dist/managers/LineSelectionManager.d.ts.map +0 -1
- package/dist/managers/LineSelectionManager.js +0 -270
- package/dist/managers/LineSelectionManager.js.map +0 -1
- package/dist/managers/MouseEventManager.d.ts +0 -71
- package/dist/managers/MouseEventManager.d.ts.map +0 -1
- package/dist/managers/MouseEventManager.js +0 -358
- package/dist/managers/MouseEventManager.js.map +0 -1
- package/dist/themes/pierre-dark.js +0 -1328
- package/dist/themes/pierre-dark.js.map +0 -1
- package/dist/themes/pierre-light.js +0 -1328
- package/dist/themes/pierre-light.js.map +0 -1
- package/dist/utils/createHoverContentNode.d.ts +0 -5
- package/dist/utils/createHoverContentNode.d.ts.map +0 -1
- package/dist/utils/createHoverContentNode.js +0 -15
- package/dist/utils/createHoverContentNode.js.map +0 -1
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
//#region src/managers/MouseEventManager.ts
|
|
2
|
-
function isLineEventData(data, mode) {
|
|
3
|
-
if (data == null) return false;
|
|
4
|
-
if (mode === "file") return data.type === "line";
|
|
5
|
-
else return data.type === "diff-line";
|
|
6
|
-
}
|
|
7
|
-
function isExpandoEventData(data) {
|
|
8
|
-
return data?.type === "line-info";
|
|
9
|
-
}
|
|
10
|
-
var MouseEventManager = class {
|
|
11
|
-
hoveredLine;
|
|
12
|
-
pre;
|
|
13
|
-
hoverSlot;
|
|
14
|
-
interactiveLinesAttr = false;
|
|
15
|
-
interactiveLineNumbersAttr = false;
|
|
16
|
-
hasEventListeners = false;
|
|
17
|
-
constructor(mode, options) {
|
|
18
|
-
this.mode = mode;
|
|
19
|
-
this.options = options;
|
|
20
|
-
}
|
|
21
|
-
setOptions(options) {
|
|
22
|
-
this.options = options;
|
|
23
|
-
}
|
|
24
|
-
cleanUp() {
|
|
25
|
-
this.pre?.removeEventListener("click", this.handleMouseClick);
|
|
26
|
-
this.pre?.removeEventListener("pointermove", this.handleMouseMove);
|
|
27
|
-
this.pre?.removeEventListener("pointerleave", this.handleMouseLeave);
|
|
28
|
-
this.pre?.removeAttribute("data-interactive-lines");
|
|
29
|
-
this.pre?.removeAttribute("data-interactive-line-numbers");
|
|
30
|
-
this.clearHoveredLine();
|
|
31
|
-
this.interactiveLinesAttr = false;
|
|
32
|
-
this.interactiveLineNumbersAttr = false;
|
|
33
|
-
this.hasEventListeners = false;
|
|
34
|
-
this.pre = void 0;
|
|
35
|
-
}
|
|
36
|
-
setup(pre) {
|
|
37
|
-
const { __debugMouseEvents, onLineClick, onLineNumberClick, onLineEnter, onLineLeave, onHunkExpand, enableHoverUtility = false, lineHoverHighlight = "disabled" } = this.options;
|
|
38
|
-
const newContainer = this.pre !== pre;
|
|
39
|
-
if (newContainer) {
|
|
40
|
-
this.cleanUp();
|
|
41
|
-
this.pre = pre;
|
|
42
|
-
this.hasEventListeners = false;
|
|
43
|
-
}
|
|
44
|
-
if (enableHoverUtility && this.hoverSlot == null) {
|
|
45
|
-
this.hoverSlot = document.createElement("div");
|
|
46
|
-
this.hoverSlot.setAttribute("data-hover-slot", "");
|
|
47
|
-
const slotElement = document.createElement("slot");
|
|
48
|
-
slotElement.name = "hover-slot";
|
|
49
|
-
this.hoverSlot.appendChild(slotElement);
|
|
50
|
-
} else if (!enableHoverUtility && this.hoverSlot != null) {
|
|
51
|
-
this.hoverSlot.parentNode?.removeChild(this.hoverSlot);
|
|
52
|
-
this.hoverSlot = void 0;
|
|
53
|
-
}
|
|
54
|
-
const requiresEventListeners = lineHoverHighlight !== "disabled" || onLineClick != null || onLineNumberClick != null || onHunkExpand != null || onLineEnter != null || onLineLeave != null || enableHoverUtility;
|
|
55
|
-
if ((newContainer || !this.hasEventListeners) && requiresEventListeners) {
|
|
56
|
-
this.hasEventListeners = true;
|
|
57
|
-
pre.addEventListener("click", this.handleMouseClick);
|
|
58
|
-
if (onLineClick != null) {
|
|
59
|
-
pre.setAttribute("data-interactive-lines", "");
|
|
60
|
-
this.interactiveLinesAttr = true;
|
|
61
|
-
this.interactiveLineNumbersAttr = false;
|
|
62
|
-
} else if (onLineNumberClick != null) {
|
|
63
|
-
pre.setAttribute("data-interactive-line-numbers", "");
|
|
64
|
-
this.interactiveLinesAttr = false;
|
|
65
|
-
this.interactiveLineNumbersAttr = true;
|
|
66
|
-
}
|
|
67
|
-
debugLogIfEnabled(__debugMouseEvents, "click", "FileDiff.DEBUG.attachEventListeners: Attaching click events for:", (() => {
|
|
68
|
-
const reasons = [];
|
|
69
|
-
if (__debugMouseEvents === "both" || __debugMouseEvents === "click") {
|
|
70
|
-
if (onLineClick != null) reasons.push("onLineClick");
|
|
71
|
-
if (onLineNumberClick != null) reasons.push("onLineNumberClick");
|
|
72
|
-
if (onHunkExpand != null) reasons.push("expandable hunk separators");
|
|
73
|
-
}
|
|
74
|
-
return reasons;
|
|
75
|
-
})());
|
|
76
|
-
pre.addEventListener("pointermove", this.handleMouseMove);
|
|
77
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.attachEventListeners: Attaching pointer move event");
|
|
78
|
-
pre.addEventListener("pointerleave", this.handleMouseLeave);
|
|
79
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.attachEventListeners: Attaching pointer leave event");
|
|
80
|
-
} else if (!requiresEventListeners && this.hasEventListeners) {
|
|
81
|
-
this.pre?.removeEventListener("click", this.handleMouseClick);
|
|
82
|
-
this.pre?.removeEventListener("pointermove", this.handleMouseMove);
|
|
83
|
-
this.pre?.removeEventListener("pointerleave", this.handleMouseLeave);
|
|
84
|
-
this.hasEventListeners = false;
|
|
85
|
-
}
|
|
86
|
-
if (!newContainer) if (onLineClick != null) {
|
|
87
|
-
if (this.interactiveLineNumbersAttr) {
|
|
88
|
-
pre.removeAttribute("data-interactive-line-numbers");
|
|
89
|
-
this.interactiveLineNumbersAttr = false;
|
|
90
|
-
}
|
|
91
|
-
if (!this.interactiveLinesAttr) {
|
|
92
|
-
pre.setAttribute("data-interactive-lines", "");
|
|
93
|
-
this.interactiveLinesAttr = true;
|
|
94
|
-
}
|
|
95
|
-
} else if (onLineNumberClick != null) {
|
|
96
|
-
if (this.interactiveLinesAttr) {
|
|
97
|
-
pre.removeAttribute("data-interactive-lines");
|
|
98
|
-
this.interactiveLinesAttr = false;
|
|
99
|
-
}
|
|
100
|
-
if (!this.interactiveLineNumbersAttr) {
|
|
101
|
-
pre.setAttribute("data-interactive-line-numbers", "");
|
|
102
|
-
this.interactiveLineNumbersAttr = true;
|
|
103
|
-
}
|
|
104
|
-
} else {
|
|
105
|
-
if (this.interactiveLinesAttr) {
|
|
106
|
-
pre.removeAttribute("data-interactive-lines");
|
|
107
|
-
this.interactiveLinesAttr = false;
|
|
108
|
-
}
|
|
109
|
-
if (this.interactiveLineNumbersAttr) {
|
|
110
|
-
pre.removeAttribute("data-interactive-line-numbers");
|
|
111
|
-
this.interactiveLineNumbersAttr = false;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
getHoveredLine = () => {
|
|
116
|
-
if (this.hoveredLine != null) {
|
|
117
|
-
if (this.mode === "diff" && this.hoveredLine.type === "diff-line") return {
|
|
118
|
-
lineNumber: this.hoveredLine.lineNumber,
|
|
119
|
-
side: this.hoveredLine.annotationSide
|
|
120
|
-
};
|
|
121
|
-
if (this.mode === "file" && this.hoveredLine.type === "line") return { lineNumber: this.hoveredLine.lineNumber };
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
handleMouseClick = (event) => {
|
|
125
|
-
const { onLineClick, onLineNumberClick, onHunkExpand } = this.options;
|
|
126
|
-
if (onLineClick == null && onLineNumberClick == null && onHunkExpand == null) return;
|
|
127
|
-
debugLogIfEnabled(this.options.__debugMouseEvents, "click", "FileDiff.DEBUG.handleMouseClick:", event);
|
|
128
|
-
this.handleMouseEvent({
|
|
129
|
-
eventType: "click",
|
|
130
|
-
event
|
|
131
|
-
});
|
|
132
|
-
};
|
|
133
|
-
handleMouseMove = (event) => {
|
|
134
|
-
const { lineHoverHighlight = "disabled", onLineEnter, onLineLeave, enableHoverUtility = false } = this.options;
|
|
135
|
-
if (lineHoverHighlight === "disabled" && !enableHoverUtility && onLineEnter == null && onLineLeave == null) return;
|
|
136
|
-
debugLogIfEnabled(this.options.__debugMouseEvents, "move", "FileDiff.DEBUG.handleMouseMove:", event);
|
|
137
|
-
this.handleMouseEvent({
|
|
138
|
-
eventType: "move",
|
|
139
|
-
event
|
|
140
|
-
});
|
|
141
|
-
};
|
|
142
|
-
handleMouseLeave = (event) => {
|
|
143
|
-
const { __debugMouseEvents } = this.options;
|
|
144
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.handleMouseLeave: no event");
|
|
145
|
-
if (this.hoveredLine == null) {
|
|
146
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.handleMouseLeave: returned early, no .hoveredLine");
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
this.hoverSlot?.parentElement?.removeChild(this.hoverSlot);
|
|
150
|
-
this.options.onLineLeave?.({
|
|
151
|
-
...this.hoveredLine,
|
|
152
|
-
event
|
|
153
|
-
});
|
|
154
|
-
this.clearHoveredLine();
|
|
155
|
-
};
|
|
156
|
-
handleMouseEvent({ eventType, event }) {
|
|
157
|
-
const { __debugMouseEvents } = this.options;
|
|
158
|
-
const composedPath = event.composedPath();
|
|
159
|
-
debugLogIfEnabled(__debugMouseEvents, eventType, "FileDiff.DEBUG.handleMouseEvent:", {
|
|
160
|
-
eventType,
|
|
161
|
-
composedPath
|
|
162
|
-
});
|
|
163
|
-
const data = this.getLineData(composedPath);
|
|
164
|
-
debugLogIfEnabled(__debugMouseEvents, eventType, "FileDiff.DEBUG.handleMouseEvent: getLineData result:", data);
|
|
165
|
-
const { onLineClick, onLineNumberClick, onLineEnter, onLineLeave, onHunkExpand } = this.options;
|
|
166
|
-
switch (eventType) {
|
|
167
|
-
case "move":
|
|
168
|
-
if (isLineEventData(data, this.mode) && this.hoveredLine?.lineElement === data.lineElement) {
|
|
169
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.handleMouseEvent: switch, 'move', returned early because same line");
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
if (this.hoveredLine != null) {
|
|
173
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.handleMouseEvent: switch, 'move', clearing an existing hovered line and firing onLineLeave");
|
|
174
|
-
this.hoverSlot?.parentElement?.removeChild(this.hoverSlot);
|
|
175
|
-
onLineLeave?.({
|
|
176
|
-
...this.hoveredLine,
|
|
177
|
-
event
|
|
178
|
-
});
|
|
179
|
-
this.clearHoveredLine();
|
|
180
|
-
}
|
|
181
|
-
if (isLineEventData(data, this.mode)) {
|
|
182
|
-
debugLogIfEnabled(__debugMouseEvents, "move", "FileDiff.DEBUG.handleMouseEvent: switch, 'move', setting up a new hoveredLine and firing onLineEnter");
|
|
183
|
-
this.setHoveredLine(data);
|
|
184
|
-
if (this.hoverSlot != null) data.numberElement?.appendChild(this.hoverSlot);
|
|
185
|
-
onLineEnter?.({
|
|
186
|
-
...this.hoveredLine,
|
|
187
|
-
event
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
break;
|
|
191
|
-
case "click":
|
|
192
|
-
debugLogIfEnabled(__debugMouseEvents, "click", "FileDiff.DEBUG.handleMouseEvent: switch, 'click', with data:", data);
|
|
193
|
-
if (data == null) break;
|
|
194
|
-
if (isExpandoEventData(data) && onHunkExpand != null) {
|
|
195
|
-
debugLogIfEnabled(__debugMouseEvents, "click", "FileDiff.DEBUG.handleMouseEvent: switch, 'click', expanding a hunk");
|
|
196
|
-
onHunkExpand(data.hunkIndex, data.direction);
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
if (isLineEventData(data, this.mode)) if (onLineNumberClick != null && data.numberColumn) {
|
|
200
|
-
debugLogIfEnabled(__debugMouseEvents, "click", "FileDiff.DEBUG.handleMouseEvent: switch, 'click', firing 'onLineNumberClick'");
|
|
201
|
-
onLineNumberClick({
|
|
202
|
-
...data,
|
|
203
|
-
event
|
|
204
|
-
});
|
|
205
|
-
} else if (onLineClick != null) {
|
|
206
|
-
debugLogIfEnabled(__debugMouseEvents, "click", "FileDiff.DEBUG.handleMouseEvent: switch, 'click', firing 'onLineClick'");
|
|
207
|
-
onLineClick({
|
|
208
|
-
...data,
|
|
209
|
-
event
|
|
210
|
-
});
|
|
211
|
-
} else debugLogIfEnabled(__debugMouseEvents, "click", "FileDiff.DEBUG.handleMouseEvent: switch, 'click', fell through, no event to fire");
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
clearHoveredLine() {
|
|
216
|
-
if (this.hoveredLine == null) return;
|
|
217
|
-
this.hoveredLine.lineElement.removeAttribute("data-hovered");
|
|
218
|
-
this.hoveredLine.numberElement.removeAttribute("data-hovered");
|
|
219
|
-
this.hoveredLine = void 0;
|
|
220
|
-
}
|
|
221
|
-
setHoveredLine(hoveredLine) {
|
|
222
|
-
const { lineHoverHighlight = "disabled" } = this.options;
|
|
223
|
-
if (this.hoveredLine != null) this.clearHoveredLine();
|
|
224
|
-
this.hoveredLine = hoveredLine;
|
|
225
|
-
if (lineHoverHighlight !== "disabled") {
|
|
226
|
-
if (lineHoverHighlight === "both" || lineHoverHighlight === "line") this.hoveredLine.lineElement.setAttribute("data-hovered", "");
|
|
227
|
-
if (lineHoverHighlight === "both" || lineHoverHighlight === "number") this.hoveredLine.numberElement.setAttribute("data-hovered", "");
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
getLineData(path) {
|
|
231
|
-
let numberColumn = false;
|
|
232
|
-
let lineType;
|
|
233
|
-
let codeElement;
|
|
234
|
-
let lineElement;
|
|
235
|
-
let lineIndex;
|
|
236
|
-
let numberElement;
|
|
237
|
-
let expandInfo;
|
|
238
|
-
let lineNumber;
|
|
239
|
-
for (const element of path) {
|
|
240
|
-
if (!(element instanceof HTMLElement)) continue;
|
|
241
|
-
const _columnNumber = numberElement == null ? element.getAttribute("data-column-number") ?? void 0 : void 0;
|
|
242
|
-
if (_columnNumber) {
|
|
243
|
-
numberElement = element;
|
|
244
|
-
lineNumber = Number.parseInt(_columnNumber, 10);
|
|
245
|
-
numberColumn = true;
|
|
246
|
-
lineType = getLineTypeFromElement(element);
|
|
247
|
-
lineIndex = element.getAttribute("data-line-index") ?? void 0;
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
const _lineNumber = lineElement == null ? element.getAttribute("data-line") ?? void 0 : void 0;
|
|
251
|
-
if (_lineNumber) {
|
|
252
|
-
lineElement = element;
|
|
253
|
-
lineNumber = Number.parseInt(_lineNumber, 10);
|
|
254
|
-
lineType = getLineTypeFromElement(element);
|
|
255
|
-
lineIndex = element.getAttribute("data-line-index") ?? void 0;
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
if (expandInfo == null && element.hasAttribute("data-expand-button")) {
|
|
259
|
-
expandInfo = {
|
|
260
|
-
hunkIndex: void 0,
|
|
261
|
-
direction: (() => {
|
|
262
|
-
if (element.hasAttribute("data-expand-up")) return "up";
|
|
263
|
-
if (element.hasAttribute("data-expand-down")) return "down";
|
|
264
|
-
return "both";
|
|
265
|
-
})()
|
|
266
|
-
};
|
|
267
|
-
continue;
|
|
268
|
-
}
|
|
269
|
-
const _expandIndex = expandInfo != null ? element.getAttribute("data-expand-index") ?? void 0 : void 0;
|
|
270
|
-
if (expandInfo != null && _expandIndex != null) {
|
|
271
|
-
const expandIndex = Number.parseInt(_expandIndex, 10);
|
|
272
|
-
if (!Number.isNaN(expandIndex)) expandInfo.hunkIndex = expandIndex;
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
275
|
-
if (codeElement == null && element.hasAttribute("data-code")) {
|
|
276
|
-
codeElement = element;
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
if (expandInfo?.hunkIndex != null) {
|
|
281
|
-
const { hunkIndex, direction } = expandInfo;
|
|
282
|
-
return {
|
|
283
|
-
type: "line-info",
|
|
284
|
-
hunkIndex,
|
|
285
|
-
direction
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
lineElement ??= lineIndex != null ? queryHTMLElement(codeElement, `[data-line][data-line-index="${lineIndex}"]`) : void 0;
|
|
289
|
-
numberElement ??= lineIndex != null ? queryHTMLElement(codeElement, `[data-column-number][data-line-index="${lineIndex}"]`) : void 0;
|
|
290
|
-
if (codeElement == null || lineElement == null || numberElement == null || lineType == null) return;
|
|
291
|
-
if (this.mode === "file") return {
|
|
292
|
-
type: "line",
|
|
293
|
-
lineElement,
|
|
294
|
-
lineNumber,
|
|
295
|
-
numberElement,
|
|
296
|
-
numberColumn
|
|
297
|
-
};
|
|
298
|
-
return {
|
|
299
|
-
type: "diff-line",
|
|
300
|
-
annotationSide: (() => {
|
|
301
|
-
switch (lineType) {
|
|
302
|
-
case "change-deletion": return "deletions";
|
|
303
|
-
case "change-addition": return "additions";
|
|
304
|
-
default: return codeElement.hasAttribute("data-deletions") ? "deletions" : "additions";
|
|
305
|
-
}
|
|
306
|
-
})(),
|
|
307
|
-
lineType,
|
|
308
|
-
lineElement,
|
|
309
|
-
numberElement,
|
|
310
|
-
lineNumber,
|
|
311
|
-
numberColumn
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
function debugLogIfEnabled(debugLogType = "none", logIfType, ...args) {
|
|
316
|
-
switch (debugLogType) {
|
|
317
|
-
case "none": return;
|
|
318
|
-
case "both": break;
|
|
319
|
-
case "click":
|
|
320
|
-
if (logIfType !== "click") return;
|
|
321
|
-
break;
|
|
322
|
-
case "move":
|
|
323
|
-
if (logIfType !== "move") return;
|
|
324
|
-
break;
|
|
325
|
-
}
|
|
326
|
-
console.log(...args);
|
|
327
|
-
}
|
|
328
|
-
function pluckMouseEventOptions({ lineHoverHighlight, onLineClick, onLineNumberClick, onLineEnter, onLineLeave, enableHoverUtility, __debugMouseEvents }, onHunkExpand) {
|
|
329
|
-
return {
|
|
330
|
-
lineHoverHighlight,
|
|
331
|
-
onLineClick,
|
|
332
|
-
onLineNumberClick,
|
|
333
|
-
onLineEnter,
|
|
334
|
-
onLineLeave,
|
|
335
|
-
enableHoverUtility,
|
|
336
|
-
__debugMouseEvents,
|
|
337
|
-
onHunkExpand
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
function queryHTMLElement(parent, query) {
|
|
341
|
-
const element = parent?.querySelector(query);
|
|
342
|
-
return element instanceof HTMLElement ? element : void 0;
|
|
343
|
-
}
|
|
344
|
-
function getLineTypeFromElement(element) {
|
|
345
|
-
const lineType = element.getAttribute("data-line-type");
|
|
346
|
-
if (lineType == null) return;
|
|
347
|
-
switch (lineType) {
|
|
348
|
-
case "change-deletion":
|
|
349
|
-
case "change-addition":
|
|
350
|
-
case "context":
|
|
351
|
-
case "context-expanded": return lineType;
|
|
352
|
-
default: return;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
//#endregion
|
|
357
|
-
export { MouseEventManager, pluckMouseEventOptions };
|
|
358
|
-
//# sourceMappingURL=MouseEventManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MouseEventManager.js","names":["mode: TMode","options: MouseEventManagerOptions<TMode>","reasons: string[]","lineType: LineTypes | undefined","codeElement: HTMLElement | undefined","lineElement: HTMLElement | undefined","lineIndex: string | undefined","numberElement: HTMLElement | undefined","expandInfo:\n | {\n hunkIndex: number | undefined;\n direction: 'up' | 'down' | 'both';\n }\n | undefined","lineNumber: number | undefined"],"sources":["../../src/managers/MouseEventManager.ts"],"sourcesContent":["import type {\n AnnotationSide,\n DiffLineEventBaseProps,\n ExpansionDirections,\n LineEventBaseProps,\n LineTypes,\n} from '../types';\n\nexport type LogTypes = 'click' | 'move' | 'both' | 'none';\n\nexport type MouseEventManagerMode = 'file' | 'diff';\n\nexport interface OnLineClickProps extends LineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnLineEnterLeaveProps extends LineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnDiffLineClickProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\n\nexport interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\n\ntype HandleMouseEventProps =\n | { eventType: 'click'; event: PointerEvent | MouseEvent }\n | { eventType: 'move'; event: PointerEvent };\n\ntype EventClickProps<TMode extends MouseEventManagerMode> = TMode extends 'file'\n ? OnLineClickProps\n : OnDiffLineClickProps;\n\ntype MouseEventEnterLeaveProps<TMode extends MouseEventManagerMode> =\n TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;\n\ntype EventBaseProps<TMode extends MouseEventManagerMode> = TMode extends 'file'\n ? LineEventBaseProps\n : DiffLineEventBaseProps;\n\ninterface ExpandoEventProps {\n type: 'line-info';\n hunkIndex: number;\n direction: ExpansionDirections;\n}\n\nexport type GetHoveredLineResult<TMode extends MouseEventManagerMode> =\n TMode extends 'file'\n ? { lineNumber: number }\n : { lineNumber: number; side: AnnotationSide };\n\ntype GetLineDataResult<TMode extends MouseEventManagerMode> =\n TMode extends 'file'\n ? LineEventBaseProps | ExpandoEventProps | undefined\n : DiffLineEventBaseProps | ExpandoEventProps | undefined;\n\ntype LineEventData<TMode extends MouseEventManagerMode> = TMode extends 'file'\n ? LineEventBaseProps\n : DiffLineEventBaseProps;\n\nfunction isLineEventData<TMode extends MouseEventManagerMode>(\n data: GetLineDataResult<TMode>,\n mode: TMode\n): data is LineEventData<TMode> {\n if (data == null) return false;\n if (mode === 'file') {\n return data.type === 'line';\n } else {\n return data.type === 'diff-line';\n }\n}\n\nfunction isExpandoEventData(\n data:\n | LineEventBaseProps\n | DiffLineEventBaseProps\n | ExpandoEventProps\n | undefined\n): data is ExpandoEventProps {\n return data?.type === 'line-info';\n}\n\nexport interface MouseEventManagerBaseOptions<\n TMode extends MouseEventManagerMode,\n> {\n lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';\n enableHoverUtility?: boolean;\n onLineClick?(props: EventClickProps<TMode>): unknown;\n onLineNumberClick?(props: EventClickProps<TMode>): unknown;\n onLineEnter?(props: MouseEventEnterLeaveProps<TMode>): unknown;\n onLineLeave?(props: MouseEventEnterLeaveProps<TMode>): unknown;\n __debugMouseEvents?: LogTypes;\n}\n\nexport interface MouseEventManagerOptions<\n TMode extends MouseEventManagerMode,\n> extends MouseEventManagerBaseOptions<TMode> {\n onHunkExpand?(hunkIndex: number, direction: ExpansionDirections): unknown;\n}\n\nexport class MouseEventManager<TMode extends MouseEventManagerMode> {\n private hoveredLine: EventBaseProps<TMode> | undefined;\n private pre: HTMLPreElement | undefined;\n private hoverSlot: HTMLDivElement | undefined;\n private interactiveLinesAttr = false;\n private interactiveLineNumbersAttr = false;\n private hasEventListeners = false;\n\n constructor(\n private mode: TMode,\n private options: MouseEventManagerOptions<TMode>\n ) {}\n\n setOptions(options: MouseEventManagerOptions<TMode>): void {\n this.options = options;\n }\n\n cleanUp(): void {\n this.pre?.removeEventListener('click', this.handleMouseClick);\n this.pre?.removeEventListener('pointermove', this.handleMouseMove);\n this.pre?.removeEventListener('pointerleave', this.handleMouseLeave);\n this.pre?.removeAttribute('data-interactive-lines');\n this.pre?.removeAttribute('data-interactive-line-numbers');\n this.clearHoveredLine();\n this.interactiveLinesAttr = false;\n this.interactiveLineNumbersAttr = false;\n this.hasEventListeners = false;\n this.pre = undefined;\n }\n\n setup(pre: HTMLPreElement): void {\n const {\n __debugMouseEvents,\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n onHunkExpand,\n enableHoverUtility = false,\n lineHoverHighlight = 'disabled',\n } = this.options;\n\n const newContainer = this.pre !== pre;\n if (newContainer) {\n this.cleanUp();\n this.pre = pre;\n this.hasEventListeners = false;\n }\n\n if (enableHoverUtility && this.hoverSlot == null) {\n this.hoverSlot = document.createElement('div');\n this.hoverSlot.setAttribute('data-hover-slot', '');\n const slotElement = document.createElement('slot');\n slotElement.name = 'hover-slot';\n this.hoverSlot.appendChild(slotElement);\n } else if (!enableHoverUtility && this.hoverSlot != null) {\n this.hoverSlot.parentNode?.removeChild(this.hoverSlot);\n this.hoverSlot = undefined;\n }\n\n const requiresEventListeners =\n lineHoverHighlight !== 'disabled' ||\n onLineClick != null ||\n onLineNumberClick != null ||\n onHunkExpand != null ||\n onLineEnter != null ||\n onLineLeave != null ||\n enableHoverUtility;\n\n if ((newContainer || !this.hasEventListeners) && requiresEventListeners) {\n this.hasEventListeners = true;\n pre.addEventListener('click', this.handleMouseClick);\n if (onLineClick != null) {\n pre.setAttribute('data-interactive-lines', '');\n this.interactiveLinesAttr = true;\n this.interactiveLineNumbersAttr = false;\n } else if (onLineNumberClick != null) {\n pre.setAttribute('data-interactive-line-numbers', '');\n this.interactiveLinesAttr = false;\n this.interactiveLineNumbersAttr = true;\n }\n debugLogIfEnabled(\n __debugMouseEvents,\n 'click',\n 'FileDiff.DEBUG.attachEventListeners: Attaching click events for:',\n (() => {\n const reasons: string[] = [];\n if (__debugMouseEvents === 'both' || __debugMouseEvents === 'click') {\n if (onLineClick != null) {\n reasons.push('onLineClick');\n }\n if (onLineNumberClick != null) {\n reasons.push('onLineNumberClick');\n }\n if (onHunkExpand != null) {\n reasons.push('expandable hunk separators');\n }\n }\n return reasons;\n })()\n );\n pre.addEventListener('pointermove', this.handleMouseMove);\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n 'FileDiff.DEBUG.attachEventListeners: Attaching pointer move event'\n );\n pre.addEventListener('pointerleave', this.handleMouseLeave);\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n 'FileDiff.DEBUG.attachEventListeners: Attaching pointer leave event'\n );\n } else if (!requiresEventListeners && this.hasEventListeners) {\n this.pre?.removeEventListener('click', this.handleMouseClick);\n this.pre?.removeEventListener('pointermove', this.handleMouseMove);\n this.pre?.removeEventListener('pointerleave', this.handleMouseLeave);\n this.hasEventListeners = false;\n }\n\n if (!newContainer) {\n if (onLineClick != null) {\n if (this.interactiveLineNumbersAttr) {\n pre.removeAttribute('data-interactive-line-numbers');\n this.interactiveLineNumbersAttr = false;\n }\n if (!this.interactiveLinesAttr) {\n pre.setAttribute('data-interactive-lines', '');\n this.interactiveLinesAttr = true;\n }\n } else if (onLineNumberClick != null) {\n if (this.interactiveLinesAttr) {\n pre.removeAttribute('data-interactive-lines');\n this.interactiveLinesAttr = false;\n }\n if (!this.interactiveLineNumbersAttr) {\n pre.setAttribute('data-interactive-line-numbers', '');\n this.interactiveLineNumbersAttr = true;\n }\n } else {\n if (this.interactiveLinesAttr) {\n pre.removeAttribute('data-interactive-lines');\n this.interactiveLinesAttr = false;\n }\n if (this.interactiveLineNumbersAttr) {\n pre.removeAttribute('data-interactive-line-numbers');\n this.interactiveLineNumbersAttr = false;\n }\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<TMode> | undefined => {\n if (this.hoveredLine != null) {\n if (this.mode === 'diff' && this.hoveredLine.type === 'diff-line') {\n return {\n lineNumber: this.hoveredLine.lineNumber,\n side: this.hoveredLine.annotationSide,\n } as GetHoveredLineResult<TMode>;\n }\n if (this.mode === 'file' && this.hoveredLine.type === 'line') {\n return {\n lineNumber: this.hoveredLine.lineNumber,\n } as GetHoveredLineResult<TMode>;\n }\n }\n return undefined;\n };\n\n handleMouseClick = (event: MouseEvent): void => {\n const { onLineClick, onLineNumberClick, onHunkExpand } = this.options;\n if (\n onLineClick == null &&\n onLineNumberClick == null &&\n onHunkExpand == null\n ) {\n return;\n }\n debugLogIfEnabled(\n this.options.__debugMouseEvents,\n 'click',\n 'FileDiff.DEBUG.handleMouseClick:',\n event\n );\n this.handleMouseEvent({ eventType: 'click', event });\n };\n\n handleMouseMove = (event: PointerEvent): void => {\n const {\n lineHoverHighlight = 'disabled',\n onLineEnter,\n onLineLeave,\n enableHoverUtility = false,\n } = this.options;\n if (\n lineHoverHighlight === 'disabled' &&\n !enableHoverUtility &&\n onLineEnter == null &&\n onLineLeave == null\n ) {\n return;\n }\n debugLogIfEnabled(\n this.options.__debugMouseEvents,\n 'move',\n 'FileDiff.DEBUG.handleMouseMove:',\n event\n );\n this.handleMouseEvent({ eventType: 'move', event });\n };\n\n handleMouseLeave = (event: PointerEvent): void => {\n const { __debugMouseEvents } = this.options;\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n 'FileDiff.DEBUG.handleMouseLeave: no event'\n );\n if (this.hoveredLine == null) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n 'FileDiff.DEBUG.handleMouseLeave: returned early, no .hoveredLine'\n );\n return;\n }\n this.hoverSlot?.parentElement?.removeChild(this.hoverSlot);\n this.options.onLineLeave?.({\n ...this.hoveredLine,\n event,\n } as MouseEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n };\n\n private handleMouseEvent({ eventType, event }: HandleMouseEventProps) {\n const { __debugMouseEvents } = this.options;\n const composedPath = event.composedPath();\n debugLogIfEnabled(\n __debugMouseEvents,\n eventType,\n 'FileDiff.DEBUG.handleMouseEvent:',\n { eventType, composedPath }\n );\n const data = this.getLineData(composedPath);\n debugLogIfEnabled(\n __debugMouseEvents,\n eventType,\n 'FileDiff.DEBUG.handleMouseEvent: getLineData result:',\n data\n );\n const {\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n onHunkExpand,\n } = this.options;\n switch (eventType) {\n case 'move': {\n if (\n isLineEventData(data, this.mode) &&\n this.hoveredLine?.lineElement === data.lineElement\n ) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'move', returned early because same line\"\n );\n break;\n }\n if (this.hoveredLine != null) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'move', clearing an existing hovered line and firing onLineLeave\"\n );\n this.hoverSlot?.parentElement?.removeChild(this.hoverSlot);\n onLineLeave?.({\n ...this.hoveredLine,\n event,\n } as MouseEventEnterLeaveProps<TMode>);\n this.clearHoveredLine();\n }\n if (isLineEventData(data, this.mode)) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'move',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'move', setting up a new hoveredLine and firing onLineEnter\"\n );\n this.setHoveredLine(data);\n if (this.hoverSlot != null) {\n data.numberElement?.appendChild(this.hoverSlot);\n }\n onLineEnter?.({\n ...this.hoveredLine,\n event,\n } as MouseEventEnterLeaveProps<TMode>);\n }\n break;\n }\n case 'click':\n debugLogIfEnabled(\n __debugMouseEvents,\n 'click',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'click', with data:\",\n data\n );\n if (data == null) break;\n if (isExpandoEventData(data) && onHunkExpand != null) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'click',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'click', expanding a hunk\"\n );\n onHunkExpand(data.hunkIndex, data.direction);\n break;\n }\n if (isLineEventData(data, this.mode)) {\n if (onLineNumberClick != null && data.numberColumn) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'click',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'click', firing 'onLineNumberClick'\"\n );\n onLineNumberClick({ ...data, event } as EventClickProps<TMode>);\n } else if (onLineClick != null) {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'click',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'click', firing 'onLineClick'\"\n );\n onLineClick({ ...data, event } as EventClickProps<TMode>);\n } else {\n debugLogIfEnabled(\n __debugMouseEvents,\n 'click',\n \"FileDiff.DEBUG.handleMouseEvent: switch, 'click', fell through, no event to fire\"\n );\n }\n }\n break;\n }\n }\n\n private clearHoveredLine() {\n if (this.hoveredLine == null) {\n return;\n }\n this.hoveredLine.lineElement.removeAttribute('data-hovered');\n this.hoveredLine.numberElement.removeAttribute('data-hovered');\n this.hoveredLine = undefined;\n }\n\n private setHoveredLine(hoveredLine: EventBaseProps<TMode>) {\n const { lineHoverHighlight = 'disabled' } = this.options;\n if (this.hoveredLine != null) {\n this.clearHoveredLine();\n }\n this.hoveredLine = hoveredLine;\n if (lineHoverHighlight !== 'disabled') {\n if (lineHoverHighlight === 'both' || lineHoverHighlight === 'line') {\n this.hoveredLine.lineElement.setAttribute('data-hovered', '');\n }\n if (lineHoverHighlight === 'both' || lineHoverHighlight === 'number') {\n this.hoveredLine.numberElement.setAttribute('data-hovered', '');\n }\n }\n }\n\n private getLineData(\n path: (EventTarget | undefined)[]\n ): GetLineDataResult<TMode> {\n let numberColumn = false;\n let lineType: LineTypes | undefined;\n let codeElement: HTMLElement | undefined;\n let lineElement: HTMLElement | undefined;\n let lineIndex: string | undefined;\n let numberElement: HTMLElement | undefined;\n let expandInfo:\n | {\n hunkIndex: number | undefined;\n direction: 'up' | 'down' | 'both';\n }\n | undefined;\n let lineNumber: number | undefined;\n\n for (const element of path) {\n if (!(element instanceof HTMLElement)) continue;\n // If we've click on a number column line, lets grab the relevant\n // line info\n const _columnNumber =\n numberElement == null\n ? (element.getAttribute('data-column-number') ?? undefined)\n : undefined;\n if (_columnNumber) {\n numberElement = element;\n lineNumber = Number.parseInt(_columnNumber, 10);\n numberColumn = true;\n lineType = getLineTypeFromElement(element);\n lineIndex = element.getAttribute('data-line-index') ?? undefined;\n continue;\n }\n // If we've clicked on a code column line, lets grab the relevant\n // line info\n const _lineNumber =\n lineElement == null\n ? (element.getAttribute('data-line') ?? undefined)\n : undefined;\n if (_lineNumber) {\n lineElement = element;\n lineNumber = Number.parseInt(_lineNumber, 10);\n lineType = getLineTypeFromElement(element);\n lineIndex = element.getAttribute('data-line-index') ?? undefined;\n continue;\n }\n // If we've clicked on an expand button, lets grab the relevant info\n if (expandInfo == null && element.hasAttribute('data-expand-button')) {\n expandInfo = {\n hunkIndex: undefined,\n direction: (() => {\n if (element.hasAttribute('data-expand-up')) {\n return 'up';\n }\n if (element.hasAttribute('data-expand-down')) {\n return 'down';\n }\n return 'both';\n })(),\n };\n continue;\n }\n // If we've clicked on an expand container, lets grab the index off of it\n // FIXME(amadeus): Might be worth stuffing the expand index into the\n // buttons themselves? Requires a small HTML change tho...\n const _expandIndex =\n expandInfo != null\n ? (element.getAttribute('data-expand-index') ?? undefined)\n : undefined;\n if (expandInfo != null && _expandIndex != null) {\n const expandIndex = Number.parseInt(_expandIndex, 10);\n if (!Number.isNaN(expandIndex)) {\n expandInfo.hunkIndex = expandIndex;\n }\n continue;\n }\n // And finally, if we managed to get to the code element, then we either\n // have the necessary info, or we don't, so we can stop iterating through\n // the path\n if (codeElement == null && element.hasAttribute('data-code')) {\n codeElement = element;\n // Once we've found the code parent, there's no more travesial necessary\n break;\n }\n }\n\n // If we are handling expansion, lets do that\n if (expandInfo?.hunkIndex != null) {\n const { hunkIndex, direction } = expandInfo;\n return { type: 'line-info', hunkIndex, direction };\n }\n\n lineElement ??=\n lineIndex != null\n ? queryHTMLElement(\n codeElement,\n `[data-line][data-line-index=\"${lineIndex}\"]`\n )\n : undefined;\n numberElement ??=\n lineIndex != null\n ? queryHTMLElement(\n codeElement,\n `[data-column-number][data-line-index=\"${lineIndex}\"]`\n )\n : undefined;\n\n // If we were unable to find the necessary elements, we out.\n if (\n codeElement == null ||\n lineElement == null ||\n numberElement == null ||\n lineType == null\n ) {\n return undefined;\n }\n\n if (this.mode === 'file') {\n return {\n type: 'line',\n lineElement,\n lineNumber,\n numberElement,\n numberColumn,\n } as GetLineDataResult<TMode>;\n }\n\n return {\n type: 'diff-line',\n annotationSide: (() => {\n switch (lineType) {\n case 'change-deletion':\n return 'deletions';\n case 'change-addition':\n return 'additions';\n default:\n return codeElement.hasAttribute('data-deletions')\n ? 'deletions'\n : 'additions';\n }\n })(),\n lineType,\n lineElement,\n numberElement,\n lineNumber,\n numberColumn,\n } as GetLineDataResult<TMode>;\n }\n}\n\nfunction debugLogIfEnabled(\n debugLogType: LogTypes | undefined = 'none',\n logIfType: 'move' | 'click',\n ...args: unknown[]\n) {\n switch (debugLogType) {\n case 'none':\n return;\n case 'both':\n break;\n case 'click':\n if (logIfType !== 'click') {\n return;\n }\n break;\n case 'move':\n if (logIfType !== 'move') {\n return;\n }\n break;\n }\n console.log(...args);\n}\n\nexport function pluckMouseEventOptions<TMode extends MouseEventManagerMode>(\n {\n lineHoverHighlight,\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n enableHoverUtility,\n __debugMouseEvents,\n }: MouseEventManagerBaseOptions<TMode>,\n onHunkExpand?: (hunkIndex: number, direction: ExpansionDirections) => unknown\n): MouseEventManagerOptions<TMode> {\n return {\n lineHoverHighlight,\n onLineClick,\n onLineNumberClick,\n onLineEnter,\n onLineLeave,\n enableHoverUtility,\n __debugMouseEvents,\n onHunkExpand,\n };\n}\n\nfunction queryHTMLElement(\n parent: HTMLElement | undefined,\n query: string\n): HTMLElement | undefined {\n const element = parent?.querySelector(query);\n return element instanceof HTMLElement ? element : undefined;\n}\n\nfunction getLineTypeFromElement(element: HTMLElement): LineTypes | undefined {\n const lineType = element.getAttribute('data-line-type');\n if (lineType == null) {\n return undefined;\n }\n switch (lineType) {\n case 'change-deletion':\n case 'change-addition':\n case 'context':\n case 'context-expanded':\n return lineType;\n default:\n return undefined;\n }\n}\n"],"mappings":"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"}
|