@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.
Files changed (218) hide show
  1. package/README.md +7 -18
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -1
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +2 -7
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -1
  5. package/dist/components/AdvancedVirtualizer.js +1 -1
  6. package/dist/components/AdvancedVirtualizer.js.map +1 -1
  7. package/dist/components/File.d.ts +17 -7
  8. package/dist/components/File.d.ts.map +1 -1
  9. package/dist/components/File.js +111 -54
  10. package/dist/components/File.js.map +1 -1
  11. package/dist/components/FileDiff.d.ts +32 -14
  12. package/dist/components/FileDiff.d.ts.map +1 -1
  13. package/dist/components/FileDiff.js +156 -81
  14. package/dist/components/FileDiff.js.map +1 -1
  15. package/dist/components/UnresolvedFile.d.ts +60 -0
  16. package/dist/components/UnresolvedFile.d.ts.map +1 -0
  17. package/dist/components/UnresolvedFile.js +280 -0
  18. package/dist/components/UnresolvedFile.js.map +1 -0
  19. package/dist/components/VirtualizedFile.js +8 -5
  20. package/dist/components/VirtualizedFile.js.map +1 -1
  21. package/dist/components/VirtualizedFileDiff.d.ts +1 -1
  22. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  23. package/dist/components/VirtualizedFileDiff.js +15 -11
  24. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  25. package/dist/components/Virtualizer.d.ts +3 -1
  26. package/dist/components/Virtualizer.d.ts.map +1 -1
  27. package/dist/components/Virtualizer.js +50 -24
  28. package/dist/components/Virtualizer.js.map +1 -1
  29. package/dist/constants.d.ts +3 -1
  30. package/dist/constants.d.ts.map +1 -1
  31. package/dist/constants.js +8 -1
  32. package/dist/constants.js.map +1 -1
  33. package/dist/highlighter/shared_highlighter.d.ts +4 -2
  34. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  35. package/dist/highlighter/shared_highlighter.js +15 -7
  36. package/dist/highlighter/shared_highlighter.js.map +1 -1
  37. package/dist/index.d.ts +9 -7
  38. package/dist/index.js +8 -6
  39. package/dist/managers/InteractionManager.d.ts +146 -0
  40. package/dist/managers/InteractionManager.d.ts.map +1 -0
  41. package/dist/managers/InteractionManager.js +813 -0
  42. package/dist/managers/InteractionManager.js.map +1 -0
  43. package/dist/managers/ResizeManager.d.ts +0 -2
  44. package/dist/managers/ResizeManager.d.ts.map +1 -1
  45. package/dist/managers/ResizeManager.js +43 -32
  46. package/dist/managers/ResizeManager.js.map +1 -1
  47. package/dist/react/File.d.ts +2 -0
  48. package/dist/react/File.d.ts.map +1 -1
  49. package/dist/react/File.js +3 -1
  50. package/dist/react/File.js.map +1 -1
  51. package/dist/react/FileDiff.d.ts +2 -0
  52. package/dist/react/FileDiff.d.ts.map +1 -1
  53. package/dist/react/FileDiff.js +3 -1
  54. package/dist/react/FileDiff.js.map +1 -1
  55. package/dist/react/MultiFileDiff.d.ts +2 -0
  56. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  57. package/dist/react/MultiFileDiff.js +3 -1
  58. package/dist/react/MultiFileDiff.js.map +1 -1
  59. package/dist/react/PatchDiff.d.ts +2 -0
  60. package/dist/react/PatchDiff.d.ts.map +1 -1
  61. package/dist/react/PatchDiff.js +3 -1
  62. package/dist/react/PatchDiff.js.map +1 -1
  63. package/dist/react/UnresolvedFile.d.ts +36 -0
  64. package/dist/react/UnresolvedFile.d.ts.map +1 -0
  65. package/dist/react/UnresolvedFile.js +42 -0
  66. package/dist/react/UnresolvedFile.js.map +1 -0
  67. package/dist/react/constants.d.ts +3 -2
  68. package/dist/react/constants.d.ts.map +1 -1
  69. package/dist/react/constants.js +3 -2
  70. package/dist/react/constants.js.map +1 -1
  71. package/dist/react/index.d.ts +4 -3
  72. package/dist/react/index.js +3 -2
  73. package/dist/react/types.d.ts +11 -2
  74. package/dist/react/types.d.ts.map +1 -1
  75. package/dist/react/utils/renderDiffChildren.d.ts +16 -5
  76. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  77. package/dist/react/utils/renderDiffChildren.js +34 -7
  78. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  79. package/dist/react/utils/renderFileChildren.d.ts +5 -1
  80. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  81. package/dist/react/utils/renderFileChildren.js +13 -7
  82. package/dist/react/utils/renderFileChildren.js.map +1 -1
  83. package/dist/react/utils/useFileDiffInstance.d.ts +1 -2
  84. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  85. package/dist/react/utils/useFileDiffInstance.js +2 -2
  86. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  87. package/dist/react/utils/useFileInstance.d.ts +1 -2
  88. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  89. package/dist/react/utils/useFileInstance.js.map +1 -1
  90. package/dist/react/utils/useUnresolvedFileInstance.d.ts +33 -0
  91. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -0
  92. package/dist/react/utils/useUnresolvedFileInstance.js +87 -0
  93. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -0
  94. package/dist/renderers/DiffHunksRenderer.d.ts +50 -6
  95. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  96. package/dist/renderers/DiffHunksRenderer.js +145 -45
  97. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  98. package/dist/renderers/FileRenderer.js +1 -1
  99. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +46 -0
  100. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -0
  101. package/dist/renderers/UnresolvedFileHunksRenderer.js +207 -0
  102. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -0
  103. package/dist/shiki-stream/stream.d.ts +1 -1
  104. package/dist/shiki-stream/stream.d.ts.map +1 -1
  105. package/dist/shiki-stream/stream.js.map +1 -1
  106. package/dist/shiki-stream/tokenizer.d.ts +1 -1
  107. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  108. package/dist/shiki-stream/tokenizer.js.map +1 -1
  109. package/dist/shiki-stream/types.d.ts +1 -1
  110. package/dist/shiki-stream/types.d.ts.map +1 -1
  111. package/dist/sprite.d.ts +2 -2
  112. package/dist/sprite.d.ts.map +1 -1
  113. package/dist/sprite.js +3 -0
  114. package/dist/sprite.js.map +1 -1
  115. package/dist/ssr/index.d.ts +3 -3
  116. package/dist/ssr/index.js +2 -2
  117. package/dist/ssr/preloadDiffs.d.ts +23 -14
  118. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  119. package/dist/ssr/preloadDiffs.js +40 -14
  120. package/dist/ssr/preloadDiffs.js.map +1 -1
  121. package/dist/style.js +1 -1
  122. package/dist/style.js.map +1 -1
  123. package/dist/types.d.ts +29 -2
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/utils/areMergeConflictActionsEqual.d.ts +7 -0
  126. package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -0
  127. package/dist/utils/areMergeConflictActionsEqual.js +11 -0
  128. package/dist/utils/areMergeConflictActionsEqual.js.map +1 -0
  129. package/dist/utils/arePrePropertiesEqual.js +10 -1
  130. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  131. package/dist/utils/areSelectionPointsEqual.d.ts +7 -0
  132. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -0
  133. package/dist/utils/areSelectionPointsEqual.js +8 -0
  134. package/dist/utils/areSelectionPointsEqual.js.map +1 -0
  135. package/dist/utils/areSelectionsEqual.d.ts +1 -1
  136. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  137. package/dist/utils/areSelectionsEqual.js.map +1 -1
  138. package/dist/utils/createFileHeaderElement.js +5 -2
  139. package/dist/utils/createFileHeaderElement.js.map +1 -1
  140. package/dist/utils/createGutterUtilityContentNode.d.ts +5 -0
  141. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -0
  142. package/dist/utils/createGutterUtilityContentNode.js +15 -0
  143. package/dist/utils/createGutterUtilityContentNode.js.map +1 -0
  144. package/dist/utils/createGutterUtilityElement.d.ts +7 -0
  145. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -0
  146. package/dist/utils/createGutterUtilityElement.js +20 -0
  147. package/dist/utils/createGutterUtilityElement.js.map +1 -0
  148. package/dist/utils/createPreElement.d.ts +2 -1
  149. package/dist/utils/createPreElement.d.ts.map +1 -1
  150. package/dist/utils/createPreElement.js +2 -1
  151. package/dist/utils/createPreElement.js.map +1 -1
  152. package/dist/utils/createSeparator.js +1 -1
  153. package/dist/utils/createSeparator.js.map +1 -1
  154. package/dist/utils/createWindowFromScrollPosition.js +12 -11
  155. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  156. package/dist/utils/getHighlighterOptions.d.ts +7 -2
  157. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  158. package/dist/utils/getHighlighterOptions.js +3 -2
  159. package/dist/utils/getHighlighterOptions.js.map +1 -1
  160. package/dist/utils/getMergeConflictActionSlotName.d.ts +16 -0
  161. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -0
  162. package/dist/utils/getMergeConflictActionSlotName.js +8 -0
  163. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -0
  164. package/dist/utils/getMergeConflictLineTypes.d.ts +15 -0
  165. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -0
  166. package/dist/utils/getMergeConflictLineTypes.js +81 -0
  167. package/dist/utils/getMergeConflictLineTypes.js.map +1 -0
  168. package/dist/utils/getOrCreateCodeNode.d.ts +3 -1
  169. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  170. package/dist/utils/getOrCreateCodeNode.js +5 -3
  171. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  172. package/dist/utils/hast_utils.d.ts +2 -2
  173. package/dist/utils/hast_utils.d.ts.map +1 -1
  174. package/dist/utils/hast_utils.js +3 -2
  175. package/dist/utils/hast_utils.js.map +1 -1
  176. package/dist/utils/parseMergeConflictDiffFromFile.d.ts +26 -0
  177. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -0
  178. package/dist/utils/parseMergeConflictDiffFromFile.js +143 -0
  179. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -0
  180. package/dist/utils/resolveMergeConflict.d.ts +7 -0
  181. package/dist/utils/resolveMergeConflict.d.ts.map +1 -0
  182. package/dist/utils/resolveMergeConflict.js +30 -0
  183. package/dist/utils/resolveMergeConflict.js.map +1 -0
  184. package/dist/utils/resolveVirtualFileMetrics.js +1 -0
  185. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
  186. package/dist/utils/setWrapperNodeProps.d.ts +2 -1
  187. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  188. package/dist/utils/setWrapperNodeProps.js +5 -1
  189. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  190. package/dist/worker/WorkerPoolManager.d.ts +4 -2
  191. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  192. package/dist/worker/WorkerPoolManager.js +16 -9
  193. package/dist/worker/WorkerPoolManager.js.map +1 -1
  194. package/dist/worker/types.d.ts +3 -1
  195. package/dist/worker/types.d.ts.map +1 -1
  196. package/dist/worker/wasm-BlUZCxHM.js +10 -0
  197. package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
  198. package/dist/worker/worker-portable.js +10546 -10106
  199. package/dist/worker/worker-portable.js.map +1 -1
  200. package/dist/worker/worker.js +27 -19
  201. package/dist/worker/worker.js.map +1 -1
  202. package/package.json +3 -7
  203. package/dist/managers/LineSelectionManager.d.ts +0 -64
  204. package/dist/managers/LineSelectionManager.d.ts.map +0 -1
  205. package/dist/managers/LineSelectionManager.js +0 -270
  206. package/dist/managers/LineSelectionManager.js.map +0 -1
  207. package/dist/managers/MouseEventManager.d.ts +0 -71
  208. package/dist/managers/MouseEventManager.d.ts.map +0 -1
  209. package/dist/managers/MouseEventManager.js +0 -358
  210. package/dist/managers/MouseEventManager.js.map +0 -1
  211. package/dist/themes/pierre-dark.js +0 -1328
  212. package/dist/themes/pierre-dark.js.map +0 -1
  213. package/dist/themes/pierre-light.js +0 -1328
  214. package/dist/themes/pierre-light.js.map +0 -1
  215. package/dist/utils/createHoverContentNode.d.ts +0 -5
  216. package/dist/utils/createHoverContentNode.d.ts.map +0 -1
  217. package/dist/utils/createHoverContentNode.js +0 -15
  218. 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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"}