@pierre/diffs 1.1.0-beta.1 → 1.1.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 (305) 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 +60 -29
  10. package/dist/components/File.d.ts.map +1 -1
  11. package/dist/components/File.js +226 -26
  12. package/dist/components/File.js.map +1 -1
  13. package/dist/components/FileDiff.d.ts +44 -12
  14. package/dist/components/FileDiff.d.ts.map +1 -1
  15. package/dist/components/FileDiff.js +510 -71
  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 +6 -8
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +16 -7
  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 +3 -1
  45. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  46. package/dist/highlighter/languages/constants.js +2 -1
  47. package/dist/highlighter/languages/constants.js.map +1 -1
  48. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  49. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  50. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  51. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  52. package/dist/highlighter/languages/registerCustomLanguage.d.ts +19 -0
  53. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  54. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  55. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  56. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  57. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  58. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  59. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  60. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  61. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  62. package/dist/highlighter/shared_highlighter.js.map +1 -1
  63. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  64. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  65. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  66. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  67. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  68. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  69. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  70. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  71. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  72. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  73. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  74. package/dist/index.d.ts +17 -12
  75. package/dist/index.js +14 -9
  76. package/dist/managers/LineSelectionManager.d.ts +14 -15
  77. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  78. package/dist/managers/LineSelectionManager.js +60 -71
  79. package/dist/managers/LineSelectionManager.js.map +1 -1
  80. package/dist/managers/MouseEventManager.d.ts +13 -6
  81. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  82. package/dist/managers/MouseEventManager.js +161 -47
  83. package/dist/managers/MouseEventManager.js.map +1 -1
  84. package/dist/managers/ResizeManager.d.ts +6 -1
  85. package/dist/managers/ResizeManager.d.ts.map +1 -1
  86. package/dist/managers/ResizeManager.js +114 -64
  87. package/dist/managers/ResizeManager.js.map +1 -1
  88. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  89. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  90. package/dist/react/File.d.ts +1 -0
  91. package/dist/react/File.d.ts.map +1 -1
  92. package/dist/react/File.js +2 -1
  93. package/dist/react/File.js.map +1 -1
  94. package/dist/react/FileDiff.d.ts +1 -0
  95. package/dist/react/FileDiff.d.ts.map +1 -1
  96. package/dist/react/FileDiff.js +2 -1
  97. package/dist/react/FileDiff.js.map +1 -1
  98. package/dist/react/MultiFileDiff.d.ts +1 -0
  99. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  100. package/dist/react/MultiFileDiff.js +2 -1
  101. package/dist/react/MultiFileDiff.js.map +1 -1
  102. package/dist/react/PatchDiff.d.ts +1 -0
  103. package/dist/react/PatchDiff.d.ts.map +1 -1
  104. package/dist/react/PatchDiff.js +3 -2
  105. package/dist/react/PatchDiff.js.map +1 -1
  106. package/dist/react/Virtualizer.d.ts +25 -0
  107. package/dist/react/Virtualizer.d.ts.map +1 -0
  108. package/dist/react/Virtualizer.js +38 -0
  109. package/dist/react/Virtualizer.js.map +1 -0
  110. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  111. package/dist/react/WorkerPoolContext.js +1 -1
  112. package/dist/react/WorkerPoolContext.js.map +1 -1
  113. package/dist/react/constants.d.ts.map +1 -1
  114. package/dist/react/index.d.ts +3 -2
  115. package/dist/react/index.js +2 -1
  116. package/dist/react/jsx.d.ts.map +1 -1
  117. package/dist/react/types.d.ts +5 -3
  118. package/dist/react/types.d.ts.map +1 -1
  119. package/dist/react/utils/renderDiffChildren.d.ts +5 -5
  120. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  121. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  122. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  123. package/dist/react/utils/templateRender.d.ts.map +1 -1
  124. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  125. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  126. package/dist/react/utils/useFileDiffInstance.js +6 -2
  127. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  128. package/dist/react/utils/useFileInstance.d.ts +5 -3
  129. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  130. package/dist/react/utils/useFileInstance.js +6 -2
  131. package/dist/react/utils/useFileInstance.js.map +1 -1
  132. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  133. package/dist/react/utils/useStableCallback.js.map +1 -1
  134. package/dist/renderers/DiffHunksRenderer.d.ts +15 -10
  135. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  136. package/dist/renderers/DiffHunksRenderer.js +249 -140
  137. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  138. package/dist/renderers/FileRenderer.d.ts +12 -5
  139. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  140. package/dist/renderers/FileRenderer.js +90 -31
  141. package/dist/renderers/FileRenderer.js.map +1 -1
  142. package/dist/shiki-stream/stream.d.ts +2 -2
  143. package/dist/shiki-stream/stream.d.ts.map +1 -1
  144. package/dist/shiki-stream/stream.js.map +1 -1
  145. package/dist/shiki-stream/tokenizer.d.ts +2 -2
  146. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  147. package/dist/shiki-stream/tokenizer.js.map +1 -1
  148. package/dist/shiki-stream/types.d.ts +18 -18
  149. package/dist/shiki-stream/types.d.ts.map +1 -1
  150. package/dist/sprite.d.ts +1 -1
  151. package/dist/sprite.d.ts.map +1 -1
  152. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  153. package/dist/ssr/FileDiffReact.js +1 -1
  154. package/dist/ssr/index.d.ts +2 -2
  155. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  156. package/dist/ssr/preloadFile.d.ts.map +1 -1
  157. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  158. package/dist/ssr/preloadPatchFile.js.map +1 -1
  159. package/dist/ssr/renderHTML.d.ts.map +1 -1
  160. package/dist/style.js +1 -1
  161. package/dist/style.js.map +1 -1
  162. package/dist/types.d.ts +198 -165
  163. package/dist/types.d.ts.map +1 -1
  164. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  165. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  166. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  167. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  168. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  169. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  170. package/dist/utils/areOptionsEqual.d.ts +1 -1
  171. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  172. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  173. package/dist/utils/arePrePropertiesEqual.js +1 -1
  174. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  175. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  176. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  177. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  178. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  179. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  180. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  181. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  182. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  183. package/dist/utils/createContentColumn.d.ts +7 -0
  184. package/dist/utils/createContentColumn.d.ts.map +1 -0
  185. package/dist/utils/createContentColumn.js +17 -0
  186. package/dist/utils/createContentColumn.js.map +1 -0
  187. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  188. package/dist/utils/createEmptyRowBuffer.js +2 -1
  189. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  190. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  191. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  192. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  193. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  194. package/dist/utils/createNoNewlineElement.js +3 -6
  195. package/dist/utils/createNoNewlineElement.js.map +1 -1
  196. package/dist/utils/createPreElement.d.ts +2 -1
  197. package/dist/utils/createPreElement.d.ts.map +1 -1
  198. package/dist/utils/createPreElement.js +4 -3
  199. package/dist/utils/createPreElement.js.map +1 -1
  200. package/dist/utils/createRowNodes.d.ts.map +1 -1
  201. package/dist/utils/createSeparator.d.ts.map +1 -1
  202. package/dist/utils/createSeparator.js +2 -2
  203. package/dist/utils/createSeparator.js.map +1 -1
  204. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  205. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  206. package/dist/utils/createStyleElement.d.ts.map +1 -1
  207. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  208. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  209. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  210. package/dist/utils/cssWrappers.d.ts.map +1 -1
  211. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  212. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  213. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  214. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  215. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  216. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  217. package/dist/utils/getFiletypeFromFileName.js +14 -4
  218. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  219. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  220. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  221. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  222. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  223. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  224. package/dist/utils/getIconForType.d.ts +1 -1
  225. package/dist/utils/getIconForType.d.ts.map +1 -1
  226. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  227. package/dist/utils/getLineEndingType.d.ts +1 -1
  228. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  229. package/dist/utils/getLineNodes.d.ts.map +1 -1
  230. package/dist/utils/getOrCreateCodeNode.d.ts +4 -2
  231. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  232. package/dist/utils/getOrCreateCodeNode.js +9 -6
  233. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  234. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  235. package/dist/utils/getThemes.d.ts.map +1 -1
  236. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  237. package/dist/utils/hast_utils.d.ts +6 -3
  238. package/dist/utils/hast_utils.d.ts.map +1 -1
  239. package/dist/utils/hast_utils.js +28 -4
  240. package/dist/utils/hast_utils.js.map +1 -1
  241. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  242. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  243. package/dist/utils/iterateOverDiff.d.ts +28 -13
  244. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  245. package/dist/utils/iterateOverDiff.js +101 -60
  246. package/dist/utils/iterateOverDiff.js.map +1 -1
  247. package/dist/utils/iterateOverFile.d.ts +50 -0
  248. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  249. package/dist/utils/iterateOverFile.js +49 -0
  250. package/dist/utils/iterateOverFile.js.map +1 -0
  251. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  252. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  253. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  254. package/dist/utils/parseDiffFromFile.js +3 -2
  255. package/dist/utils/parseDiffFromFile.js.map +1 -1
  256. package/dist/utils/parseLineType.d.ts +1 -1
  257. package/dist/utils/parseLineType.d.ts.map +1 -1
  258. package/dist/utils/parsePatchFiles.d.ts +12 -10
  259. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  260. package/dist/utils/parsePatchFiles.js +20 -11
  261. package/dist/utils/parsePatchFiles.js.map +1 -1
  262. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  263. package/dist/utils/processLine.d.ts.map +1 -1
  264. package/dist/utils/processLine.js +7 -24
  265. package/dist/utils/processLine.js.map +1 -1
  266. package/dist/utils/renderDiffWithHighlighter.d.ts +4 -3
  267. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  268. package/dist/utils/renderDiffWithHighlighter.js +18 -16
  269. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  270. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  271. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  272. package/dist/utils/renderFileWithHighlighter.js +30 -4
  273. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  274. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  275. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  276. package/dist/utils/resolveVirtualFileMetrics.js +25 -0
  277. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  278. package/dist/utils/setLanguageOverride.d.ts +2 -1
  279. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  280. package/dist/utils/setLanguageOverride.js.map +1 -1
  281. package/dist/utils/setWrapperNodeProps.d.ts +1 -0
  282. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  283. package/dist/utils/setWrapperNodeProps.js +19 -12
  284. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  285. package/dist/utils/splitFileContents.d.ts +12 -0
  286. package/dist/utils/splitFileContents.d.ts.map +1 -0
  287. package/dist/utils/splitFileContents.js +17 -0
  288. package/dist/utils/splitFileContents.js.map +1 -0
  289. package/dist/utils/trimPatchContext.d.ts +11 -0
  290. package/dist/utils/trimPatchContext.d.ts.map +1 -0
  291. package/dist/utils/trimPatchContext.js +99 -0
  292. package/dist/utils/trimPatchContext.js.map +1 -0
  293. package/dist/worker/WorkerPoolManager.d.ts +3 -3
  294. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  295. package/dist/worker/WorkerPoolManager.js +39 -26
  296. package/dist/worker/WorkerPoolManager.js.map +1 -1
  297. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  298. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  299. package/dist/worker/types.d.ts +26 -26
  300. package/dist/worker/types.d.ts.map +1 -1
  301. package/dist/worker/worker-portable.js +352 -154
  302. package/dist/worker/worker-portable.js.map +1 -1
  303. package/dist/worker/worker.js +222 -113
  304. package/dist/worker/worker.js.map +1 -1
  305. package/package.json +52 -53
@@ -1,16 +1,17 @@
1
- import { DEFAULT_EXPANDED_REGION, DEFAULT_THEMES } from "../constants.js";
1
+ import { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES } from "../constants.js";
2
2
  import { areLanguagesAttached } from "../highlighter/languages/areLanguagesAttached.js";
3
3
  import { getHighlighterIfLoaded, getSharedHighlighter } from "../highlighter/shared_highlighter.js";
4
4
  import { areThemesAttached } from "../highlighter/themes/areThemesAttached.js";
5
+ import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
5
6
  import { areThemesEqual } from "../utils/areThemesEqual.js";
6
- import { createBufferElement, createHastElement } from "../utils/hast_utils.js";
7
+ import { createGutterGap, createGutterItem, createGutterWrapper, createHastElement } from "../utils/hast_utils.js";
7
8
  import { createAnnotationElement } from "../utils/createAnnotationElement.js";
9
+ import { createContentColumn } from "../utils/createContentColumn.js";
8
10
  import { createFileHeaderElement } from "../utils/createFileHeaderElement.js";
9
11
  import { createPreElement } from "../utils/createPreElement.js";
10
12
  import { getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
11
13
  import { getHighlighterOptions } from "../utils/getHighlighterOptions.js";
12
14
  import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
13
- import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
14
15
  import { createEmptyRowBuffer } from "../utils/createEmptyRowBuffer.js";
15
16
  import { createNoNewlineElement } from "../utils/createNoNewlineElement.js";
16
17
  import { createSeparator } from "../utils/createSeparator.js";
@@ -22,12 +23,6 @@ import { renderDiffWithHighlighter } from "../utils/renderDiffWithHighlighter.js
22
23
  import { toHtml } from "hast-util-to-html";
23
24
 
24
25
  //#region src/renderers/DiffHunksRenderer.ts
25
- const DEFAULT_RENDER_RANGE = {
26
- startingLine: 0,
27
- totalLines: Infinity,
28
- bufferBefore: 0,
29
- bufferAfter: 0
30
- };
31
26
  let instanceId = -1;
32
27
  var DiffHunksRenderer = class {
33
28
  __id = `diff-hunks-renderer:${++instanceId}`;
@@ -79,6 +74,7 @@ var DiffHunksRenderer = class {
79
74
  } };
80
75
  if (direction === "up" || direction === "both") region.fromStart += expansionLineCount;
81
76
  if (direction === "down" || direction === "both") region.fromEnd += expansionLineCount;
77
+ if (this.renderCache?.highlighted !== true) this.renderCache = void 0;
82
78
  this.expandedHunks.set(index, region);
83
79
  }
84
80
  getExpandedHunk(hunkIndex) {
@@ -103,7 +99,7 @@ var DiffHunksRenderer = class {
103
99
  }
104
100
  }
105
101
  getOptionsWithDefaults() {
106
- const { diffIndicators = "bars", diffStyle = "split", disableBackground = false, disableFileHeader = false, disableLineNumbers = false, disableVirtualizationBuffers = false, expandUnchanged = false, expansionLineCount = 100, hunkSeparators = "line-info", lineDiffType = "word-alt", maxLineDiffLength = 1e3, overflow = "scroll", theme = DEFAULT_THEMES, themeType = "system", tokenizeMaxLineLength = 1e3, useCSSClasses = false } = this.options;
102
+ const { diffIndicators = "bars", diffStyle = "split", disableBackground = false, disableFileHeader = false, disableLineNumbers = false, disableVirtualizationBuffers = false, expandUnchanged = false, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, expansionLineCount = 100, hunkSeparators = "line-info", lineDiffType = "word-alt", maxLineDiffLength = 1e3, overflow = "scroll", theme = DEFAULT_THEMES, themeType = "system", tokenizeMaxLineLength = 1e3, useCSSClasses = false } = this.options;
107
103
  return {
108
104
  diffIndicators,
109
105
  diffStyle,
@@ -112,6 +108,7 @@ var DiffHunksRenderer = class {
112
108
  disableLineNumbers,
113
109
  disableVirtualizationBuffers,
114
110
  expandUnchanged,
111
+ collapsedContextThreshold,
115
112
  expansionLineCount,
116
113
  hunkSeparators,
117
114
  lineDiffType,
@@ -172,7 +169,7 @@ var DiffHunksRenderer = class {
172
169
  }
173
170
  renderDiff(diff = this.renderCache?.diff, renderRange = DEFAULT_RENDER_RANGE) {
174
171
  if (diff == null) return;
175
- const { expandUnchanged = false } = this.options;
172
+ const { expandUnchanged = false, collapsedContextThreshold } = this.getOptionsWithDefaults();
176
173
  const cache = this.workerManager?.getDiffResultCache(diff);
177
174
  if (cache != null && this.renderCache == null) this.renderCache = {
178
175
  diff,
@@ -190,7 +187,7 @@ var DiffHunksRenderer = class {
190
187
  };
191
188
  if (this.workerManager?.isWorkingPool() === true) {
192
189
  if (this.renderCache.result == null || !this.renderCache.highlighted && !areRenderRangesEqual(this.renderCache.renderRange, renderRange)) {
193
- this.renderCache.result = this.workerManager.getPlainDiffAST(diff, renderRange.startingLine, renderRange.totalLines, isDefaultRenderRange(renderRange) ? true : expandUnchanged ? true : this.expandedHunks);
190
+ this.renderCache.result = this.workerManager.getPlainDiffAST(diff, renderRange.startingLine, renderRange.totalLines, isDefaultRenderRange(renderRange) ? true : expandUnchanged ? true : this.expandedHunks, collapsedContextThreshold);
194
191
  this.renderCache.renderRange = renderRange;
195
192
  }
196
193
  if (renderRange.totalLines > 0 && (!this.renderCache.highlighted || forceRender)) this.workerManager.highlightDiffAST(this, diff);
@@ -221,6 +218,7 @@ var DiffHunksRenderer = class {
221
218
  createPreElement(split, totalLines, themeStyles, baseThemeType) {
222
219
  const { diffIndicators, disableBackground, disableLineNumbers, overflow, themeType } = this.getOptionsWithDefaults();
223
220
  return createPreElement({
221
+ type: "diff",
224
222
  diffIndicators,
225
223
  disableBackground,
226
224
  disableLineNumbers,
@@ -240,10 +238,12 @@ var DiffHunksRenderer = class {
240
238
  }
241
239
  renderDiffWithHighlighter(diff, highlighter, forcePlainText = false) {
242
240
  const { options } = this.getRenderOptions(diff);
241
+ const { collapsedContextThreshold } = this.getOptionsWithDefaults();
243
242
  return {
244
243
  result: renderDiffWithHighlighter(diff, highlighter, options, {
245
244
  forcePlainText,
246
- expandedHunks: forcePlainText ? true : void 0
245
+ expandedHunks: forcePlainText ? true : void 0,
246
+ collapsedContextThreshold
247
247
  }),
248
248
  options
249
249
  };
@@ -264,50 +264,71 @@ var DiffHunksRenderer = class {
264
264
  console.error(error);
265
265
  }
266
266
  processDiffResult(fileDiff, renderRange, { code, themeStyles, baseThemeType }) {
267
- const { diffStyle, disableFileHeader, disableVirtualizationBuffers, expandUnchanged, expansionLineCount, hunkSeparators } = this.getOptionsWithDefaults();
267
+ const { diffStyle, disableFileHeader, expandUnchanged, expansionLineCount, collapsedContextThreshold, hunkSeparators } = this.getOptionsWithDefaults();
268
268
  this.diff = fileDiff;
269
269
  const unified = diffStyle === "unified";
270
- let additionsAST = [];
271
- let deletionsAST = [];
272
- let unifiedAST = [];
270
+ let additionsContentAST = [];
271
+ let deletionsContentAST = [];
272
+ let unifiedContentAST = [];
273
273
  const hunkData = [];
274
274
  const { additionLines, deletionLines } = code;
275
- const separatorContext = {
275
+ const context = {
276
+ rowCount: 0,
276
277
  hunkSeparators,
277
- additionsAST,
278
- deletionsAST,
279
- unifiedAST,
278
+ additionsContentAST,
279
+ deletionsContentAST,
280
+ unifiedContentAST,
281
+ unifiedGutterAST: createGutterWrapper(),
282
+ deletionsGutterAST: createGutterWrapper(),
283
+ additionsGutterAST: createGutterWrapper(),
280
284
  expansionLineCount,
281
- hunkData
285
+ hunkData,
286
+ incrementRowCount(count = 1) {
287
+ context.rowCount += count;
288
+ },
289
+ pushToGutter(type, element) {
290
+ switch (type) {
291
+ case "unified":
292
+ context.unifiedGutterAST.children.push(element);
293
+ break;
294
+ case "deletions":
295
+ context.deletionsGutterAST.children.push(element);
296
+ break;
297
+ case "additions":
298
+ context.additionsGutterAST.children.push(element);
299
+ break;
300
+ }
301
+ }
282
302
  };
283
- const trailingRangeSize = (() => {
284
- const lastHunk = fileDiff.hunks.at(-1);
285
- if (lastHunk == null || fileDiff.isPartial || fileDiff.additionLines.length === 0 || fileDiff.deletionLines.length === 0) return 0;
286
- const additionRemaining = fileDiff.additionLines.length - (lastHunk.additionLineIndex + lastHunk.additionCount);
287
- const deletionRemaining = fileDiff.deletionLines.length - (lastHunk.deletionLineIndex + lastHunk.deletionCount);
288
- if (additionRemaining !== deletionRemaining) throw new Error(`DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`);
289
- return Math.min(additionRemaining, deletionRemaining);
290
- })();
303
+ const trailingRangeSize = calculateTrailingRangeSize(fileDiff);
291
304
  let pendingSplitSpanSize = 0;
292
305
  let pendingSplitMissing;
293
- let lastHunkIndex;
306
+ function pushGutterLineNumber(type, lineType, lineNumber, lineIndex) {
307
+ context.pushToGutter(type, createGutterItem(lineType, lineNumber, lineIndex));
308
+ }
294
309
  function flushSplitSpan() {
310
+ if (diffStyle === "unified") return;
295
311
  if (pendingSplitSpanSize <= 0 || pendingSplitMissing == null) {
296
312
  pendingSplitSpanSize = 0;
297
313
  pendingSplitMissing = void 0;
298
314
  return;
299
315
  }
300
- if (pendingSplitMissing === "additions") additionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));
301
- else deletionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));
316
+ if (pendingSplitMissing === "additions") {
317
+ context.pushToGutter("additions", createGutterGap(void 0, "buffer", pendingSplitSpanSize));
318
+ additionsContentAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));
319
+ } else {
320
+ context.pushToGutter("deletions", createGutterGap(void 0, "buffer", pendingSplitSpanSize));
321
+ deletionsContentAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));
322
+ }
302
323
  pendingSplitSpanSize = 0;
303
324
  pendingSplitMissing = void 0;
304
325
  }
305
326
  function pushSeparators(props) {
306
327
  flushSplitSpan();
307
- if (diffStyle === "unified") pushSeparator("unified", props, separatorContext);
328
+ if (diffStyle === "unified") pushSeparator("unified", props, context);
308
329
  else {
309
- pushSeparator("deletions", props, separatorContext);
310
- pushSeparator("additions", props, separatorContext);
330
+ pushSeparator("deletions", props, context);
331
+ pushSeparator("additions", props, context);
311
332
  }
312
333
  }
313
334
  iterateOverDiff({
@@ -316,12 +337,11 @@ var DiffHunksRenderer = class {
316
337
  startingLine: renderRange.startingLine,
317
338
  totalLines: renderRange.totalLines,
318
339
  expandedHunks: expandUnchanged ? true : this.expandedHunks,
319
- callback: ({ hunkIndex, hunk, collapsedBefore, collapsedAfter, unifiedDeletionLineIndex, unifiedAdditionLineIndex, splitLineIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, type, noEOFCRAddition, noEOFCRDeletion }) => {
320
- if (diffStyle === "split") {
321
- if (lastHunkIndex != null && lastHunkIndex !== hunkIndex) flushSplitSpan();
322
- if (type !== "change") flushSplitSpan();
323
- }
324
- lastHunkIndex = hunkIndex;
340
+ collapsedContextThreshold,
341
+ callback: ({ hunkIndex, hunk, collapsedBefore, collapsedAfter, additionLine, deletionLine, type }) => {
342
+ const splitLineIndex = deletionLine != null ? deletionLine.splitLineIndex : additionLine.splitLineIndex;
343
+ const unifiedLineIndex = additionLine != null ? additionLine.unifiedLineIndex : deletionLine.unifiedLineIndex;
344
+ if (diffStyle === "split" && type !== "change") flushSplitSpan();
325
345
  if (collapsedBefore > 0) pushSeparators({
326
346
  hunkIndex,
327
347
  collapsedLines: collapsedBefore,
@@ -331,64 +351,90 @@ var DiffHunksRenderer = class {
331
351
  isLastHunk: false,
332
352
  isExpandable: !fileDiff.isPartial
333
353
  });
334
- const lineIndex = diffStyle === "unified" ? unifiedDeletionLineIndex ?? unifiedAdditionLineIndex : splitLineIndex;
335
- if (lineIndex == null) {
336
- const errorMessage = "DiffHunksRenderer.processDiffResult: iterateOverDiff, no valid line index";
337
- console.error(errorMessage, { file: fileDiff.name });
338
- throw new Error(errorMessage);
339
- }
354
+ const lineIndex = diffStyle === "unified" ? unifiedLineIndex : splitLineIndex;
340
355
  if (diffStyle === "unified") {
341
- const deletionLine = additionLineIndex != null ? void 0 : deletionLineIndex != null ? deletionLines[deletionLineIndex] : void 0;
342
- const additionLine = additionLineIndex != null ? additionLines[additionLineIndex] : void 0;
343
- if (deletionLine == null && additionLine == null) {
356
+ const deletionLineContent = deletionLine != null ? deletionLines[deletionLine.lineIndex] : void 0;
357
+ const additionLineContent = additionLine != null ? additionLines[additionLine.lineIndex] : void 0;
358
+ if (deletionLineContent == null && additionLineContent == null) {
344
359
  const errorMessage = "DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong";
345
360
  console.error(errorMessage, { file: fileDiff.name });
346
361
  throw new Error(errorMessage);
347
362
  }
363
+ pushGutterLineNumber("unified", type === "change" ? additionLine != null ? "change-addition" : "change-deletion" : type, additionLine != null ? additionLine.lineNumber : deletionLine.lineNumber, `${unifiedLineIndex},${splitLineIndex}`);
348
364
  pushLineWithAnnotation({
349
- deletionLine,
350
- additionLine,
351
- unifiedAST,
352
- unifiedSpan: this.getAnnotations("unified", deletionLineNumber, additionLineNumber, hunkIndex, lineIndex)
365
+ diffStyle: "unified",
366
+ type,
367
+ deletionLine: deletionLineContent,
368
+ additionLine: additionLineContent,
369
+ unifiedSpan: this.getAnnotations("unified", deletionLine?.lineNumber, additionLine?.lineNumber, hunkIndex, lineIndex),
370
+ context
353
371
  });
354
372
  } else {
355
- const deletionLine = deletionLineIndex != null ? deletionLines[deletionLineIndex] : void 0;
356
- const additionLine = additionLineIndex != null ? additionLines[additionLineIndex] : void 0;
357
- if (deletionLine == null && additionLine == null) {
373
+ const deletionLineContent = deletionLine != null ? deletionLines[deletionLine.lineIndex] : void 0;
374
+ const additionLineContent = additionLine != null ? additionLines[additionLine.lineIndex] : void 0;
375
+ if (deletionLineContent == null && additionLineContent == null) {
358
376
  const errorMessage = "DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong";
359
377
  console.error(errorMessage, { file: fileDiff.name });
360
378
  throw new Error(errorMessage);
361
379
  }
362
- const missingSide = deletionLine == null ? "deletions" : additionLine == null ? "additions" : void 0;
380
+ const missingSide = (() => {
381
+ if (type === "change") {
382
+ if (additionLineContent == null) return "additions";
383
+ else if (deletionLineContent == null) return "deletions";
384
+ }
385
+ })();
363
386
  if (missingSide != null) {
364
387
  if (pendingSplitMissing != null && pendingSplitMissing !== missingSide) throw new Error("DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits");
365
388
  pendingSplitMissing = missingSide;
366
389
  pendingSplitSpanSize++;
367
390
  }
368
- const annotationSpans = this.getAnnotations("split", deletionLineNumber, additionLineNumber, hunkIndex, lineIndex);
391
+ const annotationSpans = this.getAnnotations("split", deletionLine?.lineNumber, additionLine?.lineNumber, hunkIndex, lineIndex);
369
392
  if (annotationSpans != null && pendingSplitSpanSize > 0) flushSplitSpan();
393
+ if (deletionLine != null) pushGutterLineNumber("deletions", type === "change" ? "change-deletion" : type, deletionLine.lineNumber, `${deletionLine.unifiedLineIndex},${splitLineIndex}`);
394
+ if (additionLine != null) pushGutterLineNumber("additions", type === "change" ? "change-addition" : type, additionLine.lineNumber, `${additionLine.unifiedLineIndex},${splitLineIndex}`);
370
395
  pushLineWithAnnotation({
371
- additionLine,
372
- deletionLine,
373
- deletionsAST,
374
- additionsAST,
375
- ...annotationSpans
396
+ diffStyle: "split",
397
+ type,
398
+ additionLine: additionLineContent,
399
+ deletionLine: deletionLineContent,
400
+ ...annotationSpans,
401
+ context
376
402
  });
377
403
  }
378
- if (noEOFCRDeletion || noEOFCRAddition) {
379
- const noEOFType = type === "context" || type === "context-expanded" ? "context" : deletionLineIndex != null ? "change-deletion" : "change-addition";
380
- if (noEOFCRDeletion) if (diffStyle === "unified") unifiedAST?.push(createNoNewlineElement(noEOFType));
381
- else {
382
- deletionsAST?.push(createNoNewlineElement("change-deletion"));
383
- if (!noEOFCRAddition) additionsAST?.push(createEmptyRowBuffer(1));
404
+ const noEOFCRDeletion = deletionLine?.noEOFCR ?? false;
405
+ const noEOFCRAddition = additionLine?.noEOFCR ?? false;
406
+ if (noEOFCRAddition || noEOFCRDeletion) {
407
+ if (noEOFCRDeletion) {
408
+ const noEOFType = type === "context" || type === "context-expanded" ? type : "change-deletion";
409
+ if (diffStyle === "unified") {
410
+ context.unifiedContentAST.push(createNoNewlineElement(noEOFType));
411
+ context.pushToGutter("unified", createGutterGap(noEOFType, "metadata", 1));
412
+ } else {
413
+ context.deletionsContentAST.push(createNoNewlineElement(noEOFType));
414
+ context.pushToGutter("deletions", createGutterGap(noEOFType, "metadata", 1));
415
+ if (!noEOFCRAddition) {
416
+ context.pushToGutter("additions", createGutterGap(void 0, "buffer", 1));
417
+ context.additionsContentAST.push(createEmptyRowBuffer(1));
418
+ }
419
+ }
384
420
  }
385
- if (noEOFCRAddition) if (diffStyle === "unified") unifiedAST?.push(createNoNewlineElement("change-addition"));
386
- else {
387
- additionsAST?.push(createNoNewlineElement("change-addition"));
388
- if (!noEOFCRDeletion) deletionsAST?.push(createEmptyRowBuffer(1));
421
+ if (noEOFCRAddition) {
422
+ const noEOFType = type === "context" || type === "context-expanded" ? type : "change-addition";
423
+ if (diffStyle === "unified") {
424
+ context.unifiedContentAST.push(createNoNewlineElement(noEOFType));
425
+ context.pushToGutter("unified", createGutterGap(noEOFType, "metadata", 1));
426
+ } else {
427
+ context.additionsContentAST.push(createNoNewlineElement(noEOFType));
428
+ context.pushToGutter("additions", createGutterGap(noEOFType, "metadata", 1));
429
+ if (!noEOFCRDeletion) {
430
+ context.pushToGutter("deletions", createGutterGap(void 0, "buffer", 1));
431
+ context.deletionsContentAST.push(createEmptyRowBuffer(1));
432
+ }
433
+ }
389
434
  }
435
+ context.incrementRowCount(1);
390
436
  }
391
- if (collapsedAfter > 0) pushSeparators({
437
+ if (collapsedAfter > 0 && hunkSeparators !== "simple") pushSeparators({
392
438
  hunkIndex: type === "context-expanded" ? hunkIndex : hunkIndex + 1,
393
439
  collapsedLines: collapsedAfter,
394
440
  rangeSize: trailingRangeSize,
@@ -397,64 +443,75 @@ var DiffHunksRenderer = class {
397
443
  isLastHunk: true,
398
444
  isExpandable: !fileDiff.isPartial
399
445
  });
446
+ context.incrementRowCount(1);
400
447
  }
401
448
  });
402
449
  if (diffStyle === "split") flushSplitSpan();
403
450
  const totalLines = Math.max(getTotalLineCountFromHunks(fileDiff.hunks), fileDiff.additionLines.length ?? 0, fileDiff.deletionLines.length ?? 0);
404
- additionsAST = !unified && fileDiff.type !== "deleted" ? additionsAST : void 0;
405
- deletionsAST = !unified && fileDiff.type !== "new" ? deletionsAST : void 0;
406
- unifiedAST = unified ? unifiedAST : void 0;
407
- if (!disableVirtualizationBuffers) {
408
- if (renderRange.bufferBefore > 0) {
409
- const element = createBufferElement("before", renderRange.bufferBefore);
410
- unifiedAST?.unshift(element);
411
- deletionsAST?.unshift(element);
412
- additionsAST?.unshift(element);
413
- }
414
- if (renderRange.bufferAfter > 0) {
415
- const element = createBufferElement("after", renderRange.bufferAfter);
416
- unifiedAST?.push(element);
417
- deletionsAST?.push(element);
418
- additionsAST?.push(element);
419
- }
420
- }
421
- if (unifiedAST?.length === 0) unifiedAST = void 0;
422
- if (deletionsAST?.length === 0) deletionsAST = void 0;
423
- if (additionsAST?.length === 0) additionsAST = void 0;
424
- const preNode = this.createPreElement(deletionsAST != null && additionsAST != null, totalLines, themeStyles, baseThemeType);
451
+ const hasBuffer = renderRange.bufferBefore > 0 || renderRange.bufferAfter > 0;
452
+ const shouldIncludeAdditions = !unified && fileDiff.type !== "deleted";
453
+ const shouldIncludeDeletions = !unified && fileDiff.type !== "new";
454
+ const hasContent = context.rowCount > 0 || hasBuffer;
455
+ additionsContentAST = shouldIncludeAdditions && hasContent ? additionsContentAST : void 0;
456
+ deletionsContentAST = shouldIncludeDeletions && hasContent ? deletionsContentAST : void 0;
457
+ unifiedContentAST = unified && hasContent ? unifiedContentAST : void 0;
458
+ const preNode = this.createPreElement(deletionsContentAST != null && additionsContentAST != null, totalLines, themeStyles, baseThemeType);
425
459
  return {
426
- additionsAST,
427
- deletionsAST,
428
- unifiedAST,
460
+ unifiedGutterAST: unified && hasContent ? context.unifiedGutterAST.children : void 0,
461
+ unifiedContentAST,
462
+ deletionsGutterAST: shouldIncludeDeletions && hasContent ? context.deletionsGutterAST.children : void 0,
463
+ deletionsContentAST,
464
+ additionsGutterAST: shouldIncludeAdditions && hasContent ? context.additionsGutterAST.children : void 0,
465
+ additionsContentAST,
429
466
  hunkData,
430
467
  preNode,
431
468
  themeStyles,
432
469
  baseThemeType,
433
470
  headerElement: !disableFileHeader ? this.renderHeader(this.diff, themeStyles, baseThemeType) : void 0,
434
471
  totalLines,
472
+ rowCount: context.rowCount,
473
+ bufferBefore: renderRange.bufferBefore,
474
+ bufferAfter: renderRange.bufferAfter,
435
475
  css: ""
436
476
  };
437
477
  }
478
+ renderCodeAST(type, result) {
479
+ const gutterAST = type === "unified" ? result.unifiedGutterAST : type === "deletions" ? result.deletionsGutterAST : result.additionsGutterAST;
480
+ const contentAST = type === "unified" ? result.unifiedContentAST : type === "deletions" ? result.deletionsContentAST : result.additionsContentAST;
481
+ if (gutterAST == null || contentAST == null) return;
482
+ const gutter = createGutterWrapper(gutterAST);
483
+ gutter.properties.style = `grid-row: span ${result.rowCount}`;
484
+ return [gutter, createContentColumn(contentAST, result.rowCount)];
485
+ }
438
486
  renderFullAST(result, children = []) {
439
- if (result.unifiedAST != null) children.push(createHastElement({
440
- tagName: "code",
441
- children: result.unifiedAST,
442
- properties: {
443
- "data-code": "",
444
- "data-unified": ""
445
- }
446
- }));
447
- if (result.deletionsAST != null) children.push(createHastElement({
487
+ const unifiedAST = this.renderCodeAST("unified", result);
488
+ if (unifiedAST != null) {
489
+ children.push(createHastElement({
490
+ tagName: "code",
491
+ children: unifiedAST,
492
+ properties: {
493
+ "data-code": "",
494
+ "data-unified": ""
495
+ }
496
+ }));
497
+ return {
498
+ ...result.preNode,
499
+ children
500
+ };
501
+ }
502
+ const deletionsAST = this.renderCodeAST("deletions", result);
503
+ if (deletionsAST != null) children.push(createHastElement({
448
504
  tagName: "code",
449
- children: result.deletionsAST,
505
+ children: deletionsAST,
450
506
  properties: {
451
507
  "data-code": "",
452
508
  "data-deletions": ""
453
509
  }
454
510
  }));
455
- if (result.additionsAST != null) children.push(createHastElement({
511
+ const additionsAST = this.renderCodeAST("additions", result);
512
+ if (additionsAST != null) children.push(createHastElement({
456
513
  tagName: "code",
457
- children: result.additionsAST,
514
+ children: additionsAST,
458
515
  properties: {
459
516
  "data-code": "",
460
517
  "data-additions": ""
@@ -519,43 +576,86 @@ function areRenderOptionsEqual(optionsA, optionsB) {
519
576
  function getModifiedLinesString(lines) {
520
577
  return `${lines} unmodified line${lines > 1 ? "s" : ""}`;
521
578
  }
522
- function pushLineWithAnnotation({ deletionLine, additionLine, unifiedAST, additionsAST, deletionsAST, unifiedSpan, deletionSpan, additionSpan }) {
523
- if (unifiedAST != null) {
524
- if (deletionLine != null) unifiedAST.push(deletionLine);
525
- else if (additionLine != null) unifiedAST.push(additionLine);
526
- if (unifiedSpan != null) unifiedAST.push(createAnnotationElement(unifiedSpan));
527
- } else if (deletionsAST != null && additionsAST != null) {
528
- if (deletionLine != null) deletionsAST.push(deletionLine);
529
- if (additionLine != null) additionsAST.push(additionLine);
530
- if (deletionSpan != null) deletionsAST.push(createAnnotationElement(deletionSpan));
531
- if (additionSpan != null) additionsAST.push(createAnnotationElement(additionSpan));
579
+ function pushLineWithAnnotation({ diffStyle, type, deletionLine, additionLine, unifiedSpan, deletionSpan, additionSpan, context }) {
580
+ let hasAnnotationRow = false;
581
+ if (diffStyle === "unified") {
582
+ if (additionLine != null) context.unifiedContentAST.push(additionLine);
583
+ else if (deletionLine != null) context.unifiedContentAST.push(deletionLine);
584
+ if (unifiedSpan != null) {
585
+ const lineType = type === "change" ? deletionLine != null ? "change-deletion" : "change-addition" : type;
586
+ context.unifiedContentAST.push(createAnnotationElement(unifiedSpan));
587
+ context.pushToGutter("unified", createGutterGap(lineType, "annotation", 1));
588
+ hasAnnotationRow = true;
589
+ }
590
+ } else if (diffStyle === "split") {
591
+ if (deletionLine != null) context.deletionsContentAST.push(deletionLine);
592
+ if (additionLine != null) context.additionsContentAST.push(additionLine);
593
+ if (deletionSpan != null) {
594
+ const lineType = type === "change" ? deletionLine != null ? "change-deletion" : "context" : type;
595
+ context.deletionsContentAST.push(createAnnotationElement(deletionSpan));
596
+ context.pushToGutter("deletions", createGutterGap(lineType, "annotation", 1));
597
+ hasAnnotationRow = true;
598
+ }
599
+ if (additionSpan != null) {
600
+ const lineType = type === "change" ? additionLine != null ? "change-addition" : "context" : type;
601
+ context.additionsContentAST.push(createAnnotationElement(additionSpan));
602
+ context.pushToGutter("additions", createGutterGap(lineType, "annotation", 1));
603
+ hasAnnotationRow = true;
604
+ }
532
605
  }
606
+ if (hasAnnotationRow) context.incrementRowCount(1);
533
607
  }
534
- function pushSeparator(type, { hunkIndex, collapsedLines, rangeSize, hunkSpecs, isFirstHunk, isLastHunk, isExpandable }, { expansionLineCount, hunkSeparators, unifiedAST, deletionsAST, additionsAST, hunkData }) {
608
+ function pushSeparator(type, { hunkIndex, collapsedLines, rangeSize, hunkSpecs, isFirstHunk, isLastHunk, isExpandable }, context) {
535
609
  if (collapsedLines <= 0) return;
536
- const linesAST = type === "unified" ? unifiedAST : type === "deletions" ? deletionsAST : additionsAST;
537
- if (hunkSeparators === "metadata") {
538
- if (hunkSpecs != null) linesAST.push(createSeparator({
539
- type: "metadata",
540
- content: hunkSpecs,
541
- isFirstHunk,
542
- isLastHunk
543
- }));
610
+ const linesAST = type === "unified" ? context.unifiedContentAST : type === "deletions" ? context.deletionsContentAST : context.additionsContentAST;
611
+ if (context.hunkSeparators === "metadata") {
612
+ if (hunkSpecs != null) {
613
+ context.pushToGutter(type, createSeparator({
614
+ type: "metadata",
615
+ content: hunkSpecs,
616
+ isFirstHunk,
617
+ isLastHunk
618
+ }));
619
+ linesAST.push(createSeparator({
620
+ type: "metadata",
621
+ content: hunkSpecs,
622
+ isFirstHunk,
623
+ isLastHunk
624
+ }));
625
+ if (type !== "additions") context.incrementRowCount(1);
626
+ }
544
627
  return;
545
628
  }
546
- if (hunkSeparators === "simple") {
547
- if (hunkIndex > 0) linesAST.push(createSeparator({
548
- type: "simple",
549
- isFirstHunk,
550
- isLastHunk: false
551
- }));
629
+ if (context.hunkSeparators === "simple") {
630
+ if (hunkIndex > 0) {
631
+ context.pushToGutter(type, createSeparator({
632
+ type: "simple",
633
+ isFirstHunk,
634
+ isLastHunk: false
635
+ }));
636
+ linesAST.push(createSeparator({
637
+ type: "simple",
638
+ isFirstHunk,
639
+ isLastHunk: false
640
+ }));
641
+ if (type !== "additions") context.incrementRowCount(1);
642
+ }
552
643
  return;
553
644
  }
554
645
  const slotName = getHunkSeparatorSlotName(type, hunkIndex);
555
- const chunked = rangeSize > expansionLineCount;
646
+ const chunked = rangeSize > context.expansionLineCount;
556
647
  const expandIndex = isExpandable ? hunkIndex : void 0;
648
+ context.pushToGutter(type, createSeparator({
649
+ type: context.hunkSeparators,
650
+ content: getModifiedLinesString(collapsedLines),
651
+ expandIndex,
652
+ chunked,
653
+ slotName,
654
+ isFirstHunk,
655
+ isLastHunk
656
+ }));
557
657
  linesAST.push(createSeparator({
558
- type: hunkSeparators,
658
+ type: context.hunkSeparators,
559
659
  content: getModifiedLinesString(collapsedLines),
560
660
  expandIndex,
561
661
  chunked,
@@ -563,7 +663,8 @@ function pushSeparator(type, { hunkIndex, collapsedLines, rangeSize, hunkSpecs,
563
663
  isFirstHunk,
564
664
  isLastHunk
565
665
  }));
566
- hunkData.push({
666
+ if (type !== "additions") context.incrementRowCount(1);
667
+ context.hunkData.push({
567
668
  slotName,
568
669
  hunkIndex,
569
670
  lines: collapsedLines,
@@ -575,6 +676,14 @@ function pushSeparator(type, { hunkIndex, collapsedLines, rangeSize, hunkSpecs,
575
676
  } : void 0
576
677
  });
577
678
  }
679
+ function calculateTrailingRangeSize(fileDiff) {
680
+ const lastHunk = fileDiff.hunks.at(-1);
681
+ if (lastHunk == null || fileDiff.isPartial || fileDiff.additionLines.length === 0 || fileDiff.deletionLines.length === 0) return 0;
682
+ const additionRemaining = fileDiff.additionLines.length - (lastHunk.additionLineIndex + lastHunk.additionCount);
683
+ const deletionRemaining = fileDiff.deletionLines.length - (lastHunk.deletionLineIndex + lastHunk.deletionCount);
684
+ if (additionRemaining !== deletionRemaining) throw new Error(`DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`);
685
+ return Math.min(additionRemaining, deletionRemaining);
686
+ }
578
687
 
579
688
  //#endregion
580
689
  export { DiffHunksRenderer };