@pierre/diffs 1.1.0-beta.1 → 1.1.0-beta.11

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 (313) hide show
  1. package/README.md +7 -18
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +40 -0
  3. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -0
  4. package/dist/components/AdvancedVirtualizedFileDiff.js +145 -0
  5. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -0
  6. package/dist/components/AdvancedVirtualizer.d.ts +38 -0
  7. package/dist/components/AdvancedVirtualizer.d.ts.map +1 -0
  8. package/dist/components/AdvancedVirtualizer.js +201 -0
  9. package/dist/components/AdvancedVirtualizer.js.map +1 -0
  10. package/dist/components/File.d.ts +60 -29
  11. package/dist/components/File.d.ts.map +1 -1
  12. package/dist/components/File.js +226 -26
  13. package/dist/components/File.js.map +1 -1
  14. package/dist/components/FileDiff.d.ts +44 -12
  15. package/dist/components/FileDiff.d.ts.map +1 -1
  16. package/dist/components/FileDiff.js +510 -71
  17. package/dist/components/FileDiff.js.map +1 -1
  18. package/dist/components/FileStream.d.ts +5 -0
  19. package/dist/components/FileStream.d.ts.map +1 -1
  20. package/dist/components/FileStream.js +66 -8
  21. package/dist/components/FileStream.js.map +1 -1
  22. package/dist/components/VirtualizedFile.d.ts +33 -0
  23. package/dist/components/VirtualizedFile.d.ts.map +1 -0
  24. package/dist/components/VirtualizedFile.js +227 -0
  25. package/dist/components/VirtualizedFile.js.map +1 -0
  26. package/dist/components/VirtualizedFileDiff.d.ts +39 -0
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -0
  28. package/dist/components/VirtualizedFileDiff.js +316 -0
  29. package/dist/components/VirtualizedFileDiff.js.map +1 -0
  30. package/dist/components/Virtualizer.d.ts +63 -0
  31. package/dist/components/Virtualizer.d.ts.map +1 -0
  32. package/dist/components/Virtualizer.js +369 -0
  33. package/dist/components/Virtualizer.js.map +1 -0
  34. package/dist/components/VirtulizerDevelopment.d.ts +14 -0
  35. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -0
  36. package/dist/components/web-components.d.ts +1 -1
  37. package/dist/components/web-components.d.ts.map +1 -1
  38. package/dist/constants.d.ts +6 -8
  39. package/dist/constants.d.ts.map +1 -1
  40. package/dist/constants.js +16 -7
  41. package/dist/constants.js.map +1 -1
  42. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  43. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  44. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  45. package/dist/highlighter/languages/constants.d.ts +3 -1
  46. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  47. package/dist/highlighter/languages/constants.js +2 -1
  48. package/dist/highlighter/languages/constants.js.map +1 -1
  49. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  50. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  51. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  52. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  53. package/dist/highlighter/languages/registerCustomLanguage.d.ts +19 -0
  54. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  55. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  56. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  57. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  58. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  59. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  60. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  61. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  62. package/dist/highlighter/shared_highlighter.d.ts +4 -2
  63. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  64. package/dist/highlighter/shared_highlighter.js +3 -3
  65. package/dist/highlighter/shared_highlighter.js.map +1 -1
  66. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  67. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  68. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  69. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  70. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  71. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  72. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  73. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  74. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  75. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  76. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  77. package/dist/index.d.ts +17 -12
  78. package/dist/index.js +14 -9
  79. package/dist/managers/LineSelectionManager.d.ts +14 -15
  80. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  81. package/dist/managers/LineSelectionManager.js +60 -71
  82. package/dist/managers/LineSelectionManager.js.map +1 -1
  83. package/dist/managers/MouseEventManager.d.ts +13 -6
  84. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  85. package/dist/managers/MouseEventManager.js +161 -47
  86. package/dist/managers/MouseEventManager.js.map +1 -1
  87. package/dist/managers/ResizeManager.d.ts +6 -1
  88. package/dist/managers/ResizeManager.d.ts.map +1 -1
  89. package/dist/managers/ResizeManager.js +114 -64
  90. package/dist/managers/ResizeManager.js.map +1 -1
  91. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  92. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  93. package/dist/react/File.d.ts +1 -0
  94. package/dist/react/File.d.ts.map +1 -1
  95. package/dist/react/File.js +2 -1
  96. package/dist/react/File.js.map +1 -1
  97. package/dist/react/FileDiff.d.ts +1 -0
  98. package/dist/react/FileDiff.d.ts.map +1 -1
  99. package/dist/react/FileDiff.js +2 -1
  100. package/dist/react/FileDiff.js.map +1 -1
  101. package/dist/react/MultiFileDiff.d.ts +1 -0
  102. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  103. package/dist/react/MultiFileDiff.js +2 -1
  104. package/dist/react/MultiFileDiff.js.map +1 -1
  105. package/dist/react/PatchDiff.d.ts +1 -0
  106. package/dist/react/PatchDiff.d.ts.map +1 -1
  107. package/dist/react/PatchDiff.js +3 -2
  108. package/dist/react/PatchDiff.js.map +1 -1
  109. package/dist/react/Virtualizer.d.ts +25 -0
  110. package/dist/react/Virtualizer.d.ts.map +1 -0
  111. package/dist/react/Virtualizer.js +38 -0
  112. package/dist/react/Virtualizer.js.map +1 -0
  113. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  114. package/dist/react/WorkerPoolContext.js +1 -1
  115. package/dist/react/WorkerPoolContext.js.map +1 -1
  116. package/dist/react/constants.d.ts.map +1 -1
  117. package/dist/react/index.d.ts +3 -2
  118. package/dist/react/index.js +2 -1
  119. package/dist/react/jsx.d.ts.map +1 -1
  120. package/dist/react/types.d.ts +5 -3
  121. package/dist/react/types.d.ts.map +1 -1
  122. package/dist/react/utils/renderDiffChildren.d.ts +5 -5
  123. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  124. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  125. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  126. package/dist/react/utils/templateRender.d.ts.map +1 -1
  127. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  128. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  129. package/dist/react/utils/useFileDiffInstance.js +6 -2
  130. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  131. package/dist/react/utils/useFileInstance.d.ts +5 -3
  132. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  133. package/dist/react/utils/useFileInstance.js +6 -2
  134. package/dist/react/utils/useFileInstance.js.map +1 -1
  135. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  136. package/dist/react/utils/useStableCallback.js.map +1 -1
  137. package/dist/renderers/DiffHunksRenderer.d.ts +15 -10
  138. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  139. package/dist/renderers/DiffHunksRenderer.js +249 -140
  140. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  141. package/dist/renderers/FileRenderer.d.ts +12 -5
  142. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  143. package/dist/renderers/FileRenderer.js +90 -31
  144. package/dist/renderers/FileRenderer.js.map +1 -1
  145. package/dist/shiki-stream/stream.d.ts +3 -3
  146. package/dist/shiki-stream/stream.d.ts.map +1 -1
  147. package/dist/shiki-stream/stream.js.map +1 -1
  148. package/dist/shiki-stream/tokenizer.d.ts +3 -3
  149. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  150. package/dist/shiki-stream/tokenizer.js.map +1 -1
  151. package/dist/shiki-stream/types.d.ts +19 -19
  152. package/dist/shiki-stream/types.d.ts.map +1 -1
  153. package/dist/sprite.d.ts +1 -1
  154. package/dist/sprite.d.ts.map +1 -1
  155. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  156. package/dist/ssr/FileDiffReact.js +1 -1
  157. package/dist/ssr/index.d.ts +2 -2
  158. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  159. package/dist/ssr/preloadFile.d.ts.map +1 -1
  160. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  161. package/dist/ssr/preloadPatchFile.js.map +1 -1
  162. package/dist/ssr/renderHTML.d.ts.map +1 -1
  163. package/dist/style.js +1 -1
  164. package/dist/style.js.map +1 -1
  165. package/dist/types.d.ts +200 -165
  166. package/dist/types.d.ts.map +1 -1
  167. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  168. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  169. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  170. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  171. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  172. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  173. package/dist/utils/areOptionsEqual.d.ts +1 -1
  174. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  175. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  176. package/dist/utils/arePrePropertiesEqual.js +1 -1
  177. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  178. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  179. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  180. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  181. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  182. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  183. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  184. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  185. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  186. package/dist/utils/createContentColumn.d.ts +7 -0
  187. package/dist/utils/createContentColumn.d.ts.map +1 -0
  188. package/dist/utils/createContentColumn.js +17 -0
  189. package/dist/utils/createContentColumn.js.map +1 -0
  190. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  191. package/dist/utils/createEmptyRowBuffer.js +2 -1
  192. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  193. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  194. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  195. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  196. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  197. package/dist/utils/createNoNewlineElement.js +3 -6
  198. package/dist/utils/createNoNewlineElement.js.map +1 -1
  199. package/dist/utils/createPreElement.d.ts +2 -1
  200. package/dist/utils/createPreElement.d.ts.map +1 -1
  201. package/dist/utils/createPreElement.js +4 -3
  202. package/dist/utils/createPreElement.js.map +1 -1
  203. package/dist/utils/createRowNodes.d.ts.map +1 -1
  204. package/dist/utils/createSeparator.d.ts.map +1 -1
  205. package/dist/utils/createSeparator.js +2 -2
  206. package/dist/utils/createSeparator.js.map +1 -1
  207. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  208. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  209. package/dist/utils/createStyleElement.d.ts.map +1 -1
  210. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  211. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  212. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  213. package/dist/utils/cssWrappers.d.ts.map +1 -1
  214. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  215. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  216. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  217. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  218. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  219. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  220. package/dist/utils/getFiletypeFromFileName.js +14 -4
  221. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  222. package/dist/utils/getHighlighterOptions.d.ts +7 -2
  223. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  224. package/dist/utils/getHighlighterOptions.js +3 -2
  225. package/dist/utils/getHighlighterOptions.js.map +1 -1
  226. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  227. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  228. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  229. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  230. package/dist/utils/getIconForType.d.ts +1 -1
  231. package/dist/utils/getIconForType.d.ts.map +1 -1
  232. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  233. package/dist/utils/getLineEndingType.d.ts +1 -1
  234. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  235. package/dist/utils/getLineNodes.d.ts.map +1 -1
  236. package/dist/utils/getOrCreateCodeNode.d.ts +4 -2
  237. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  238. package/dist/utils/getOrCreateCodeNode.js +9 -6
  239. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  240. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  241. package/dist/utils/getThemes.d.ts.map +1 -1
  242. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  243. package/dist/utils/hast_utils.d.ts +6 -3
  244. package/dist/utils/hast_utils.d.ts.map +1 -1
  245. package/dist/utils/hast_utils.js +28 -4
  246. package/dist/utils/hast_utils.js.map +1 -1
  247. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  248. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  249. package/dist/utils/iterateOverDiff.d.ts +28 -13
  250. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  251. package/dist/utils/iterateOverDiff.js +101 -60
  252. package/dist/utils/iterateOverDiff.js.map +1 -1
  253. package/dist/utils/iterateOverFile.d.ts +50 -0
  254. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  255. package/dist/utils/iterateOverFile.js +49 -0
  256. package/dist/utils/iterateOverFile.js.map +1 -0
  257. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  258. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  259. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  260. package/dist/utils/parseDiffFromFile.js +3 -2
  261. package/dist/utils/parseDiffFromFile.js.map +1 -1
  262. package/dist/utils/parseLineType.d.ts +1 -1
  263. package/dist/utils/parseLineType.d.ts.map +1 -1
  264. package/dist/utils/parsePatchFiles.d.ts +12 -10
  265. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  266. package/dist/utils/parsePatchFiles.js +20 -11
  267. package/dist/utils/parsePatchFiles.js.map +1 -1
  268. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  269. package/dist/utils/processLine.d.ts.map +1 -1
  270. package/dist/utils/processLine.js +7 -24
  271. package/dist/utils/processLine.js.map +1 -1
  272. package/dist/utils/renderDiffWithHighlighter.d.ts +4 -3
  273. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  274. package/dist/utils/renderDiffWithHighlighter.js +18 -16
  275. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  276. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  277. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  278. package/dist/utils/renderFileWithHighlighter.js +30 -4
  279. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  280. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  281. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  282. package/dist/utils/resolveVirtualFileMetrics.js +25 -0
  283. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  284. package/dist/utils/setLanguageOverride.d.ts +2 -1
  285. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  286. package/dist/utils/setLanguageOverride.js.map +1 -1
  287. package/dist/utils/setWrapperNodeProps.d.ts +1 -0
  288. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  289. package/dist/utils/setWrapperNodeProps.js +19 -12
  290. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  291. package/dist/utils/splitFileContents.d.ts +12 -0
  292. package/dist/utils/splitFileContents.d.ts.map +1 -0
  293. package/dist/utils/splitFileContents.js +17 -0
  294. package/dist/utils/splitFileContents.js.map +1 -0
  295. package/dist/utils/trimPatchContext.d.ts +11 -0
  296. package/dist/utils/trimPatchContext.d.ts.map +1 -0
  297. package/dist/utils/trimPatchContext.js +99 -0
  298. package/dist/utils/trimPatchContext.js.map +1 -0
  299. package/dist/worker/WorkerPoolManager.d.ts +6 -4
  300. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  301. package/dist/worker/WorkerPoolManager.js +47 -29
  302. package/dist/worker/WorkerPoolManager.js.map +1 -1
  303. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  304. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  305. package/dist/worker/types.d.ts +29 -27
  306. package/dist/worker/types.d.ts.map +1 -1
  307. package/dist/worker/wasm-BlUZCxHM.js +10 -0
  308. package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
  309. package/dist/worker/worker-portable.js +10887 -10257
  310. package/dist/worker/worker-portable.js.map +1 -1
  311. package/dist/worker/worker.js +249 -132
  312. package/dist/worker/worker.js.map +1 -1
  313. package/package.json +50 -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;
@@ -63,14 +67,67 @@ var FileDiff = class {
63
67
  }, this.handleHighlightRender, this.workerManager);
64
68
  this.resizeManager = new ResizeManager();
65
69
  this.scrollSyncManager = new ScrollSyncManager();
66
- 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));
70
+ this.mouseEventManager = new MouseEventManager("diff", pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" || options.hunkSeparators === "line-info-basic" ? this.handleExpandHunk : void 0));
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;
@@ -78,8 +135,8 @@ var FileDiff = class {
78
135
  ...this.options,
79
136
  hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
80
137
  });
81
- 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));
138
+ this.mouseEventManager.setOptions(pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" || options.hunkSeparators === "line-info-basic" ? this.handleExpandHunk : void 0));
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 } = 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,28 +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
- if (error instanceof Error) {
263
- console.error(error);
264
- this.applyErrorToDOM(error, fileContainer);
265
- }
341
+ if (disableErrorHandling) throw error;
342
+ console.error(error);
343
+ if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
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);
266
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;
267
388
  }
268
389
  renderSeparators(hunkData) {
269
390
  const { hunkSeparators } = this.options;
@@ -375,6 +496,8 @@ var FileDiff = class {
375
496
  shadowRoot.appendChild(this.pre);
376
497
  this.appliedPreAttributes = void 0;
377
498
  }
499
+ this.placeHolder?.remove();
500
+ this.placeHolder = void 0;
378
501
  return this.pre;
379
502
  }
380
503
  syncCodeNodesFromPre(pre) {
@@ -390,6 +513,8 @@ var FileDiff = class {
390
513
  }
391
514
  applyHeaderToDOM(headerAST, container) {
392
515
  this.cleanupErrorWrapper();
516
+ this.placeHolder?.remove();
517
+ this.placeHolder = void 0;
393
518
  const headerHTML = toHtml(headerAST);
394
519
  if (headerHTML !== this.lastRenderedHeaderHTML) {
395
520
  const tempDiv = document.createElement("div");
@@ -428,72 +553,382 @@ var FileDiff = class {
428
553
  this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);
429
554
  }
430
555
  applyHunksToDOM(pre, result) {
556
+ const { overflow = "scroll" } = this.options;
557
+ const rowSpan = overflow === "wrap" ? result.rowCount : void 0;
431
558
  this.cleanupErrorWrapper();
432
559
  this.applyPreNodeAttributes(pre, result);
433
560
  let shouldReplace = false;
434
- let codeDeletions;
435
- let codeAdditions;
436
561
  const codeElements = [];
437
- 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) {
438
566
  shouldReplace = this.codeUnified == null || this.codeAdditions != null || this.codeDeletions != null;
567
+ this.codeDeletions?.remove();
439
568
  this.codeDeletions = void 0;
569
+ this.codeAdditions?.remove();
440
570
  this.codeAdditions = void 0;
441
- if (result.unifiedAST.length > 0) {
442
- this.codeUnified = getOrCreateCodeNode({
443
- code: this.codeUnified,
444
- columnType: "unified"
445
- });
446
- this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(result.unifiedAST);
447
- codeElements.push(this.codeUnified);
448
- } else this.codeUnified = void 0;
449
- } else {
450
- 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) {
451
580
  shouldReplace = this.codeDeletions == null || this.codeUnified != null;
581
+ this.codeUnified?.remove();
452
582
  this.codeUnified = void 0;
453
- if (result.deletionsAST.length > 0) {
454
- this.codeDeletions = getOrCreateCodeNode({
455
- code: this.codeDeletions,
456
- columnType: "deletions"
457
- });
458
- this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(result.deletionsAST);
459
- codeElements.push(this.codeDeletions);
460
- } 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;
461
593
  }
462
- if (result.additionsAST != null) {
594
+ if (additionsAST != null) {
463
595
  shouldReplace = shouldReplace || this.codeAdditions == null || this.codeUnified != null;
596
+ this.codeUnified?.remove();
464
597
  this.codeUnified = void 0;
465
- if (result.additionsAST.length > 0) {
466
- this.codeAdditions = getOrCreateCodeNode({
467
- code: this.codeAdditions,
468
- columnType: "additions"
469
- });
470
- this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(result.additionsAST);
471
- codeElements.push(this.codeAdditions);
472
- } 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;
473
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;
474
616
  }
475
617
  if (codeElements.length === 0) pre.textContent = "";
476
618
  else if (shouldReplace) pre.replaceChildren(...codeElements);
477
- this.injectUnsafeCSS();
478
- this.mouseEventManager.setup(pre);
479
- this.lineSelectionManager.setup(pre);
480
- if ((this.options.overflow ?? "scroll") === "scroll") {
481
- this.resizeManager.setup(pre);
482
- if ((this.options.diffStyle ?? "split") === "split") this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);
483
- 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("FileDiff.applyPartialRender.applyChunk: invalid chunk application");
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();
706
+ } else {
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("FileDiff.trimColumnRows: invalid element");
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;
484
850
  } else {
485
- this.resizeManager.cleanUp();
486
- this.scrollSyncManager.cleanUp();
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;
487
921
  }
488
922
  }
489
- applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsAST, deletionsAST, totalLines }) {
923
+ applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsContentAST, deletionsContentAST, totalLines }) {
490
924
  const { diffIndicators = "bars", disableBackground = false, disableLineNumbers = false, overflow = "scroll", themeType = "system", diffStyle = "split" } = this.options;
491
925
  const preProperties = {
926
+ type: "diff",
492
927
  diffIndicators,
493
928
  disableBackground,
494
929
  disableLineNumbers,
495
930
  overflow,
496
- split: diffStyle === "unified" ? false : additionsAST != null && deletionsAST != null,
931
+ split: diffStyle === "unified" ? false : additionsContentAST != null && deletionsContentAST != null,
497
932
  themeStyles,
498
933
  themeType: baseThemeType ?? themeType,
499
934
  totalLines
@@ -528,6 +963,10 @@ var FileDiff = class {
528
963
  this.errorWrapper = void 0;
529
964
  }
530
965
  };
966
+ function getElementChildren(node) {
967
+ if (node == null || node.type !== "element") return;
968
+ return node.children ?? [];
969
+ }
531
970
 
532
971
  //#endregion
533
972
  export { FileDiff };