@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,13 +1,16 @@
1
- import { createJavaScriptRegexEngine } from "@shikijs/engine-javascript";
2
- import { createHighlighterCoreSync } from "shiki/core";
1
+ import { createHighlighterCore } from "shiki/core";
2
+ import { createJavaScriptRegexEngine } from "shiki/engine/javascript";
3
+ import { createOnigurumaEngine } from "shiki/engine/oniguruma";
3
4
  import { diffChars, diffWordsWithSpace } from "diff";
4
5
  import { transformerStyleToClass } from "@shikijs/transformers";
5
6
 
6
7
  //#region src/constants.ts
8
+ const SPLIT_WITH_NEWLINES = /(?<=\n)/;
7
9
  const DEFAULT_THEMES = {
8
10
  dark: "pierre-dark",
9
11
  light: "pierre-light"
10
12
  };
13
+ const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;
11
14
  const DEFAULT_EXPANDED_REGION = Object.freeze({
12
15
  fromStart: 0,
13
16
  fromEnd: 0
@@ -73,14 +76,6 @@ function createTextNodeElement(value) {
73
76
  value
74
77
  };
75
78
  }
76
- function createHastElement({ tagName, children = [], properties = {} }) {
77
- return {
78
- type: "element",
79
- tagName,
80
- properties,
81
- children
82
- };
83
- }
84
79
  function findCodeElement(nodes) {
85
80
  let firstChild = nodes.children[0];
86
81
  while (firstChild != null) {
@@ -103,30 +98,13 @@ function processLine(node, line, state) {
103
98
  });
104
99
  throw new Error(errorMessage);
105
100
  }
106
- node.tagName = "span";
107
- node.properties["data-column-content"] = "";
101
+ node.tagName = "div";
102
+ node.properties["data-line"] = lineInfo.lineNumber;
103
+ node.properties["data-alt-line"] = lineInfo.altLineNumber;
104
+ node.properties["data-line-type"] = lineInfo.type;
105
+ node.properties["data-line-index"] = lineInfo.lineIndex;
108
106
  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
- });
107
+ return node;
130
108
  }
131
109
 
132
110
  //#endregion
@@ -187,6 +165,7 @@ function formatCSSVariablePrefix(type) {
187
165
 
188
166
  //#endregion
189
167
  //#region src/utils/getFiletypeFromFileName.ts
168
+ const CUSTOM_EXTENSION_TO_FILE_FORMAT = /* @__PURE__ */ new Map();
190
169
  const EXTENSION_TO_FILE_FORMAT = {
191
170
  "1c": "1c",
192
171
  abap: "abap",
@@ -517,10 +496,16 @@ const EXTENSION_TO_FILE_FORMAT = {
517
496
  sty: "tex"
518
497
  };
519
498
  function getFiletypeFromFileName(fileName) {
499
+ if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(fileName)) return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(fileName) ?? "text";
520
500
  if (EXTENSION_TO_FILE_FORMAT[fileName] != null) return EXTENSION_TO_FILE_FORMAT[fileName];
521
501
  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";
502
+ if (compoundMatch != null) {
503
+ if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(compoundMatch[1])) return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(compoundMatch[1]) ?? "text";
504
+ if (EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] != null) return EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] ?? "text";
505
+ }
506
+ const simpleMatch = fileName.match(/\.([^.]+)$/)?.[1] ?? "";
507
+ if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(simpleMatch)) return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(simpleMatch) ?? "text";
508
+ return EXTENSION_TO_FILE_FORMAT[simpleMatch] ?? "text";
524
509
  }
525
510
 
526
511
  //#endregion
@@ -573,7 +558,7 @@ function getLineNodes(nodes) {
573
558
 
574
559
  //#endregion
575
560
  //#region src/utils/iterateOverDiff.ts
576
- function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infinity, expandedHunks, callback }) {
561
+ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infinity, expandedHunks, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, callback }) {
577
562
  const state = {
578
563
  finalHunk: diff.hunks.at(-1),
579
564
  viewportStart: startingLine,
@@ -624,14 +609,14 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
624
609
  };
625
610
  hunkIterator: for (const [hunkIndex, hunk] of diff.hunks.entries()) {
626
611
  if (state.shouldBreak()) break;
627
- const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, hunkIndex);
612
+ const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, hunkIndex, collapsedContextThreshold);
628
613
  const trailingRegion = (() => {
629
614
  if (hunk !== state.finalHunk || !hasFinalCollapsedHunk(diff)) return;
630
615
  const additionRemaining = diff.additionLines.length - (hunk.additionLineIndex + hunk.additionCount);
631
616
  const deletionRemaining = diff.deletionLines.length - (hunk.deletionLineIndex + hunk.deletionCount);
632
617
  if (additionRemaining !== deletionRemaining) throw new Error(`iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`);
633
618
  const trailingRangeSize = Math.min(additionRemaining, deletionRemaining);
634
- return getExpandedRegion(diff.isPartial, trailingRangeSize, expandedHunks, diff.hunks.length);
619
+ return getExpandedRegion(diff.isPartial, trailingRangeSize, expandedHunks, diff.hunks.length, collapsedContextThreshold);
635
620
  })();
636
621
  const expandedLineCount = leadingRegion.fromStart + leadingRegion.fromEnd;
637
622
  function getTrailingCollapsedAfter(unifiedLineIndex$1, splitLineIndex$1) {
@@ -660,16 +645,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
660
645
  hunk,
661
646
  collapsedBefore: 0,
662
647
  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
648
  type: "context-expanded",
671
- noEOFCRAddition: false,
672
- noEOFCRDeletion: false
649
+ deletionLine: {
650
+ lineNumber: deletionLineNumber$1 + index,
651
+ lineIndex: deletionLineIndex$1 + index,
652
+ noEOFCR: false,
653
+ unifiedLineIndex: unifiedLineIndex$1 + index,
654
+ splitLineIndex: splitLineIndex$1 + index
655
+ },
656
+ additionLine: {
657
+ unifiedLineIndex: unifiedLineIndex$1 + index,
658
+ splitLineIndex: splitLineIndex$1 + index,
659
+ lineIndex: additionLineIndex$1 + index,
660
+ lineNumber: additionLineNumber$1 + index,
661
+ noEOFCR: false
662
+ }
673
663
  })) break hunkIterator;
674
664
  } else state.incrementCounts(1, 1);
675
665
  index++;
@@ -688,16 +678,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
688
678
  hunk,
689
679
  collapsedBefore: getPendingCollapsed(),
690
680
  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
681
  type: "context-expanded",
699
- noEOFCRAddition: false,
700
- noEOFCRDeletion: false
682
+ deletionLine: {
683
+ lineNumber: deletionLineNumber$1 + index,
684
+ lineIndex: deletionLineIndex$1 + index,
685
+ noEOFCR: false,
686
+ unifiedLineIndex: unifiedLineIndex$1 + index,
687
+ splitLineIndex: splitLineIndex$1 + index
688
+ },
689
+ additionLine: {
690
+ unifiedLineIndex: unifiedLineIndex$1 + index,
691
+ splitLineIndex: splitLineIndex$1 + index,
692
+ lineIndex: additionLineIndex$1 + index,
693
+ lineNumber: additionLineNumber$1 + index,
694
+ noEOFCR: false
695
+ }
701
696
  })) break hunkIterator;
702
697
  } else state.incrementCounts(1, 1);
703
698
  index++;
@@ -729,16 +724,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
729
724
  hunk,
730
725
  collapsedBefore: getPendingCollapsed(),
731
726
  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
727
  type: "context",
740
- noEOFCRAddition: isLastLine && hunk.noEOFCRAdditions,
741
- noEOFCRDeletion: isLastLine && hunk.noEOFCRDeletions
728
+ deletionLine: {
729
+ lineNumber: deletionLineNumber + index,
730
+ lineIndex: deletionLineIndex + index,
731
+ noEOFCR: isLastLine && hunk.noEOFCRDeletions,
732
+ unifiedLineIndex: unifiedRowIndex,
733
+ splitLineIndex: splitRowIndex
734
+ },
735
+ additionLine: {
736
+ unifiedLineIndex: unifiedRowIndex,
737
+ splitLineIndex: splitRowIndex,
738
+ lineIndex: additionLineIndex + index,
739
+ lineNumber: additionLineNumber + index,
740
+ noEOFCR: isLastLine && hunk.noEOFCRAdditions
741
+ }
742
742
  })) break hunkIterator;
743
743
  } else state.incrementCounts(1, 1);
744
744
  index++;
@@ -803,16 +803,21 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
803
803
  hunk: void 0,
804
804
  collapsedBefore: 0,
805
805
  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
806
  type: "context-expanded",
814
- noEOFCRAddition: false,
815
- noEOFCRDeletion: false
807
+ deletionLine: {
808
+ lineNumber: deletionLineNumber + index,
809
+ lineIndex: deletionLineIndex + index,
810
+ noEOFCR: false,
811
+ unifiedLineIndex: unifiedLineIndex + index,
812
+ splitLineIndex: splitLineIndex + index
813
+ },
814
+ additionLine: {
815
+ unifiedLineIndex: unifiedLineIndex + index,
816
+ splitLineIndex: splitLineIndex + index,
817
+ lineIndex: additionLineIndex + index,
818
+ lineNumber: additionLineNumber + index,
819
+ noEOFCR: false
820
+ }
816
821
  })) break hunkIterator;
817
822
  } else state.incrementCounts(1, 1);
818
823
  index++;
@@ -820,7 +825,7 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
820
825
  }
821
826
  }
822
827
  }
823
- function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex) {
828
+ function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex, collapsedContextThreshold) {
824
829
  rangeSize = Math.max(rangeSize, 0);
825
830
  if (rangeSize === 0 || isPartial) return {
826
831
  fromStart: 0,
@@ -828,7 +833,7 @@ function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex) {
828
833
  rangeSize,
829
834
  collapsedLines: Math.max(rangeSize, 0)
830
835
  };
831
- if (expandedHunks === true) return {
836
+ if (expandedHunks === true || rangeSize <= collapsedContextThreshold) return {
832
837
  fromStart: rangeSize,
833
838
  fromEnd: 0,
834
839
  rangeSize,
@@ -891,37 +896,56 @@ function getChangeIterationRanges(state, content, diffStyle) {
891
896
  return merged;
892
897
  }
893
898
  function getChangeLineData({ hunkIndex, hunk, collapsedAfter, collapsedBefore, diffStyle, index, unifiedLineIndex, splitLineIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, content, isLastContent, unifiedCount, splitCount }) {
894
- if (diffStyle === "unified") return {
899
+ const unifiedDeletionLineIndex = index < content.deletions ? unifiedLineIndex + index : void 0;
900
+ const unifiedAdditionLineIndex = diffStyle === "unified" ? index >= content.deletions ? unifiedLineIndex + index : void 0 : index < content.additions ? unifiedLineIndex + content.deletions + index : void 0;
901
+ const resolvedSplitLineIndex = diffStyle === "unified" ? splitLineIndex + (index < content.deletions ? index : index - content.deletions) : splitLineIndex + index;
902
+ const deletionLineIndexValue = index < content.deletions ? deletionLineIndex + index : void 0;
903
+ const deletionLineNumberValue = index < content.deletions ? deletionLineNumber + index : void 0;
904
+ const additionLineIndexValue = diffStyle === "unified" ? index >= content.deletions ? additionLineIndex + (index - content.deletions) : void 0 : index < content.additions ? additionLineIndex + index : void 0;
905
+ const additionLineNumberValue = diffStyle === "unified" ? index >= content.deletions ? additionLineNumber + (index - content.deletions) : void 0 : index < content.additions ? additionLineNumber + index : void 0;
906
+ const noEOFCRDeletion = diffStyle === "unified" ? isLastContent && index === content.deletions - 1 && hunk.noEOFCRDeletions : isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions;
907
+ const noEOFCRAddition = diffStyle === "unified" ? isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions : isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions;
908
+ const deletionLine = deletionLineIndexValue != null && deletionLineNumberValue != null && unifiedDeletionLineIndex != null ? {
909
+ lineNumber: deletionLineNumberValue,
910
+ lineIndex: deletionLineIndexValue,
911
+ noEOFCR: noEOFCRDeletion,
912
+ unifiedLineIndex: unifiedDeletionLineIndex,
913
+ splitLineIndex: resolvedSplitLineIndex
914
+ } : void 0;
915
+ const additionLine = additionLineIndexValue != null && additionLineNumberValue != null && unifiedAdditionLineIndex != null ? {
916
+ unifiedLineIndex: unifiedAdditionLineIndex,
917
+ splitLineIndex: resolvedSplitLineIndex,
918
+ lineIndex: additionLineIndexValue,
919
+ lineNumber: additionLineNumberValue,
920
+ noEOFCR: noEOFCRAddition
921
+ } : void 0;
922
+ if (deletionLine == null && additionLine != null) return {
923
+ type: "change",
924
+ hunkIndex,
925
+ hunk,
926
+ collapsedAfter,
927
+ collapsedBefore,
928
+ deletionLine: void 0,
929
+ additionLine
930
+ };
931
+ else if (deletionLine != null && additionLine == null) return {
895
932
  type: "change",
896
933
  hunkIndex,
897
934
  hunk,
898
935
  collapsedAfter,
899
936
  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
937
+ deletionLine,
938
+ additionLine: void 0
909
939
  };
940
+ if (deletionLine == null || additionLine == null) throw new Error("iterateOverDiff: missing change line data");
910
941
  return {
911
942
  type: "change",
912
943
  hunkIndex,
913
944
  hunk,
914
945
  collapsedAfter,
915
946
  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
947
+ deletionLine,
948
+ additionLine
925
949
  };
926
950
  }
927
951
 
@@ -957,8 +981,8 @@ function pushOrJoinSpan({ item, arr, enableJoin, isNeutral = false, isLastItem =
957
981
 
958
982
  //#endregion
959
983
  //#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) {
984
+ const DEFAULT_PLAIN_TEXT_OPTIONS$1 = { forcePlainText: false };
985
+ function renderDiffWithHighlighter(diff, highlighter$1, options, { forcePlainText, startingLine, totalLines, expandedHunks, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } = DEFAULT_PLAIN_TEXT_OPTIONS$1) {
962
986
  if (forcePlainText) {
963
987
  startingLine ??= 0;
964
988
  totalLines ??= Infinity;
@@ -1010,33 +1034,35 @@ function renderDiffWithHighlighter(diff, highlighter$1, options, { forcePlainTex
1010
1034
  startingLine,
1011
1035
  totalLines,
1012
1036
  expandedHunks: isWindowedHighlight ? expandedHunksForIteration : true,
1013
- callback: ({ hunkIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, unifiedAdditionLineIndex, unifiedDeletionLineIndex, splitLineIndex, type }) => {
1037
+ collapsedContextThreshold,
1038
+ callback: ({ hunkIndex, additionLine, deletionLine, type }) => {
1014
1039
  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],
1040
+ const splitLineIndex = additionLine != null ? additionLine.splitLineIndex : deletionLine.splitLineIndex;
1041
+ if (type === "change" && additionLine != null && deletionLine != null) computeLineDiffDecorations({
1042
+ additionLine: diff.additionLines[additionLine.lineIndex],
1043
+ deletionLine: diff.deletionLines[deletionLine.lineIndex],
1018
1044
  deletionLineIndex: bucket.deletionContent.length,
1019
1045
  additionLineIndex: bucket.additionContent.length,
1020
1046
  deletionDecorations: bucket.deletionDecorations,
1021
1047
  additionDecorations: bucket.additionDecorations,
1022
1048
  lineDiffType
1023
1049
  });
1024
- if (deletionLineIndex != null && deletionLineNumber != null && unifiedDeletionLineIndex != null) {
1025
- appendContent(diff.deletionLines[deletionLineIndex], deletionLineIndex, bucket.deletionSegments, bucket.deletionContent);
1050
+ if (deletionLine != null) {
1051
+ appendContent(diff.deletionLines[deletionLine.lineIndex], deletionLine.lineIndex, bucket.deletionSegments, bucket.deletionContent);
1026
1052
  bucket.deletionInfo.push({
1027
1053
  type: type === "change" ? "change-deletion" : type,
1028
- lineNumber: deletionLineNumber,
1029
- altLineNumber: type === "change" ? void 0 : additionLineNumber ?? void 0,
1030
- lineIndex: `${unifiedDeletionLineIndex},${splitLineIndex}`
1054
+ lineNumber: deletionLine.lineNumber,
1055
+ altLineNumber: type === "change" ? void 0 : additionLine.lineNumber ?? void 0,
1056
+ lineIndex: `${deletionLine.unifiedLineIndex},${splitLineIndex}`
1031
1057
  });
1032
1058
  }
1033
- if (additionLineIndex != null && additionLineNumber != null && unifiedAdditionLineIndex != null) {
1034
- appendContent(diff.additionLines[additionLineIndex], additionLineIndex, bucket.additionSegments, bucket.additionContent);
1059
+ if (additionLine != null) {
1060
+ appendContent(diff.additionLines[additionLine.lineIndex], additionLine.lineIndex, bucket.additionSegments, bucket.additionContent);
1035
1061
  bucket.additionInfo.push({
1036
1062
  type: type === "change" ? "change-addition" : type,
1037
- lineNumber: additionLineNumber,
1038
- altLineNumber: type === "change" ? void 0 : deletionLineNumber ?? void 0,
1039
- lineIndex: `${unifiedAdditionLineIndex},${splitLineIndex}`
1063
+ lineNumber: additionLine.lineNumber,
1064
+ altLineNumber: type === "change" ? void 0 : deletionLine.lineNumber ?? void 0,
1065
+ lineIndex: `${additionLine.unifiedLineIndex},${splitLineIndex}`
1040
1066
  });
1041
1067
  }
1042
1068
  }
@@ -1203,9 +1229,78 @@ function renderTwoFiles({ deletionFile, additionFile, deletionInfo, additionInfo
1203
1229
  };
1204
1230
  }
1205
1231
 
1232
+ //#endregion
1233
+ //#region src/utils/iterateOverFile.ts
1234
+ /**
1235
+ * Iterates over lines in a file with optional windowing support.
1236
+ *
1237
+ * Similar to `iterateOverDiff` but simplified for linear file content.
1238
+ * Supports viewport windowing for virtualization scenarios.
1239
+ *
1240
+ * @param props - Configuration for iteration
1241
+ * @param props.lines - Pre-split array of lines (use splitFileContents() to create from string)
1242
+ * @param props.startingLine - Optional starting line index (0-based, default: 0)
1243
+ * @param props.totalLines - Optional max lines to iterate (default: Infinity)
1244
+ * @param props.callback - Callback invoked for each line in the window.
1245
+ * Return `true` to stop iteration early.
1246
+ *
1247
+ * @example
1248
+ * ```typescript
1249
+ * const lines = splitFileContents('line1\nline2\nline3');
1250
+ * iterateOverFile({
1251
+ * lines,
1252
+ * startingLine: 0,
1253
+ * totalLines: 10,
1254
+ * callback: ({ lineIndex, lineNumber, content, isLastLine }) => {
1255
+ * console.log(`Line ${lineNumber}: ${content}`);
1256
+ * if (content.includes('stop')) return true; // Stop iteration
1257
+ * }
1258
+ * });
1259
+ * ```
1260
+ */
1261
+ function iterateOverFile({ lines, startingLine = 0, totalLines = Infinity, callback }) {
1262
+ const len = Math.min(startingLine + totalLines, lines.length);
1263
+ const lastLineIndex = (() => {
1264
+ const lastLine = lines.at(-1);
1265
+ if (lastLine === "" || lastLine === "\n" || lastLine === "\r\n" || lastLine === "\r") return Math.max(0, lines.length - 2);
1266
+ return lines.length - 1;
1267
+ })();
1268
+ for (let lineIndex = startingLine; lineIndex < len; lineIndex++) {
1269
+ const isLastLine = lineIndex === lastLineIndex;
1270
+ if (callback({
1271
+ lineIndex,
1272
+ lineNumber: lineIndex + 1,
1273
+ content: lines[lineIndex],
1274
+ isLastLine
1275
+ }) === true || isLastLine) break;
1276
+ }
1277
+ }
1278
+
1279
+ //#endregion
1280
+ //#region src/utils/splitFileContents.ts
1281
+ /**
1282
+ * Splits file contents into lines using the same logic as diff parsing.
1283
+ * - Preserves trailing newlines on each line
1284
+ *
1285
+ * @param contents - The raw file contents string
1286
+ * @returns Array of lines with newlines preserved
1287
+ */
1288
+ function splitFileContents(contents) {
1289
+ return contents !== "" ? contents.split(SPLIT_WITH_NEWLINES) : [];
1290
+ }
1291
+
1206
1292
  //#endregion
1207
1293
  //#region src/utils/renderFileWithHighlighter.ts
1208
- function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES, tokenizeMaxLineLength }, forcePlainText = false) {
1294
+ const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false };
1295
+ function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES, tokenizeMaxLineLength }, { forcePlainText, startingLine, totalLines, lines } = DEFAULT_PLAIN_TEXT_OPTIONS) {
1296
+ if (forcePlainText) {
1297
+ startingLine ??= 0;
1298
+ totalLines ??= Infinity;
1299
+ } else {
1300
+ startingLine = 0;
1301
+ totalLines = Infinity;
1302
+ }
1303
+ const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;
1209
1304
  const { state, transformers } = createTransformerWithState();
1210
1305
  const lang = forcePlainText ? "text" : file.lang ?? getFiletypeFromFileName(file.name);
1211
1306
  const baseThemeType = (() => {
@@ -1217,8 +1312,8 @@ function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES
1217
1312
  });
1218
1313
  state.lineInfo = (shikiLineNumber) => ({
1219
1314
  type: "context",
1220
- lineIndex: shikiLineNumber - 1,
1221
- lineNumber: shikiLineNumber
1315
+ lineIndex: shikiLineNumber - 1 + startingLine,
1316
+ lineNumber: shikiLineNumber + startingLine
1222
1317
  });
1223
1318
  const hastConfig = (() => {
1224
1319
  if (typeof theme === "string") return {
@@ -1238,12 +1333,27 @@ function renderFileWithHighlighter(file, highlighter$1, { theme = DEFAULT_THEMES
1238
1333
  tokenizeMaxLineLength
1239
1334
  };
1240
1335
  })();
1336
+ const highlightedLines = getLineNodes(highlighter$1.codeToHast(isWindowedHighlight ? extractWindowedFileContent(lines ?? splitFileContents(file.contents), startingLine, totalLines) : cleanLastNewline(file.contents), hastConfig));
1337
+ const code = isWindowedHighlight ? new Array(startingLine) : highlightedLines;
1338
+ if (isWindowedHighlight) code.push(...highlightedLines);
1241
1339
  return {
1242
- code: getLineNodes(highlighter$1.codeToHast(cleanLastNewline(file.contents), hastConfig)),
1340
+ code,
1243
1341
  themeStyles,
1244
1342
  baseThemeType
1245
1343
  };
1246
1344
  }
1345
+ function extractWindowedFileContent(lines, startingLine, totalLines) {
1346
+ let windowContent = "";
1347
+ iterateOverFile({
1348
+ lines,
1349
+ startingLine,
1350
+ totalLines,
1351
+ callback({ content }) {
1352
+ windowContent += content;
1353
+ }
1354
+ });
1355
+ return windowContent;
1356
+ }
1247
1357
 
1248
1358
  //#endregion
1249
1359
  //#region src/worker/worker.ts
@@ -1257,20 +1367,22 @@ self.addEventListener("error", (event) => {
1257
1367
  console.error("[Shiki Worker] Unhandled error:", event.error);
1258
1368
  });
1259
1369
  self.addEventListener("message", (event) => {
1260
- const request = event.data;
1370
+ handleMessage(event.data);
1371
+ });
1372
+ async function handleMessage(request) {
1261
1373
  try {
1262
1374
  switch (request.type) {
1263
1375
  case "initialize":
1264
- handleInitialize(request);
1376
+ await handleInitialize(request);
1265
1377
  break;
1266
1378
  case "set-render-options":
1267
- handleSetRenderOptions(request);
1379
+ await handleSetRenderOptions(request);
1268
1380
  break;
1269
1381
  case "file":
1270
- handleRenderFile(request);
1382
+ await handleRenderFile(request);
1271
1383
  break;
1272
1384
  case "diff":
1273
- handleRenderDiff(request);
1385
+ await handleRenderDiff(request);
1274
1386
  break;
1275
1387
  default: throw new Error(`Unknown request type: ${request.type}`);
1276
1388
  }
@@ -1278,9 +1390,10 @@ self.addEventListener("message", (event) => {
1278
1390
  console.error("Worker error:", error);
1279
1391
  sendError(request.id, error);
1280
1392
  }
1281
- });
1282
- function handleInitialize({ id, renderOptions: options, resolvedThemes, resolvedLanguages }) {
1283
- const highlighter$1 = getHighlighter();
1393
+ }
1394
+ async function handleInitialize({ id, renderOptions: options, preferredHighlighter, resolvedThemes, resolvedLanguages }) {
1395
+ let highlighter$1 = getHighlighter(preferredHighlighter);
1396
+ if ("then" in highlighter$1) highlighter$1 = await highlighter$1;
1284
1397
  attachResolvedThemes(resolvedThemes, highlighter$1);
1285
1398
  if (resolvedLanguages != null) attachResolvedLanguages(resolvedLanguages, highlighter$1);
1286
1399
  renderOptions = options;
@@ -1291,8 +1404,10 @@ function handleInitialize({ id, renderOptions: options, resolvedThemes, resolved
1291
1404
  sentAt: Date.now()
1292
1405
  });
1293
1406
  }
1294
- function handleSetRenderOptions({ id, renderOptions: options, resolvedThemes }) {
1295
- attachResolvedThemes(resolvedThemes, getHighlighter());
1407
+ async function handleSetRenderOptions({ id, renderOptions: options, resolvedThemes }) {
1408
+ let highlighter$1 = getHighlighter();
1409
+ if ("then" in highlighter$1) highlighter$1 = await highlighter$1;
1410
+ attachResolvedThemes(resolvedThemes, highlighter$1);
1296
1411
  renderOptions = options;
1297
1412
  postMessage({
1298
1413
  type: "success",
@@ -1301,8 +1416,9 @@ function handleSetRenderOptions({ id, renderOptions: options, resolvedThemes })
1301
1416
  sentAt: Date.now()
1302
1417
  });
1303
1418
  }
1304
- function handleRenderFile({ id, file, resolvedLanguages }) {
1305
- const highlighter$1 = getHighlighter();
1419
+ async function handleRenderFile({ id, file, resolvedLanguages }) {
1420
+ let highlighter$1 = getHighlighter();
1421
+ if ("then" in highlighter$1) highlighter$1 = await highlighter$1;
1306
1422
  if (resolvedLanguages != null) attachResolvedLanguages(resolvedLanguages, highlighter$1);
1307
1423
  const fileOptions = {
1308
1424
  theme: renderOptions.theme,
@@ -1310,16 +1426,17 @@ function handleRenderFile({ id, file, resolvedLanguages }) {
1310
1426
  };
1311
1427
  sendFileSuccess(id, renderFileWithHighlighter(file, highlighter$1, fileOptions), fileOptions);
1312
1428
  }
1313
- function handleRenderDiff({ id, diff, resolvedLanguages }) {
1314
- const highlighter$1 = getHighlighter();
1429
+ async function handleRenderDiff({ id, diff, resolvedLanguages }) {
1430
+ let highlighter$1 = getHighlighter();
1431
+ if ("then" in highlighter$1) highlighter$1 = await highlighter$1;
1315
1432
  if (resolvedLanguages != null) attachResolvedLanguages(resolvedLanguages, highlighter$1);
1316
1433
  sendDiffSuccess(id, renderDiffWithHighlighter(diff, highlighter$1, renderOptions), renderOptions);
1317
1434
  }
1318
- function getHighlighter() {
1319
- highlighter ??= createHighlighterCoreSync({
1435
+ function getHighlighter(preferredHighlighter = "shiki-js") {
1436
+ highlighter ??= createHighlighterCore({
1320
1437
  themes: [],
1321
1438
  langs: [],
1322
- engine: createJavaScriptRegexEngine()
1439
+ engine: preferredHighlighter === "shiki-wasm" ? createOnigurumaEngine(import("shiki/wasm")) : createJavaScriptRegexEngine()
1323
1440
  });
1324
1441
  return highlighter;
1325
1442
  }