@pierre/diffs 1.2.12 → 1.3.0-beta.10

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 (288) hide show
  1. package/dist/components/CodeView.d.ts +91 -6
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +300 -38
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts +14 -3
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +98 -12
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +68 -19
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +363 -25
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/FileStream.d.ts.map +1 -1
  14. package/dist/components/FileStream.js +2 -1
  15. package/dist/components/FileStream.js.map +1 -1
  16. package/dist/components/UnresolvedFile.d.ts +2 -2
  17. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  18. package/dist/components/UnresolvedFile.js +2 -2
  19. package/dist/components/UnresolvedFile.js.map +1 -1
  20. package/dist/components/VirtualizedFile.d.ts +4 -2
  21. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  22. package/dist/components/VirtualizedFile.js +59 -47
  23. package/dist/components/VirtualizedFile.js.map +1 -1
  24. package/dist/components/VirtualizedFileDiff.d.ts +27 -5
  25. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.js +262 -56
  27. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  28. package/dist/components/Virtualizer.d.ts +4 -1
  29. package/dist/components/Virtualizer.d.ts.map +1 -1
  30. package/dist/components/Virtualizer.js +21 -4
  31. package/dist/components/Virtualizer.js.map +1 -1
  32. package/dist/constants.d.ts +4 -1
  33. package/dist/constants.d.ts.map +1 -1
  34. package/dist/constants.js +4 -1
  35. package/dist/constants.js.map +1 -1
  36. package/dist/editor/command.d.ts +7 -0
  37. package/dist/editor/command.d.ts.map +1 -0
  38. package/dist/editor/command.js +54 -0
  39. package/dist/editor/command.js.map +1 -0
  40. package/dist/editor/editStack.d.ts +71 -0
  41. package/dist/editor/editStack.d.ts.map +1 -0
  42. package/dist/editor/editStack.js +218 -0
  43. package/dist/editor/editStack.js.map +1 -0
  44. package/dist/editor/editor.d.ts +105 -0
  45. package/dist/editor/editor.d.ts.map +1 -0
  46. package/dist/editor/editor.js +2545 -0
  47. package/dist/editor/editor.js.map +1 -0
  48. package/dist/editor/editor2.js +6 -0
  49. package/dist/editor/editor2.js.map +1 -0
  50. package/dist/editor/index.d.ts +5 -0
  51. package/dist/editor/index.js +3 -0
  52. package/dist/editor/languages.d.ts +26 -0
  53. package/dist/editor/languages.d.ts.map +1 -0
  54. package/dist/editor/languages.js +363 -0
  55. package/dist/editor/languages.js.map +1 -0
  56. package/dist/editor/lineAnnotations.d.ts +9 -0
  57. package/dist/editor/lineAnnotations.d.ts.map +1 -0
  58. package/dist/editor/lineAnnotations.js +212 -0
  59. package/dist/editor/lineAnnotations.js.map +1 -0
  60. package/dist/editor/marker.d.ts +38 -0
  61. package/dist/editor/marker.d.ts.map +1 -0
  62. package/dist/editor/marker.js +245 -0
  63. package/dist/editor/marker.js.map +1 -0
  64. package/dist/editor/matchBrackets.d.ts +9 -0
  65. package/dist/editor/matchBrackets.d.ts.map +1 -0
  66. package/dist/editor/matchBrackets.js +138 -0
  67. package/dist/editor/matchBrackets.js.map +1 -0
  68. package/dist/editor/pieceTable.d.ts +41 -0
  69. package/dist/editor/pieceTable.d.ts.map +1 -0
  70. package/dist/editor/pieceTable.js +671 -0
  71. package/dist/editor/pieceTable.js.map +1 -0
  72. package/dist/editor/platform.d.ts +19 -0
  73. package/dist/editor/platform.d.ts.map +1 -0
  74. package/dist/editor/platform.js +57 -0
  75. package/dist/editor/platform.js.map +1 -0
  76. package/dist/editor/popover.d.ts +65 -0
  77. package/dist/editor/popover.d.ts.map +1 -0
  78. package/dist/editor/popover.js +187 -0
  79. package/dist/editor/popover.js.map +1 -0
  80. package/dist/editor/searchPanel.d.ts +40 -0
  81. package/dist/editor/searchPanel.d.ts.map +1 -0
  82. package/dist/editor/searchPanel.js +318 -0
  83. package/dist/editor/searchPanel.js.map +1 -0
  84. package/dist/editor/selection.d.ts +211 -0
  85. package/dist/editor/selection.d.ts.map +1 -0
  86. package/dist/editor/selection.js +1626 -0
  87. package/dist/editor/selection.js.map +1 -0
  88. package/dist/editor/selectionAction.d.ts +46 -0
  89. package/dist/editor/selectionAction.d.ts.map +1 -0
  90. package/dist/editor/selectionAction.js +64 -0
  91. package/dist/editor/selectionAction.js.map +1 -0
  92. package/dist/editor/sprite.d.ts +8 -0
  93. package/dist/editor/sprite.d.ts.map +1 -0
  94. package/dist/editor/sprite.js +45 -0
  95. package/dist/editor/sprite.js.map +1 -0
  96. package/dist/editor/stateStorage.d.ts +15 -0
  97. package/dist/editor/stateStorage.d.ts.map +1 -0
  98. package/dist/editor/stateStorage.js +65 -0
  99. package/dist/editor/stateStorage.js.map +1 -0
  100. package/dist/editor/textDocument.d.ts +77 -0
  101. package/dist/editor/textDocument.d.ts.map +1 -0
  102. package/dist/editor/textDocument.js +271 -0
  103. package/dist/editor/textDocument.js.map +1 -0
  104. package/dist/editor/textMeasure.d.ts +61 -0
  105. package/dist/editor/textMeasure.d.ts.map +1 -0
  106. package/dist/editor/textMeasure.js +209 -0
  107. package/dist/editor/textMeasure.js.map +1 -0
  108. package/dist/editor/tokenizer.d.ts +41 -0
  109. package/dist/editor/tokenizer.d.ts.map +1 -0
  110. package/dist/editor/tokenizer.js +513 -0
  111. package/dist/editor/tokenizer.js.map +1 -0
  112. package/dist/editor/utils.d.ts +21 -0
  113. package/dist/editor/utils.d.ts.map +1 -0
  114. package/dist/editor/utils.js +68 -0
  115. package/dist/editor/utils.js.map +1 -0
  116. package/dist/index.d.ts +10 -8
  117. package/dist/index.js +12 -10
  118. package/dist/managers/InteractionManager.d.ts +7 -0
  119. package/dist/managers/InteractionManager.d.ts.map +1 -1
  120. package/dist/managers/InteractionManager.js +22 -1
  121. package/dist/managers/InteractionManager.js.map +1 -1
  122. package/dist/managers/ResizeManager.d.ts +10 -2
  123. package/dist/managers/ResizeManager.d.ts.map +1 -1
  124. package/dist/managers/ResizeManager.js +33 -13
  125. package/dist/managers/ResizeManager.js.map +1 -1
  126. package/dist/managers/UniversalRenderingManager.d.ts +2 -1
  127. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  128. package/dist/managers/UniversalRenderingManager.js +6 -1
  129. package/dist/managers/UniversalRenderingManager.js.map +1 -1
  130. package/dist/react/CodeView.d.ts +26 -1
  131. package/dist/react/CodeView.d.ts.map +1 -1
  132. package/dist/react/CodeView.js +82 -19
  133. package/dist/react/CodeView.js.map +1 -1
  134. package/dist/react/EditContext.d.ts +15 -0
  135. package/dist/react/EditContext.d.ts.map +1 -0
  136. package/dist/react/EditContext.js +23 -0
  137. package/dist/react/EditContext.js.map +1 -0
  138. package/dist/react/File.d.ts +3 -1
  139. package/dist/react/File.d.ts.map +1 -1
  140. package/dist/react/File.js +4 -2
  141. package/dist/react/File.js.map +1 -1
  142. package/dist/react/FileDiff.d.ts +4 -1
  143. package/dist/react/FileDiff.d.ts.map +1 -1
  144. package/dist/react/FileDiff.js +4 -2
  145. package/dist/react/FileDiff.js.map +1 -1
  146. package/dist/react/MultiFileDiff.d.ts +7 -5
  147. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  148. package/dist/react/MultiFileDiff.js +4 -2
  149. package/dist/react/MultiFileDiff.js.map +1 -1
  150. package/dist/react/PatchDiff.d.ts +4 -1
  151. package/dist/react/PatchDiff.d.ts.map +1 -1
  152. package/dist/react/PatchDiff.js +4 -2
  153. package/dist/react/PatchDiff.js.map +1 -1
  154. package/dist/react/UnresolvedFile.d.ts +1 -0
  155. package/dist/react/UnresolvedFile.d.ts.map +1 -1
  156. package/dist/react/UnresolvedFile.js +2 -1
  157. package/dist/react/UnresolvedFile.js.map +1 -1
  158. package/dist/react/index.d.ts +3 -2
  159. package/dist/react/index.js +2 -1
  160. package/dist/react/types.d.ts +3 -0
  161. package/dist/react/types.d.ts.map +1 -1
  162. package/dist/react/utils/renderDiffChildren.d.ts +2 -0
  163. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  164. package/dist/react/utils/renderDiffChildren.js +16 -8
  165. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  166. package/dist/react/utils/renderFileChildren.d.ts +2 -0
  167. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  168. package/dist/react/utils/renderFileChildren.js +16 -8
  169. package/dist/react/utils/renderFileChildren.js.map +1 -1
  170. package/dist/react/utils/useFileDiffInstance.d.ts +3 -1
  171. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  172. package/dist/react/utils/useFileDiffInstance.js +30 -6
  173. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  174. package/dist/react/utils/useFileInstance.d.ts +4 -1
  175. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  176. package/dist/react/utils/useFileInstance.js +30 -5
  177. package/dist/react/utils/useFileInstance.js.map +1 -1
  178. package/dist/renderers/DiffHunksRenderer.d.ts +28 -2
  179. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  180. package/dist/renderers/DiffHunksRenderer.js +244 -22
  181. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  182. package/dist/renderers/FileRenderer.d.ts +8 -1
  183. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  184. package/dist/renderers/FileRenderer.js +155 -45
  185. package/dist/renderers/FileRenderer.js.map +1 -1
  186. package/dist/ssr/index.d.ts +2 -2
  187. package/dist/ssr/preloadDiffs.d.ts +11 -10
  188. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  189. package/dist/ssr/preloadDiffs.js +15 -7
  190. package/dist/ssr/preloadDiffs.js.map +1 -1
  191. package/dist/style.js +1 -1
  192. package/dist/types.d.ts +282 -5
  193. package/dist/types.d.ts.map +1 -1
  194. package/dist/utils/applyLineTextWithNewline.d.ts +5 -0
  195. package/dist/utils/applyLineTextWithNewline.d.ts.map +1 -0
  196. package/dist/utils/applyLineTextWithNewline.js +11 -0
  197. package/dist/utils/applyLineTextWithNewline.js.map +1 -0
  198. package/dist/utils/areHunkDataEqual.js +1 -1
  199. package/dist/utils/areHunkDataEqual.js.map +1 -1
  200. package/dist/utils/areManagedSnapshotsEqual.d.ts +2 -2
  201. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  202. package/dist/utils/areManagedSnapshotsEqual.js +5 -0
  203. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  204. package/dist/utils/awaitWithTimeout.d.ts +5 -0
  205. package/dist/utils/awaitWithTimeout.d.ts.map +1 -0
  206. package/dist/utils/awaitWithTimeout.js +15 -0
  207. package/dist/utils/awaitWithTimeout.js.map +1 -0
  208. package/dist/utils/cleanLastNewline.js +6 -1
  209. package/dist/utils/cleanLastNewline.js.map +1 -1
  210. package/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
  211. package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
  212. package/dist/utils/cloneFileDiffMetadata.js +16 -0
  213. package/dist/utils/cloneFileDiffMetadata.js.map +1 -0
  214. package/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
  215. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  216. package/dist/utils/computeEstimatedDiffHeights.js +8 -1
  217. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  218. package/dist/utils/computeFileOffsets.d.ts +21 -0
  219. package/dist/utils/computeFileOffsets.d.ts.map +1 -0
  220. package/dist/utils/computeFileOffsets.js +51 -0
  221. package/dist/utils/computeFileOffsets.js.map +1 -0
  222. package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts +5 -0
  223. package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts.map +1 -0
  224. package/dist/utils/createCodeViewHeaderFooterHostElement.js +19 -0
  225. package/dist/utils/createCodeViewHeaderFooterHostElement.js.map +1 -0
  226. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  227. package/dist/utils/createFileHeaderElement.js +5 -1
  228. package/dist/utils/createFileHeaderElement.js.map +1 -1
  229. package/dist/utils/createTransformerWithState.js +9 -0
  230. package/dist/utils/createTransformerWithState.js.map +1 -1
  231. package/dist/utils/editSessionHunks.d.ts +84 -0
  232. package/dist/utils/editSessionHunks.d.ts.map +1 -0
  233. package/dist/utils/editSessionHunks.js +366 -0
  234. package/dist/utils/editSessionHunks.js.map +1 -0
  235. package/dist/utils/getDiffFileInput.d.ts +14 -0
  236. package/dist/utils/getDiffFileInput.d.ts.map +1 -0
  237. package/dist/utils/getDiffFileInput.js +24 -0
  238. package/dist/utils/getDiffFileInput.js.map +1 -0
  239. package/dist/utils/getDiffHunksRendererOptions.js +1 -0
  240. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  241. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  242. package/dist/utils/getFiletypeFromFileName.js +2 -0
  243. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  244. package/dist/utils/hydratePartialDiff.d.ts +10 -0
  245. package/dist/utils/hydratePartialDiff.d.ts.map +1 -0
  246. package/dist/utils/hydratePartialDiff.js +140 -0
  247. package/dist/utils/hydratePartialDiff.js.map +1 -0
  248. package/dist/utils/iterateOverDiff.js +3 -3
  249. package/dist/utils/iterateOverDiff.js.map +1 -1
  250. package/dist/utils/parseDiffFromFile.d.ts +1 -1
  251. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  252. package/dist/utils/parseDiffFromFile.js +26 -5
  253. package/dist/utils/parseDiffFromFile.js.map +1 -1
  254. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  255. package/dist/utils/parsePatchFiles.js +2 -0
  256. package/dist/utils/parsePatchFiles.js.map +1 -1
  257. package/dist/utils/realignChangeContent.d.ts +28 -0
  258. package/dist/utils/realignChangeContent.d.ts.map +1 -0
  259. package/dist/utils/realignChangeContent.js +142 -0
  260. package/dist/utils/realignChangeContent.js.map +1 -0
  261. package/dist/utils/renderDiffWithHighlighter.js +1 -1
  262. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  263. package/dist/utils/renderFileWithHighlighter.js +5 -14
  264. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  265. package/dist/utils/updateDiffHunks.d.ts +24 -0
  266. package/dist/utils/updateDiffHunks.d.ts.map +1 -0
  267. package/dist/utils/updateDiffHunks.js +235 -0
  268. package/dist/utils/updateDiffHunks.js.map +1 -0
  269. package/dist/utils/virtualDiffLayout.d.ts +40 -1
  270. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  271. package/dist/utils/virtualDiffLayout.js +96 -1
  272. package/dist/utils/virtualDiffLayout.js.map +1 -1
  273. package/dist/worker/WorkerPoolManager.d.ts +7 -2
  274. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  275. package/dist/worker/WorkerPoolManager.js +83 -18
  276. package/dist/worker/WorkerPoolManager.js.map +1 -1
  277. package/dist/worker/index.d.ts +2 -2
  278. package/dist/worker/types.d.ts +11 -1
  279. package/dist/worker/types.d.ts.map +1 -1
  280. package/dist/worker/worker-portable.js +46 -66
  281. package/dist/worker/worker-portable.js.map +1 -1
  282. package/dist/worker/worker.js +46 -66
  283. package/dist/worker/worker.js.map +1 -1
  284. package/package.json +12 -5
  285. package/dist/utils/iterateOverFile.d.ts +0 -50
  286. package/dist/utils/iterateOverFile.d.ts.map +0 -1
  287. package/dist/utils/iterateOverFile.js +0 -49
  288. package/dist/utils/iterateOverFile.js.map +0 -1
@@ -1,9 +1,13 @@
1
- import { CUSTOM_HEADER_SLOT_ID, DEFAULT_THEMES, EMPTY_RENDER_RANGE, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID } from "../constants.js";
1
+ import { CUSTOM_HEADER_SLOT_ID, DEFAULT_THEMES, EMPTY_RENDER_RANGE, HEADER_FILENAME_SUFFIX_SLOT_ID, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID } from "../constants.js";
2
+ import { dequeueRender, queueRender } from "../managers/UniversalRenderingManager.js";
2
3
  import { areThemesEqual } from "../utils/areThemesEqual.js";
4
+ import { parseDiffFromFile } from "../utils/parseDiffFromFile.js";
5
+ import { getExpandedRegion, getNearestRenderableAdditionLine, getTrailingExpandedRegion, isAdditionLineRenderable } from "../utils/virtualDiffLayout.js";
6
+ import { captureExpansionAnchors, finishEditSessionForDiff, rebuildExpansionFromAnchors } from "../utils/editSessionHunks.js";
3
7
  import { isStyleNode } from "../utils/isStyleNode.js";
8
+ import { areFilesEqual } from "../utils/areFilesEqual.js";
4
9
  import { InteractionManager, pluckInteractionOptions } from "../managers/InteractionManager.js";
5
10
  import { ResizeManager } from "../managers/ResizeManager.js";
6
- import { areFilesEqual } from "../utils/areFilesEqual.js";
7
11
  import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
8
12
  import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
9
13
  import { SVGSpriteSheet } from "../sprite.js";
@@ -18,8 +22,12 @@ import { upsertHostThemeStyle } from "../utils/hostTheme.js";
18
22
  import { prerenderHTMLIfNecessary } from "../utils/prerenderHTMLIfNecessary.js";
19
23
  import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
20
24
  import "./web-components.js";
21
- import { parseDiffFromFile } from "../utils/parseDiffFromFile.js";
25
+ import { awaitWithTimeout } from "../utils/awaitWithTimeout.js";
26
+ import { getDiffFileInput } from "../utils/getDiffFileInput.js";
27
+ import { hydratePartialDiff } from "../utils/hydratePartialDiff.js";
28
+ import { iterateOverDiff } from "../utils/iterateOverDiff.js";
22
29
  import { ScrollSyncManager } from "../managers/ScrollSyncManager.js";
30
+ import { isDefaultRenderRange } from "../utils/isDefaultRenderRange.js";
23
31
  import { isDiffPlainText } from "../utils/isDiffPlainText.js";
24
32
  import { DiffHunksRenderer } from "../renderers/DiffHunksRenderer.js";
25
33
  import { areDiffLineAnnotationsEqual } from "../utils/areDiffLineAnnotationsEqual.js";
@@ -27,6 +35,9 @@ import { areHunkDataEqual } from "../utils/areHunkDataEqual.js";
27
35
  import { getDiffHunksRendererOptions } from "../utils/getDiffHunksRendererOptions.js";
28
36
  import { toHtml } from "hast-util-to-html";
29
37
  //#region src/components/FileDiff.ts
38
+ function canHydrateDiff(fileDiff) {
39
+ return fileDiff.isPartial && (fileDiff.type === "change" || fileDiff.type === "rename-changed" || fileDiff.type === "rename-pure");
40
+ }
30
41
  let instanceId = -1;
31
42
  var FileDiff = class {
32
43
  options;
@@ -51,6 +62,7 @@ var FileDiff = class {
51
62
  gutterUtilityContent;
52
63
  headerElement;
53
64
  headerPrefix;
65
+ headerFilenameSuffix;
54
66
  headerMetadata;
55
67
  headerCustom;
56
68
  separatorCache = /* @__PURE__ */ new Map();
@@ -67,12 +79,16 @@ var FileDiff = class {
67
79
  additionFile;
68
80
  fileDiff;
69
81
  renderRange;
82
+ pendingFiles;
70
83
  appliedPreAttributes;
71
84
  lastRenderedHeaderHTML;
72
85
  cachedHeaderHTML;
73
86
  lastRowCount;
74
87
  mounted = false;
75
88
  enabled = true;
89
+ editor;
90
+ refreshViewTimeout;
91
+ deferSetSelection;
76
92
  constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
77
93
  this.options = options;
78
94
  this.workerManager = workerManager;
@@ -94,11 +110,12 @@ var FileDiff = class {
94
110
  return new DiffHunksRenderer(this.getHunksRendererOptions(options), this.handleHighlightRender, this.workerManager);
95
111
  }
96
112
  getLineIndex = (lineNumber, side = "additions") => {
97
- if (this.fileDiff == null) return;
98
- const lastHunk = this.fileDiff.hunks.at(-1);
113
+ const fileDiff = this.fileDiffCache;
114
+ if (fileDiff == null) return;
115
+ const lastHunk = fileDiff.hunks.at(-1);
99
116
  let targetUnifiedIndex;
100
117
  let targetSplitIndex;
101
- hunkIterator: for (const hunk of this.fileDiff.hunks) {
118
+ hunkIterator: for (const hunk of fileDiff.hunks) {
102
119
  let currentLineNumber = side === "deletions" ? hunk.deletionStart : hunk.additionStart;
103
120
  const hunkCount = side === "deletions" ? hunk.deletionCount : hunk.additionCount;
104
121
  let splitIndex = hunk.splitLineStart;
@@ -188,7 +205,8 @@ var FileDiff = class {
188
205
  return true;
189
206
  }
190
207
  setSelectedLines(range, options) {
191
- this.interactionManager.setSelection(range, options);
208
+ if (this.refreshViewTimeout != null) this.deferSetSelection = [range, options];
209
+ else this.interactionManager.setSelection(range, options);
192
210
  }
193
211
  flushManagers() {
194
212
  if (!this.managersDirty || this.pre == null) {
@@ -197,12 +215,20 @@ var FileDiff = class {
197
215
  }
198
216
  const { diffStyle = "split", overflow = "scroll" } = this.options;
199
217
  this.interactionManager.setup(this.pre);
200
- this.resizeManager.setup(this.pre, overflow === "wrap");
218
+ this.resizeManager.setup(this.pre, {
219
+ disableAnnotations: overflow === "wrap",
220
+ columnVariables: this.shouldApplyColumnVariables(overflow) ? "apply" : "measure"
221
+ });
201
222
  if (overflow === "scroll" && diffStyle === "split") this.scrollSyncManager.setup(this.pre, this.codeDeletions, this.codeAdditions);
202
223
  else this.scrollSyncManager.cleanUp();
203
224
  this.managersDirty = false;
204
225
  }
226
+ shouldApplyColumnVariables(overflow) {
227
+ if (typeof this.options.hunkSeparators === "function") return true;
228
+ return overflow === "scroll" && (this.lineAnnotations.length > 0 || this.pre?.hasAttribute("data-has-merge-conflict") === true);
229
+ }
205
230
  cleanUp(recycle = false) {
231
+ dequeueRender(this.handleEditSessionRender);
206
232
  this.emitPostRender(true);
207
233
  this.resizeManager.cleanUp();
208
234
  this.interactionManager.cleanUp();
@@ -210,6 +236,7 @@ var FileDiff = class {
210
236
  this.managersDirty = false;
211
237
  this.workerManager?.unsubscribeToThemeChanges(this);
212
238
  this.renderRange = void 0;
239
+ this.pendingFiles = void 0;
213
240
  if (!this.isContainerManaged) this.fileContainer?.remove();
214
241
  this.fileContainer = void 0;
215
242
  this.mounted = false;
@@ -220,16 +247,21 @@ var FileDiff = class {
220
247
  this.codeUnified = void 0;
221
248
  this.codeDeletions = void 0;
222
249
  this.codeAdditions = void 0;
250
+ this.bufferBefore?.remove();
223
251
  this.bufferBefore = void 0;
252
+ this.bufferAfter?.remove();
224
253
  this.bufferAfter = void 0;
225
254
  this.appliedPreAttributes = void 0;
226
255
  this.headerElement = void 0;
227
256
  this.headerPrefix = void 0;
257
+ this.headerFilenameSuffix = void 0;
228
258
  this.headerMetadata = void 0;
229
259
  this.headerCustom = void 0;
260
+ this.placeHolder?.remove();
230
261
  this.placeHolder = void 0;
231
262
  this.lastRenderedHeaderHTML = void 0;
232
263
  if (!recycle) this.cachedHeaderHTML = void 0;
264
+ this.errorWrapper?.remove();
233
265
  this.errorWrapper = void 0;
234
266
  this.spriteSVG = void 0;
235
267
  this.lastRowCount = void 0;
@@ -247,13 +279,23 @@ var FileDiff = class {
247
279
  this.additionFile = void 0;
248
280
  }
249
281
  this.enabled = false;
282
+ this.editor?.cleanUp(recycle);
283
+ this.editor = void 0;
284
+ if (this.refreshViewTimeout != null) {
285
+ clearTimeout(this.refreshViewTimeout);
286
+ this.refreshViewTimeout = void 0;
287
+ }
250
288
  }
251
289
  virtualizedSetup() {
252
290
  this.enabled = true;
253
291
  this.workerManager?.subscribeToThemeChanges(this);
254
292
  }
255
- hydrate(props) {
256
- const { fileContainer, prerenderedHTML, preventEmit = false, lineAnnotations, oldFile, newFile, fileDiff } = props;
293
+ hydrate({ fileContainer, prerenderedHTML, preventEmit = false, lineAnnotations, fileDiff, ...fileInputProps }) {
294
+ if (!this.enabled) throw new Error("FileDiff.hydrate: attempting to call hydrate after cleaned up");
295
+ if (this.fileContainer != null) throw new Error("FileDiff.hydrate: hydrate can only be called before the instance has rendered or hydrated");
296
+ const fileInput = getDiffFileInput(fileInputProps, "FileDiff.hydrate");
297
+ const oldFile = fileInput?.oldFile;
298
+ const newFile = fileInput?.newFile;
257
299
  this.hydrateElements(fileContainer, prerenderedHTML);
258
300
  if (shouldRenderCode(this.pre, hasDiffContent({
259
301
  fileDiff,
@@ -264,14 +306,16 @@ var FileDiff = class {
264
306
  oldFile,
265
307
  newFile
266
308
  }), this.options.disableFileHeader)) this.render({
267
- ...props,
309
+ ...fileInputProps,
310
+ fileContainer,
311
+ lineAnnotations,
312
+ fileDiff,
268
313
  preventEmit: true
269
314
  });
270
315
  else this.hydrationSetup({
271
316
  fileDiff,
272
- oldFile,
273
- newFile,
274
- lineAnnotations
317
+ lineAnnotations,
318
+ ...fileInput
275
319
  });
276
320
  if (!preventEmit) this.emitPostRender();
277
321
  }
@@ -319,7 +363,7 @@ var FileDiff = class {
319
363
  this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;
320
364
  this.additionFile = newFile;
321
365
  this.deletionFile = oldFile;
322
- this.fileDiff = fileDiff ?? (oldFile != null && newFile != null ? parseDiffFromFile(oldFile, newFile, this.options.parseDiffOptions) : void 0);
366
+ this.fileDiff = fileDiff ?? (oldFile !== void 0 && newFile !== void 0 ? parseDiffFromFile(oldFile, newFile, this.options.parseDiffOptions) : void 0);
323
367
  if (this.pre == null) return;
324
368
  this.syncInteractionOptions();
325
369
  this.hunksRenderer.hydrate(this.fileDiff);
@@ -345,29 +389,74 @@ var FileDiff = class {
345
389
  };
346
390
  expandHunk = (hunkIndex, direction, expansionLineCountOverride) => {
347
391
  this.hunksRenderer.expandHunk(hunkIndex, direction, expansionLineCountOverride);
392
+ this.loadFilesIfNecessary();
348
393
  this.rerender();
349
394
  };
350
- render({ oldFile, newFile, fileDiff, deferManagers = false, forceRender = false, preventEmit = false, lineAnnotations, fileContainer, containerWrapper, renderRange }) {
395
+ loadFilesIfNecessary() {
396
+ const { fileDiff, options: { loadDiffFiles } } = this;
397
+ if (fileDiff == null || loadDiffFiles == null || !canHydrateDiff(fileDiff) || this.pendingFiles?.fileDiff === fileDiff) return;
398
+ this.pendingFiles = {
399
+ fileDiff,
400
+ promise: this.loadFilesForDiff(fileDiff, loadDiffFiles)
401
+ };
402
+ }
403
+ async loadFilesForDiff(fileDiff, loadDiffFiles) {
404
+ try {
405
+ const files = await loadDiffFiles(fileDiff);
406
+ if (!this.enabled || this.fileDiff !== fileDiff) return;
407
+ await this.handleFilesLoaded(fileDiff, files);
408
+ } catch (error) {
409
+ if (this.options.disableErrorHandling === true) throw error;
410
+ console.error(error);
411
+ } finally {
412
+ if (this.pendingFiles?.fileDiff === fileDiff) this.pendingFiles = void 0;
413
+ }
414
+ }
415
+ async handleFilesLoaded(expectedDiff, files) {
416
+ if (this.fileDiff !== expectedDiff || !expectedDiff.isPartial) return;
417
+ hydratePartialDiff("merge", expectedDiff, files);
418
+ this.setHydratedState(files);
419
+ await awaitWithTimeout(() => this.primeHighlightCache(expectedDiff));
420
+ if (!this.enabled || this.fileDiff !== expectedDiff) return;
421
+ this.rerender();
422
+ }
423
+ setHydratedState(files) {
424
+ this.deletionFile = files.oldFile;
425
+ this.additionFile = files.newFile;
426
+ this.workerManager?.cleanUpTasks(this.hunksRenderer);
427
+ this.hunksRenderer.clearRenderCache();
428
+ }
429
+ render({ fileDiff, deferManagers = false, forceRender = false, preventEmit = false, lineAnnotations, fileContainer, containerWrapper, renderRange, ...fileInputProps }) {
430
+ const fileInput = getDiffFileInput(fileInputProps, "FileDiff.render");
431
+ const oldFile = fileInput?.oldFile;
432
+ const newFile = fileInput?.newFile;
351
433
  if (!this.enabled) throw new Error("FileDiff.render: attempting to call render after cleaned up");
352
- const { collapsed = false, themeType = "system" } = this.options;
434
+ if (fileDiff != null && fileDiff.cacheKey === void 0) fileDiff.cacheKey = fileDiff.prevName != null ? fileDiff.prevName + ":" + fileDiff.name : fileDiff.name;
435
+ this.editor?.__postponeBgTokenizeToNextFrame();
436
+ const { collapsed = false, themeType = "system", expandUnchanged = false } = this.options;
353
437
  const nextRenderRange = collapsed ? void 0 : renderRange;
354
438
  const themeChanged = this.hasThemeChanged();
355
- const filesDidChange = oldFile != null && newFile != null && (!areFilesEqual(oldFile, this.deletionFile) || !areFilesEqual(newFile, this.additionFile));
439
+ const hasFileInput = fileInput != null;
440
+ const filesDidChange = hasFileInput && (!areOptionalFilesEqual(oldFile, this.deletionFile) || !areOptionalFilesEqual(newFile, this.additionFile));
356
441
  let diffDidChange = fileDiff != null && fileDiff !== this.fileDiff;
357
442
  const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
358
443
  if (!collapsed && areRenderRangesEqual(nextRenderRange, this.renderRange) && !forceRender && !annotationsChanged && !themeChanged && (fileDiff != null && fileDiff === this.fileDiff || fileDiff == null && !filesDidChange)) return this.applyCachedThemeState(themeType);
444
+ let nextParsedFileDiff;
445
+ if (fileDiff == null && hasFileInput && (filesDidChange || this.fileDiff == null)) nextParsedFileDiff = parseDiffFromFile(fileInput.oldFile, fileInput.newFile, this.options.parseDiffOptions);
359
446
  const { renderRange: previousRenderRange } = this;
360
447
  this.renderRange = nextRenderRange;
361
448
  this.deletionFile = oldFile;
362
449
  this.additionFile = newFile;
363
450
  if (fileDiff != null) this.fileDiff = fileDiff;
364
- else if (oldFile != null && newFile != null && filesDidChange) {
451
+ else if (nextParsedFileDiff != null) {
365
452
  diffDidChange = true;
366
- this.fileDiff = parseDiffFromFile(oldFile, newFile, this.options.parseDiffOptions);
453
+ this.fileDiff = nextParsedFileDiff;
367
454
  }
368
455
  if (diffDidChange) this.cachedHeaderHTML = void 0;
369
456
  if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
370
457
  if (this.fileDiff == null) return false;
458
+ if (this.fileDiff.editSessionDirty === true && this.shouldSelfHealEditSession()) finishEditSessionForDiff(this.fileDiff, this.options.parseDiffOptions);
459
+ if (expandUnchanged) this.loadFilesIfNecessary();
371
460
  this.hunksRenderer.setOptions(this.getHunksRendererOptions(this.options));
372
461
  this.syncInteractionOptions();
373
462
  this.hunksRenderer.setLineAnnotations(this.lineAnnotations);
@@ -425,6 +514,7 @@ var FileDiff = class {
425
514
  this.renderGutterUtility();
426
515
  this.managersDirty = true;
427
516
  if (!deferManagers) this.flushManagers();
517
+ if (this.editor != null) this.syncRenderViewToEditor();
428
518
  } catch (error) {
429
519
  if (disableErrorHandling) throw error;
430
520
  console.error(error);
@@ -447,6 +537,198 @@ var FileDiff = class {
447
537
  this.mounted = true;
448
538
  onPostRender?.(fileContainer, this, phase);
449
539
  }
540
+ get fileDiffCache() {
541
+ return this.hunksRenderer.diffCache ?? this.fileDiff;
542
+ }
543
+ syncRenderViewToEditor() {
544
+ const editor = this.editor;
545
+ const fileContainer = this.fileContainer;
546
+ const fileDiff = this.fileDiffCache;
547
+ const lineAnnotations = this.lineAnnotations;
548
+ const renderRange = this.computeEditorRenderRange(this.renderRange);
549
+ if (editor != null && fileContainer != null && fileDiff != null && !fileDiff.isPartial) this.hunksRenderer.initializeHighlighter().then((highlighter) => {
550
+ if (!this.enabled || this.editor !== editor || this.fileContainer !== fileContainer || this.fileDiffCache !== fileDiff) return;
551
+ editor.__syncRenderView(highlighter, fileContainer, fileDiff, lineAnnotations, renderRange);
552
+ });
553
+ }
554
+ computeEditorRenderRange(renderRange) {
555
+ const fileDiff = this.fileDiffCache;
556
+ if (renderRange == null || fileDiff == null || isDefaultRenderRange(renderRange)) return renderRange;
557
+ const { diffStyle = "split", expandUnchanged = false, collapsedContextThreshold = 1 } = this.options;
558
+ let firstLineNumber;
559
+ let lastLineNumber;
560
+ iterateOverDiff({
561
+ diff: fileDiff,
562
+ diffStyle,
563
+ startingLine: renderRange.startingLine,
564
+ totalLines: renderRange.totalLines,
565
+ expandedHunks: expandUnchanged ? true : this.hunksRenderer.getExpandedHunksMap(),
566
+ collapsedContextThreshold,
567
+ callback: ({ additionLine }) => {
568
+ if (additionLine != null) {
569
+ firstLineNumber ??= additionLine.lineNumber;
570
+ lastLineNumber = additionLine.lineNumber;
571
+ }
572
+ }
573
+ });
574
+ if (firstLineNumber == null || lastLineNumber == null) return {
575
+ ...renderRange,
576
+ startingLine: 0,
577
+ totalLines: 0
578
+ };
579
+ return {
580
+ ...renderRange,
581
+ startingLine: firstLineNumber - 1,
582
+ totalLines: lastLineNumber - firstLineNumber + 1
583
+ };
584
+ }
585
+ attachEditor(editor) {
586
+ this.editor?.cleanUp();
587
+ this.editor = editor;
588
+ this.interactionManager.setEditorAttached(true);
589
+ if (this.type === "file-diff") this.hunksRenderer.beginEditSession(this.fileDiffCache);
590
+ if (this.fileDiff?.isPartial === true) this.loadFilesIfNecessary();
591
+ this.syncRenderViewToEditor();
592
+ return (recycle) => {
593
+ this.editor = void 0;
594
+ this.interactionManager.setEditorAttached(false);
595
+ if (recycle !== true) this.finishEditSession();
596
+ };
597
+ }
598
+ finishEditSession() {
599
+ this.hunksRenderer.endEditSession();
600
+ this.completeEditSession();
601
+ }
602
+ /**
603
+ * Run the genuine session-end recompute: restore recompute-shaped hunks (a
604
+ * context-only region collapses away, boundaries re-derive), preserve
605
+ * expansion state best-effort via old-side anchors, and repaint through
606
+ * the session render path — which also invalidates virtualized layout,
607
+ * since nothing else does at exit now that editing does not flip
608
+ * expandUnchanged. Marker-guarded and idempotent; CodeView also calls this
609
+ * when reaping a session whose detach closure was consumed by a recycle.
610
+ * Safe on a cleaned-up instance: the recompute is pure metadata work and
611
+ * the deferred rerender is enabled-guarded. Returns true when a recompute
612
+ * ran.
613
+ */
614
+ completeEditSession() {
615
+ const fileDiff = this.fileDiffCache;
616
+ if (fileDiff == null || fileDiff.editSessionDirty !== true) return false;
617
+ const { collapsedContextThreshold = 1 } = this.options;
618
+ const anchors = captureExpansionAnchors(fileDiff, this.hunksRenderer.getExpandedHunksMap(), collapsedContextThreshold);
619
+ finishEditSessionForDiff(fileDiff, this.options.parseDiffOptions);
620
+ this.hunksRenderer.setExpandedHunksMap(rebuildExpansionFromAnchors(fileDiff, anchors));
621
+ this.escalateEditSessionRender();
622
+ return true;
623
+ }
624
+ applyDocumentChange(textDocument, newLineAnnotations) {
625
+ this.hunksRenderer.applyDocumentChange(textDocument);
626
+ const fileDiff = this.hunksRenderer.diffCache;
627
+ if (fileDiff != null) {
628
+ const cacheKey = this.fileDiff?.cacheKey;
629
+ if (cacheKey != null && fileDiff.cacheKey == null) fileDiff.cacheKey = cacheKey;
630
+ this.fileDiff = fileDiff;
631
+ }
632
+ if (newLineAnnotations !== void 0 && newLineAnnotations !== this.lineAnnotations) {
633
+ this.setLineAnnotations(newLineAnnotations);
634
+ this.hunksRenderer.setLineAnnotations(this.lineAnnotations);
635
+ this.renderAnnotations();
636
+ }
637
+ this.rerender();
638
+ this.interactionManager.setSelectionDirty();
639
+ }
640
+ updateRenderCache(dirtyLines, themeType, shouldRefreshView, lineCountChangeInFlight = false) {
641
+ if (this.hunksRenderer.updateRenderCache(dirtyLines, themeType, lineCountChangeInFlight)) {
642
+ if (this.refreshViewTimeout != null) {
643
+ clearTimeout(this.refreshViewTimeout);
644
+ this.refreshViewTimeout = void 0;
645
+ }
646
+ this.escalateEditSessionRender();
647
+ return;
648
+ }
649
+ if (shouldRefreshView) {
650
+ if (this.refreshViewTimeout != null) clearTimeout(this.refreshViewTimeout);
651
+ this.refreshViewTimeout = setTimeout(() => {
652
+ this.refreshViewTimeout = void 0;
653
+ if (this.options.diffStyle === "split") this.refreshSplitDiffView();
654
+ else this.refreshUnifiedDiffView();
655
+ if (this.deferSetSelection != null) {
656
+ this.interactionManager.setSelection(...this.deferSetSelection);
657
+ this.deferSetSelection = void 0;
658
+ }
659
+ }, 150);
660
+ }
661
+ }
662
+ isLineRenderable(lineNumber) {
663
+ const fileDiff = this.fileDiffCache;
664
+ if (fileDiff == null) return true;
665
+ const { expandUnchanged = false, collapsedContextThreshold = 1 } = this.options;
666
+ return isAdditionLineRenderable({
667
+ fileDiff,
668
+ lineNumber,
669
+ expandedHunks: expandUnchanged ? true : this.hunksRenderer.getExpandedHunksMap(),
670
+ collapsedContextThreshold
671
+ });
672
+ }
673
+ getNearestRenderableLine(lineNumber, direction) {
674
+ const fileDiff = this.fileDiffCache;
675
+ if (fileDiff == null) return lineNumber;
676
+ const { expandUnchanged = false, collapsedContextThreshold = 1 } = this.options;
677
+ return getNearestRenderableAdditionLine({
678
+ fileDiff,
679
+ lineNumber,
680
+ direction,
681
+ expandedHunks: expandUnchanged ? true : this.hunksRenderer.getExpandedHunksMap(),
682
+ collapsedContextThreshold
683
+ });
684
+ }
685
+ revealLine(lineNumber) {
686
+ const fileDiff = this.fileDiffCache;
687
+ const { expandUnchanged = false, collapsedContextThreshold = 1, expansionLineCount = 100 } = this.options;
688
+ if (fileDiff == null || fileDiff.isPartial || expandUnchanged) return false;
689
+ const expandedHunks = this.hunksRenderer.getExpandedHunksMap();
690
+ for (const [hunkIndex, hunk] of fileDiff.hunks.entries()) {
691
+ if (lineNumber < hunk.additionStart) {
692
+ const region = getExpandedRegion({
693
+ isPartial: fileDiff.isPartial,
694
+ rangeSize: hunk.collapsedBefore,
695
+ expandedHunks,
696
+ hunkIndex,
697
+ collapsedContextThreshold
698
+ });
699
+ const gapStart = hunk.additionStart - region.rangeSize;
700
+ if (region.renderAll || lineNumber < gapStart + region.fromStart || lineNumber >= hunk.additionStart - region.fromEnd) return false;
701
+ const fromStartDistance = lineNumber - (gapStart + region.fromStart) + 1;
702
+ const fromEndDistance = hunk.additionStart - region.fromEnd - lineNumber;
703
+ if (fromStartDistance <= fromEndDistance) this.expandHunk(hunkIndex, "up", fromStartDistance + expansionLineCount);
704
+ else this.expandHunk(hunkIndex, "down", fromEndDistance + expansionLineCount);
705
+ return true;
706
+ }
707
+ if (lineNumber < hunk.additionStart + hunk.additionCount) return false;
708
+ }
709
+ const trailingRegion = getTrailingExpandedRegion({
710
+ fileDiff,
711
+ hunkIndex: fileDiff.hunks.length - 1,
712
+ expandedHunks,
713
+ collapsedContextThreshold,
714
+ errorPrefix: "FileDiff.revealLine"
715
+ });
716
+ if (trailingRegion == null || trailingRegion.renderAll) return false;
717
+ const lastHunk = fileDiff.hunks[fileDiff.hunks.length - 1];
718
+ const trailingStart = lastHunk.additionStart + lastHunk.additionCount;
719
+ if (lineNumber < trailingStart + trailingRegion.fromStart || lineNumber >= trailingStart + trailingRegion.rangeSize) return false;
720
+ this.expandHunk(fileDiff.hunks.length, "up", lineNumber - (trailingStart + trailingRegion.fromStart) + 1 + expansionLineCount);
721
+ return true;
722
+ }
723
+ shouldSelfHealEditSession() {
724
+ return this.editor == null;
725
+ }
726
+ escalateEditSessionRender() {
727
+ queueRender(this.handleEditSessionRender);
728
+ }
729
+ handleEditSessionRender = () => {
730
+ this.rerender();
731
+ };
450
732
  removeRenderedCode() {
451
733
  this.resizeManager.cleanUp();
452
734
  this.scrollSyncManager.cleanUp();
@@ -487,12 +769,14 @@ var FileDiff = class {
487
769
  this.placeHolder.style.setProperty("height", `${height}px`);
488
770
  return true;
489
771
  }
490
- primeHighlightCache() {
491
- const { fileDiff, workerManager } = this;
492
- if (fileDiff == null || workerManager == null || isDiffPlainText(fileDiff)) return;
772
+ async primeHighlightCache(fileDiff = this.fileDiff) {
773
+ const { workerManager } = this;
774
+ if (fileDiff == null || workerManager == null || !workerManager.isWorkingPool() || fileDiff.cacheKey == null || isDiffPlainText(fileDiff)) return;
493
775
  const tokenizeMaxLength = this.options.tokenizeMaxLength ?? 1e5;
494
776
  if (Math.max(fileDiff.additionLines.length, fileDiff.deletionLines.length) > tokenizeMaxLength) return;
495
- workerManager.primeDiffHighlightCache(fileDiff);
777
+ await workerManager.primeDiffHighlightCache(fileDiff).catch((error) => {
778
+ console.error(error);
779
+ });
496
780
  }
497
781
  cleanChildNodes() {
498
782
  this.resizeManager.cleanUp();
@@ -507,6 +791,7 @@ var FileDiff = class {
507
791
  this.errorWrapper?.remove();
508
792
  this.headerElement?.remove();
509
793
  this.headerPrefix?.remove();
794
+ this.headerFilenameSuffix?.remove();
510
795
  this.headerMetadata?.remove();
511
796
  this.headerCustom?.remove();
512
797
  this.pre?.remove();
@@ -521,6 +806,7 @@ var FileDiff = class {
521
806
  this.errorWrapper = void 0;
522
807
  this.headerElement = void 0;
523
808
  this.headerPrefix = void 0;
809
+ this.headerFilenameSuffix = void 0;
524
810
  this.headerMetadata = void 0;
525
811
  this.headerCustom = void 0;
526
812
  this.pre = void 0;
@@ -698,28 +984,34 @@ var FileDiff = class {
698
984
  this.lastRenderedHeaderHTML = headerHTML;
699
985
  }
700
986
  if (this.isContainerManaged || fileDiff == null) return;
701
- const { renderCustomHeader, renderHeaderPrefix, renderHeaderMetadata } = this.options;
987
+ const { renderCustomHeader, renderHeaderPrefix, renderHeaderFilenameSuffix, renderHeaderMetadata } = this.options;
702
988
  if (renderCustomHeader != null) {
703
989
  const content = renderCustomHeader(fileDiff) ?? void 0;
704
990
  this.headerCustom = this.upsertHeaderSlotElement(container, this.headerCustom, CUSTOM_HEADER_SLOT_ID, content);
705
991
  this.headerPrefix?.remove();
992
+ this.headerFilenameSuffix?.remove();
706
993
  this.headerMetadata?.remove();
707
994
  this.headerPrefix = void 0;
995
+ this.headerFilenameSuffix = void 0;
708
996
  this.headerMetadata = void 0;
709
997
  return;
710
998
  }
711
999
  const prefix = renderHeaderPrefix?.(fileDiff) ?? void 0;
1000
+ const suffix = renderHeaderFilenameSuffix?.(fileDiff) ?? void 0;
712
1001
  const content = renderHeaderMetadata?.(fileDiff) ?? void 0;
713
1002
  this.headerPrefix = this.upsertHeaderSlotElement(container, this.headerPrefix, HEADER_PREFIX_SLOT_ID, prefix);
1003
+ this.headerFilenameSuffix = this.upsertHeaderSlotElement(container, this.headerFilenameSuffix, HEADER_FILENAME_SUFFIX_SLOT_ID, suffix);
714
1004
  this.headerMetadata = this.upsertHeaderSlotElement(container, this.headerMetadata, HEADER_METADATA_SLOT_ID, content);
715
1005
  this.headerCustom?.remove();
716
1006
  this.headerCustom = void 0;
717
1007
  }
718
1008
  clearHeaderSlots() {
719
1009
  this.headerPrefix?.remove();
1010
+ this.headerFilenameSuffix?.remove();
720
1011
  this.headerMetadata?.remove();
721
1012
  this.headerCustom?.remove();
722
1013
  this.headerPrefix = void 0;
1014
+ this.headerFilenameSuffix = void 0;
723
1015
  this.headerMetadata = void 0;
724
1016
  this.headerCustom = void 0;
725
1017
  }
@@ -936,6 +1228,45 @@ var FileDiff = class {
936
1228
  this.renderPartialColumn(columns[1], additionsAST, insertPosition);
937
1229
  } else throw new Error("FileDiff.insertPartialHTML: Invalid argument composition");
938
1230
  }
1231
+ refreshSplitDiffView() {
1232
+ if (this.options.diffStyle !== "split") return;
1233
+ const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, this.renderRange);
1234
+ if (hunksResult == null) return;
1235
+ const columns = this.getCodeColumns("split", this.codeUnified, this.codeDeletions, this.codeAdditions);
1236
+ if (!Array.isArray(columns)) return;
1237
+ const applyLineType = (type, column) => {
1238
+ if (column == null) return;
1239
+ const ast = this.hunksRenderer.renderCodeAST(type, hunksResult);
1240
+ const gutterChildren = getElementChildren(ast?.[0]);
1241
+ const contentChildren = getElementChildren(ast?.[1]);
1242
+ for (const [el, astChildren] of [[column.gutter, gutterChildren], [column.content, contentChildren]]) if (astChildren != null && el.childElementCount === astChildren.length) for (let i = 0; i < astChildren.length; i++) {
1243
+ const gutterElement = el.children[i];
1244
+ const lineType = astChildren[i].properties["data-line-type"];
1245
+ if (lineType != null && gutterElement.dataset.lineType !== lineType) gutterElement.dataset.lineType = lineType;
1246
+ }
1247
+ };
1248
+ applyLineType("deletions", columns[0]);
1249
+ applyLineType("additions", columns[1]);
1250
+ }
1251
+ refreshUnifiedDiffView() {
1252
+ if (this.options.diffStyle !== "unified") return;
1253
+ const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, this.renderRange);
1254
+ if (hunksResult == null) return;
1255
+ const columns = this.getCodeColumns("unified", this.codeUnified, this.codeDeletions, this.codeAdditions);
1256
+ if (columns == null || Array.isArray(columns)) return;
1257
+ const ast = this.hunksRenderer.renderCodeAST("unified", hunksResult);
1258
+ const gutterChildren = getElementChildren(ast?.[0]);
1259
+ const contentChildren = getElementChildren(ast?.[1]);
1260
+ for (const [el, astChildren] of [[columns.gutter, gutterChildren], [columns.content, contentChildren]]) if (astChildren != null) el.innerHTML = toHtml(astChildren);
1261
+ if (hunksResult.rowCount !== this.lastRowCount) {
1262
+ this.applyRowSpan("unified", columns, hunksResult.rowCount);
1263
+ this.lastRowCount = hunksResult.rowCount;
1264
+ }
1265
+ this.renderSeparators(hunksResult.hunkData);
1266
+ this.managersDirty = true;
1267
+ this.flushManagers();
1268
+ this.syncRenderViewToEditor();
1269
+ }
939
1270
  renderPartialColumn(column, ast, insertPosition) {
940
1271
  if (column == null || ast == null) return;
941
1272
  const gutterChildren = getElementChildren(ast[0]);
@@ -1135,6 +1466,9 @@ var FileDiff = class {
1135
1466
  return deletions != null || additions != null ? [deletions, additions] : void 0;
1136
1467
  }
1137
1468
  }
1469
+ updateBuffers(renderRange) {
1470
+ if (this.pre != null) this.applyBuffers(this.pre, renderRange);
1471
+ }
1138
1472
  applyBuffers(pre, renderRange) {
1139
1473
  if (renderRange == null || this.shouldDisableVirtualizationBuffers()) {
1140
1474
  if (this.bufferBefore != null) {
@@ -1215,6 +1549,10 @@ var FileDiff = class {
1215
1549
  this.errorWrapper = void 0;
1216
1550
  }
1217
1551
  };
1552
+ function areOptionalFilesEqual(fileA, fileB) {
1553
+ if (fileA == null || fileB == null) return fileA == null && fileB == null;
1554
+ return areFilesEqual(fileA, fileB);
1555
+ }
1218
1556
  function hasDiffContent({ fileDiff, oldFile, newFile }) {
1219
1557
  return fileDiff != null && fileDiff.hunks.length > 0 || oldFile != null || newFile != null;
1220
1558
  }