@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,6 +1,5 @@
1
- import { DEFAULT_THEMES, DIFFS_TAG_NAME, HEADER_METADATA_SLOT_ID, UNSAFE_CSS_ATTRIBUTE } from "../constants.js";
2
- import { LineSelectionManager, pluckLineSelectionOptions } from "../managers/LineSelectionManager.js";
3
- import { MouseEventManager, pluckMouseEventOptions } from "../managers/MouseEventManager.js";
1
+ import { DEFAULT_THEMES, DIFFS_TAG_NAME, EMPTY_RENDER_RANGE, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID, UNSAFE_CSS_ATTRIBUTE } from "../constants.js";
2
+ import { InteractionManager, pluckInteractionOptions } from "../managers/InteractionManager.js";
4
3
  import { ResizeManager } from "../managers/ResizeManager.js";
5
4
  import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
6
5
  import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
@@ -8,7 +7,7 @@ import { SVGSpriteSheet } from "../sprite.js";
8
7
  import { areFilesEqual } from "../utils/areFilesEqual.js";
9
8
  import { arePrePropertiesEqual } from "../utils/arePrePropertiesEqual.js";
10
9
  import { createAnnotationWrapperNode } from "../utils/createAnnotationWrapperNode.js";
11
- import { createHoverContentNode } from "../utils/createHoverContentNode.js";
10
+ import { createGutterUtilityContentNode } from "../utils/createGutterUtilityContentNode.js";
12
11
  import { createUnsafeCSSStyleNode } from "../utils/createUnsafeCSSStyleNode.js";
13
12
  import { wrapUnsafeCSS } from "../utils/cssWrappers.js";
14
13
  import { getOrCreateCodeNode } from "../utils/getOrCreateCodeNode.js";
@@ -36,8 +35,9 @@ var FileDiff = class {
36
35
  bufferBefore;
37
36
  bufferAfter;
38
37
  unsafeCSSStyle;
39
- hoverContent;
38
+ gutterUtilityContent;
40
39
  headerElement;
40
+ headerPrefix;
41
41
  headerMetadata;
42
42
  separatorCache = /* @__PURE__ */ new Map();
43
43
  errorWrapper;
@@ -45,8 +45,7 @@ var FileDiff = class {
45
45
  hunksRenderer;
46
46
  resizeManager;
47
47
  scrollSyncManager;
48
- mouseEventManager;
49
- lineSelectionManager;
48
+ interactionManager;
50
49
  annotationCache = /* @__PURE__ */ new Map();
51
50
  lineAnnotations = [];
52
51
  deletionFile;
@@ -61,20 +60,25 @@ var FileDiff = class {
61
60
  this.options = options;
62
61
  this.workerManager = workerManager;
63
62
  this.isContainerManaged = isContainerManaged;
64
- this.hunksRenderer = new DiffHunksRenderer({
65
- ...options,
66
- hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
67
- }, this.handleHighlightRender, this.workerManager);
63
+ this.hunksRenderer = this.createHunksRenderer(options);
68
64
  this.resizeManager = new ResizeManager();
69
65
  this.scrollSyncManager = new ScrollSyncManager();
70
- this.mouseEventManager = new MouseEventManager("diff", pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" ? this.handleExpandHunk : void 0));
71
- this.lineSelectionManager = new LineSelectionManager(pluckLineSelectionOptions(options, this.getLineIndex));
66
+ this.interactionManager = new InteractionManager("diff", pluckInteractionOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" || options.hunkSeparators === "line-info-basic" ? this.handleExpandHunk : void 0, this.getLineIndex));
72
67
  this.workerManager?.subscribeToThemeChanges(this);
73
68
  this.enabled = true;
74
69
  }
75
70
  handleHighlightRender = () => {
76
71
  this.rerender();
77
72
  };
73
+ getHunksRendererOptions(options) {
74
+ return {
75
+ ...options,
76
+ hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
77
+ };
78
+ }
79
+ createHunksRenderer(options) {
80
+ return new DiffHunksRenderer(this.getHunksRendererOptions(options), this.handleHighlightRender, this.workerManager);
81
+ }
78
82
  getLineIndex = (lineNumber, side = "additions") => {
79
83
  if (this.fileDiff == null) return;
80
84
  const lastHunk = this.fileDiff.hunks.at(-1);
@@ -131,12 +135,8 @@ var FileDiff = class {
131
135
  setOptions(options) {
132
136
  if (options == null) return;
133
137
  this.options = options;
134
- this.hunksRenderer.setOptions({
135
- ...this.options,
136
- hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
137
- });
138
- this.mouseEventManager.setOptions(pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" ? this.handleExpandHunk : void 0));
139
- this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options, this.getLineIndex));
138
+ this.hunksRenderer.setOptions(this.getHunksRendererOptions(options));
139
+ this.interactionManager.setOptions(pluckInteractionOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" || options.hunkSeparators === "line-info-basic" ? this.handleExpandHunk : void 0, this.getLineIndex));
140
140
  }
141
141
  mergeOptions(options) {
142
142
  this.options = {
@@ -161,7 +161,7 @@ var FileDiff = class {
161
161
  }
162
162
  }
163
163
  getHoveredLine = () => {
164
- return this.mouseEventManager.getHoveredLine();
164
+ return this.interactionManager.getHoveredLine();
165
165
  };
166
166
  setLineAnnotations(lineAnnotations) {
167
167
  this.lineAnnotations = lineAnnotations;
@@ -171,16 +171,15 @@ var FileDiff = class {
171
171
  return true;
172
172
  }
173
173
  setSelectedLines(range) {
174
- this.lineSelectionManager.setSelection(range);
174
+ this.interactionManager.setSelection(range);
175
175
  }
176
176
  cleanUp(recycle = false) {
177
177
  this.resizeManager.cleanUp();
178
- this.mouseEventManager.cleanUp();
178
+ this.interactionManager.cleanUp();
179
179
  this.scrollSyncManager.cleanUp();
180
- this.lineSelectionManager.cleanUp();
181
180
  this.workerManager?.unsubscribeToThemeChanges(this);
182
181
  this.renderRange = void 0;
183
- if (!this.isContainerManaged) this.fileContainer?.parentNode?.removeChild(this.fileContainer);
182
+ if (!this.isContainerManaged) this.fileContainer?.remove();
184
183
  if (this.fileContainer?.shadowRoot != null) this.fileContainer.shadowRoot.innerHTML = "";
185
184
  this.fileContainer = void 0;
186
185
  if (this.pre != null) {
@@ -194,6 +193,8 @@ var FileDiff = class {
194
193
  this.bufferAfter = void 0;
195
194
  this.appliedPreAttributes = void 0;
196
195
  this.headerElement = void 0;
196
+ this.headerPrefix = void 0;
197
+ this.headerMetadata = void 0;
197
198
  this.lastRenderedHeaderHTML = void 0;
198
199
  this.errorWrapper = void 0;
199
200
  this.spriteSVG = void 0;
@@ -253,10 +254,9 @@ var FileDiff = class {
253
254
  this.fileDiff = fileDiff ?? (oldFile != null && newFile != null ? parseDiffFromFile(oldFile, newFile) : void 0);
254
255
  this.hunksRenderer.hydrate(this.fileDiff);
255
256
  this.renderAnnotations();
256
- this.renderHoverUtility();
257
+ this.renderGutterUtility();
257
258
  this.injectUnsafeCSS();
258
- this.mouseEventManager.setup(this.pre);
259
- this.lineSelectionManager.setup(this.pre);
259
+ this.interactionManager.setup(this.pre);
260
260
  this.resizeManager.setup(this.pre, overflow === "wrap");
261
261
  if (overflow === "scroll" && diffStyle === "split") this.scrollSyncManager.setup(this.pre, this.codeDeletions, this.codeAdditions);
262
262
  }
@@ -264,28 +264,27 @@ var FileDiff = class {
264
264
  rerender() {
265
265
  if (!this.enabled || this.fileDiff == null && this.additionFile == null && this.deletionFile == null) return;
266
266
  this.render({
267
- oldFile: this.deletionFile,
268
- newFile: this.additionFile,
269
- fileDiff: this.fileDiff,
270
267
  forceRender: true,
271
268
  renderRange: this.renderRange
272
269
  });
273
270
  }
274
- handleExpandHunk = (hunkIndex, direction) => {
275
- this.expandHunk(hunkIndex, direction);
271
+ handleExpandHunk = (hunkIndex, direction, expansionLineCountOverride) => {
272
+ this.expandHunk(hunkIndex, direction, expansionLineCountOverride);
276
273
  };
277
- expandHunk(hunkIndex, direction) {
278
- this.hunksRenderer.expandHunk(hunkIndex, direction);
274
+ expandHunk = (hunkIndex, direction, expansionLineCountOverride) => {
275
+ this.hunksRenderer.expandHunk(hunkIndex, direction, expansionLineCountOverride);
279
276
  this.rerender();
280
- }
277
+ };
281
278
  render({ oldFile, newFile, fileDiff, forceRender = false, lineAnnotations, fileContainer, containerWrapper, renderRange }) {
282
279
  if (!this.enabled) throw new Error("FileDiff.render: attempting to call render after cleaned up");
280
+ const { collapsed = false } = this.options;
281
+ const nextRenderRange = collapsed ? void 0 : renderRange;
283
282
  const filesDidChange = oldFile != null && newFile != null && (!areFilesEqual(oldFile, this.deletionFile) || !areFilesEqual(newFile, this.additionFile));
284
283
  let diffDidChange = fileDiff != null && fileDiff !== this.fileDiff;
285
284
  const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
286
- if (areRenderRangesEqual(renderRange, this.renderRange) && !forceRender && !annotationsChanged && (fileDiff != null && fileDiff === this.fileDiff || fileDiff == null && !filesDidChange)) return false;
285
+ if (!collapsed && areRenderRangesEqual(nextRenderRange, this.renderRange) && !forceRender && !annotationsChanged && (fileDiff != null && fileDiff === this.fileDiff || fileDiff == null && !filesDidChange)) return false;
287
286
  const { renderRange: previousRenderRange } = this;
288
- this.renderRange = renderRange;
287
+ this.renderRange = nextRenderRange;
289
288
  this.deletionFile = oldFile;
290
289
  this.additionFile = newFile;
291
290
  if (fileDiff != null) this.fileDiff = fileDiff;
@@ -303,19 +302,42 @@ var FileDiff = class {
303
302
  const { diffStyle = "split", disableErrorHandling = false, disableFileHeader = false, overflow = "scroll" } = this.options;
304
303
  if (disableFileHeader) {
305
304
  if (this.headerElement != null) {
306
- this.headerElement.parentNode?.removeChild(this.headerElement);
305
+ this.headerElement.remove();
307
306
  this.headerElement = void 0;
308
307
  this.lastRenderedHeaderHTML = void 0;
309
308
  }
309
+ if (this.headerPrefix != null) {
310
+ this.headerPrefix.remove();
311
+ this.headerPrefix = void 0;
312
+ }
313
+ if (this.headerMetadata != null) {
314
+ this.headerMetadata.remove();
315
+ this.headerMetadata = void 0;
316
+ }
310
317
  }
311
318
  fileContainer = this.getOrCreateFileContainer(fileContainer, containerWrapper);
319
+ if (collapsed) {
320
+ this.removeRenderedCode();
321
+ this.clearAuxiliaryNodes();
322
+ try {
323
+ const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, EMPTY_RENDER_RANGE);
324
+ if (hunksResult?.headerElement != null) this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);
325
+ this.renderSeparators([]);
326
+ this.injectUnsafeCSS();
327
+ } catch (error) {
328
+ if (disableErrorHandling) throw error;
329
+ console.error(error);
330
+ if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
331
+ }
332
+ return true;
333
+ }
312
334
  try {
313
335
  const pre = this.getOrCreatePreNode(fileContainer);
314
336
  if (!(this.canPartiallyRender(forceRender, annotationsChanged, filesDidChange || diffDidChange) && this.applyPartialRender({
315
337
  previousRenderRange,
316
- renderRange
338
+ renderRange: nextRenderRange
317
339
  }))) {
318
- const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, renderRange);
340
+ const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, nextRenderRange);
319
341
  if (hunksResult == null) {
320
342
  if (this.workerManager?.isInitialized() === false) this.workerManager.initialize().then(() => this.rerender());
321
343
  return false;
@@ -323,17 +345,16 @@ var FileDiff = class {
323
345
  if (hunksResult.headerElement != null) this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);
324
346
  if (hunksResult.additionsContentAST != null || hunksResult.deletionsContentAST != null || hunksResult.unifiedContentAST != null) this.applyHunksToDOM(pre, hunksResult);
325
347
  else if (this.pre != null) {
326
- this.pre.parentNode?.removeChild(this.pre);
348
+ this.pre.remove();
327
349
  this.pre = void 0;
328
350
  }
329
351
  this.renderSeparators(hunksResult.hunkData);
330
352
  }
331
- this.applyBuffers(pre, renderRange);
353
+ this.applyBuffers(pre, nextRenderRange);
332
354
  this.injectUnsafeCSS();
333
355
  this.renderAnnotations();
334
- this.renderHoverUtility();
335
- this.mouseEventManager.setup(pre);
336
- this.lineSelectionManager.setup(pre);
356
+ this.renderGutterUtility();
357
+ this.interactionManager.setup(pre);
337
358
  this.resizeManager.setup(pre, overflow === "wrap");
338
359
  if (overflow === "scroll" && diffStyle === "split") this.scrollSyncManager.setup(pre, this.codeDeletions, this.codeAdditions);
339
360
  else this.scrollSyncManager.cleanUp();
@@ -344,6 +365,33 @@ var FileDiff = class {
344
365
  }
345
366
  return true;
346
367
  }
368
+ removeRenderedCode() {
369
+ this.resizeManager.cleanUp();
370
+ this.scrollSyncManager.cleanUp();
371
+ this.interactionManager.cleanUp();
372
+ this.bufferBefore?.remove();
373
+ this.bufferBefore = void 0;
374
+ this.bufferAfter?.remove();
375
+ this.bufferAfter = void 0;
376
+ this.codeUnified?.remove();
377
+ this.codeUnified = void 0;
378
+ this.codeDeletions?.remove();
379
+ this.codeDeletions = void 0;
380
+ this.codeAdditions?.remove();
381
+ this.codeAdditions = void 0;
382
+ this.pre?.remove();
383
+ this.pre = void 0;
384
+ this.appliedPreAttributes = void 0;
385
+ this.lastRowCount = void 0;
386
+ }
387
+ clearAuxiliaryNodes() {
388
+ for (const { element } of this.separatorCache.values()) element.remove();
389
+ this.separatorCache.clear();
390
+ for (const { element } of this.annotationCache.values()) element.remove();
391
+ this.annotationCache.clear();
392
+ this.gutterUtilityContent?.remove();
393
+ this.gutterUtilityContent = void 0;
394
+ }
347
395
  renderPlaceholder(height) {
348
396
  if (this.fileContainer == null) return false;
349
397
  this.cleanChildNodes();
@@ -359,8 +407,7 @@ var FileDiff = class {
359
407
  cleanChildNodes() {
360
408
  this.resizeManager.cleanUp();
361
409
  this.scrollSyncManager.cleanUp();
362
- this.mouseEventManager.cleanUp();
363
- this.lineSelectionManager.cleanUp();
410
+ this.interactionManager.cleanUp();
364
411
  this.bufferAfter?.remove();
365
412
  this.bufferBefore?.remove();
366
413
  this.codeAdditions?.remove();
@@ -368,7 +415,9 @@ var FileDiff = class {
368
415
  this.codeUnified?.remove();
369
416
  this.errorWrapper?.remove();
370
417
  this.headerElement?.remove();
371
- this.hoverContent?.remove();
418
+ this.gutterUtilityContent?.remove();
419
+ this.headerPrefix?.remove();
420
+ this.headerMetadata?.remove();
372
421
  this.pre?.remove();
373
422
  this.spriteSVG?.remove();
374
423
  this.unsafeCSSStyle?.remove();
@@ -379,7 +428,9 @@ var FileDiff = class {
379
428
  this.codeUnified = void 0;
380
429
  this.errorWrapper = void 0;
381
430
  this.headerElement = void 0;
382
- this.hoverContent = void 0;
431
+ this.gutterUtilityContent = void 0;
432
+ this.headerPrefix = void 0;
433
+ this.headerMetadata = void 0;
383
434
  this.pre = void 0;
384
435
  this.spriteSVG = void 0;
385
436
  this.unsafeCSSStyle = void 0;
@@ -389,7 +440,7 @@ var FileDiff = class {
389
440
  renderSeparators(hunkData) {
390
441
  const { hunkSeparators } = this.options;
391
442
  if (this.isContainerManaged || this.fileContainer == null || typeof hunkSeparators !== "function") {
392
- for (const { element } of this.separatorCache.values()) element.parentNode?.removeChild(element);
443
+ for (const { element } of this.separatorCache.values()) element.remove();
393
444
  this.separatorCache.clear();
394
445
  return;
395
446
  }
@@ -398,11 +449,12 @@ var FileDiff = class {
398
449
  const id = hunk.slotName;
399
450
  let cache = this.separatorCache.get(id);
400
451
  if (cache == null || !areHunkDataEqual(hunk, cache.hunkData)) {
401
- cache?.element.parentNode?.removeChild(cache.element);
452
+ cache?.element.remove();
402
453
  const element = document.createElement("div");
403
454
  element.style.display = "contents";
404
455
  element.slot = hunk.slotName;
405
- element.appendChild(hunkSeparators(hunk, this));
456
+ const child = hunkSeparators(hunk, this);
457
+ if (child != null) element.appendChild(child);
406
458
  this.fileContainer.appendChild(element);
407
459
  cache = {
408
460
  element,
@@ -414,12 +466,12 @@ var FileDiff = class {
414
466
  }
415
467
  for (const [id, { element }] of staleSeparators.entries()) {
416
468
  this.separatorCache.delete(id);
417
- element.parentNode?.removeChild(element);
469
+ element.remove();
418
470
  }
419
471
  }
420
472
  renderAnnotations() {
421
473
  if (this.isContainerManaged || this.fileContainer == null) {
422
- for (const { element } of this.annotationCache.values()) element.parentNode?.removeChild(element);
474
+ for (const { element } of this.annotationCache.values()) element.remove();
423
475
  this.annotationCache.clear();
424
476
  return;
425
477
  }
@@ -429,7 +481,7 @@ var FileDiff = class {
429
481
  const id = `${index}-${getLineAnnotationName(annotation)}`;
430
482
  let cache = this.annotationCache.get(id);
431
483
  if (cache == null || !areDiffLineAnnotationsEqual(annotation, cache.annotation)) {
432
- cache?.element.parentElement?.removeChild(cache.element);
484
+ cache?.element.remove();
433
485
  const content = renderAnnotation(annotation);
434
486
  if (content == null) continue;
435
487
  cache = {
@@ -444,22 +496,27 @@ var FileDiff = class {
444
496
  }
445
497
  for (const [id, { element }] of staleAnnotations.entries()) {
446
498
  this.annotationCache.delete(id);
447
- element.parentNode?.removeChild(element);
499
+ element.remove();
448
500
  }
449
501
  }
450
- renderHoverUtility() {
451
- const { renderHoverUtility } = this.options;
452
- if (this.fileContainer == null || renderHoverUtility == null) return;
453
- const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);
454
- if (element != null && this.hoverContent != null) return;
502
+ renderGutterUtility() {
503
+ const renderGutterUtility = this.options.renderGutterUtility ?? this.options.renderHoverUtility;
504
+ if (this.fileContainer == null || renderGutterUtility == null) {
505
+ this.gutterUtilityContent?.remove();
506
+ this.gutterUtilityContent = void 0;
507
+ return;
508
+ }
509
+ const element = renderGutterUtility(this.interactionManager.getHoveredLine);
510
+ if (element != null && this.gutterUtilityContent != null) return;
455
511
  else if (element == null) {
456
- this.hoverContent?.parentNode?.removeChild(this.hoverContent);
457
- this.hoverContent = void 0;
512
+ this.gutterUtilityContent?.remove();
513
+ this.gutterUtilityContent = void 0;
458
514
  return;
459
515
  }
460
- this.hoverContent = createHoverContentNode();
461
- this.hoverContent.appendChild(element);
462
- this.fileContainer.appendChild(this.hoverContent);
516
+ const gutterUtilityContent = createGutterUtilityContentNode();
517
+ gutterUtilityContent.appendChild(element);
518
+ this.fileContainer.appendChild(gutterUtilityContent);
519
+ this.gutterUtilityContent = gutterUtilityContent;
463
520
  }
464
521
  getOrCreateFileContainer(fileContainer, parentNode) {
465
522
  const previousContainer = this.fileContainer;
@@ -527,13 +584,26 @@ var FileDiff = class {
527
584
  this.lastRenderedHeaderHTML = headerHTML;
528
585
  }
529
586
  if (this.isContainerManaged) return;
530
- const { renderHeaderMetadata } = this.options;
531
- if (this.headerMetadata != null) this.headerMetadata.parentNode?.removeChild(this.headerMetadata);
587
+ const { renderHeaderPrefix, renderHeaderMetadata } = this.options;
588
+ if (this.headerPrefix != null) this.headerPrefix.remove();
589
+ if (this.headerMetadata != null) this.headerMetadata.remove();
590
+ const prefix = renderHeaderPrefix?.({
591
+ deletionFile: this.deletionFile,
592
+ additionFile: this.additionFile,
593
+ fileDiff: this.fileDiff
594
+ }) ?? void 0;
532
595
  const content = renderHeaderMetadata?.({
533
596
  deletionFile: this.deletionFile,
534
597
  additionFile: this.additionFile,
535
598
  fileDiff: this.fileDiff
536
599
  }) ?? void 0;
600
+ if (prefix != null) {
601
+ this.headerPrefix = document.createElement("div");
602
+ this.headerPrefix.slot = HEADER_PREFIX_SLOT_ID;
603
+ if (prefix instanceof Element) this.headerPrefix.appendChild(prefix);
604
+ else this.headerPrefix.innerText = `${prefix}`;
605
+ container.appendChild(this.headerPrefix);
606
+ }
537
607
  if (content != null) {
538
608
  this.headerMetadata = document.createElement("div");
539
609
  this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;
@@ -554,6 +624,7 @@ var FileDiff = class {
554
624
  }
555
625
  applyHunksToDOM(pre, result) {
556
626
  const { overflow = "scroll" } = this.options;
627
+ const containerSize = (this.options.hunkSeparators ?? "line-info") === "line-info";
557
628
  const rowSpan = overflow === "wrap" ? result.rowCount : void 0;
558
629
  this.cleanupErrorWrapper();
559
630
  this.applyPreNodeAttributes(pre, result);
@@ -571,7 +642,8 @@ var FileDiff = class {
571
642
  this.codeUnified = getOrCreateCodeNode({
572
643
  code: this.codeUnified,
573
644
  columnType: "unified",
574
- rowSpan
645
+ rowSpan,
646
+ containerSize
575
647
  });
576
648
  this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(unifiedAST);
577
649
  codeElements.push(this.codeUnified);
@@ -583,7 +655,8 @@ var FileDiff = class {
583
655
  this.codeDeletions = getOrCreateCodeNode({
584
656
  code: this.codeDeletions,
585
657
  columnType: "deletions",
586
- rowSpan
658
+ rowSpan,
659
+ containerSize
587
660
  });
588
661
  this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(deletionsAST);
589
662
  codeElements.push(this.codeDeletions);
@@ -598,7 +671,8 @@ var FileDiff = class {
598
671
  this.codeAdditions = getOrCreateCodeNode({
599
672
  code: this.codeAdditions,
600
673
  columnType: "additions",
601
- rowSpan
674
+ rowSpan,
675
+ containerSize
602
676
  });
603
677
  this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(additionsAST);
604
678
  codeElements.push(this.codeAdditions);
@@ -661,7 +735,7 @@ var FileDiff = class {
661
735
  if (result == null) return;
662
736
  if (diffStyle === "unified" && !Array.isArray(codeElements)) this.insertPartialHTML(diffStyle, codeElements, result, insertPosition);
663
737
  else if (diffStyle === "split" && Array.isArray(codeElements)) this.insertPartialHTML(diffStyle, codeElements, result, insertPosition);
664
- else throw new Error("u done fuked up, again");
738
+ else throw new Error("FileDiff.applyPartialRender.applyChunk: invalid chunk application");
665
739
  rowCount += result.rowCount;
666
740
  };
667
741
  this.cleanupErrorWrapper();
@@ -792,7 +866,7 @@ var FileDiff = class {
792
866
  }
793
867
  if (gutterElement.dataset.gutterBuffer === "buffer" && "contentBuffer" in contentElement.dataset) {
794
868
  const totalRows = this.getBufferSize(contentElement.dataset);
795
- if (totalRows == null) throw new Error("u fuked up");
869
+ if (totalRows == null) throw new Error("FileDiff.trimColumnRows: invalid element");
796
870
  if (preTrimCount > 0) {
797
871
  const rowsToRemove = Math.min(preTrimCount, totalRows);
798
872
  const newSize = totalRows - rowsToRemove;
@@ -886,11 +960,11 @@ var FileDiff = class {
886
960
  const { disableVirtualizationBuffers = false } = this.options;
887
961
  if (disableVirtualizationBuffers || renderRange == null) {
888
962
  if (this.bufferBefore != null) {
889
- this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
963
+ this.bufferBefore.remove();
890
964
  this.bufferBefore = void 0;
891
965
  }
892
966
  if (this.bufferAfter != null) {
893
- this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
967
+ this.bufferAfter.remove();
894
968
  this.bufferAfter = void 0;
895
969
  }
896
970
  return;
@@ -904,7 +978,7 @@ var FileDiff = class {
904
978
  this.bufferBefore.style.setProperty("height", `${renderRange.bufferBefore}px`);
905
979
  this.bufferBefore.style.setProperty("contain", "strict");
906
980
  } else if (this.bufferBefore != null) {
907
- this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
981
+ this.bufferBefore.remove();
908
982
  this.bufferBefore = void 0;
909
983
  }
910
984
  if (renderRange.bufferAfter > 0) {
@@ -916,11 +990,11 @@ var FileDiff = class {
916
990
  this.bufferAfter.style.setProperty("height", `${renderRange.bufferAfter}px`);
917
991
  this.bufferAfter.style.setProperty("contain", "strict");
918
992
  } else if (this.bufferAfter != null) {
919
- this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
993
+ this.bufferAfter.remove();
920
994
  this.bufferAfter = void 0;
921
995
  }
922
996
  }
923
- applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsContentAST, deletionsContentAST, totalLines }) {
997
+ applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsContentAST, deletionsContentAST, totalLines }, customProperties) {
924
998
  const { diffIndicators = "bars", disableBackground = false, disableLineNumbers = false, overflow = "scroll", themeType = "system", diffStyle = "split" } = this.options;
925
999
  const preProperties = {
926
1000
  type: "diff",
@@ -931,7 +1005,8 @@ var FileDiff = class {
931
1005
  split: diffStyle === "unified" ? false : additionsContentAST != null && deletionsContentAST != null,
932
1006
  themeStyles,
933
1007
  themeType: baseThemeType ?? themeType,
934
- totalLines
1008
+ totalLines,
1009
+ customProperties
935
1010
  };
936
1011
  if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) return;
937
1012
  setPreNodeProperties(pre, preProperties);
@@ -941,7 +1016,7 @@ var FileDiff = class {
941
1016
  this.cleanupErrorWrapper();
942
1017
  const pre = this.getOrCreatePreNode(container);
943
1018
  pre.innerHTML = "";
944
- pre.parentNode?.removeChild(pre);
1019
+ pre.remove();
945
1020
  this.pre = void 0;
946
1021
  this.appliedPreAttributes = void 0;
947
1022
  const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
@@ -959,7 +1034,7 @@ var FileDiff = class {
959
1034
  this.errorWrapper.appendChild(errorStack);
960
1035
  }
961
1036
  cleanupErrorWrapper() {
962
- this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);
1037
+ this.errorWrapper?.remove();
963
1038
  this.errorWrapper = void 0;
964
1039
  }
965
1040
  };