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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +40 -0
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -0
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +145 -0
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -0
  5. package/dist/components/AdvancedVirtualizer.d.ts +38 -0
  6. package/dist/components/AdvancedVirtualizer.d.ts.map +1 -0
  7. package/dist/components/AdvancedVirtualizer.js +201 -0
  8. package/dist/components/AdvancedVirtualizer.js.map +1 -0
  9. package/dist/components/File.d.ts +60 -29
  10. package/dist/components/File.d.ts.map +1 -1
  11. package/dist/components/File.js +226 -26
  12. package/dist/components/File.js.map +1 -1
  13. package/dist/components/FileDiff.d.ts +44 -12
  14. package/dist/components/FileDiff.d.ts.map +1 -1
  15. package/dist/components/FileDiff.js +510 -71
  16. package/dist/components/FileDiff.js.map +1 -1
  17. package/dist/components/FileStream.d.ts +5 -0
  18. package/dist/components/FileStream.d.ts.map +1 -1
  19. package/dist/components/FileStream.js +66 -8
  20. package/dist/components/FileStream.js.map +1 -1
  21. package/dist/components/VirtualizedFile.d.ts +33 -0
  22. package/dist/components/VirtualizedFile.d.ts.map +1 -0
  23. package/dist/components/VirtualizedFile.js +227 -0
  24. package/dist/components/VirtualizedFile.js.map +1 -0
  25. package/dist/components/VirtualizedFileDiff.d.ts +39 -0
  26. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -0
  27. package/dist/components/VirtualizedFileDiff.js +316 -0
  28. package/dist/components/VirtualizedFileDiff.js.map +1 -0
  29. package/dist/components/Virtualizer.d.ts +63 -0
  30. package/dist/components/Virtualizer.d.ts.map +1 -0
  31. package/dist/components/Virtualizer.js +369 -0
  32. package/dist/components/Virtualizer.js.map +1 -0
  33. package/dist/components/VirtulizerDevelopment.d.ts +14 -0
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -0
  35. package/dist/components/web-components.d.ts +1 -1
  36. package/dist/components/web-components.d.ts.map +1 -1
  37. package/dist/constants.d.ts +6 -8
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +16 -7
  40. package/dist/constants.js.map +1 -1
  41. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  42. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  43. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  44. package/dist/highlighter/languages/constants.d.ts +3 -1
  45. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  46. package/dist/highlighter/languages/constants.js +2 -1
  47. package/dist/highlighter/languages/constants.js.map +1 -1
  48. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  49. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  50. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  51. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  52. package/dist/highlighter/languages/registerCustomLanguage.d.ts +19 -0
  53. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  54. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  55. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  56. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  57. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  58. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  59. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  60. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  61. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  62. package/dist/highlighter/shared_highlighter.js.map +1 -1
  63. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  64. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  65. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  66. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  67. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  68. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  69. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  70. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  71. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  72. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  73. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  74. package/dist/index.d.ts +17 -12
  75. package/dist/index.js +14 -9
  76. package/dist/managers/LineSelectionManager.d.ts +14 -15
  77. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  78. package/dist/managers/LineSelectionManager.js +60 -71
  79. package/dist/managers/LineSelectionManager.js.map +1 -1
  80. package/dist/managers/MouseEventManager.d.ts +13 -6
  81. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  82. package/dist/managers/MouseEventManager.js +161 -47
  83. package/dist/managers/MouseEventManager.js.map +1 -1
  84. package/dist/managers/ResizeManager.d.ts +6 -1
  85. package/dist/managers/ResizeManager.d.ts.map +1 -1
  86. package/dist/managers/ResizeManager.js +114 -64
  87. package/dist/managers/ResizeManager.js.map +1 -1
  88. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  89. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  90. package/dist/react/File.d.ts +1 -0
  91. package/dist/react/File.d.ts.map +1 -1
  92. package/dist/react/File.js +2 -1
  93. package/dist/react/File.js.map +1 -1
  94. package/dist/react/FileDiff.d.ts +1 -0
  95. package/dist/react/FileDiff.d.ts.map +1 -1
  96. package/dist/react/FileDiff.js +2 -1
  97. package/dist/react/FileDiff.js.map +1 -1
  98. package/dist/react/MultiFileDiff.d.ts +1 -0
  99. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  100. package/dist/react/MultiFileDiff.js +2 -1
  101. package/dist/react/MultiFileDiff.js.map +1 -1
  102. package/dist/react/PatchDiff.d.ts +1 -0
  103. package/dist/react/PatchDiff.d.ts.map +1 -1
  104. package/dist/react/PatchDiff.js +3 -2
  105. package/dist/react/PatchDiff.js.map +1 -1
  106. package/dist/react/Virtualizer.d.ts +25 -0
  107. package/dist/react/Virtualizer.d.ts.map +1 -0
  108. package/dist/react/Virtualizer.js +38 -0
  109. package/dist/react/Virtualizer.js.map +1 -0
  110. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  111. package/dist/react/WorkerPoolContext.js +1 -1
  112. package/dist/react/WorkerPoolContext.js.map +1 -1
  113. package/dist/react/constants.d.ts.map +1 -1
  114. package/dist/react/index.d.ts +3 -2
  115. package/dist/react/index.js +2 -1
  116. package/dist/react/jsx.d.ts.map +1 -1
  117. package/dist/react/types.d.ts +5 -3
  118. package/dist/react/types.d.ts.map +1 -1
  119. package/dist/react/utils/renderDiffChildren.d.ts +5 -5
  120. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  121. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  122. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  123. package/dist/react/utils/templateRender.d.ts.map +1 -1
  124. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  125. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  126. package/dist/react/utils/useFileDiffInstance.js +6 -2
  127. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  128. package/dist/react/utils/useFileInstance.d.ts +5 -3
  129. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  130. package/dist/react/utils/useFileInstance.js +6 -2
  131. package/dist/react/utils/useFileInstance.js.map +1 -1
  132. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  133. package/dist/react/utils/useStableCallback.js.map +1 -1
  134. package/dist/renderers/DiffHunksRenderer.d.ts +15 -10
  135. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  136. package/dist/renderers/DiffHunksRenderer.js +249 -140
  137. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  138. package/dist/renderers/FileRenderer.d.ts +12 -5
  139. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  140. package/dist/renderers/FileRenderer.js +90 -31
  141. package/dist/renderers/FileRenderer.js.map +1 -1
  142. package/dist/shiki-stream/stream.d.ts +2 -2
  143. package/dist/shiki-stream/stream.d.ts.map +1 -1
  144. package/dist/shiki-stream/stream.js.map +1 -1
  145. package/dist/shiki-stream/tokenizer.d.ts +2 -2
  146. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  147. package/dist/shiki-stream/tokenizer.js.map +1 -1
  148. package/dist/shiki-stream/types.d.ts +18 -18
  149. package/dist/shiki-stream/types.d.ts.map +1 -1
  150. package/dist/sprite.d.ts +1 -1
  151. package/dist/sprite.d.ts.map +1 -1
  152. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  153. package/dist/ssr/FileDiffReact.js +1 -1
  154. package/dist/ssr/index.d.ts +2 -2
  155. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  156. package/dist/ssr/preloadFile.d.ts.map +1 -1
  157. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  158. package/dist/ssr/preloadPatchFile.js.map +1 -1
  159. package/dist/ssr/renderHTML.d.ts.map +1 -1
  160. package/dist/style.js +1 -1
  161. package/dist/style.js.map +1 -1
  162. package/dist/types.d.ts +198 -165
  163. package/dist/types.d.ts.map +1 -1
  164. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  165. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  166. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  167. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  168. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  169. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  170. package/dist/utils/areOptionsEqual.d.ts +1 -1
  171. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  172. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  173. package/dist/utils/arePrePropertiesEqual.js +1 -1
  174. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  175. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  176. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  177. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  178. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  179. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  180. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  181. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  182. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  183. package/dist/utils/createContentColumn.d.ts +7 -0
  184. package/dist/utils/createContentColumn.d.ts.map +1 -0
  185. package/dist/utils/createContentColumn.js +17 -0
  186. package/dist/utils/createContentColumn.js.map +1 -0
  187. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  188. package/dist/utils/createEmptyRowBuffer.js +2 -1
  189. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  190. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  191. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  192. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  193. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  194. package/dist/utils/createNoNewlineElement.js +3 -6
  195. package/dist/utils/createNoNewlineElement.js.map +1 -1
  196. package/dist/utils/createPreElement.d.ts +2 -1
  197. package/dist/utils/createPreElement.d.ts.map +1 -1
  198. package/dist/utils/createPreElement.js +4 -3
  199. package/dist/utils/createPreElement.js.map +1 -1
  200. package/dist/utils/createRowNodes.d.ts.map +1 -1
  201. package/dist/utils/createSeparator.d.ts.map +1 -1
  202. package/dist/utils/createSeparator.js +2 -2
  203. package/dist/utils/createSeparator.js.map +1 -1
  204. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  205. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  206. package/dist/utils/createStyleElement.d.ts.map +1 -1
  207. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  208. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  209. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  210. package/dist/utils/cssWrappers.d.ts.map +1 -1
  211. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  212. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  213. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  214. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  215. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  216. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  217. package/dist/utils/getFiletypeFromFileName.js +14 -4
  218. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  219. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  220. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  221. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  222. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  223. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  224. package/dist/utils/getIconForType.d.ts +1 -1
  225. package/dist/utils/getIconForType.d.ts.map +1 -1
  226. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  227. package/dist/utils/getLineEndingType.d.ts +1 -1
  228. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  229. package/dist/utils/getLineNodes.d.ts.map +1 -1
  230. package/dist/utils/getOrCreateCodeNode.d.ts +4 -2
  231. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  232. package/dist/utils/getOrCreateCodeNode.js +9 -6
  233. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  234. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  235. package/dist/utils/getThemes.d.ts.map +1 -1
  236. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  237. package/dist/utils/hast_utils.d.ts +6 -3
  238. package/dist/utils/hast_utils.d.ts.map +1 -1
  239. package/dist/utils/hast_utils.js +28 -4
  240. package/dist/utils/hast_utils.js.map +1 -1
  241. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  242. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  243. package/dist/utils/iterateOverDiff.d.ts +28 -13
  244. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  245. package/dist/utils/iterateOverDiff.js +101 -60
  246. package/dist/utils/iterateOverDiff.js.map +1 -1
  247. package/dist/utils/iterateOverFile.d.ts +50 -0
  248. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  249. package/dist/utils/iterateOverFile.js +49 -0
  250. package/dist/utils/iterateOverFile.js.map +1 -0
  251. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  252. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  253. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  254. package/dist/utils/parseDiffFromFile.js +3 -2
  255. package/dist/utils/parseDiffFromFile.js.map +1 -1
  256. package/dist/utils/parseLineType.d.ts +1 -1
  257. package/dist/utils/parseLineType.d.ts.map +1 -1
  258. package/dist/utils/parsePatchFiles.d.ts +12 -10
  259. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  260. package/dist/utils/parsePatchFiles.js +20 -11
  261. package/dist/utils/parsePatchFiles.js.map +1 -1
  262. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  263. package/dist/utils/processLine.d.ts.map +1 -1
  264. package/dist/utils/processLine.js +7 -24
  265. package/dist/utils/processLine.js.map +1 -1
  266. package/dist/utils/renderDiffWithHighlighter.d.ts +4 -3
  267. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  268. package/dist/utils/renderDiffWithHighlighter.js +18 -16
  269. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  270. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  271. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  272. package/dist/utils/renderFileWithHighlighter.js +30 -4
  273. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  274. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  275. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  276. package/dist/utils/resolveVirtualFileMetrics.js +25 -0
  277. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  278. package/dist/utils/setLanguageOverride.d.ts +2 -1
  279. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  280. package/dist/utils/setLanguageOverride.js.map +1 -1
  281. package/dist/utils/setWrapperNodeProps.d.ts +1 -0
  282. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  283. package/dist/utils/setWrapperNodeProps.js +19 -12
  284. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  285. package/dist/utils/splitFileContents.d.ts +12 -0
  286. package/dist/utils/splitFileContents.d.ts.map +1 -0
  287. package/dist/utils/splitFileContents.js +17 -0
  288. package/dist/utils/splitFileContents.js.map +1 -0
  289. package/dist/utils/trimPatchContext.d.ts +11 -0
  290. package/dist/utils/trimPatchContext.d.ts.map +1 -0
  291. package/dist/utils/trimPatchContext.js +99 -0
  292. package/dist/utils/trimPatchContext.js.map +1 -0
  293. package/dist/worker/WorkerPoolManager.d.ts +3 -3
  294. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  295. package/dist/worker/WorkerPoolManager.js +39 -26
  296. package/dist/worker/WorkerPoolManager.js.map +1 -1
  297. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  298. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  299. package/dist/worker/types.d.ts +26 -26
  300. package/dist/worker/types.d.ts.map +1 -1
  301. package/dist/worker/worker-portable.js +352 -154
  302. package/dist/worker/worker-portable.js.map +1 -1
  303. package/dist/worker/worker.js +222 -113
  304. package/dist/worker/worker.js.map +1 -1
  305. package/package.json +52 -53
@@ -4,10 +4,12 @@ import { diffChars, diffWordsWithSpace } from "diff";
4
4
  import { transformerStyleToClass } from "@shikijs/transformers";
5
5
 
6
6
  //#region src/constants.ts
7
+ const SPLIT_WITH_NEWLINES = /(?<=\n)/;
7
8
  const DEFAULT_THEMES = {
8
9
  dark: "pierre-dark",
9
10
  light: "pierre-light"
10
11
  };
12
+ const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;
11
13
  const DEFAULT_EXPANDED_REGION = Object.freeze({
12
14
  fromStart: 0,
13
15
  fromEnd: 0
@@ -73,14 +75,6 @@ function createTextNodeElement(value) {
73
75
  value
74
76
  };
75
77
  }
76
- function createHastElement({ tagName, children = [], properties = {} }) {
77
- return {
78
- type: "element",
79
- tagName,
80
- properties,
81
- children
82
- };
83
- }
84
78
  function findCodeElement(nodes) {
85
79
  let firstChild = nodes.children[0];
86
80
  while (firstChild != null) {
@@ -103,30 +97,13 @@ function processLine(node, line, state) {
103
97
  });
104
98
  throw new Error(errorMessage);
105
99
  }
106
- node.tagName = "span";
107
- node.properties["data-column-content"] = "";
100
+ node.tagName = "div";
101
+ node.properties["data-line"] = lineInfo.lineNumber;
102
+ node.properties["data-alt-line"] = lineInfo.altLineNumber;
103
+ node.properties["data-line-type"] = lineInfo.type;
104
+ node.properties["data-line-index"] = lineInfo.lineIndex;
108
105
  if (node.children.length === 0) node.children.push(createTextNodeElement("\n"));
109
- return createHastElement({
110
- tagName: "div",
111
- children: [createHastElement({
112
- tagName: "span",
113
- children: [createHastElement({
114
- tagName: "span",
115
- children: [{
116
- type: "text",
117
- value: `${lineInfo.lineNumber}`
118
- }],
119
- properties: { "data-line-number-content": "" }
120
- })],
121
- properties: { "data-column-number": "" }
122
- }), node],
123
- properties: {
124
- "data-line": lineInfo.lineNumber,
125
- "data-alt-line": lineInfo.altLineNumber,
126
- "data-line-type": lineInfo.type,
127
- "data-line-index": lineInfo.lineIndex
128
- }
129
- });
106
+ return node;
130
107
  }
131
108
 
132
109
  //#endregion
@@ -187,6 +164,7 @@ function formatCSSVariablePrefix(type) {
187
164
 
188
165
  //#endregion
189
166
  //#region src/utils/getFiletypeFromFileName.ts
167
+ const CUSTOM_EXTENSION_TO_FILE_FORMAT = /* @__PURE__ */ new Map();
190
168
  const EXTENSION_TO_FILE_FORMAT = {
191
169
  "1c": "1c",
192
170
  abap: "abap",
@@ -517,10 +495,16 @@ const EXTENSION_TO_FILE_FORMAT = {
517
495
  sty: "tex"
518
496
  };
519
497
  function getFiletypeFromFileName(fileName) {
498
+ if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(fileName)) return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(fileName) ?? "text";
520
499
  if (EXTENSION_TO_FILE_FORMAT[fileName] != null) return EXTENSION_TO_FILE_FORMAT[fileName];
521
500
  const compoundMatch = fileName.match(/\.([^/\\]+\.[^/\\]+)$/);
522
- if (compoundMatch != null && EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] != null) return EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] ?? "text";
523
- return EXTENSION_TO_FILE_FORMAT[fileName.match(/\.([^.]+)$/)?.[1] ?? ""] ?? "text";
501
+ if (compoundMatch != null) {
502
+ if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(compoundMatch[1])) return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(compoundMatch[1]) ?? "text";
503
+ if (EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] != null) return EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] ?? "text";
504
+ }
505
+ const simpleMatch = fileName.match(/\.([^.]+)$/)?.[1] ?? "";
506
+ if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(simpleMatch)) return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(simpleMatch) ?? "text";
507
+ return EXTENSION_TO_FILE_FORMAT[simpleMatch] ?? "text";
524
508
  }
525
509
 
526
510
  //#endregion
@@ -573,7 +557,7 @@ function getLineNodes(nodes) {
573
557
 
574
558
  //#endregion
575
559
  //#region src/utils/iterateOverDiff.ts
576
- function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infinity, expandedHunks, callback }) {
560
+ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infinity, expandedHunks, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, callback }) {
577
561
  const state = {
578
562
  finalHunk: diff.hunks.at(-1),
579
563
  viewportStart: startingLine,
@@ -624,14 +608,14 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
624
608
  };
625
609
  hunkIterator: for (const [hunkIndex, hunk] of diff.hunks.entries()) {
626
610
  if (state.shouldBreak()) break;
627
- const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, hunkIndex);
611
+ const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, hunkIndex, collapsedContextThreshold);
628
612
  const trailingRegion = (() => {
629
613
  if (hunk !== state.finalHunk || !hasFinalCollapsedHunk(diff)) return;
630
614
  const additionRemaining = diff.additionLines.length - (hunk.additionLineIndex + hunk.additionCount);
631
615
  const deletionRemaining = diff.deletionLines.length - (hunk.deletionLineIndex + hunk.deletionCount);
632
616
  if (additionRemaining !== deletionRemaining) throw new Error(`iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`);
633
617
  const trailingRangeSize = Math.min(additionRemaining, deletionRemaining);
634
- return getExpandedRegion(diff.isPartial, trailingRangeSize, expandedHunks, diff.hunks.length);
618
+ return getExpandedRegion(diff.isPartial, trailingRangeSize, expandedHunks, diff.hunks.length, collapsedContextThreshold);
635
619
  })();
636
620
  const expandedLineCount = leadingRegion.fromStart + leadingRegion.fromEnd;
637
621
  function getTrailingCollapsedAfter(unifiedLineIndex$1, splitLineIndex$1) {
@@ -660,16 +644,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
660
644
  hunk,
661
645
  collapsedBefore: 0,
662
646
  collapsedAfter: 0,
663
- unifiedDeletionLineIndex: unifiedLineIndex$1 + index,
664
- unifiedAdditionLineIndex: unifiedLineIndex$1 + index,
665
- splitLineIndex: splitLineIndex$1 + index,
666
- deletionLineIndex: deletionLineIndex$1 + index,
667
- additionLineIndex: additionLineIndex$1 + index,
668
- deletionLineNumber: deletionLineNumber$1 + index,
669
- additionLineNumber: additionLineNumber$1 + index,
670
647
  type: "context-expanded",
671
- noEOFCRAddition: false,
672
- noEOFCRDeletion: false
648
+ deletionLine: {
649
+ lineNumber: deletionLineNumber$1 + index,
650
+ lineIndex: deletionLineIndex$1 + index,
651
+ noEOFCR: false,
652
+ unifiedLineIndex: unifiedLineIndex$1 + index,
653
+ splitLineIndex: splitLineIndex$1 + index
654
+ },
655
+ additionLine: {
656
+ unifiedLineIndex: unifiedLineIndex$1 + index,
657
+ splitLineIndex: splitLineIndex$1 + index,
658
+ lineIndex: additionLineIndex$1 + index,
659
+ lineNumber: additionLineNumber$1 + index,
660
+ noEOFCR: false
661
+ }
673
662
  })) break hunkIterator;
674
663
  } else state.incrementCounts(1, 1);
675
664
  index++;
@@ -688,16 +677,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
688
677
  hunk,
689
678
  collapsedBefore: getPendingCollapsed(),
690
679
  collapsedAfter: 0,
691
- unifiedDeletionLineIndex: unifiedLineIndex$1 + index,
692
- unifiedAdditionLineIndex: unifiedLineIndex$1 + index,
693
- splitLineIndex: splitLineIndex$1 + index,
694
- deletionLineIndex: deletionLineIndex$1 + index,
695
- additionLineIndex: additionLineIndex$1 + index,
696
- deletionLineNumber: deletionLineNumber$1 + index,
697
- additionLineNumber: additionLineNumber$1 + index,
698
680
  type: "context-expanded",
699
- noEOFCRAddition: false,
700
- noEOFCRDeletion: false
681
+ deletionLine: {
682
+ lineNumber: deletionLineNumber$1 + index,
683
+ lineIndex: deletionLineIndex$1 + index,
684
+ noEOFCR: false,
685
+ unifiedLineIndex: unifiedLineIndex$1 + index,
686
+ splitLineIndex: splitLineIndex$1 + index
687
+ },
688
+ additionLine: {
689
+ unifiedLineIndex: unifiedLineIndex$1 + index,
690
+ splitLineIndex: splitLineIndex$1 + index,
691
+ lineIndex: additionLineIndex$1 + index,
692
+ lineNumber: additionLineNumber$1 + index,
693
+ noEOFCR: false
694
+ }
701
695
  })) break hunkIterator;
702
696
  } else state.incrementCounts(1, 1);
703
697
  index++;
@@ -729,16 +723,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
729
723
  hunk,
730
724
  collapsedBefore: getPendingCollapsed(),
731
725
  collapsedAfter: getTrailingCollapsedAfter(unifiedRowIndex, splitRowIndex),
732
- unifiedDeletionLineIndex: unifiedRowIndex,
733
- unifiedAdditionLineIndex: unifiedRowIndex,
734
- splitLineIndex: splitRowIndex,
735
- deletionLineIndex: deletionLineIndex + index,
736
- additionLineIndex: additionLineIndex + index,
737
- deletionLineNumber: deletionLineNumber + index,
738
- additionLineNumber: additionLineNumber + index,
739
726
  type: "context",
740
- noEOFCRAddition: isLastLine && hunk.noEOFCRAdditions,
741
- noEOFCRDeletion: isLastLine && hunk.noEOFCRDeletions
727
+ deletionLine: {
728
+ lineNumber: deletionLineNumber + index,
729
+ lineIndex: deletionLineIndex + index,
730
+ noEOFCR: isLastLine && hunk.noEOFCRDeletions,
731
+ unifiedLineIndex: unifiedRowIndex,
732
+ splitLineIndex: splitRowIndex
733
+ },
734
+ additionLine: {
735
+ unifiedLineIndex: unifiedRowIndex,
736
+ splitLineIndex: splitRowIndex,
737
+ lineIndex: additionLineIndex + index,
738
+ lineNumber: additionLineNumber + index,
739
+ noEOFCR: isLastLine && hunk.noEOFCRAdditions
740
+ }
742
741
  })) break hunkIterator;
743
742
  } else state.incrementCounts(1, 1);
744
743
  index++;
@@ -803,16 +802,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
803
802
  hunk: void 0,
804
803
  collapsedBefore: 0,
805
804
  collapsedAfter: isLastLine ? collapsedLines : 0,
806
- unifiedDeletionLineIndex: unifiedLineIndex + index,
807
- unifiedAdditionLineIndex: unifiedLineIndex + index,
808
- splitLineIndex: splitLineIndex + index,
809
- additionLineIndex: additionLineIndex + index,
810
- deletionLineIndex: deletionLineIndex + index,
811
- additionLineNumber: additionLineNumber + index,
812
- deletionLineNumber: deletionLineNumber + index,
813
805
  type: "context-expanded",
814
- noEOFCRAddition: false,
815
- noEOFCRDeletion: false
806
+ deletionLine: {
807
+ lineNumber: deletionLineNumber + index,
808
+ lineIndex: deletionLineIndex + index,
809
+ noEOFCR: false,
810
+ unifiedLineIndex: unifiedLineIndex + index,
811
+ splitLineIndex: splitLineIndex + index
812
+ },
813
+ additionLine: {
814
+ unifiedLineIndex: unifiedLineIndex + index,
815
+ splitLineIndex: splitLineIndex + index,
816
+ lineIndex: additionLineIndex + index,
817
+ lineNumber: additionLineNumber + index,
818
+ noEOFCR: false
819
+ }
816
820
  })) break hunkIterator;
817
821
  } else state.incrementCounts(1, 1);
818
822
  index++;
@@ -820,7 +824,7 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
820
824
  }
821
825
  }
822
826
  }
823
- function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex) {
827
+ function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex, collapsedContextThreshold) {
824
828
  rangeSize = Math.max(rangeSize, 0);
825
829
  if (rangeSize === 0 || isPartial) return {
826
830
  fromStart: 0,
@@ -828,7 +832,7 @@ function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex) {
828
832
  rangeSize,
829
833
  collapsedLines: Math.max(rangeSize, 0)
830
834
  };
831
- if (expandedHunks === true) return {
835
+ if (expandedHunks === true || rangeSize <= collapsedContextThreshold) return {
832
836
  fromStart: rangeSize,
833
837
  fromEnd: 0,
834
838
  rangeSize,
@@ -891,37 +895,56 @@ function getChangeIterationRanges(state, content, diffStyle) {
891
895
  return merged;
892
896
  }
893
897
  function getChangeLineData({ hunkIndex, hunk, collapsedAfter, collapsedBefore, diffStyle, index, unifiedLineIndex, splitLineIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, content, isLastContent, unifiedCount, splitCount }) {
894
- if (diffStyle === "unified") return {
898
+ const unifiedDeletionLineIndex = index < content.deletions ? unifiedLineIndex + index : void 0;
899
+ const unifiedAdditionLineIndex = diffStyle === "unified" ? index >= content.deletions ? unifiedLineIndex + index : void 0 : index < content.additions ? unifiedLineIndex + content.deletions + index : void 0;
900
+ const resolvedSplitLineIndex = diffStyle === "unified" ? splitLineIndex + (index < content.deletions ? index : index - content.deletions) : splitLineIndex + index;
901
+ const deletionLineIndexValue = index < content.deletions ? deletionLineIndex + index : void 0;
902
+ const deletionLineNumberValue = index < content.deletions ? deletionLineNumber + index : void 0;
903
+ const additionLineIndexValue = diffStyle === "unified" ? index >= content.deletions ? additionLineIndex + (index - content.deletions) : void 0 : index < content.additions ? additionLineIndex + index : void 0;
904
+ const additionLineNumberValue = diffStyle === "unified" ? index >= content.deletions ? additionLineNumber + (index - content.deletions) : void 0 : index < content.additions ? additionLineNumber + index : void 0;
905
+ const noEOFCRDeletion = diffStyle === "unified" ? isLastContent && index === content.deletions - 1 && hunk.noEOFCRDeletions : isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions;
906
+ const noEOFCRAddition = diffStyle === "unified" ? isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions : isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions;
907
+ const deletionLine = deletionLineIndexValue != null && deletionLineNumberValue != null && unifiedDeletionLineIndex != null ? {
908
+ lineNumber: deletionLineNumberValue,
909
+ lineIndex: deletionLineIndexValue,
910
+ noEOFCR: noEOFCRDeletion,
911
+ unifiedLineIndex: unifiedDeletionLineIndex,
912
+ splitLineIndex: resolvedSplitLineIndex
913
+ } : void 0;
914
+ const additionLine = additionLineIndexValue != null && additionLineNumberValue != null && unifiedAdditionLineIndex != null ? {
915
+ unifiedLineIndex: unifiedAdditionLineIndex,
916
+ splitLineIndex: resolvedSplitLineIndex,
917
+ lineIndex: additionLineIndexValue,
918
+ lineNumber: additionLineNumberValue,
919
+ noEOFCR: noEOFCRAddition
920
+ } : void 0;
921
+ if (deletionLine == null && additionLine != null) return {
922
+ type: "change",
923
+ hunkIndex,
924
+ hunk,
925
+ collapsedAfter,
926
+ collapsedBefore,
927
+ deletionLine: void 0,
928
+ additionLine
929
+ };
930
+ else if (deletionLine != null && additionLine == null) return {
895
931
  type: "change",
896
932
  hunkIndex,
897
933
  hunk,
898
934
  collapsedAfter,
899
935
  collapsedBefore,
900
- unifiedDeletionLineIndex: index < content.deletions ? unifiedLineIndex + index : void 0,
901
- unifiedAdditionLineIndex: index >= content.deletions ? unifiedLineIndex + index : void 0,
902
- splitLineIndex: splitLineIndex + (index < content.deletions ? index : index - content.deletions),
903
- additionLineIndex: index >= content.deletions ? additionLineIndex + (index - content.deletions) : void 0,
904
- additionLineNumber: index >= content.deletions ? additionLineNumber + (index - content.deletions) : void 0,
905
- deletionLineIndex: index < content.deletions ? deletionLineIndex + index : void 0,
906
- deletionLineNumber: index < content.deletions ? deletionLineNumber + index : void 0,
907
- noEOFCRDeletion: isLastContent && index === content.deletions - 1 && hunk.noEOFCRDeletions,
908
- noEOFCRAddition: isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions
936
+ deletionLine,
937
+ additionLine: void 0
909
938
  };
939
+ if (deletionLine == null || additionLine == null) throw new Error("iterateOverDiff: missing change line data");
910
940
  return {
911
941
  type: "change",
912
942
  hunkIndex,
913
943
  hunk,
914
944
  collapsedAfter,
915
945
  collapsedBefore,
916
- unifiedDeletionLineIndex: index < content.deletions ? unifiedLineIndex + index : void 0,
917
- unifiedAdditionLineIndex: index < content.additions ? unifiedLineIndex + content.deletions + index : void 0,
918
- splitLineIndex: splitLineIndex + index,
919
- additionLineIndex: index < content.additions ? additionLineIndex + index : void 0,
920
- additionLineNumber: index < content.additions ? additionLineNumber + index : void 0,
921
- deletionLineIndex: index < content.deletions ? deletionLineIndex + index : void 0,
922
- deletionLineNumber: index < content.deletions ? deletionLineNumber + index : void 0,
923
- noEOFCRDeletion: isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions,
924
- noEOFCRAddition: isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions
946
+ deletionLine,
947
+ additionLine
925
948
  };
926
949
  }
927
950
 
@@ -957,8 +980,8 @@ function pushOrJoinSpan({ item, arr, enableJoin, isNeutral = false, isLastItem =
957
980
 
958
981
  //#endregion
959
982
  //#region src/utils/renderDiffWithHighlighter.ts
960
- const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false };
961
- function renderDiffWithHighlighter(diff, highlighter$1, options, { forcePlainText, startingLine, totalLines, expandedHunks } = DEFAULT_PLAIN_TEXT_OPTIONS) {
983
+ const DEFAULT_PLAIN_TEXT_OPTIONS$1 = { forcePlainText: false };
984
+ function renderDiffWithHighlighter(diff, highlighter$1, options, { forcePlainText, startingLine, totalLines, expandedHunks, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } = DEFAULT_PLAIN_TEXT_OPTIONS$1) {
962
985
  if (forcePlainText) {
963
986
  startingLine ??= 0;
964
987
  totalLines ??= Infinity;
@@ -1010,33 +1033,35 @@ function renderDiffWithHighlighter(diff, highlighter$1, options, { forcePlainTex
1010
1033
  startingLine,
1011
1034
  totalLines,
1012
1035
  expandedHunks: isWindowedHighlight ? expandedHunksForIteration : true,
1013
- callback: ({ hunkIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, unifiedAdditionLineIndex, unifiedDeletionLineIndex, splitLineIndex, type }) => {
1036
+ collapsedContextThreshold,
1037
+ callback: ({ hunkIndex, additionLine, deletionLine, type }) => {
1014
1038
  const bucket = getBucketForHunk(hunkIndex);
1015
- if (type === "change" && lineDiffType !== "none" && additionLineIndex != null && deletionLineIndex != null) computeLineDiffDecorations({
1016
- additionLine: diff.additionLines[additionLineIndex],
1017
- deletionLine: diff.deletionLines[deletionLineIndex],
1039
+ const splitLineIndex = additionLine != null ? additionLine.splitLineIndex : deletionLine.splitLineIndex;
1040
+ if (type === "change" && additionLine != null && deletionLine != null) computeLineDiffDecorations({
1041
+ additionLine: diff.additionLines[additionLine.lineIndex],
1042
+ deletionLine: diff.deletionLines[deletionLine.lineIndex],
1018
1043
  deletionLineIndex: bucket.deletionContent.length,
1019
1044
  additionLineIndex: bucket.additionContent.length,
1020
1045
  deletionDecorations: bucket.deletionDecorations,
1021
1046
  additionDecorations: bucket.additionDecorations,
1022
1047
  lineDiffType
1023
1048
  });
1024
- if (deletionLineIndex != null && deletionLineNumber != null && unifiedDeletionLineIndex != null) {
1025
- appendContent(diff.deletionLines[deletionLineIndex], deletionLineIndex, bucket.deletionSegments, bucket.deletionContent);
1049
+ if (deletionLine != null) {
1050
+ appendContent(diff.deletionLines[deletionLine.lineIndex], deletionLine.lineIndex, bucket.deletionSegments, bucket.deletionContent);
1026
1051
  bucket.deletionInfo.push({
1027
1052
  type: type === "change" ? "change-deletion" : type,
1028
- lineNumber: deletionLineNumber,
1029
- altLineNumber: type === "change" ? void 0 : additionLineNumber ?? void 0,
1030
- lineIndex: `${unifiedDeletionLineIndex},${splitLineIndex}`
1053
+ lineNumber: deletionLine.lineNumber,
1054
+ altLineNumber: type === "change" ? void 0 : additionLine.lineNumber ?? void 0,
1055
+ lineIndex: `${deletionLine.unifiedLineIndex},${splitLineIndex}`
1031
1056
  });
1032
1057
  }
1033
- if (additionLineIndex != null && additionLineNumber != null && unifiedAdditionLineIndex != null) {
1034
- appendContent(diff.additionLines[additionLineIndex], additionLineIndex, bucket.additionSegments, bucket.additionContent);
1058
+ if (additionLine != null) {
1059
+ appendContent(diff.additionLines[additionLine.lineIndex], additionLine.lineIndex, bucket.additionSegments, bucket.additionContent);
1035
1060
  bucket.additionInfo.push({
1036
1061
  type: type === "change" ? "change-addition" : type,
1037
- lineNumber: additionLineNumber,
1038
- altLineNumber: type === "change" ? void 0 : deletionLineNumber ?? void 0,
1039
- lineIndex: `${unifiedAdditionLineIndex},${splitLineIndex}`
1062
+ lineNumber: additionLine.lineNumber,
1063
+ altLineNumber: type === "change" ? void 0 : deletionLine.lineNumber ?? void 0,
1064
+ lineIndex: `${additionLine.unifiedLineIndex},${splitLineIndex}`
1040
1065
  });
1041
1066
  }
1042
1067
  }
@@ -1203,9 +1228,78 @@ function renderTwoFiles({ deletionFile, additionFile, deletionInfo, additionInfo
1203
1228
  };
1204
1229
  }
1205
1230
 
1231
+ //#endregion
1232
+ //#region src/utils/iterateOverFile.ts
1233
+ /**
1234
+ * Iterates over lines in a file with optional windowing support.
1235
+ *
1236
+ * Similar to `iterateOverDiff` but simplified for linear file content.
1237
+ * Supports viewport windowing for virtualization scenarios.
1238
+ *
1239
+ * @param props - Configuration for iteration
1240
+ * @param props.lines - Pre-split array of lines (use splitFileContents() to create from string)
1241
+ * @param props.startingLine - Optional starting line index (0-based, default: 0)
1242
+ * @param props.totalLines - Optional max lines to iterate (default: Infinity)
1243
+ * @param props.callback - Callback invoked for each line in the window.
1244
+ * Return `true` to stop iteration early.
1245
+ *
1246
+ * @example
1247
+ * ```typescript
1248
+ * const lines = splitFileContents('line1\nline2\nline3');
1249
+ * iterateOverFile({
1250
+ * lines,
1251
+ * startingLine: 0,
1252
+ * totalLines: 10,
1253
+ * callback: ({ lineIndex, lineNumber, content, isLastLine }) => {
1254
+ * console.log(`Line ${lineNumber}: ${content}`);
1255
+ * if (content.includes('stop')) return true; // Stop iteration
1256
+ * }
1257
+ * });
1258
+ * ```
1259
+ */
1260
+ function iterateOverFile({ lines, startingLine = 0, totalLines = Infinity, callback }) {
1261
+ const len = Math.min(startingLine + totalLines, lines.length);
1262
+ const lastLineIndex = (() => {
1263
+ const lastLine = lines.at(-1);
1264
+ if (lastLine === "" || lastLine === "\n" || lastLine === "\r\n" || lastLine === "\r") return Math.max(0, lines.length - 2);
1265
+ return lines.length - 1;
1266
+ })();
1267
+ for (let lineIndex = startingLine; lineIndex < len; lineIndex++) {
1268
+ const isLastLine = lineIndex === lastLineIndex;
1269
+ if (callback({
1270
+ lineIndex,
1271
+ lineNumber: lineIndex + 1,
1272
+ content: lines[lineIndex],
1273
+ isLastLine
1274
+ }) === true || isLastLine) break;
1275
+ }
1276
+ }
1277
+
1278
+ //#endregion
1279
+ //#region src/utils/splitFileContents.ts
1280
+ /**
1281
+ * Splits file contents into lines using the same logic as diff parsing.
1282
+ * - Preserves trailing newlines on each line
1283
+ *
1284
+ * @param contents - The raw file contents string
1285
+ * @returns Array of lines with newlines preserved
1286
+ */
1287
+ function splitFileContents(contents) {
1288
+ return contents !== "" ? contents.split(SPLIT_WITH_NEWLINES) : [];
1289
+ }
1290
+
1206
1291
  //#endregion
1207
1292
  //#region src/utils/renderFileWithHighlighter.ts
1208
- function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES, tokenizeMaxLineLength }, forcePlainText = false) {
1293
+ const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false };
1294
+ function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES, tokenizeMaxLineLength }, { forcePlainText, startingLine, totalLines, lines } = DEFAULT_PLAIN_TEXT_OPTIONS) {
1295
+ if (forcePlainText) {
1296
+ startingLine ??= 0;
1297
+ totalLines ??= Infinity;
1298
+ } else {
1299
+ startingLine = 0;
1300
+ totalLines = Infinity;
1301
+ }
1302
+ const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;
1209
1303
  const { state, transformers } = createTransformerWithState();
1210
1304
  const lang = forcePlainText ? "text" : file.lang ?? getFiletypeFromFileName(file.name);
1211
1305
  const baseThemeType = (() => {
@@ -1217,8 +1311,8 @@ function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES
1217
1311
  });
1218
1312
  state.lineInfo = (shikiLineNumber) => ({
1219
1313
  type: "context",
1220
- lineIndex: shikiLineNumber - 1,
1221
- lineNumber: shikiLineNumber
1314
+ lineIndex: shikiLineNumber - 1 + startingLine,
1315
+ lineNumber: shikiLineNumber + startingLine
1222
1316
  });
1223
1317
  const hastConfig = (() => {
1224
1318
  if (typeof theme === "string") return {
@@ -1238,12 +1332,27 @@ function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES
1238
1332
  tokenizeMaxLineLength
1239
1333
  };
1240
1334
  })();
1335
+ const highlightedLines = getLineNodes(highlighter$1.codeToHast(isWindowedHighlight ? extractWindowedFileContent(lines ?? splitFileContents(file.contents), startingLine, totalLines) : cleanLastNewline(file.contents), hastConfig));
1336
+ const code = isWindowedHighlight ? new Array(startingLine) : highlightedLines;
1337
+ if (isWindowedHighlight) code.push(...highlightedLines);
1241
1338
  return {
1242
- code: getLineNodes(highlighter$1.codeToHast(cleanLastNewline(file.contents), hastConfig)),
1339
+ code,
1243
1340
  themeStyles,
1244
1341
  baseThemeType
1245
1342
  };
1246
1343
  }
1344
+ function extractWindowedFileContent(lines, startingLine, totalLines) {
1345
+ let windowContent = "";
1346
+ iterateOverFile({
1347
+ lines,
1348
+ startingLine,
1349
+ totalLines,
1350
+ callback({ content }) {
1351
+ windowContent += content;
1352
+ }
1353
+ });
1354
+ return windowContent;
1355
+ }
1247
1356
 
1248
1357
  //#endregion
1249
1358
  //#region src/worker/worker.ts