@pierre/diffs 1.1.0-beta.6 → 1.1.0-beta.8

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 (291) hide show
  1. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +40 -0
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -0
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +145 -0
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -0
  5. package/dist/components/AdvancedVirtualizer.d.ts +38 -0
  6. package/dist/components/AdvancedVirtualizer.d.ts.map +1 -0
  7. package/dist/components/AdvancedVirtualizer.js +201 -0
  8. package/dist/components/AdvancedVirtualizer.js.map +1 -0
  9. package/dist/components/File.d.ts +58 -33
  10. package/dist/components/File.d.ts.map +1 -1
  11. package/dist/components/File.js +223 -22
  12. package/dist/components/File.js.map +1 -1
  13. package/dist/components/FileDiff.d.ts +42 -16
  14. package/dist/components/FileDiff.d.ts.map +1 -1
  15. package/dist/components/FileDiff.js +505 -65
  16. package/dist/components/FileDiff.js.map +1 -1
  17. package/dist/components/FileStream.d.ts +5 -0
  18. package/dist/components/FileStream.d.ts.map +1 -1
  19. package/dist/components/FileStream.js +66 -8
  20. package/dist/components/FileStream.js.map +1 -1
  21. package/dist/components/VirtualizedFile.d.ts +33 -0
  22. package/dist/components/VirtualizedFile.d.ts.map +1 -0
  23. package/dist/components/VirtualizedFile.js +227 -0
  24. package/dist/components/VirtualizedFile.js.map +1 -0
  25. package/dist/components/VirtualizedFileDiff.d.ts +39 -0
  26. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -0
  27. package/dist/components/VirtualizedFileDiff.js +316 -0
  28. package/dist/components/VirtualizedFileDiff.js.map +1 -0
  29. package/dist/components/Virtualizer.d.ts +63 -0
  30. package/dist/components/Virtualizer.d.ts.map +1 -0
  31. package/dist/components/Virtualizer.js +369 -0
  32. package/dist/components/Virtualizer.js.map +1 -0
  33. package/dist/components/VirtulizerDevelopment.d.ts +14 -0
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -0
  35. package/dist/components/web-components.d.ts +1 -1
  36. package/dist/components/web-components.d.ts.map +1 -1
  37. package/dist/constants.d.ts +4 -7
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +14 -6
  40. package/dist/constants.js.map +1 -1
  41. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  42. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  43. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  44. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  45. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  46. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  47. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  48. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  49. package/dist/highlighter/languages/registerCustomLanguage.d.ts +11 -4
  50. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
  51. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  52. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  53. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  54. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  55. package/dist/highlighter/shared_highlighter.js.map +1 -1
  56. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  57. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  58. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  59. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  60. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  61. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  62. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  63. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  64. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  65. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  66. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  67. package/dist/index.d.ts +13 -10
  68. package/dist/index.js +10 -7
  69. package/dist/managers/LineSelectionManager.d.ts +14 -15
  70. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  71. package/dist/managers/LineSelectionManager.js +60 -71
  72. package/dist/managers/LineSelectionManager.js.map +1 -1
  73. package/dist/managers/MouseEventManager.d.ts +13 -6
  74. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  75. package/dist/managers/MouseEventManager.js +161 -47
  76. package/dist/managers/MouseEventManager.js.map +1 -1
  77. package/dist/managers/ResizeManager.d.ts +6 -1
  78. package/dist/managers/ResizeManager.d.ts.map +1 -1
  79. package/dist/managers/ResizeManager.js +114 -64
  80. package/dist/managers/ResizeManager.js.map +1 -1
  81. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  82. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  83. package/dist/react/File.d.ts +1 -0
  84. package/dist/react/File.d.ts.map +1 -1
  85. package/dist/react/File.js +2 -1
  86. package/dist/react/File.js.map +1 -1
  87. package/dist/react/FileDiff.d.ts +1 -0
  88. package/dist/react/FileDiff.d.ts.map +1 -1
  89. package/dist/react/FileDiff.js +2 -1
  90. package/dist/react/FileDiff.js.map +1 -1
  91. package/dist/react/MultiFileDiff.d.ts +1 -0
  92. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  93. package/dist/react/MultiFileDiff.js +2 -1
  94. package/dist/react/MultiFileDiff.js.map +1 -1
  95. package/dist/react/PatchDiff.d.ts +1 -0
  96. package/dist/react/PatchDiff.d.ts.map +1 -1
  97. package/dist/react/PatchDiff.js +3 -2
  98. package/dist/react/PatchDiff.js.map +1 -1
  99. package/dist/react/Virtualizer.d.ts +25 -0
  100. package/dist/react/Virtualizer.d.ts.map +1 -0
  101. package/dist/react/Virtualizer.js +38 -0
  102. package/dist/react/Virtualizer.js.map +1 -0
  103. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  104. package/dist/react/WorkerPoolContext.js +1 -1
  105. package/dist/react/WorkerPoolContext.js.map +1 -1
  106. package/dist/react/constants.d.ts.map +1 -1
  107. package/dist/react/index.d.ts +3 -2
  108. package/dist/react/index.js +2 -1
  109. package/dist/react/jsx.d.ts.map +1 -1
  110. package/dist/react/types.d.ts +5 -3
  111. package/dist/react/types.d.ts.map +1 -1
  112. package/dist/react/utils/renderDiffChildren.d.ts +5 -5
  113. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  114. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  115. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  116. package/dist/react/utils/templateRender.d.ts.map +1 -1
  117. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  118. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  119. package/dist/react/utils/useFileDiffInstance.js +6 -2
  120. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  121. package/dist/react/utils/useFileInstance.d.ts +5 -3
  122. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  123. package/dist/react/utils/useFileInstance.js +6 -2
  124. package/dist/react/utils/useFileInstance.js.map +1 -1
  125. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  126. package/dist/react/utils/useStableCallback.js.map +1 -1
  127. package/dist/renderers/DiffHunksRenderer.d.ts +15 -10
  128. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  129. package/dist/renderers/DiffHunksRenderer.js +240 -136
  130. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  131. package/dist/renderers/FileRenderer.d.ts +12 -5
  132. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  133. package/dist/renderers/FileRenderer.js +90 -31
  134. package/dist/renderers/FileRenderer.js.map +1 -1
  135. package/dist/shiki-stream/stream.d.ts +2 -2
  136. package/dist/shiki-stream/stream.d.ts.map +1 -1
  137. package/dist/shiki-stream/stream.js.map +1 -1
  138. package/dist/shiki-stream/tokenizer.d.ts +2 -2
  139. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  140. package/dist/shiki-stream/tokenizer.js.map +1 -1
  141. package/dist/shiki-stream/types.d.ts +18 -18
  142. package/dist/shiki-stream/types.d.ts.map +1 -1
  143. package/dist/sprite.d.ts +1 -1
  144. package/dist/sprite.d.ts.map +1 -1
  145. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  146. package/dist/ssr/FileDiffReact.js +1 -1
  147. package/dist/ssr/index.d.ts +2 -2
  148. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  149. package/dist/ssr/preloadFile.d.ts.map +1 -1
  150. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  151. package/dist/ssr/preloadPatchFile.js.map +1 -1
  152. package/dist/ssr/renderHTML.d.ts.map +1 -1
  153. package/dist/style.js +1 -1
  154. package/dist/style.js.map +1 -1
  155. package/dist/types.d.ts +191 -172
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  158. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  159. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  160. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  161. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  162. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  163. package/dist/utils/areOptionsEqual.d.ts +1 -1
  164. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  165. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  166. package/dist/utils/arePrePropertiesEqual.js +1 -1
  167. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  168. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  169. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  170. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  171. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  172. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  173. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  174. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  175. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  176. package/dist/utils/createContentColumn.d.ts +7 -0
  177. package/dist/utils/createContentColumn.d.ts.map +1 -0
  178. package/dist/utils/createContentColumn.js +17 -0
  179. package/dist/utils/createContentColumn.js.map +1 -0
  180. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  181. package/dist/utils/createEmptyRowBuffer.js +2 -1
  182. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  183. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  184. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  185. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  186. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  187. package/dist/utils/createNoNewlineElement.js +3 -6
  188. package/dist/utils/createNoNewlineElement.js.map +1 -1
  189. package/dist/utils/createPreElement.d.ts +2 -1
  190. package/dist/utils/createPreElement.d.ts.map +1 -1
  191. package/dist/utils/createPreElement.js +4 -3
  192. package/dist/utils/createPreElement.js.map +1 -1
  193. package/dist/utils/createRowNodes.d.ts.map +1 -1
  194. package/dist/utils/createSeparator.d.ts.map +1 -1
  195. package/dist/utils/createSeparator.js +1 -1
  196. package/dist/utils/createSeparator.js.map +1 -1
  197. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  198. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  199. package/dist/utils/createStyleElement.d.ts.map +1 -1
  200. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  201. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  202. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  203. package/dist/utils/cssWrappers.d.ts.map +1 -1
  204. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  205. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  206. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  207. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  208. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  209. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  210. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  211. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  212. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  213. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  214. package/dist/utils/getIconForType.d.ts +1 -1
  215. package/dist/utils/getIconForType.d.ts.map +1 -1
  216. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  217. package/dist/utils/getLineEndingType.d.ts +1 -1
  218. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  219. package/dist/utils/getLineNodes.d.ts.map +1 -1
  220. package/dist/utils/getOrCreateCodeNode.d.ts +4 -2
  221. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  222. package/dist/utils/getOrCreateCodeNode.js +9 -6
  223. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  224. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  225. package/dist/utils/getThemes.d.ts.map +1 -1
  226. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  227. package/dist/utils/hast_utils.d.ts +6 -3
  228. package/dist/utils/hast_utils.d.ts.map +1 -1
  229. package/dist/utils/hast_utils.js +28 -4
  230. package/dist/utils/hast_utils.js.map +1 -1
  231. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  232. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  233. package/dist/utils/iterateOverDiff.d.ts +26 -13
  234. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  235. package/dist/utils/iterateOverDiff.js +94 -55
  236. package/dist/utils/iterateOverDiff.js.map +1 -1
  237. package/dist/utils/iterateOverFile.d.ts +50 -0
  238. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  239. package/dist/utils/iterateOverFile.js +49 -0
  240. package/dist/utils/iterateOverFile.js.map +1 -0
  241. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  242. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  243. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  244. package/dist/utils/parseDiffFromFile.js +3 -2
  245. package/dist/utils/parseDiffFromFile.js.map +1 -1
  246. package/dist/utils/parseLineType.d.ts +1 -1
  247. package/dist/utils/parseLineType.d.ts.map +1 -1
  248. package/dist/utils/parsePatchFiles.d.ts +12 -10
  249. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  250. package/dist/utils/parsePatchFiles.js +16 -9
  251. package/dist/utils/parsePatchFiles.js.map +1 -1
  252. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  253. package/dist/utils/processLine.d.ts.map +1 -1
  254. package/dist/utils/processLine.js +7 -24
  255. package/dist/utils/processLine.js.map +1 -1
  256. package/dist/utils/renderDiffWithHighlighter.d.ts +2 -2
  257. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  258. package/dist/utils/renderDiffWithHighlighter.js +15 -14
  259. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  260. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  261. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  262. package/dist/utils/renderFileWithHighlighter.js +30 -4
  263. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  264. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  265. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  266. package/dist/utils/resolveVirtualFileMetrics.js +24 -0
  267. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  268. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  269. package/dist/utils/setWrapperNodeProps.d.ts +1 -0
  270. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  271. package/dist/utils/setWrapperNodeProps.js +19 -12
  272. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  273. package/dist/utils/splitFileContents.d.ts +12 -0
  274. package/dist/utils/splitFileContents.d.ts.map +1 -0
  275. package/dist/utils/splitFileContents.js +17 -0
  276. package/dist/utils/splitFileContents.js.map +1 -0
  277. package/dist/utils/trimPatchContext.d.ts +5 -5
  278. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  279. package/dist/worker/WorkerPoolManager.d.ts +2 -2
  280. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  281. package/dist/worker/WorkerPoolManager.js +36 -24
  282. package/dist/worker/WorkerPoolManager.js.map +1 -1
  283. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  284. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  285. package/dist/worker/types.d.ts +26 -26
  286. package/dist/worker/types.d.ts.map +1 -1
  287. package/dist/worker/worker-portable.js +323 -143
  288. package/dist/worker/worker-portable.js.map +1 -1
  289. package/dist/worker/worker.js +206 -106
  290. package/dist/worker/worker.js.map +1 -1
  291. package/package.json +52 -53
@@ -2,6 +2,7 @@ import { DEFAULT_THEMES, DIFFS_TAG_NAME, HEADER_METADATA_SLOT_ID, UNSAFE_CSS_ATT
2
2
  import { LineSelectionManager, pluckLineSelectionOptions } from "../managers/LineSelectionManager.js";
3
3
  import { MouseEventManager, pluckMouseEventOptions } from "../managers/MouseEventManager.js";
4
4
  import { ResizeManager } from "../managers/ResizeManager.js";
5
+ import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
5
6
  import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
6
7
  import { SVGSpriteSheet } from "../sprite.js";
7
8
  import { areFilesEqual } from "../utils/areFilesEqual.js";
@@ -15,7 +16,6 @@ import { prerenderHTMLIfNecessary } from "../utils/prerenderHTMLIfNecessary.js";
15
16
  import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
16
17
  import { DiffsContainerLoaded } from "./web-components.js";
17
18
  import { ScrollSyncManager } from "../managers/ScrollSyncManager.js";
18
- import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
19
19
  import { DiffHunksRenderer } from "../renderers/DiffHunksRenderer.js";
20
20
  import { areDiffLineAnnotationsEqual } from "../utils/areDiffLineAnnotationsEqual.js";
21
21
  import { areHunkDataEqual } from "../utils/areHunkDataEqual.js";
@@ -33,12 +33,15 @@ var FileDiff = class {
33
33
  codeUnified;
34
34
  codeDeletions;
35
35
  codeAdditions;
36
+ bufferBefore;
37
+ bufferAfter;
36
38
  unsafeCSSStyle;
37
39
  hoverContent;
38
40
  headerElement;
39
41
  headerMetadata;
40
42
  separatorCache = /* @__PURE__ */ new Map();
41
43
  errorWrapper;
44
+ placeHolder;
42
45
  hunksRenderer;
43
46
  resizeManager;
44
47
  scrollSyncManager;
@@ -52,6 +55,7 @@ var FileDiff = class {
52
55
  renderRange;
53
56
  appliedPreAttributes;
54
57
  lastRenderedHeaderHTML;
58
+ lastRowCount;
55
59
  enabled = true;
56
60
  constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
57
61
  this.options = options;
@@ -64,13 +68,66 @@ var FileDiff = class {
64
68
  this.resizeManager = new ResizeManager();
65
69
  this.scrollSyncManager = new ScrollSyncManager();
66
70
  this.mouseEventManager = new MouseEventManager("diff", pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" ? this.handleExpandHunk : void 0));
67
- this.lineSelectionManager = new LineSelectionManager(pluckLineSelectionOptions(options));
71
+ this.lineSelectionManager = new LineSelectionManager(pluckLineSelectionOptions(options, this.getLineIndex));
68
72
  this.workerManager?.subscribeToThemeChanges(this);
69
73
  this.enabled = true;
70
74
  }
71
75
  handleHighlightRender = () => {
72
76
  this.rerender();
73
77
  };
78
+ getLineIndex = (lineNumber, side = "additions") => {
79
+ if (this.fileDiff == null) return;
80
+ const lastHunk = this.fileDiff.hunks.at(-1);
81
+ let targetUnifiedIndex;
82
+ let targetSplitIndex;
83
+ hunkIterator: for (const hunk of this.fileDiff.hunks) {
84
+ let currentLineNumber = side === "deletions" ? hunk.deletionStart : hunk.additionStart;
85
+ const hunkCount = side === "deletions" ? hunk.deletionCount : hunk.additionCount;
86
+ let splitIndex = hunk.splitLineStart;
87
+ let unifiedIndex = hunk.unifiedLineStart;
88
+ if (lineNumber < currentLineNumber) {
89
+ const difference = currentLineNumber - lineNumber;
90
+ targetUnifiedIndex = Math.max(unifiedIndex - difference, 0);
91
+ targetSplitIndex = Math.max(splitIndex - difference, 0);
92
+ break hunkIterator;
93
+ }
94
+ if (lineNumber >= currentLineNumber + hunkCount) {
95
+ if (hunk === lastHunk) {
96
+ const difference = lineNumber - (currentLineNumber + hunkCount);
97
+ targetUnifiedIndex = unifiedIndex + hunk.unifiedLineCount + difference;
98
+ targetSplitIndex = splitIndex + hunk.splitLineCount + difference;
99
+ break hunkIterator;
100
+ }
101
+ continue;
102
+ }
103
+ for (const content of hunk.hunkContent) if (content.type === "context") if (lineNumber < currentLineNumber + content.lines) {
104
+ const difference = lineNumber - currentLineNumber;
105
+ targetSplitIndex = splitIndex + difference;
106
+ targetUnifiedIndex = unifiedIndex + difference;
107
+ break hunkIterator;
108
+ } else {
109
+ currentLineNumber += content.lines;
110
+ splitIndex += content.lines;
111
+ unifiedIndex += content.lines;
112
+ }
113
+ else {
114
+ const sideCount = side === "deletions" ? content.deletions : content.additions;
115
+ if (lineNumber < currentLineNumber + sideCount) {
116
+ const indexDifference = lineNumber - currentLineNumber;
117
+ targetUnifiedIndex = unifiedIndex + (side === "additions" ? content.deletions : 0) + indexDifference;
118
+ targetSplitIndex = splitIndex + indexDifference;
119
+ break hunkIterator;
120
+ } else {
121
+ currentLineNumber += sideCount;
122
+ splitIndex += Math.max(content.deletions, content.additions);
123
+ unifiedIndex += content.deletions + content.additions;
124
+ }
125
+ }
126
+ break hunkIterator;
127
+ }
128
+ if (targetUnifiedIndex == null || targetSplitIndex == null) return;
129
+ return [targetUnifiedIndex, targetSplitIndex];
130
+ };
74
131
  setOptions(options) {
75
132
  if (options == null) return;
76
133
  this.options = options;
@@ -79,7 +136,7 @@ var FileDiff = class {
79
136
  hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
80
137
  });
81
138
  this.mouseEventManager.setOptions(pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" ? this.handleExpandHunk : void 0));
82
- this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));
139
+ this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options, this.getLineIndex));
83
140
  }
84
141
  mergeOptions(options) {
85
142
  this.options = {
@@ -109,6 +166,10 @@ var FileDiff = class {
109
166
  setLineAnnotations(lineAnnotations) {
110
167
  this.lineAnnotations = lineAnnotations;
111
168
  }
169
+ canPartiallyRender(forceRender, annotationsChanged, didContentChange) {
170
+ if (forceRender || annotationsChanged || didContentChange || typeof this.options.hunkSeparators === "function") return false;
171
+ return true;
172
+ }
112
173
  setSelectedLines(range) {
113
174
  this.lineSelectionManager.setSelection(range);
114
175
  }
@@ -129,11 +190,14 @@ var FileDiff = class {
129
190
  this.codeUnified = void 0;
130
191
  this.codeDeletions = void 0;
131
192
  this.codeAdditions = void 0;
193
+ this.bufferBefore = void 0;
194
+ this.bufferAfter = void 0;
132
195
  this.appliedPreAttributes = void 0;
133
196
  this.headerElement = void 0;
134
197
  this.lastRenderedHeaderHTML = void 0;
135
198
  this.errorWrapper = void 0;
136
199
  this.spriteSVG = void 0;
200
+ this.lastRowCount = void 0;
137
201
  if (recycle) this.hunksRenderer.recycle();
138
202
  else {
139
203
  this.hunksRenderer.cleanUp();
@@ -149,6 +213,7 @@ var FileDiff = class {
149
213
  this.workerManager?.subscribeToThemeChanges(this);
150
214
  }
151
215
  hydrate(props) {
216
+ const { overflow = "scroll", diffStyle = "split" } = this.options;
152
217
  const { fileContainer, prerenderedHTML } = props;
153
218
  prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);
154
219
  for (const element of fileContainer.shadowRoot?.children ?? []) {
@@ -192,10 +257,8 @@ var FileDiff = class {
192
257
  this.injectUnsafeCSS();
193
258
  this.mouseEventManager.setup(this.pre);
194
259
  this.lineSelectionManager.setup(this.pre);
195
- if ((this.options.overflow ?? "scroll") === "scroll") {
196
- this.resizeManager.setup(this.pre);
197
- if ((this.options.diffStyle ?? "split") === "split") this.scrollSyncManager.setup(this.pre, this.codeDeletions, this.codeAdditions);
198
- }
260
+ this.resizeManager.setup(this.pre, overflow === "wrap");
261
+ if (overflow === "scroll" && diffStyle === "split") this.scrollSyncManager.setup(this.pre, this.codeDeletions, this.codeAdditions);
199
262
  }
200
263
  }
201
264
  rerender() {
@@ -218,21 +281,26 @@ var FileDiff = class {
218
281
  render({ oldFile, newFile, fileDiff, forceRender = false, lineAnnotations, fileContainer, containerWrapper, renderRange }) {
219
282
  if (!this.enabled) throw new Error("FileDiff.render: attempting to call render after cleaned up");
220
283
  const filesDidChange = oldFile != null && newFile != null && (!areFilesEqual(oldFile, this.deletionFile) || !areFilesEqual(newFile, this.additionFile));
284
+ let diffDidChange = fileDiff != null && fileDiff !== this.fileDiff;
221
285
  const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
222
- if (areRenderRangesEqual(renderRange, this.renderRange) && !forceRender && !annotationsChanged && (fileDiff != null && fileDiff === this.fileDiff || fileDiff == null && !filesDidChange)) return;
286
+ if (areRenderRangesEqual(renderRange, this.renderRange) && !forceRender && !annotationsChanged && (fileDiff != null && fileDiff === this.fileDiff || fileDiff == null && !filesDidChange)) return false;
287
+ const { renderRange: previousRenderRange } = this;
223
288
  this.renderRange = renderRange;
224
289
  this.deletionFile = oldFile;
225
290
  this.additionFile = newFile;
226
291
  if (fileDiff != null) this.fileDiff = fileDiff;
227
- else if (oldFile != null && newFile != null && filesDidChange) this.fileDiff = parseDiffFromFile(oldFile, newFile);
292
+ else if (oldFile != null && newFile != null && filesDidChange) {
293
+ diffDidChange = true;
294
+ this.fileDiff = parseDiffFromFile(oldFile, newFile);
295
+ }
228
296
  if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
229
- if (this.fileDiff == null) return;
297
+ if (this.fileDiff == null) return false;
230
298
  this.hunksRenderer.setOptions({
231
299
  ...this.options,
232
300
  hunkSeparators: typeof this.options.hunkSeparators === "function" ? "custom" : this.options.hunkSeparators
233
301
  });
234
302
  this.hunksRenderer.setLineAnnotations(this.lineAnnotations);
235
- const { disableFileHeader = false, disableErrorHandling = false } = this.options;
303
+ const { diffStyle = "split", disableErrorHandling = false, disableFileHeader = false, overflow = "scroll" } = this.options;
236
304
  if (disableFileHeader) {
237
305
  if (this.headerElement != null) {
238
306
  this.headerElement.parentNode?.removeChild(this.headerElement);
@@ -242,27 +310,81 @@ var FileDiff = class {
242
310
  }
243
311
  fileContainer = this.getOrCreateFileContainer(fileContainer, containerWrapper);
244
312
  try {
245
- const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, renderRange);
246
- if (hunksResult == null) {
247
- if (this.workerManager != null && !this.workerManager.isInitialized()) this.workerManager.initialize().then(() => this.rerender());
248
- return;
249
- }
250
- if (hunksResult.headerElement != null) this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);
251
- if (hunksResult.additionsAST != null || hunksResult.deletionsAST != null || hunksResult.unifiedAST != null) {
252
- const pre = this.getOrCreatePreNode(fileContainer);
253
- this.applyHunksToDOM(pre, hunksResult);
254
- } else if (this.pre != null) {
255
- this.pre.parentNode?.removeChild(this.pre);
256
- this.pre = void 0;
313
+ const pre = this.getOrCreatePreNode(fileContainer);
314
+ if (!(this.canPartiallyRender(forceRender, annotationsChanged, filesDidChange || diffDidChange) && this.applyPartialRender({
315
+ previousRenderRange,
316
+ renderRange
317
+ }))) {
318
+ const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff, renderRange);
319
+ if (hunksResult == null) {
320
+ if (this.workerManager?.isInitialized() === false) this.workerManager.initialize().then(() => this.rerender());
321
+ return false;
322
+ }
323
+ if (hunksResult.headerElement != null) this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);
324
+ if (hunksResult.additionsContentAST != null || hunksResult.deletionsContentAST != null || hunksResult.unifiedContentAST != null) this.applyHunksToDOM(pre, hunksResult);
325
+ else if (this.pre != null) {
326
+ this.pre.parentNode?.removeChild(this.pre);
327
+ this.pre = void 0;
328
+ }
329
+ this.renderSeparators(hunksResult.hunkData);
257
330
  }
258
- this.renderSeparators(hunksResult.hunkData);
331
+ this.applyBuffers(pre, renderRange);
332
+ this.injectUnsafeCSS();
259
333
  this.renderAnnotations();
260
334
  this.renderHoverUtility();
335
+ this.mouseEventManager.setup(pre);
336
+ this.lineSelectionManager.setup(pre);
337
+ this.resizeManager.setup(pre, overflow === "wrap");
338
+ if (overflow === "scroll" && diffStyle === "split") this.scrollSyncManager.setup(pre, this.codeDeletions, this.codeAdditions);
339
+ else this.scrollSyncManager.cleanUp();
261
340
  } catch (error) {
262
341
  if (disableErrorHandling) throw error;
263
342
  console.error(error);
264
343
  if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
265
344
  }
345
+ return true;
346
+ }
347
+ renderPlaceholder(height) {
348
+ if (this.fileContainer == null) return false;
349
+ this.cleanChildNodes();
350
+ if (this.placeHolder == null) {
351
+ const shadowRoot = this.fileContainer.shadowRoot ?? this.fileContainer.attachShadow({ mode: "open" });
352
+ this.placeHolder = document.createElement("div");
353
+ this.placeHolder.dataset.placeholder = "";
354
+ shadowRoot.appendChild(this.placeHolder);
355
+ }
356
+ this.placeHolder.style.setProperty("height", `${height}px`);
357
+ return true;
358
+ }
359
+ cleanChildNodes() {
360
+ this.resizeManager.cleanUp();
361
+ this.scrollSyncManager.cleanUp();
362
+ this.mouseEventManager.cleanUp();
363
+ this.lineSelectionManager.cleanUp();
364
+ this.bufferAfter?.remove();
365
+ this.bufferBefore?.remove();
366
+ this.codeAdditions?.remove();
367
+ this.codeDeletions?.remove();
368
+ this.codeUnified?.remove();
369
+ this.errorWrapper?.remove();
370
+ this.headerElement?.remove();
371
+ this.hoverContent?.remove();
372
+ this.pre?.remove();
373
+ this.spriteSVG?.remove();
374
+ this.unsafeCSSStyle?.remove();
375
+ this.bufferAfter = void 0;
376
+ this.bufferBefore = void 0;
377
+ this.codeAdditions = void 0;
378
+ this.codeDeletions = void 0;
379
+ this.codeUnified = void 0;
380
+ this.errorWrapper = void 0;
381
+ this.headerElement = void 0;
382
+ this.hoverContent = void 0;
383
+ this.pre = void 0;
384
+ this.spriteSVG = void 0;
385
+ this.unsafeCSSStyle = void 0;
386
+ this.lastRenderedHeaderHTML = void 0;
387
+ this.lastRowCount = void 0;
266
388
  }
267
389
  renderSeparators(hunkData) {
268
390
  const { hunkSeparators } = this.options;
@@ -374,6 +496,8 @@ var FileDiff = class {
374
496
  shadowRoot.appendChild(this.pre);
375
497
  this.appliedPreAttributes = void 0;
376
498
  }
499
+ this.placeHolder?.remove();
500
+ this.placeHolder = void 0;
377
501
  return this.pre;
378
502
  }
379
503
  syncCodeNodesFromPre(pre) {
@@ -389,6 +513,8 @@ var FileDiff = class {
389
513
  }
390
514
  applyHeaderToDOM(headerAST, container) {
391
515
  this.cleanupErrorWrapper();
516
+ this.placeHolder?.remove();
517
+ this.placeHolder = void 0;
392
518
  const headerHTML = toHtml(headerAST);
393
519
  if (headerHTML !== this.lastRenderedHeaderHTML) {
394
520
  const tempDiv = document.createElement("div");
@@ -427,72 +553,382 @@ var FileDiff = class {
427
553
  this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);
428
554
  }
429
555
  applyHunksToDOM(pre, result) {
556
+ const { overflow = "scroll" } = this.options;
557
+ const rowSpan = overflow === "wrap" ? result.rowCount : void 0;
430
558
  this.cleanupErrorWrapper();
431
559
  this.applyPreNodeAttributes(pre, result);
432
560
  let shouldReplace = false;
433
- let codeDeletions;
434
- let codeAdditions;
435
561
  const codeElements = [];
436
- if (result.unifiedAST != null) {
562
+ const unifiedAST = this.hunksRenderer.renderCodeAST("unified", result);
563
+ const deletionsAST = this.hunksRenderer.renderCodeAST("deletions", result);
564
+ const additionsAST = this.hunksRenderer.renderCodeAST("additions", result);
565
+ if (unifiedAST != null) {
437
566
  shouldReplace = this.codeUnified == null || this.codeAdditions != null || this.codeDeletions != null;
567
+ this.codeDeletions?.remove();
438
568
  this.codeDeletions = void 0;
569
+ this.codeAdditions?.remove();
439
570
  this.codeAdditions = void 0;
440
- if (result.unifiedAST.length > 0) {
441
- this.codeUnified = getOrCreateCodeNode({
442
- code: this.codeUnified,
443
- columnType: "unified"
444
- });
445
- this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(result.unifiedAST);
446
- codeElements.push(this.codeUnified);
447
- } else this.codeUnified = void 0;
448
- } else {
449
- if (result.deletionsAST != null) {
571
+ this.codeUnified = getOrCreateCodeNode({
572
+ code: this.codeUnified,
573
+ columnType: "unified",
574
+ rowSpan
575
+ });
576
+ this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(unifiedAST);
577
+ codeElements.push(this.codeUnified);
578
+ } else if (deletionsAST != null || additionsAST != null) {
579
+ if (deletionsAST != null) {
450
580
  shouldReplace = this.codeDeletions == null || this.codeUnified != null;
581
+ this.codeUnified?.remove();
451
582
  this.codeUnified = void 0;
452
- if (result.deletionsAST.length > 0) {
453
- this.codeDeletions = getOrCreateCodeNode({
454
- code: this.codeDeletions,
455
- columnType: "deletions"
456
- });
457
- this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(result.deletionsAST);
458
- codeElements.push(this.codeDeletions);
459
- } else this.codeDeletions = void 0;
583
+ this.codeDeletions = getOrCreateCodeNode({
584
+ code: this.codeDeletions,
585
+ columnType: "deletions",
586
+ rowSpan
587
+ });
588
+ this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(deletionsAST);
589
+ codeElements.push(this.codeDeletions);
590
+ } else {
591
+ this.codeDeletions?.remove();
592
+ this.codeDeletions = void 0;
460
593
  }
461
- if (result.additionsAST != null) {
594
+ if (additionsAST != null) {
462
595
  shouldReplace = shouldReplace || this.codeAdditions == null || this.codeUnified != null;
596
+ this.codeUnified?.remove();
463
597
  this.codeUnified = void 0;
464
- if (result.additionsAST.length > 0) {
465
- this.codeAdditions = getOrCreateCodeNode({
466
- code: this.codeAdditions,
467
- columnType: "additions"
468
- });
469
- this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(result.additionsAST);
470
- codeElements.push(this.codeAdditions);
471
- } else this.codeAdditions = void 0;
598
+ this.codeAdditions = getOrCreateCodeNode({
599
+ code: this.codeAdditions,
600
+ columnType: "additions",
601
+ rowSpan
602
+ });
603
+ this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(additionsAST);
604
+ codeElements.push(this.codeAdditions);
605
+ } else {
606
+ this.codeAdditions?.remove();
607
+ this.codeAdditions = void 0;
472
608
  }
609
+ } else {
610
+ this.codeUnified?.remove();
611
+ this.codeUnified = void 0;
612
+ this.codeDeletions?.remove();
613
+ this.codeDeletions = void 0;
614
+ this.codeAdditions?.remove();
615
+ this.codeAdditions = void 0;
473
616
  }
474
617
  if (codeElements.length === 0) pre.textContent = "";
475
618
  else if (shouldReplace) pre.replaceChildren(...codeElements);
476
- this.injectUnsafeCSS();
477
- this.mouseEventManager.setup(pre);
478
- this.lineSelectionManager.setup(pre);
479
- if ((this.options.overflow ?? "scroll") === "scroll") {
480
- this.resizeManager.setup(pre);
481
- if ((this.options.diffStyle ?? "split") === "split") this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);
482
- else this.scrollSyncManager.cleanUp();
619
+ this.lastRowCount = result.rowCount;
620
+ }
621
+ applyPartialRender({ previousRenderRange, renderRange }) {
622
+ const { pre, codeUnified, codeAdditions, codeDeletions, options: { diffStyle = "split" } } = this;
623
+ if (pre == null || previousRenderRange == null || renderRange == null || !Number.isFinite(previousRenderRange.totalLines) || !Number.isFinite(renderRange.totalLines) || this.lastRowCount == null) return false;
624
+ const codeElements = this.getCodeColumns(diffStyle, codeUnified, codeDeletions, codeAdditions);
625
+ if (codeElements == null) return false;
626
+ const previousStart = previousRenderRange.startingLine;
627
+ const nextStart = renderRange.startingLine;
628
+ const previousEnd = previousStart + previousRenderRange.totalLines;
629
+ const nextEnd = nextStart + renderRange.totalLines;
630
+ const overlapStart = Math.max(previousStart, nextStart);
631
+ const overlapEnd = Math.min(previousEnd, nextEnd);
632
+ if (overlapEnd <= overlapStart) return false;
633
+ const trimStart = Math.max(0, overlapStart - previousStart);
634
+ const trimEnd = Math.max(0, previousEnd - overlapEnd);
635
+ const trimResult = this.trimColumns({
636
+ columns: codeElements,
637
+ trimStart,
638
+ trimEnd,
639
+ previousStart,
640
+ overlapStart,
641
+ overlapEnd,
642
+ diffStyle
643
+ });
644
+ if (trimResult < 0) throw new Error("applyPartialRender: failed to trim to overlap");
645
+ if (this.lastRowCount < trimResult) throw new Error("applyPartialRender: trimmed beyond DOM row count");
646
+ let rowCount = this.lastRowCount - trimResult;
647
+ const renderChunk = (startingLine, totalLines) => {
648
+ if (totalLines <= 0 || this.fileDiff == null) return;
649
+ return this.hunksRenderer.renderDiff(this.fileDiff, {
650
+ startingLine,
651
+ totalLines,
652
+ bufferBefore: 0,
653
+ bufferAfter: 0
654
+ });
655
+ };
656
+ const prependResult = renderChunk(nextStart, Math.max(overlapStart - nextStart, 0));
657
+ if (prependResult == null && nextStart < overlapStart) return false;
658
+ const appendResult = renderChunk(overlapEnd, Math.max(nextEnd - overlapEnd, 0));
659
+ if (appendResult == null && nextEnd > overlapEnd) return false;
660
+ const applyChunk = (result, insertPosition) => {
661
+ if (result == null) return;
662
+ if (diffStyle === "unified" && !Array.isArray(codeElements)) this.insertPartialHTML(diffStyle, codeElements, result, insertPosition);
663
+ else if (diffStyle === "split" && Array.isArray(codeElements)) this.insertPartialHTML(diffStyle, codeElements, result, insertPosition);
664
+ else throw new Error("u done fuked up, again");
665
+ rowCount += result.rowCount;
666
+ };
667
+ this.cleanupErrorWrapper();
668
+ applyChunk(prependResult, "afterbegin");
669
+ applyChunk(appendResult, "beforeend");
670
+ if (this.lastRowCount !== rowCount) {
671
+ this.applyRowSpan(diffStyle, codeElements, rowCount);
672
+ this.lastRowCount = rowCount;
673
+ }
674
+ return true;
675
+ }
676
+ insertPartialHTML(diffStyle, columns, result, insertPosition) {
677
+ if (diffStyle === "unified" && !Array.isArray(columns)) {
678
+ const unifiedAST = this.hunksRenderer.renderCodeAST("unified", result);
679
+ this.renderPartialColumn(columns, unifiedAST, insertPosition);
680
+ } else if (diffStyle === "split" && Array.isArray(columns)) {
681
+ const deletionsAST = this.hunksRenderer.renderCodeAST("deletions", result);
682
+ const additionsAST = this.hunksRenderer.renderCodeAST("additions", result);
683
+ this.renderPartialColumn(columns[0], deletionsAST, insertPosition);
684
+ this.renderPartialColumn(columns[1], additionsAST, insertPosition);
685
+ } else throw new Error("FileDiff.insertPartialHTML: Invalid argument composition");
686
+ }
687
+ renderPartialColumn(column, ast, insertPosition) {
688
+ if (column == null || ast == null) return;
689
+ const gutterChildren = getElementChildren(ast[0]);
690
+ const contentChildren = getElementChildren(ast[1]);
691
+ if (gutterChildren == null || contentChildren == null) throw new Error("FileDiff.insertPartialHTML: Unexpected AST structure");
692
+ const firstHASTElement = contentChildren.at(0);
693
+ if (insertPosition === "beforeend" && firstHASTElement?.type === "element" && typeof firstHASTElement.properties["data-buffer-size"] === "number") this.mergeBuffersIfNecessary(firstHASTElement.properties["data-buffer-size"], column.content.children[column.content.children.length - 1], column.gutter.children[column.gutter.children.length - 1], gutterChildren, contentChildren, true);
694
+ const lastHASTElement = contentChildren.at(-1);
695
+ if (insertPosition === "afterbegin" && lastHASTElement?.type === "element" && typeof lastHASTElement.properties["data-buffer-size"] === "number") this.mergeBuffersIfNecessary(lastHASTElement.properties["data-buffer-size"], column.content.children[0], column.gutter.children[0], gutterChildren, contentChildren, false);
696
+ column.gutter.insertAdjacentHTML(insertPosition, this.hunksRenderer.renderPartialHTML(gutterChildren));
697
+ column.content.insertAdjacentHTML(insertPosition, this.hunksRenderer.renderPartialHTML(contentChildren));
698
+ }
699
+ mergeBuffersIfNecessary(adjustmentSize, contentElement, gutterElement, gutterChildren, contentChildren, fromStart) {
700
+ if (!(contentElement instanceof HTMLElement) || !(gutterElement instanceof HTMLElement)) return;
701
+ const currentSize = this.getBufferSize(contentElement.dataset);
702
+ if (currentSize == null) return;
703
+ if (fromStart) {
704
+ gutterChildren.shift();
705
+ contentChildren.shift();
483
706
  } else {
484
- this.resizeManager.cleanUp();
485
- this.scrollSyncManager.cleanUp();
707
+ gutterChildren.pop();
708
+ contentChildren.pop();
709
+ }
710
+ this.updateBufferSize(contentElement, currentSize + adjustmentSize);
711
+ this.updateBufferSize(gutterElement, currentSize + adjustmentSize);
712
+ }
713
+ applyRowSpan(diffStyle, columns, rowCount) {
714
+ const applySpan = (column) => {
715
+ if (column == null) return;
716
+ column.gutter.style.setProperty("grid-row", `span ${rowCount}`);
717
+ column.content.style.setProperty("grid-row", `span ${rowCount}`);
718
+ };
719
+ if (diffStyle === "unified" && !Array.isArray(columns)) applySpan(columns);
720
+ else if (diffStyle === "split" && Array.isArray(columns)) {
721
+ applySpan(columns[0]);
722
+ applySpan(columns[1]);
723
+ } else throw new Error("dun fuuuuked up");
724
+ }
725
+ trimColumnRows(columns, preTrimCount, postTrimStart) {
726
+ let visibleLineIndex = 0;
727
+ let rowCount = 0;
728
+ let rowIndex = 0;
729
+ let pendingMetadataTrim = false;
730
+ const hasPostTrim = postTrimStart >= 0;
731
+ if (columns == null) return 0;
732
+ const contentChildren = Array.from(columns.content.children);
733
+ const gutterChildren = Array.from(columns.gutter.children);
734
+ if (contentChildren.length !== gutterChildren.length) throw new Error("FileDiff.trimColumnRows: columns do not match");
735
+ while (rowIndex < contentChildren.length) {
736
+ if (preTrimCount <= 0 && !hasPostTrim && !pendingMetadataTrim) break;
737
+ const gutterElement = gutterChildren[rowIndex];
738
+ const contentElement = contentChildren[rowIndex];
739
+ rowIndex++;
740
+ if (!(gutterElement instanceof HTMLElement) || !(contentElement instanceof HTMLElement)) {
741
+ console.error({
742
+ gutterElement,
743
+ contentElement
744
+ });
745
+ throw new Error("FileDiff.trimColumnRows: invalid row elements");
746
+ }
747
+ if (pendingMetadataTrim) {
748
+ pendingMetadataTrim = false;
749
+ if (gutterElement.dataset.gutterBuffer === "annotation" && "lineAnnotation" in contentElement.dataset || gutterElement.dataset.gutterBuffer === "metadata" && "noNewline" in contentElement.dataset) {
750
+ gutterElement.remove();
751
+ contentElement.remove();
752
+ rowCount++;
753
+ continue;
754
+ }
755
+ }
756
+ if ("lineIndex" in gutterElement.dataset && "lineIndex" in contentElement.dataset) {
757
+ if (preTrimCount > 0 || hasPostTrim && visibleLineIndex >= postTrimStart) {
758
+ gutterElement.remove();
759
+ contentElement.remove();
760
+ if (preTrimCount > 0) {
761
+ preTrimCount--;
762
+ if (preTrimCount === 0) pendingMetadataTrim = true;
763
+ }
764
+ rowCount++;
765
+ }
766
+ visibleLineIndex++;
767
+ continue;
768
+ }
769
+ if ("separator" in gutterElement.dataset && "separator" in contentElement.dataset) {
770
+ if (preTrimCount > 0 || hasPostTrim && visibleLineIndex >= postTrimStart) {
771
+ gutterElement.remove();
772
+ contentElement.remove();
773
+ rowCount++;
774
+ }
775
+ continue;
776
+ }
777
+ if (gutterElement.dataset.gutterBuffer === "annotation" && "lineAnnotation" in contentElement.dataset) {
778
+ if (preTrimCount > 0 || hasPostTrim && visibleLineIndex >= postTrimStart) {
779
+ gutterElement.remove();
780
+ contentElement.remove();
781
+ rowCount++;
782
+ }
783
+ continue;
784
+ }
785
+ if (gutterElement.dataset.gutterBuffer === "metadata" && "noNewline" in contentElement.dataset) {
786
+ if (preTrimCount > 0 || hasPostTrim && visibleLineIndex >= postTrimStart) {
787
+ gutterElement.remove();
788
+ contentElement.remove();
789
+ rowCount++;
790
+ }
791
+ continue;
792
+ }
793
+ if (gutterElement.dataset.gutterBuffer === "buffer" && "contentBuffer" in contentElement.dataset) {
794
+ const totalRows = this.getBufferSize(contentElement.dataset);
795
+ if (totalRows == null) throw new Error("u fuked up");
796
+ if (preTrimCount > 0) {
797
+ const rowsToRemove = Math.min(preTrimCount, totalRows);
798
+ const newSize = totalRows - rowsToRemove;
799
+ if (newSize > 0) {
800
+ this.updateBufferSize(gutterElement, newSize);
801
+ this.updateBufferSize(contentElement, newSize);
802
+ rowCount += rowsToRemove;
803
+ } else {
804
+ gutterElement.remove();
805
+ contentElement.remove();
806
+ rowCount += totalRows;
807
+ }
808
+ preTrimCount -= rowsToRemove;
809
+ } else if (hasPostTrim) {
810
+ const bufferStart = visibleLineIndex;
811
+ const bufferEnd = visibleLineIndex + totalRows - 1;
812
+ if (postTrimStart <= bufferStart) {
813
+ gutterElement.remove();
814
+ contentElement.remove();
815
+ rowCount += totalRows;
816
+ } else if (postTrimStart <= bufferEnd) {
817
+ const rowsToRemove = bufferEnd - postTrimStart + 1;
818
+ const newSize = totalRows - rowsToRemove;
819
+ this.updateBufferSize(gutterElement, newSize);
820
+ this.updateBufferSize(contentElement, newSize);
821
+ rowCount += rowsToRemove;
822
+ }
823
+ }
824
+ visibleLineIndex += totalRows;
825
+ continue;
826
+ }
827
+ console.error({
828
+ gutterElement,
829
+ contentElement
830
+ });
831
+ throw new Error("FileDiff.trimColumnRows: unknown row elements");
832
+ }
833
+ return rowCount;
834
+ }
835
+ trimColumns({ columns, diffStyle, overlapEnd, overlapStart, previousStart, trimEnd, trimStart }) {
836
+ const preTrimCount = Math.max(0, overlapStart - previousStart);
837
+ const postTrimStart = overlapEnd - previousStart;
838
+ if (postTrimStart < 0) throw new Error("FileDiff.trimColumns: overlap ends before previous");
839
+ const shouldTrimStart = trimStart > 0;
840
+ const shouldTrimEnd = trimEnd > 0;
841
+ if (!shouldTrimStart && !shouldTrimEnd) return 0;
842
+ const effectivePreTrimCount = shouldTrimStart ? preTrimCount : 0;
843
+ const effectivePostTrimStart = shouldTrimEnd ? postTrimStart : -1;
844
+ if (diffStyle === "unified" && !Array.isArray(columns)) return this.trimColumnRows(columns, effectivePreTrimCount, effectivePostTrimStart);
845
+ else if (diffStyle === "split" && Array.isArray(columns)) {
846
+ const deletionsTrim = this.trimColumnRows(columns[0], effectivePreTrimCount, effectivePostTrimStart);
847
+ const additionsTrim = this.trimColumnRows(columns[1], effectivePreTrimCount, effectivePostTrimStart);
848
+ if (columns[0] != null && columns[1] != null && deletionsTrim !== additionsTrim) throw new Error("FileDiff.trimColumns: split columns out of sync");
849
+ return columns[0] != null ? deletionsTrim : additionsTrim;
850
+ } else {
851
+ console.error({
852
+ diffStyle,
853
+ columns
854
+ });
855
+ throw new Error("FileDiff.trimColumns: Invalid columns for diffType");
856
+ }
857
+ }
858
+ getBufferSize(properties) {
859
+ const parsed = Number.parseInt(properties?.bufferSize ?? "", 10);
860
+ return Number.isNaN(parsed) ? void 0 : parsed;
861
+ }
862
+ updateBufferSize(element, size) {
863
+ element.dataset.bufferSize = `${size}`;
864
+ element.style.setProperty("grid-row", `span ${size}`);
865
+ element.style.setProperty("min-height", `calc(${size} * 1lh)`);
866
+ }
867
+ getCodeColumns(diffStyle, codeUnified, codeDeletions, codeAdditions) {
868
+ function getColumns(code) {
869
+ if (code == null) return;
870
+ const gutter = code.children[0];
871
+ const content = code.children[1];
872
+ if (!(gutter instanceof HTMLElement) || !(content instanceof HTMLElement) || gutter.dataset.gutter == null || content.dataset.content == null) return;
873
+ return {
874
+ gutter,
875
+ content
876
+ };
877
+ }
878
+ if (diffStyle === "unified") return getColumns(codeUnified);
879
+ else {
880
+ const deletions = getColumns(codeDeletions);
881
+ const additions = getColumns(codeAdditions);
882
+ return deletions != null || additions != null ? [deletions, additions] : void 0;
883
+ }
884
+ }
885
+ applyBuffers(pre, renderRange) {
886
+ const { disableVirtualizationBuffers = false } = this.options;
887
+ if (disableVirtualizationBuffers || renderRange == null) {
888
+ if (this.bufferBefore != null) {
889
+ this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
890
+ this.bufferBefore = void 0;
891
+ }
892
+ if (this.bufferAfter != null) {
893
+ this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
894
+ this.bufferAfter = void 0;
895
+ }
896
+ return;
897
+ }
898
+ if (renderRange.bufferBefore > 0) {
899
+ if (this.bufferBefore == null) {
900
+ this.bufferBefore = document.createElement("div");
901
+ this.bufferBefore.dataset.virtualizerBuffer = "before";
902
+ pre.before(this.bufferBefore);
903
+ }
904
+ this.bufferBefore.style.setProperty("height", `${renderRange.bufferBefore}px`);
905
+ this.bufferBefore.style.setProperty("contain", "strict");
906
+ } else if (this.bufferBefore != null) {
907
+ this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
908
+ this.bufferBefore = void 0;
909
+ }
910
+ if (renderRange.bufferAfter > 0) {
911
+ if (this.bufferAfter == null) {
912
+ this.bufferAfter = document.createElement("div");
913
+ this.bufferAfter.dataset.virtualizerBuffer = "after";
914
+ pre.after(this.bufferAfter);
915
+ }
916
+ this.bufferAfter.style.setProperty("height", `${renderRange.bufferAfter}px`);
917
+ this.bufferAfter.style.setProperty("contain", "strict");
918
+ } else if (this.bufferAfter != null) {
919
+ this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
920
+ this.bufferAfter = void 0;
486
921
  }
487
922
  }
488
- applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsAST, deletionsAST, totalLines }) {
923
+ applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsContentAST, deletionsContentAST, totalLines }) {
489
924
  const { diffIndicators = "bars", disableBackground = false, disableLineNumbers = false, overflow = "scroll", themeType = "system", diffStyle = "split" } = this.options;
490
925
  const preProperties = {
926
+ type: "diff",
491
927
  diffIndicators,
492
928
  disableBackground,
493
929
  disableLineNumbers,
494
930
  overflow,
495
- split: diffStyle === "unified" ? false : additionsAST != null && deletionsAST != null,
931
+ split: diffStyle === "unified" ? false : additionsContentAST != null && deletionsContentAST != null,
496
932
  themeStyles,
497
933
  themeType: baseThemeType ?? themeType,
498
934
  totalLines
@@ -527,6 +963,10 @@ var FileDiff = class {
527
963
  this.errorWrapper = void 0;
528
964
  }
529
965
  };
966
+ function getElementChildren(node) {
967
+ if (node == null || node.type !== "element") return;
968
+ return node.children ?? [];
969
+ }
530
970
 
531
971
  //#endregion
532
972
  export { FileDiff };