@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
@@ -1,8 +1,10 @@
1
- import { BaseCodeOptions, FileContents, LineAnnotation, RenderFileMetadata, ThemeTypes } from "../types.js";
2
- import { LineSelectionOptions, SelectedLineRange } from "../managers/LineSelectionManager.js";
3
- import { GetHoveredLineResult, MouseEventManagerBaseOptions } from "../managers/MouseEventManager.js";
1
+ import { BaseCodeOptions, FileContents, LineAnnotation, PrePropertiesConfig, RenderFileMetadata, RenderRange, ThemeTypes } from "../types.js";
4
2
  import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
5
3
  import "../worker/index.js";
4
+ import { LineSelectionManager, LineSelectionOptions, SelectedLineRange } from "../managers/LineSelectionManager.js";
5
+ import { GetHoveredLineResult, MouseEventManager, MouseEventManagerBaseOptions } from "../managers/MouseEventManager.js";
6
+ import { ResizeManager } from "../managers/ResizeManager.js";
7
+ import { FileRenderer } from "../renderers/FileRenderer.js";
6
8
 
7
9
  //#region src/components/File.d.ts
8
10
  interface FileRenderProps<LAnnotation> {
@@ -11,16 +13,27 @@ interface FileRenderProps<LAnnotation> {
11
13
  containerWrapper?: HTMLElement;
12
14
  forceRender?: boolean;
13
15
  lineAnnotations?: LineAnnotation<LAnnotation>[];
16
+ renderRange?: RenderRange;
14
17
  }
15
- interface FileHyrdateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation>, "fileContainer"> {
18
+ interface FileHyrdateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {
16
19
  fileContainer: HTMLElement;
17
20
  prerenderedHTML?: string;
18
21
  }
19
- interface FileOptions<LAnnotation> extends BaseCodeOptions, MouseEventManagerBaseOptions<"file">, LineSelectionOptions {
22
+ interface FileOptions<LAnnotation> extends BaseCodeOptions, MouseEventManagerBaseOptions<'file'>, LineSelectionOptions {
20
23
  disableFileHeader?: boolean;
21
24
  renderCustomMetadata?: RenderFileMetadata;
25
+ /**
26
+ * When true, errors during rendering are rethrown instead of being caught
27
+ * and displayed in the DOM. Useful for testing or when you want to handle
28
+ * errors yourself.
29
+ */
30
+ disableErrorHandling?: boolean;
22
31
  renderAnnotation?(annotation: LineAnnotation<LAnnotation>): HTMLElement | undefined;
23
- renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<"file"> | undefined): HTMLElement | null;
32
+ renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null;
33
+ }
34
+ interface AnnotationElementCache<LAnnotation> {
35
+ element: HTMLElement;
36
+ annotation: LineAnnotation<LAnnotation>;
24
37
  }
25
38
  declare class File<LAnnotation = undefined> {
26
39
  options: FileOptions<LAnnotation>;
@@ -28,48 +41,66 @@ declare class File<LAnnotation = undefined> {
28
41
  private isContainerManaged;
29
42
  static LoadedCustomComponent: boolean;
30
43
  readonly __id: string;
31
- private fileContainer;
32
- private spriteSVG;
33
- private pre;
34
- private code;
35
- private unsafeCSSStyle;
36
- private hoverContent;
37
- private errorWrapper;
38
- private lastRenderedHeaderHTML;
39
- private appliedPreAttributes;
40
- private headerElement;
41
- private headerMetadata;
42
- private fileRenderer;
43
- private resizeManager;
44
- private mouseEventManager;
45
- private lineSelectionManager;
46
- private annotationCache;
47
- private lineAnnotations;
48
- private file;
44
+ protected fileContainer: HTMLElement | undefined;
45
+ protected spriteSVG: SVGElement | undefined;
46
+ protected pre: HTMLPreElement | undefined;
47
+ protected code: HTMLElement | undefined;
48
+ protected bufferBefore: HTMLElement | undefined;
49
+ protected bufferAfter: HTMLElement | undefined;
50
+ protected unsafeCSSStyle: HTMLStyleElement | undefined;
51
+ protected hoverContent: HTMLElement | undefined;
52
+ protected errorWrapper: HTMLElement | undefined;
53
+ protected placeHolder: HTMLElement | undefined;
54
+ protected lastRenderedHeaderHTML: string | undefined;
55
+ protected appliedPreAttributes: PrePropertiesConfig | undefined;
56
+ protected lastRowCount: number | undefined;
57
+ protected headerElement: HTMLElement | undefined;
58
+ protected headerMetadata: HTMLElement | undefined;
59
+ protected fileRenderer: FileRenderer<LAnnotation>;
60
+ protected resizeManager: ResizeManager;
61
+ protected mouseEventManager: MouseEventManager<'file'>;
62
+ protected lineSelectionManager: LineSelectionManager;
63
+ protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>>;
64
+ protected lineAnnotations: LineAnnotation<LAnnotation>[];
65
+ protected file: FileContents | undefined;
66
+ protected renderRange: RenderRange | undefined;
49
67
  constructor(options?: FileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);
50
68
  private handleHighlightRender;
51
69
  rerender(): void;
52
70
  setOptions(options: FileOptions<LAnnotation> | undefined): void;
53
71
  private mergeOptions;
54
72
  setThemeType(themeType: ThemeTypes): void;
55
- getHoveredLine: () => GetHoveredLineResult<"file"> | undefined;
73
+ getHoveredLine: () => {
74
+ lineNumber: number;
75
+ } | undefined;
56
76
  setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void;
57
77
  setSelectedLines(range: SelectedLineRange | null): void;
58
78
  cleanUp(): void;
59
79
  hydrate(props: FileHyrdateProps<LAnnotation>): void;
80
+ getOrCreateLineCache(file?: FileContents | undefined): string[];
60
81
  render({
61
82
  file,
62
83
  fileContainer,
63
84
  forceRender,
64
85
  containerWrapper,
65
- lineAnnotations
66
- }: FileRenderProps<LAnnotation>): void;
86
+ lineAnnotations,
87
+ renderRange
88
+ }: FileRenderProps<LAnnotation>): boolean;
89
+ private canPartiallyRender;
90
+ renderPlaceholder(height: number): boolean;
91
+ private cleanChildNodes;
67
92
  private renderAnnotations;
68
93
  private renderHoverUtility;
69
94
  private injectUnsafeCSS;
70
- private applyHunksToDOM;
95
+ private applyFullRender;
96
+ private applyPartialRender;
97
+ private getColumns;
98
+ private trimDOMToOverlap;
99
+ private getDOMBoundaryIndices;
100
+ private getLineIndexFromDOMNode;
101
+ private applyBuffers;
71
102
  private applyHeaderToDOM;
72
- private getOrCreateFileContainerNode;
103
+ protected getOrCreateFileContainerNode(fileContainer?: HTMLElement, parentNode?: HTMLElement): HTMLElement;
73
104
  private getOrCreatePreNode;
74
105
  private applyPreNodeAttributes;
75
106
  private applyErrorToDOM;
@@ -1 +1 @@
1
- {"version":3,"file":"File.d.ts","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/File.ts"],"sourcesContent":[],"mappings":";;;;;;;UA8CiB;QACT;kBACU;EAFlB,gBAAiB,CAAA,EAGI,WAHJ;EACT,WAAA,CAAA,EAAA,OAAA;EACU,eAAA,CAAA,EAGE,cAHF,CAGiB,WAHjB,CAAA,EAAA;;AAGiB,UAGlB,gBAHkB,CAAA,WAAA,CAAA,SAIzB,IAJyB,CAIpB,eAJoB,CAIJ,WAJI,CAAA,EAAA,eAAA,CAAA,CAAA;EAAf,aAAA,EAKH,WALG;EAAA,eAAA,CAAA,EAAA,MAAA;AAGpB;AAC+B,UAKd,WALc,CAAA,WAAA,CAAA,SAMrB,eANqB,EAO3B,4BAP2B,CAAA,MAAA,CAAA,EAQ3B,oBAR2B,CAAA;EAAhB,iBAAA,CAAA,EAAA,OAAA;EACE,oBAAA,CAAA,EASQ,kBATR;EADP,gBAAA,EAAA,UAAA,EAYM,cAZN,CAYqB,WAZrB,CAAA,CAAA,EAaL,WAbK,GAAA,SAAA;EAAA,kBAAA,EAAA,aAAA,EAAA,GAAA,GAee,oBAff,CAAA,MAAA,CAAA,GAAA,SAAA,CAAA,EAgBL,WAhBK,GAAA,IAAA;AAKV;AAKyB,cAgBZ,IAhBY,CAAA,cAAA,SAAA,CAAA,CAAA;EAEM,OAAA,EA4CX,WA5CW,CA4CC,WA5CD,CAAA;EAAf,QAAA,aAAA;EACX,QAAA,kBAAA;EAEoB,OAAA,qBAAA,EAAA,OAAA;EACpB,SAAA,IAAA,EAAA,MAAA;EAVK,QAAA,aAAA;EACN,QAAA,SAAA;EACA,QAAA,GAAA;EAAA,QAAA,IAAA;EAkBJ,QAAa,cAAA;EA8BmB,QAAA,YAAA;EAAZ,QAAA,YAAA;EAAY,QAAA,sBAAA;EAAZ,QAAA,oBAAA;EACQ,QAAA,aAAA;EA4BM,QAAA,cAAA;EAAZ,QAAA,YAAA;EAWI,QAAA,aAAA;EA8BH,QAAA,iBAAA;EAI8B,QAAA,oBAAA;EAAf,QAAA,eAAA;EAIZ,QAAA,eAAA;EA+BQ,QAAA,IAAA;EAAjB,WAAA,CAAA,OAAA,CAAA,EA7GG,WA6GH,CA7Ge,WA6Gf,CAAA,EAAA,aAAA,CAAA,EA5GW,iBA4GX,GAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA;EAwDb,QAAA,qBAAA;EACA,QAAA,CAAA,CAAA,EAAA,IAAA;EACA,UAAA,CAAA,OAAA,EA1IkB,WA0IlB,CA1I8B,WA0I9B,CAAA,GAAA,SAAA,CAAA,EAAA,IAAA;EACA,QAAA,YAAA;EACA,YAAA,CAAA,SAAA,EAjIsB,UAiItB,CAAA,EAAA,IAAA;EACiB,cAAA,EAAA,GAAA,GApGE,oBAoGF,CAAA,MAAA,CAAA,GAAA,SAAA;EAAhB,kBAAA,CAAA,eAAA,EAhGiC,cAgGjC,CAhGgD,WAgGhD,CAAA,EAAA,CAAA,EAAA,IAAA;EAAA,gBAAA,CAAA,KAAA,EA5FqB,iBA4FrB,GAAA,IAAA,CAAA,EAAA,IAAA;;iBA7DY,iBAAiB;;;;;;;KA6D7B,gBAAgB"}
1
+ {"version":3,"file":"File.d.ts","names":["LineSelectionManager","LineSelectionOptions","SelectedLineRange","GetHoveredLineResult","MouseEventManager","MouseEventManagerBaseOptions","ResizeManager","FileRenderer","BaseCodeOptions","FileContents","LineAnnotation","PrePropertiesConfig","RenderFileMetadata","RenderRange","ThemeTypes","WorkerPoolManager","FileRenderProps","LAnnotation","HTMLElement","FileHyrdateProps","Omit","FileOptions","AnnotationElementCache","File","SVGElement","HTMLPreElement","HTMLStyleElement","Map","file","fileContainer","forceRender","containerWrapper","lineAnnotations","renderRange"],"sources":["../../src/components/File.d.ts"],"sourcesContent":["import { LineSelectionManager, type LineSelectionOptions, type SelectedLineRange } from '../managers/LineSelectionManager';\nimport { type GetHoveredLineResult, MouseEventManager, type MouseEventManagerBaseOptions } from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer } from '../renderers/FileRenderer';\nimport type { BaseCodeOptions, FileContents, LineAnnotation, PrePropertiesConfig, RenderFileMetadata, RenderRange, ThemeTypes } from '../types';\nimport type { WorkerPoolManager } from '../worker';\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\nexport interface FileHyrdateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\nexport interface FileOptions<LAnnotation> extends BaseCodeOptions, MouseEventManagerBaseOptions<'file'>, LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(annotation: LineAnnotation<LAnnotation>): HTMLElement | undefined;\n renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null;\n}\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\nexport declare class File<LAnnotation = undefined> {\n options: FileOptions<LAnnotation>;\n private workerManager?;\n private isContainerManaged;\n static LoadedCustomComponent: boolean;\n readonly __id: string;\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected hoverContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n protected headerElement: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected mouseEventManager: MouseEventManager<'file'>;\n protected lineSelectionManager: LineSelectionManager;\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>>;\n protected lineAnnotations: LineAnnotation<LAnnotation>[];\n protected file: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n constructor(options?: FileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);\n private handleHighlightRender;\n rerender(): void;\n setOptions(options: FileOptions<LAnnotation> | undefined): void;\n private mergeOptions;\n setThemeType(themeType: ThemeTypes): void;\n getHoveredLine: () => {\n lineNumber: number;\n } | undefined;\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void;\n setSelectedLines(range: SelectedLineRange | null): void;\n cleanUp(): void;\n hydrate(props: FileHyrdateProps<LAnnotation>): void;\n getOrCreateLineCache(file?: FileContents | undefined): string[];\n render({ file, fileContainer, forceRender, containerWrapper, lineAnnotations, renderRange }: FileRenderProps<LAnnotation>): boolean;\n private canPartiallyRender;\n renderPlaceholder(height: number): boolean;\n private cleanChildNodes;\n private renderAnnotations;\n private renderHoverUtility;\n private injectUnsafeCSS;\n private applyFullRender;\n private applyPartialRender;\n private getColumns;\n private trimDOMToOverlap;\n private getDOMBoundaryIndices;\n private getLineIndexFromDOMNode;\n private applyBuffers;\n private applyHeaderToDOM;\n protected getOrCreateFileContainerNode(fileContainer?: HTMLElement, parentNode?: HTMLElement): HTMLElement;\n private getOrCreatePreNode;\n private applyPreNodeAttributes;\n private applyErrorToDOM;\n private cleanupErrorWrapper;\n}\nexport {};\n//# sourceMappingURL=File.d.ts.map"],"mappings":"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"}
@@ -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 { FileRenderer } from "../renderers/FileRenderer.js";
7
8
  import { SVGSpriteSheet } from "../sprite.js";
@@ -19,6 +20,7 @@ import { DiffsContainerLoaded } from "./web-components.js";
19
20
  import { toHtml } from "hast-util-to-html";
20
21
 
21
22
  //#region src/components/File.ts
23
+ const EMPTY_STRINGS = [];
22
24
  let instanceId = -1;
23
25
  var File = class {
24
26
  static LoadedCustomComponent = DiffsContainerLoaded;
@@ -27,11 +29,15 @@ var File = class {
27
29
  spriteSVG;
28
30
  pre;
29
31
  code;
32
+ bufferBefore;
33
+ bufferAfter;
30
34
  unsafeCSSStyle;
31
35
  hoverContent;
32
36
  errorWrapper;
37
+ placeHolder;
33
38
  lastRenderedHeaderHTML;
34
39
  appliedPreAttributes;
40
+ lastRowCount;
35
41
  headerElement;
36
42
  headerMetadata;
37
43
  fileRenderer;
@@ -41,6 +47,7 @@ var File = class {
41
47
  annotationCache = /* @__PURE__ */ new Map();
42
48
  lineAnnotations = [];
43
49
  file;
50
+ renderRange;
44
51
  constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
45
52
  this.options = options;
46
53
  this.workerManager = workerManager;
@@ -58,7 +65,8 @@ var File = class {
58
65
  if (this.file == null) return;
59
66
  this.render({
60
67
  file: this.file,
61
- forceRender: true
68
+ forceRender: true,
69
+ renderRange: this.renderRange
62
70
  });
63
71
  }
64
72
  setOptions(options) {
@@ -105,16 +113,21 @@ var File = class {
105
113
  this.lineSelectionManager.cleanUp();
106
114
  this.workerManager?.unsubscribeToThemeChanges(this);
107
115
  this.workerManager = void 0;
116
+ this.renderRange = void 0;
108
117
  this.file = void 0;
109
118
  if (!this.isContainerManaged) this.fileContainer?.parentNode?.removeChild(this.fileContainer);
110
119
  if (this.fileContainer?.shadowRoot != null) this.fileContainer.shadowRoot.innerHTML = "";
111
120
  this.fileContainer = void 0;
112
121
  this.pre = void 0;
122
+ this.bufferBefore = void 0;
123
+ this.bufferAfter = void 0;
113
124
  this.appliedPreAttributes = void 0;
125
+ this.lastRowCount = void 0;
114
126
  this.headerElement = void 0;
115
127
  this.lastRenderedHeaderHTML = void 0;
116
128
  this.errorWrapper = void 0;
117
129
  this.unsafeCSSStyle = void 0;
130
+ this.placeHolder = void 0;
118
131
  }
119
132
  hydrate(props) {
120
133
  const { fileContainer, prerenderedHTML } = props;
@@ -143,6 +156,7 @@ var File = class {
143
156
  if (this.pre == null) this.render(props);
144
157
  else {
145
158
  const { file, lineAnnotations } = props;
159
+ const { overflow = "scroll" } = this.options;
146
160
  this.fileContainer = fileContainer;
147
161
  delete this.pre.dataset.dehydrated;
148
162
  this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;
@@ -153,17 +167,23 @@ var File = class {
153
167
  this.injectUnsafeCSS();
154
168
  this.mouseEventManager.setup(this.pre);
155
169
  this.lineSelectionManager.setup(this.pre);
156
- if ((this.options.overflow ?? "scroll") === "scroll") this.resizeManager.setup(this.pre);
170
+ this.resizeManager.setup(this.pre, overflow === "wrap");
157
171
  }
158
172
  }
159
- render({ file, fileContainer, forceRender = false, containerWrapper, lineAnnotations }) {
173
+ getOrCreateLineCache(file = this.file) {
174
+ return file != null ? this.fileRenderer.getOrCreateLineCache(file) : EMPTY_STRINGS;
175
+ }
176
+ render({ file, fileContainer, forceRender = false, containerWrapper, lineAnnotations, renderRange }) {
177
+ const previousRenderRange = this.renderRange;
160
178
  const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
161
- if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) return;
179
+ const didFileChange = !areFilesEqual(this.file, file);
180
+ if (!forceRender && areRenderRangesEqual(renderRange, this.renderRange) && !didFileChange && !annotationsChanged) return false;
181
+ this.renderRange = renderRange;
162
182
  this.file = file;
163
183
  this.fileRenderer.setOptions(this.options);
164
184
  if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
165
185
  this.fileRenderer.setLineAnnotations(this.lineAnnotations);
166
- const { disableFileHeader = false } = this.options;
186
+ const { disableErrorHandling = false, disableFileHeader = false, overflow = "scroll" } = this.options;
167
187
  if (disableFileHeader) {
168
188
  if (this.headerElement != null) {
169
189
  this.headerElement.parentNode?.removeChild(this.headerElement);
@@ -173,22 +193,70 @@ var File = class {
173
193
  }
174
194
  fileContainer = this.getOrCreateFileContainerNode(fileContainer, containerWrapper);
175
195
  try {
176
- const fileResult = this.fileRenderer.renderFile(file);
177
- if (fileResult == null) {
178
- if (this.workerManager != null && !this.workerManager.isInitialized()) this.workerManager.initialize().then(() => this.rerender());
179
- return;
180
- }
181
- if (fileResult.headerAST != null) this.applyHeaderToDOM(fileResult.headerAST, fileContainer);
182
196
  const pre = this.getOrCreatePreNode(fileContainer);
183
- this.applyHunksToDOM(fileResult, pre);
197
+ if (!this.canPartiallyRender(forceRender, annotationsChanged, didFileChange) || !this.applyPartialRender(previousRenderRange, renderRange)) {
198
+ const fileResult = this.fileRenderer.renderFile(file, renderRange);
199
+ if (fileResult == null) {
200
+ if (this.workerManager?.isInitialized() === false) this.workerManager.initialize().then(() => this.rerender());
201
+ return false;
202
+ }
203
+ if (fileResult.headerAST != null) this.applyHeaderToDOM(fileResult.headerAST, fileContainer);
204
+ this.applyFullRender(fileResult, pre);
205
+ }
206
+ this.applyBuffers(pre, renderRange);
207
+ this.injectUnsafeCSS();
208
+ this.mouseEventManager.setup(pre);
209
+ this.lineSelectionManager.setup(pre);
210
+ this.resizeManager.setup(pre, overflow === "wrap");
184
211
  this.renderAnnotations();
185
212
  this.renderHoverUtility();
186
213
  } catch (error) {
187
- if (error instanceof Error) {
188
- console.error(error);
189
- this.applyErrorToDOM(error, fileContainer);
190
- }
214
+ if (disableErrorHandling) throw error;
215
+ console.error(error);
216
+ if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
191
217
  }
218
+ return true;
219
+ }
220
+ canPartiallyRender(forceRender, annotationsChanged, didContentChange) {
221
+ if (forceRender || annotationsChanged || didContentChange) return false;
222
+ return true;
223
+ }
224
+ renderPlaceholder(height) {
225
+ if (this.fileContainer == null) return false;
226
+ this.cleanChildNodes();
227
+ if (this.placeHolder == null) {
228
+ const shadowRoot = this.fileContainer.shadowRoot ?? this.fileContainer.attachShadow({ mode: "open" });
229
+ this.placeHolder = document.createElement("div");
230
+ this.placeHolder.dataset.placeholder = "";
231
+ shadowRoot.appendChild(this.placeHolder);
232
+ }
233
+ this.placeHolder.style.setProperty("height", `${height}px`);
234
+ return true;
235
+ }
236
+ cleanChildNodes() {
237
+ this.resizeManager.cleanUp();
238
+ this.mouseEventManager.cleanUp();
239
+ this.lineSelectionManager.cleanUp();
240
+ this.bufferAfter?.remove();
241
+ this.bufferBefore?.remove();
242
+ this.code?.remove();
243
+ this.errorWrapper?.remove();
244
+ this.headerElement?.remove();
245
+ this.hoverContent?.remove();
246
+ this.pre?.remove();
247
+ this.spriteSVG?.remove();
248
+ this.unsafeCSSStyle?.remove();
249
+ this.bufferAfter = void 0;
250
+ this.bufferBefore = void 0;
251
+ this.code = void 0;
252
+ this.errorWrapper = void 0;
253
+ this.headerElement = void 0;
254
+ this.hoverContent = void 0;
255
+ this.pre = void 0;
256
+ this.spriteSVG = void 0;
257
+ this.unsafeCSSStyle = void 0;
258
+ this.lastRenderedHeaderHTML = void 0;
259
+ this.lastRowCount = void 0;
192
260
  }
193
261
  renderAnnotations() {
194
262
  if (this.isContainerManaged || this.fileContainer == null) {
@@ -250,23 +318,150 @@ var File = class {
250
318
  }
251
319
  this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);
252
320
  }
253
- applyHunksToDOM(result, pre) {
321
+ applyFullRender(result, pre) {
254
322
  this.cleanupErrorWrapper();
255
323
  this.applyPreNodeAttributes(pre, result);
256
324
  this.code = getOrCreateCodeNode({ code: this.code });
257
- this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);
325
+ this.code.innerHTML = this.fileRenderer.renderPartialHTML(this.fileRenderer.renderCodeAST(result));
258
326
  pre.replaceChildren(this.code);
259
- this.injectUnsafeCSS();
260
- this.mouseEventManager.setup(pre);
261
- this.lineSelectionManager.setup(pre);
262
- this.lineSelectionManager.setDirty();
263
- if ((this.options.overflow ?? "scroll") === "scroll") this.resizeManager.setup(pre);
264
- else this.resizeManager.cleanUp();
327
+ this.lastRowCount = result.rowCount;
328
+ }
329
+ applyPartialRender(previousRenderRange, renderRange) {
330
+ if (previousRenderRange == null || renderRange == null) return false;
331
+ const { file, code } = this;
332
+ const columns = code != null ? this.getColumns(code) : void 0;
333
+ if (file == null || code == null || columns == null) return false;
334
+ const previousStart = previousRenderRange.startingLine;
335
+ const nextStart = renderRange.startingLine;
336
+ const previousEnd = previousRenderRange.totalLines === Infinity ? Number.POSITIVE_INFINITY : previousStart + previousRenderRange.totalLines;
337
+ const nextEnd = renderRange.totalLines === Infinity ? Number.POSITIVE_INFINITY : nextStart + renderRange.totalLines;
338
+ const overlapStart = Math.max(previousStart, nextStart);
339
+ const overlapEnd = Math.min(previousEnd, nextEnd);
340
+ if (overlapEnd <= overlapStart) return false;
341
+ if (!this.trimDOMToOverlap(columns.gutter, overlapStart, overlapEnd) || !this.trimDOMToOverlap(columns.content, overlapStart, overlapEnd)) return false;
342
+ let { length: rowCount } = columns.content.children;
343
+ const renderChunk = (startingLine, totalLines) => {
344
+ if (totalLines <= 0) return;
345
+ return this.fileRenderer.renderFile(file, {
346
+ startingLine,
347
+ totalLines,
348
+ bufferBefore: 0,
349
+ bufferAfter: 0
350
+ });
351
+ };
352
+ const prependResult = nextStart < overlapStart ? renderChunk(nextStart, overlapStart - nextStart) : void 0;
353
+ if (prependResult === void 0 && nextStart < overlapStart) return false;
354
+ const appendTotalLines = nextEnd === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : Math.max(0, nextEnd - overlapEnd);
355
+ const appendResult = nextEnd > overlapEnd ? renderChunk(overlapEnd, appendTotalLines) : void 0;
356
+ if (appendResult === void 0 && nextEnd > overlapEnd) return false;
357
+ this.cleanupErrorWrapper();
358
+ if (prependResult != null) {
359
+ columns.gutter.insertAdjacentHTML("afterbegin", this.fileRenderer.renderPartialHTML(prependResult.gutterAST));
360
+ columns.content.insertAdjacentHTML("afterbegin", this.fileRenderer.renderPartialHTML(prependResult.contentAST));
361
+ rowCount += prependResult.rowCount;
362
+ }
363
+ if (appendResult != null) {
364
+ columns.gutter.insertAdjacentHTML("beforeend", this.fileRenderer.renderPartialHTML(appendResult.gutterAST));
365
+ columns.content.insertAdjacentHTML("beforeend", this.fileRenderer.renderPartialHTML(appendResult.contentAST));
366
+ rowCount += appendResult.rowCount;
367
+ }
368
+ if (this.lastRowCount !== rowCount) {
369
+ columns.gutter.style.setProperty("grid-row", `span ${rowCount}`);
370
+ columns.content.style.setProperty("grid-row", `span ${rowCount}`);
371
+ this.lastRowCount = rowCount;
372
+ }
373
+ return true;
374
+ }
375
+ getColumns(code) {
376
+ const gutter = code.children[0];
377
+ const content = code.children[1];
378
+ if (!(gutter instanceof HTMLElement) || !(content instanceof HTMLElement) || gutter.dataset.gutter == null || content.dataset.content == null) return;
379
+ return {
380
+ gutter,
381
+ content
382
+ };
383
+ }
384
+ trimDOMToOverlap(container, overlapStart, overlapEnd) {
385
+ const boundaryIndices = this.getDOMBoundaryIndices(container, [overlapStart, overlapEnd]);
386
+ const startIndex = boundaryIndices.get(overlapStart) ?? container.children.length;
387
+ const endIndex = boundaryIndices.get(overlapEnd) ?? container.children.length;
388
+ if (startIndex > endIndex) return false;
389
+ for (let i = container.children.length - 1; i >= endIndex; i -= 1) container.children[i]?.remove();
390
+ for (let i = startIndex - 1; i >= 0; i -= 1) container.children[i]?.remove();
391
+ return true;
392
+ }
393
+ getDOMBoundaryIndices(container, boundaries) {
394
+ const sortedBoundaries = [...new Set(boundaries)].sort((a, b) => a - b);
395
+ const boundaryIndices = /* @__PURE__ */ new Map();
396
+ if (sortedBoundaries.length === 0) return boundaryIndices;
397
+ let boundaryIndex = 0;
398
+ let nextBoundary = sortedBoundaries[boundaryIndex];
399
+ const { children } = container;
400
+ for (let i = 0; i < children.length; i += 1) {
401
+ const child = children[i];
402
+ if (!(child instanceof HTMLElement)) continue;
403
+ const lineIndex = this.getLineIndexFromDOMNode(child);
404
+ if (lineIndex == null) continue;
405
+ while (nextBoundary != null && lineIndex >= nextBoundary) {
406
+ boundaryIndices.set(nextBoundary, i);
407
+ boundaryIndex += 1;
408
+ nextBoundary = sortedBoundaries[boundaryIndex];
409
+ }
410
+ if (boundaryIndex >= sortedBoundaries.length) break;
411
+ }
412
+ for (const boundary of sortedBoundaries) if (!boundaryIndices.has(boundary)) boundaryIndices.set(boundary, children.length);
413
+ return boundaryIndices;
414
+ }
415
+ getLineIndexFromDOMNode(node) {
416
+ const lineIndexAttr = node.dataset.lineIndex;
417
+ if (lineIndexAttr == null) return;
418
+ const parsed = Number(lineIndexAttr);
419
+ return Number.isNaN(parsed) ? void 0 : parsed;
420
+ }
421
+ applyBuffers(pre, renderRange) {
422
+ const { disableVirtualizationBuffers = false } = this.options;
423
+ if (disableVirtualizationBuffers || renderRange == null) {
424
+ if (this.bufferBefore != null) {
425
+ this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
426
+ this.bufferBefore = void 0;
427
+ }
428
+ if (this.bufferAfter != null) {
429
+ this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
430
+ this.bufferAfter = void 0;
431
+ }
432
+ return;
433
+ }
434
+ if (renderRange.bufferBefore > 0) {
435
+ if (this.bufferBefore == null) {
436
+ this.bufferBefore = document.createElement("div");
437
+ this.bufferBefore.dataset.virtualizerBuffer = "before";
438
+ pre.before(this.bufferBefore);
439
+ }
440
+ this.bufferBefore.style.setProperty("height", `${renderRange.bufferBefore}px`);
441
+ this.bufferBefore.style.setProperty("contain", "strict");
442
+ } else if (this.bufferBefore != null) {
443
+ this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
444
+ this.bufferBefore = void 0;
445
+ }
446
+ if (renderRange.bufferAfter > 0) {
447
+ if (this.bufferAfter == null) {
448
+ this.bufferAfter = document.createElement("div");
449
+ this.bufferAfter.dataset.virtualizerBuffer = "after";
450
+ pre.after(this.bufferAfter);
451
+ }
452
+ this.bufferAfter.style.setProperty("height", `${renderRange.bufferAfter}px`);
453
+ this.bufferAfter.style.setProperty("contain", "strict");
454
+ } else if (this.bufferAfter != null) {
455
+ this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
456
+ this.bufferAfter = void 0;
457
+ }
265
458
  }
266
459
  applyHeaderToDOM(headerAST, container) {
267
460
  const { file } = this;
268
461
  if (file == null) return;
269
462
  this.cleanupErrorWrapper();
463
+ this.placeHolder?.remove();
464
+ this.placeHolder = void 0;
270
465
  const headerHTML = toHtml(headerAST);
271
466
  if (headerHTML !== this.lastRenderedHeaderHTML) {
272
467
  const tempDiv = document.createElement("div");
@@ -310,19 +505,24 @@ var File = class {
310
505
  return this.fileContainer;
311
506
  }
312
507
  getOrCreatePreNode(container) {
508
+ const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
313
509
  if (this.pre == null) {
314
510
  this.pre = document.createElement("pre");
315
- container.shadowRoot?.appendChild(this.pre);
316
511
  this.appliedPreAttributes = void 0;
317
- } else if (this.pre.parentNode !== container) {
512
+ this.code = void 0;
513
+ shadowRoot.appendChild(this.pre);
514
+ } else if (this.pre.parentNode !== shadowRoot) {
318
515
  container.shadowRoot?.appendChild(this.pre);
319
516
  this.appliedPreAttributes = void 0;
320
517
  }
518
+ this.placeHolder?.remove();
519
+ this.placeHolder = void 0;
321
520
  return this.pre;
322
521
  }
323
522
  applyPreNodeAttributes(pre, { totalLines, themeStyles, baseThemeType }) {
324
523
  const { overflow = "scroll", themeType = "system", disableLineNumbers = false } = this.options;
325
524
  const preProperties = {
525
+ type: "file",
326
526
  split: false,
327
527
  themeStyles,
328
528
  overflow,