@pierre/diffs 1.5.1 → 1.6.0-beta.1

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 (304) hide show
  1. package/README.md +4 -3
  2. package/dist/components/CodeView.d.ts +2 -1
  3. package/dist/components/CodeView.d.ts.map +1 -1
  4. package/dist/components/CodeView.js +27 -16
  5. package/dist/components/CodeView.js.map +1 -1
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +14 -7
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +7 -4
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +16 -9
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/FileStream.d.ts +6 -4
  14. package/dist/components/FileStream.d.ts.map +1 -1
  15. package/dist/components/FileStream.js +49 -36
  16. package/dist/components/FileStream.js.map +1 -1
  17. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  18. package/dist/components/VirtualizedFile.js +10 -5
  19. package/dist/components/VirtualizedFile.js.map +1 -1
  20. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  21. package/dist/components/VirtualizedFileDiff.js +3 -4
  22. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  23. package/dist/constants.d.ts +3 -2
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +2 -1
  26. package/dist/constants.js.map +1 -1
  27. package/dist/editor/editor.d.ts +2 -1
  28. package/dist/editor/editor.d.ts.map +1 -1
  29. package/dist/editor/editor.js +10 -3
  30. package/dist/editor/editor.js.map +1 -1
  31. package/dist/editor/getChangedDocumentLines.d.ts +6 -0
  32. package/dist/editor/getChangedDocumentLines.d.ts.map +1 -0
  33. package/dist/editor/getChangedDocumentLines.js +35 -0
  34. package/dist/editor/getChangedDocumentLines.js.map +1 -0
  35. package/dist/editor/tokenizer.d.ts +6 -4
  36. package/dist/editor/tokenizer.d.ts.map +1 -1
  37. package/dist/editor/tokenizer.js +25 -470
  38. package/dist/editor/tokenizer.js.map +1 -1
  39. package/dist/highlighter/DiffsEditorTokenizer.d.ts +16 -0
  40. package/dist/highlighter/DiffsEditorTokenizer.d.ts.map +1 -0
  41. package/dist/highlighter/DiffsEditorTokenizer.js +0 -0
  42. package/dist/highlighter/DiffsHighlighter.d.ts +41 -0
  43. package/dist/highlighter/DiffsHighlighter.d.ts.map +1 -0
  44. package/dist/highlighter/DiffsHighlighter.js +39 -0
  45. package/dist/highlighter/DiffsHighlighter.js.map +1 -0
  46. package/dist/highlighter/backends/highlights.d.ts +26 -0
  47. package/dist/highlighter/backends/highlights.d.ts.map +1 -0
  48. package/dist/highlighter/backends/highlights.js +71 -0
  49. package/dist/highlighter/backends/highlights.js.map +1 -0
  50. package/dist/highlighter/backends/shiki.d.ts +27 -0
  51. package/dist/highlighter/backends/shiki.d.ts.map +1 -0
  52. package/dist/highlighter/backends/shiki.js +107 -0
  53. package/dist/highlighter/backends/shiki.js.map +1 -0
  54. package/dist/highlighter/highlighterType.d.ts +13 -0
  55. package/dist/highlighter/highlighterType.d.ts.map +1 -0
  56. package/dist/highlighter/highlighterType.js +32 -0
  57. package/dist/highlighter/highlighterType.js.map +1 -0
  58. package/dist/highlighter/highlights-editor.d.ts +24 -0
  59. package/dist/highlighter/highlights-editor.d.ts.map +1 -0
  60. package/dist/highlighter/highlights-editor.js +166 -0
  61. package/dist/highlighter/highlights-editor.js.map +1 -0
  62. package/dist/highlighter/highlights-stream.d.ts +20 -0
  63. package/dist/highlighter/highlights-stream.d.ts.map +1 -0
  64. package/dist/highlighter/highlights-stream.js +93 -0
  65. package/dist/highlighter/highlights-stream.js.map +1 -0
  66. package/dist/highlighter/languages/areLanguagesAttached.d.ts +2 -1
  67. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  68. package/dist/highlighter/languages/areLanguagesAttached.js +4 -6
  69. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
  70. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +6 -1
  71. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  72. package/dist/highlighter/languages/attachResolvedLanguages.js +6 -11
  73. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
  74. package/dist/highlighter/languages/constants.d.ts +1 -1
  75. package/dist/highlighter/languages/getResolvedLanguages.d.ts +1 -1
  76. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  77. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  78. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  79. package/dist/highlighter/languages/resolveLanguage.js +19 -16
  80. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  81. package/dist/highlighter/languages/resolveLanguages.d.ts +1 -1
  82. package/dist/highlighter/shared_highlighter.d.ts +23 -9
  83. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  84. package/dist/highlighter/shared_highlighter.js +59 -47
  85. package/dist/highlighter/shared_highlighter.js.map +1 -1
  86. package/dist/highlighter/shiki-editor.d.ts +25 -0
  87. package/dist/highlighter/shiki-editor.d.ts.map +1 -0
  88. package/dist/highlighter/shiki-editor.js +483 -0
  89. package/dist/highlighter/shiki-editor.js.map +1 -0
  90. package/dist/highlighter/shiki-stream.d.ts +20 -0
  91. package/dist/highlighter/shiki-stream.d.ts.map +1 -0
  92. package/dist/highlighter/shiki-stream.js +60 -0
  93. package/dist/highlighter/shiki-stream.js.map +1 -0
  94. package/dist/highlighter/stream-tokenizer.d.ts +40 -0
  95. package/dist/highlighter/stream-tokenizer.d.ts.map +1 -0
  96. package/dist/highlighter/stream-tokenizer.js +70 -0
  97. package/dist/highlighter/stream-tokenizer.js.map +1 -0
  98. package/dist/highlighter/themes/areThemesAttached.d.ts +3 -2
  99. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  100. package/dist/highlighter/themes/areThemesAttached.js +5 -4
  101. package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
  102. package/dist/highlighter/themes/attachResolvedThemes.d.ts +5 -2
  103. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  104. package/dist/highlighter/themes/attachResolvedThemes.js +4 -16
  105. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  106. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts +3 -1
  107. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  108. package/dist/highlighter/themes/cleanUpResolvedThemes.js +8 -5
  109. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  110. package/dist/highlighter/themes/createCSSVariablesTheme.d.ts +7 -0
  111. package/dist/highlighter/themes/createCSSVariablesTheme.d.ts.map +1 -0
  112. package/dist/highlighter/themes/createCSSVariablesTheme.js +89 -0
  113. package/dist/highlighter/themes/createCSSVariablesTheme.js.map +1 -0
  114. package/dist/highlighter/themes/createCachedLoader.d.ts +5 -0
  115. package/dist/highlighter/themes/createCachedLoader.d.ts.map +1 -0
  116. package/dist/highlighter/themes/createCachedLoader.js +15 -0
  117. package/dist/highlighter/themes/createCachedLoader.js.map +1 -0
  118. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts +3 -2
  119. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  120. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +4 -4
  121. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  122. package/dist/highlighter/themes/getResolvedThemes.d.ts +3 -2
  123. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  124. package/dist/highlighter/themes/getResolvedThemes.js +4 -3
  125. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  126. package/dist/highlighter/themes/hasResolvedThemes.d.ts +2 -2
  127. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  128. package/dist/highlighter/themes/hasResolvedThemes.js +4 -3
  129. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  130. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  131. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +3 -3
  132. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  133. package/dist/highlighter/themes/registerCustomTheme.d.ts +9 -4
  134. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  135. package/dist/highlighter/themes/registerCustomTheme.js +8 -16
  136. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  137. package/dist/highlighter/themes/resolveTheme.d.ts +3 -2
  138. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  139. package/dist/highlighter/themes/resolveTheme.js +4 -7
  140. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  141. package/dist/highlighter/themes/resolveThemes.d.ts +3 -2
  142. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  143. package/dist/highlighter/themes/resolveThemes.js +4 -7
  144. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  145. package/dist/highlighter/themes/themeResolver.d.ts +10 -4
  146. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
  147. package/dist/highlighter/themes/themeResolver.js +141 -2
  148. package/dist/highlighter/themes/themeResolver.js.map +1 -1
  149. package/dist/highlighter/themes/types.d.ts +23 -0
  150. package/dist/highlighter/themes/types.d.ts.map +1 -0
  151. package/dist/highlighter/themes/types.js +0 -0
  152. package/dist/highlighter/tokenizer-types.d.ts +35 -0
  153. package/dist/highlighter/tokenizer-types.d.ts.map +1 -0
  154. package/dist/highlighter/tokenizer-types.js +0 -0
  155. package/dist/highlighter/types.d.ts +55 -0
  156. package/dist/highlighter/types.d.ts.map +1 -0
  157. package/dist/highlighter/types.js +0 -0
  158. package/dist/index.d.ts +14 -10
  159. package/dist/index.js +16 -18
  160. package/dist/managers/InteractionManager.d.ts.map +1 -1
  161. package/dist/managers/InteractionManager.js +2 -2
  162. package/dist/managers/InteractionManager.js.map +1 -1
  163. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +9 -1
  164. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -1
  165. package/dist/react/CodeView.js +1 -1
  166. package/dist/react/index.d.ts +8 -3
  167. package/dist/renderers/DiffHunksRenderer.d.ts +3 -2
  168. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  169. package/dist/renderers/DiffHunksRenderer.js +50 -24
  170. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  171. package/dist/renderers/FileRenderer.d.ts +2 -1
  172. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  173. package/dist/renderers/FileRenderer.js +33 -24
  174. package/dist/renderers/FileRenderer.js.map +1 -1
  175. package/dist/shiki-stream/index.d.ts +3 -3
  176. package/dist/shiki-stream/index.js +1 -2
  177. package/dist/shiki-stream/stream.d.ts +4 -4
  178. package/dist/shiki-stream/stream.d.ts.map +1 -1
  179. package/dist/shiki-stream/stream.js +20 -9
  180. package/dist/shiki-stream/stream.js.map +1 -1
  181. package/dist/shiki-stream/types.d.ts +7 -38
  182. package/dist/shiki-stream/types.d.ts.map +1 -1
  183. package/dist/ssr/FileDiffReact.js +1 -1
  184. package/dist/ssr/index.d.ts +7 -2
  185. package/dist/ssr/renderHTML.js +2 -2
  186. package/dist/ssr/renderHTML.js.map +1 -1
  187. package/dist/style.js +1 -1
  188. package/dist/style.js.map +1 -1
  189. package/dist/types.d.ts +13 -13
  190. package/dist/types.d.ts.map +1 -1
  191. package/dist/utils/computeVirtualFileMetrics.d.ts +2 -1
  192. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  193. package/dist/utils/computeVirtualFileMetrics.js +5 -3
  194. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  195. package/dist/utils/createSpanNodeFromToken.d.ts +3 -2
  196. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  197. package/dist/utils/createSpanNodeFromToken.js +4 -5
  198. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  199. package/dist/utils/cssWrappers.d.ts.map +1 -1
  200. package/dist/utils/cssWrappers.js +12 -0
  201. package/dist/utils/cssWrappers.js.map +1 -1
  202. package/dist/utils/getDiffHunksRendererOptions.js +1 -0
  203. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  204. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  205. package/dist/utils/getFiletypeFromFileName.js +21 -3
  206. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  207. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  208. package/dist/utils/getHighlighterOptions.js +3 -2
  209. package/dist/utils/getHighlighterOptions.js.map +1 -1
  210. package/dist/utils/getHighlighterThemeStyles.d.ts +2 -1
  211. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  212. package/dist/utils/getHighlighterThemeStyles.js +13 -3
  213. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  214. package/dist/utils/getTokenOptions.d.ts +7 -0
  215. package/dist/utils/getTokenOptions.d.ts.map +1 -0
  216. package/dist/utils/getTokenOptions.js +16 -0
  217. package/dist/utils/getTokenOptions.js.map +1 -0
  218. package/dist/utils/hastToHtml.d.ts +10 -0
  219. package/dist/utils/hastToHtml.d.ts.map +1 -0
  220. package/dist/utils/hastToHtml.js +125 -0
  221. package/dist/utils/hastToHtml.js.map +1 -0
  222. package/dist/utils/parseDiffDecorations.d.ts +2 -1
  223. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  224. package/dist/utils/platform.d.ts +2 -1
  225. package/dist/utils/platform.d.ts.map +1 -1
  226. package/dist/utils/platform.js +6 -1
  227. package/dist/utils/platform.js.map +1 -1
  228. package/dist/utils/renderDiffWithHighlighter.d.ts +3 -2
  229. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  230. package/dist/utils/renderDiffWithHighlighter.js +33 -48
  231. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  232. package/dist/utils/renderFileWithHighlighter.d.ts +3 -2
  233. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  234. package/dist/utils/renderFileWithHighlighter.js +10 -26
  235. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  236. package/dist/utils/renderTokenLines.d.ts +17 -0
  237. package/dist/utils/renderTokenLines.d.ts.map +1 -0
  238. package/dist/utils/renderTokenLines.js +246 -0
  239. package/dist/utils/renderTokenLines.js.map +1 -0
  240. package/dist/utils/resolvePreferredHighlighter.d.ts +13 -0
  241. package/dist/utils/resolvePreferredHighlighter.d.ts.map +1 -0
  242. package/dist/utils/resolvePreferredHighlighter.js +11 -0
  243. package/dist/utils/resolvePreferredHighlighter.js.map +1 -0
  244. package/dist/utils/setDeferredArrayItem.d.ts +5 -0
  245. package/dist/utils/setDeferredArrayItem.d.ts.map +1 -0
  246. package/dist/utils/setDeferredArrayItem.js +39 -0
  247. package/dist/utils/setDeferredArrayItem.js.map +1 -0
  248. package/dist/utils/tokenStyle.d.ts +7 -0
  249. package/dist/utils/tokenStyle.d.ts.map +1 -0
  250. package/dist/utils/tokenStyle.js +28 -0
  251. package/dist/utils/tokenStyle.js.map +1 -0
  252. package/dist/utils/tokensToHtml.d.ts +8 -0
  253. package/dist/utils/tokensToHtml.d.ts.map +1 -0
  254. package/dist/utils/tokensToHtml.js +45 -0
  255. package/dist/utils/tokensToHtml.js.map +1 -0
  256. package/dist/utils/wrapTokenFragments.js.map +1 -1
  257. package/dist/worker/WorkerPoolManager.d.ts +10 -2
  258. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  259. package/dist/worker/WorkerPoolManager.js +85 -60
  260. package/dist/worker/WorkerPoolManager.js.map +1 -1
  261. package/dist/worker/errors.d.ts +35 -0
  262. package/dist/worker/errors.d.ts.map +1 -0
  263. package/dist/worker/errors.js +52 -0
  264. package/dist/worker/errors.js.map +1 -0
  265. package/dist/worker/hastLinesTransport.d.ts +14 -0
  266. package/dist/worker/hastLinesTransport.d.ts.map +1 -0
  267. package/dist/worker/hastLinesTransport.js +156 -0
  268. package/dist/worker/hastLinesTransport.js.map +1 -0
  269. package/dist/worker/highlights-sAHlxqlf.js +317 -0
  270. package/dist/worker/highlights-sAHlxqlf.js.map +1 -0
  271. package/dist/worker/index.d.ts +2 -1
  272. package/dist/worker/index.js +2 -1
  273. package/dist/worker/shiki-Bx2JpdqZ.js +697 -0
  274. package/dist/worker/shiki-Bx2JpdqZ.js.map +1 -0
  275. package/dist/worker/stream-tokenizer-YZ6M1qSx.js +424 -0
  276. package/dist/worker/stream-tokenizer-YZ6M1qSx.js.map +1 -0
  277. package/dist/worker/types.d.ts +18 -3
  278. package/dist/worker/types.d.ts.map +1 -1
  279. package/dist/worker/worker-portable.js +41 -13319
  280. package/dist/worker/worker-portable.js.map +1 -1
  281. package/dist/worker/worker.js +693 -352
  282. package/dist/worker/worker.js.map +1 -1
  283. package/dist/worker/workerMessage.d.ts +24 -0
  284. package/dist/worker/workerMessage.d.ts.map +1 -0
  285. package/dist/worker/workerMessage.js +0 -0
  286. package/package.json +33 -29
  287. package/dist/highlighter/themes/constants.d.ts +0 -5
  288. package/dist/highlighter/themes/constants.d.ts.map +0 -1
  289. package/dist/highlighter/themes/constants.js +0 -6
  290. package/dist/highlighter/themes/constants.js.map +0 -1
  291. package/dist/highlighter/themes/themeResolution.d.ts +0 -7
  292. package/dist/highlighter/themes/themeResolution.d.ts.map +0 -1
  293. package/dist/highlighter/themes/themeResolution.js +0 -21
  294. package/dist/highlighter/themes/themeResolution.js.map +0 -1
  295. package/dist/shiki-stream/tokenizer.d.ts +0 -23
  296. package/dist/shiki-stream/tokenizer.d.ts.map +0 -1
  297. package/dist/shiki-stream/tokenizer.js +0 -72
  298. package/dist/shiki-stream/tokenizer.js.map +0 -1
  299. package/dist/utils/createTransformerWithState.d.ts +0 -12
  300. package/dist/utils/createTransformerWithState.d.ts.map +0 -1
  301. package/dist/utils/createTransformerWithState.js +0 -89
  302. package/dist/utils/createTransformerWithState.js.map +0 -1
  303. package/dist/worker/wasm-B9ZqxnKj.js +0 -8
  304. package/dist/worker/wasm-B9ZqxnKj.js.map +0 -1
@@ -1,5 +1,6 @@
1
- import { BaseCodeOptions, SupportedLanguages, ThemeTypes, ThemedToken } from "../types.js";
2
- import { RecallToken } from "../shiki-stream/types.js";
1
+ import { RecallToken } from "../highlighter/tokenizer-types.js";
2
+ import { ThemedToken } from "../highlighter/types.js";
3
+ import { BaseCodeOptions, SupportedLanguages, ThemeTypes } from "../types.js";
3
4
  import "../shiki-stream/index.js";
4
5
  //#region src/components/FileStream.d.ts
5
6
  interface FileStreamOptions extends BaseCodeOptions {
@@ -15,8 +16,8 @@ interface FileStreamOptions extends BaseCodeOptions {
15
16
  declare class FileStream {
16
17
  options: FileStreamOptions;
17
18
  readonly __id: string;
18
- private highlighter;
19
19
  private stream;
20
+ private tokenStream;
20
21
  private abortController;
21
22
  private fileContainer;
22
23
  private pre;
@@ -29,7 +30,6 @@ declare class FileStream {
29
30
  constructor(options?: FileStreamOptions);
30
31
  cleanUp(): void;
31
32
  setThemeType(themeType: ThemeTypes): void;
32
- private initializeHighlighter;
33
33
  private queuedSetupArgs;
34
34
  setup(_source: ReadableStream<string>, _wrapper: HTMLElement): Promise<void>;
35
35
  private setupStream;
@@ -37,6 +37,8 @@ declare class FileStream {
37
37
  private handleWrite;
38
38
  private currentLineIndex;
39
39
  private currentLineElement;
40
+ private pendingCarriageReturn;
41
+ private streamClosed;
40
42
  private render;
41
43
  private getOrCreateStreamColumns;
42
44
  private updateRowSpan;
@@ -1 +1 @@
1
- {"version":3,"file":"FileStream.d.ts","names":[],"sources":["../../src/components/FileStream.ts"],"mappings":";;;;UAyBiB,0BAA0B;EACzC,OAAO;EACP;EAEA,aAAa,UAAU;EACvB,cAAc,UAAU;EAExB,eAAe,YAAY;EAC3B,eAAe,OAAO,cAAc;EACpC;EACA,eAAe;;cAKJ;EAeQ,SAAS;WAdnB;UAED;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;EAER,YAAmB,UAAS;EAI5B;EAMA,aAAa,WAAW;UAoBV;UAON;EACF,MACJ,SAAS,wBACT,UAAU,cACT;UAkBK;UA+FA;UACA;UAYA;UACA;UACA;UA8CA;UAqBA;UASA;UAwBA;UAoBA"}
1
+ {"version":3,"file":"FileStream.d.ts","names":[],"sources":["../../src/components/FileStream.ts"],"mappings":";;;;;UAyBiB,0BAA0B;EACzC,OAAO;EACP;EAEA,aAAa,UAAU;EACvB,cAAc,UAAU;EAExB,eAAe,YAAY;EAC3B,eAAe,OAAO,cAAc;EACpC;EACA,eAAe;;cAKJ;EAeQ,SAAS;WAdnB;UAED;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;EAER,YAAmB,UAAS;EAI5B;EAQA,aAAa,WAAW;UAoBhB;EACF,MACJ,SAAS,wBACT,UAAU,cACT;UAwBK;UA4FA;UACA;UAYA;UACA;UACA;UACA;UACA;UA4DA;UAqBA;UASA;UAwBA;UAoBA"}
@@ -2,8 +2,8 @@ import { DEFAULT_THEMES } from "../constants.js";
2
2
  import { getSharedHighlighter } from "../highlighter/shared_highlighter.js";
3
3
  import { dequeueRender, queueRender } from "../managers/UniversalRenderingManager.js";
4
4
  import { getHighlighterOptions } from "../utils/getHighlighterOptions.js";
5
- import { formatCSSVariablePrefix } from "../utils/formatCSSVariablePrefix.js";
6
5
  import { getHighlighterThemeStyles } from "../utils/getHighlighterThemeStyles.js";
6
+ import { getTokenOptions } from "../utils/getTokenOptions.js";
7
7
  import { getMeasuredScrollbarGutter } from "../utils/scrollbarGutter.js";
8
8
  import { wrapThemeCSS } from "../utils/cssWrappers.js";
9
9
  import { getOrCreateCodeNode } from "../utils/getOrCreateCodeNode.js";
@@ -16,8 +16,8 @@ let instanceId = -1;
16
16
  var FileStream = class {
17
17
  options;
18
18
  __id = `file-stream:${++instanceId}`;
19
- highlighter;
20
19
  stream;
20
+ tokenStream;
21
21
  abortController;
22
22
  fileContainer;
23
23
  pre;
@@ -35,6 +35,8 @@ var FileStream = class {
35
35
  dequeueRender(this.render);
36
36
  this.abortController?.abort();
37
37
  this.abortController = void 0;
38
+ this.tokenStream?.tokenizer.dispose();
39
+ this.tokenStream = void 0;
38
40
  }
39
41
  setThemeType(themeType) {
40
42
  if ((this.options.themeType ?? "system") === themeType) return;
@@ -45,20 +47,21 @@ var FileStream = class {
45
47
  if (typeof this.options.theme === "string" || this.fileContainer == null || this.appliedThemeCSS == null) return;
46
48
  this.applyThemeState(this.fileContainer, this.appliedThemeCSS.themeStyles, themeType, this.appliedThemeCSS.baseThemeType);
47
49
  }
48
- async initializeHighlighter() {
49
- this.highlighter = await getSharedHighlighter(getHighlighterOptions(this.options.lang, this.options));
50
- return this.highlighter;
51
- }
52
50
  queuedSetupArgs;
53
51
  async setup(_source, _wrapper) {
54
52
  const isSettingUp = this.queuedSetupArgs != null;
55
53
  this.queuedSetupArgs = [_source, _wrapper];
56
54
  if (isSettingUp) return;
57
- this.highlighter ??= await this.initializeHighlighter();
55
+ let highlighter;
56
+ try {
57
+ highlighter = await getSharedHighlighter(getHighlighterOptions(this.options.lang, this.options));
58
+ } catch (error) {
59
+ this.queuedSetupArgs = void 0;
60
+ throw error;
61
+ }
58
62
  const [source, wrapper] = this.queuedSetupArgs;
59
63
  this.queuedSetupArgs = void 0;
60
- const stream = source;
61
- this.setupStream(stream, wrapper, this.highlighter);
64
+ this.setupStream(source, wrapper, highlighter);
62
65
  }
63
66
  setupStream(stream, wrapper, highlighter) {
64
67
  const { disableLineNumbers = false, overflow = "scroll", theme = DEFAULT_THEMES, themeType = "system" } = this.options;
@@ -92,32 +95,30 @@ var FileStream = class {
92
95
  this.currentRowCount = 0;
93
96
  this.currentLineElement = void 0;
94
97
  this.currentLineIndex = this.options.startingLineIndex ?? 1;
98
+ this.pendingCarriageReturn = false;
99
+ this.streamClosed = false;
95
100
  this.abortController?.abort();
101
+ this.tokenStream?.tokenizer.dispose();
102
+ this.queuedTokens = [];
96
103
  this.abortController = new AbortController();
97
104
  const { onStreamStart, onStreamClose, onStreamAbort } = this.options;
98
105
  this.stream?.cancel().catch(() => {});
99
106
  this.stream = stream;
100
- this.stream.pipeThrough(typeof theme === "string" ? new CodeToTokenTransformStream({
101
- ...this.options,
102
- theme,
103
- highlighter,
104
- allowRecalls: true,
105
- defaultColor: false,
106
- cssVariablePrefix: formatCSSVariablePrefix("token"),
107
- tokenizeTimeLimit: 0
108
- }) : new CodeToTokenTransformStream({
109
- ...this.options,
110
- themes: theme,
107
+ const tokenStream = new CodeToTokenTransformStream({
108
+ ...getTokenOptions(this.options.lang ?? "text", theme, this.options.tokenizeMaxLineLength),
111
109
  highlighter,
112
- allowRecalls: true,
113
- defaultColor: false,
114
- cssVariablePrefix: formatCSSVariablePrefix("token"),
115
- tokenizeTimeLimit: 0
116
- })).pipeTo(new WritableStream({
110
+ allowRecalls: true
111
+ });
112
+ this.tokenStream = tokenStream;
113
+ this.stream.pipeThrough(tokenStream).pipeTo(new WritableStream({
117
114
  start(controller) {
118
115
  onStreamStart?.(controller);
119
116
  },
120
- close() {
117
+ close: () => {
118
+ if (this.tokenStream === tokenStream) {
119
+ this.streamClosed = true;
120
+ queueRender(this.render);
121
+ }
121
122
  onStreamClose?.();
122
123
  },
123
124
  abort(reason) {
@@ -126,7 +127,7 @@ var FileStream = class {
126
127
  write: this.handleWrite
127
128
  }), { signal: this.abortController.signal }).catch((error) => {
128
129
  if (error.name !== "AbortError") console.error("FileStream pipe error:", error);
129
- });
130
+ }).finally(() => tokenStream.tokenizer.dispose());
130
131
  }
131
132
  queuedTokens = [];
132
133
  handleWrite = (token) => {
@@ -137,30 +138,42 @@ var FileStream = class {
137
138
  };
138
139
  currentLineIndex;
139
140
  currentLineElement;
141
+ pendingCarriageReturn = false;
142
+ streamClosed = false;
140
143
  render = () => {
141
144
  this.options.onPreRender?.(this);
142
145
  const { gutter, content } = this.getOrCreateStreamColumns();
143
146
  const gutterFragment = document.createDocumentFragment();
144
147
  const contentFragment = document.createDocumentFragment();
148
+ const cacheHtmlStyle = this.tokenStream?.options.highlighter.name === "highlights";
149
+ const appendLine = () => {
150
+ const { gutterLine, contentLine } = this.createLine();
151
+ gutterFragment.appendChild(gutterLine);
152
+ contentFragment.appendChild(contentLine);
153
+ };
145
154
  for (const token of this.queuedTokens) if ("recall" in token) {
146
155
  if (this.currentLineElement == null) throw new Error("FileStream.render: no current line element, shouldnt be possible to get here");
147
156
  if (token.recall > this.currentLineElement.childNodes.length) throw new Error(`FileStream.render: Token recall exceed the current line, there's probably a bug...`);
148
157
  for (let i = 0; i < token.recall; i++) this.currentLineElement.lastChild?.remove();
158
+ if (token.recall > 0) this.pendingCarriageReturn = false;
149
159
  } else {
150
- const span = createSpanFromToken(token);
151
- if (this.currentLineElement == null) {
152
- const { gutterLine, contentLine } = this.createLine();
153
- gutterFragment.appendChild(gutterLine);
154
- contentFragment.appendChild(contentLine);
155
- }
160
+ const span = createSpanFromToken(token, cacheHtmlStyle);
161
+ if (this.pendingCarriageReturn && token.content !== "\n") {
162
+ this.currentLineIndex++;
163
+ appendLine();
164
+ } else if (this.currentLineElement == null) appendLine();
156
165
  this.currentLineElement?.appendChild(span);
166
+ this.pendingCarriageReturn = token.content === "\r";
157
167
  if (token.content === "\n") {
158
168
  this.currentLineIndex++;
159
- const { gutterLine, contentLine } = this.createLine();
160
- gutterFragment.appendChild(gutterLine);
161
- contentFragment.appendChild(contentLine);
169
+ appendLine();
162
170
  }
163
171
  }
172
+ if (this.streamClosed && this.pendingCarriageReturn) {
173
+ this.pendingCarriageReturn = false;
174
+ this.currentLineIndex++;
175
+ appendLine();
176
+ }
164
177
  if (gutterFragment.childNodes.length > 0) gutter.appendChild(gutterFragment);
165
178
  if (contentFragment.childNodes.length > 0) content.appendChild(contentFragment);
166
179
  this.queuedTokens.length = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"FileStream.js","names":[],"sources":["../../src/components/FileStream.ts"],"sourcesContent":["import { DEFAULT_THEMES, DIFFS_TAG_NAME } from '../constants';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport {\n dequeueRender,\n queueRender,\n} from '../managers/UniversalRenderingManager';\nimport { CodeToTokenTransformStream, type RecallToken } from '../shiki-stream';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n DiffsHighlighter,\n SupportedLanguages,\n ThemedToken,\n ThemeTypes,\n} from '../types';\nimport { createSpanFromToken } from '../utils/createSpanNodeFromToken';\nimport { wrapThemeCSS } from '../utils/cssWrappers';\nimport { formatCSSVariablePrefix } from '../utils/formatCSSVariablePrefix';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHighlighterThemeStyles } from '../utils/getHighlighterThemeStyles';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { getMeasuredScrollbarGutter } from '../utils/scrollbarGutter';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\n\nexport interface FileStreamOptions extends BaseCodeOptions {\n lang?: SupportedLanguages;\n startingLineIndex?: number;\n\n onPreRender?(instance: FileStream): unknown;\n onPostRender?(instance: FileStream): unknown;\n\n onStreamStart?(controller: WritableStreamDefaultController): unknown;\n onStreamWrite?(token: ThemedToken | RecallToken): unknown;\n onStreamClose?(): unknown;\n onStreamAbort?(reason: unknown): unknown;\n}\n\nlet instanceId = -1;\n\nexport class FileStream {\n readonly __id: string = `file-stream:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private stream: ReadableStream<string> | undefined;\n private abortController: AbortController | undefined;\n private fileContainer: HTMLElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private gutterElement: HTMLElement | undefined;\n private contentElement: HTMLElement | undefined;\n private themeCSSStyle: HTMLStyleElement | undefined;\n private appliedThemeCSS: AppliedThemeStyleCache | undefined;\n private currentRowCount = 0;\n\n constructor(public options: FileStreamOptions = { theme: DEFAULT_THEMES }) {\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n }\n\n cleanUp(): void {\n dequeueRender(this.render);\n this.abortController?.abort();\n this.abortController = undefined;\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.options = { ...this.options, themeType };\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.options.lang, this.options)\n );\n return this.highlighter;\n }\n\n private queuedSetupArgs: [ReadableStream<string>, HTMLElement] | undefined;\n async setup(\n _source: ReadableStream<string>,\n _wrapper: HTMLElement\n ): Promise<void> {\n const isSettingUp = this.queuedSetupArgs != null;\n this.queuedSetupArgs = [_source, _wrapper];\n if (isSettingUp) {\n // TODO(amadeus): Make it so that this function can be properly\n // awaitable, maybe?\n return;\n }\n this.highlighter ??= await this.initializeHighlighter();\n\n const [source, wrapper] = this.queuedSetupArgs;\n this.queuedSetupArgs = undefined;\n\n const stream = source;\n\n this.setupStream(stream, wrapper, this.highlighter);\n }\n\n private setupStream(\n stream: ReadableStream<string>,\n wrapper: HTMLElement,\n highlighter: DiffsHighlighter\n ): void {\n const {\n disableLineNumbers = false,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n } = this.options;\n const fileContainer = this.getOrCreateFileContainer();\n if (fileContainer.parentElement == null) {\n wrapper.appendChild(fileContainer);\n }\n this.pre ??= document.createElement('pre');\n if (this.pre.parentElement == null) {\n fileContainer.shadowRoot?.appendChild(this.pre);\n }\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const themeStyles = getHighlighterThemeStyles({ theme, highlighter });\n this.applyThemeState(fileContainer, themeStyles, themeType, baseThemeType);\n const pre = setPreNodeProperties(this.pre, {\n type: 'file',\n diffIndicators: 'none',\n disableBackground: true,\n disableLineNumbers,\n overflow,\n split: false,\n totalLines: 0,\n });\n pre.textContent = '';\n\n this.pre = pre;\n this.code = getOrCreateCodeNode({ code: this.code, pre });\n this.gutterElement = undefined;\n this.contentElement = undefined;\n this.currentRowCount = 0;\n this.currentLineElement = undefined;\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { onStreamStart, onStreamClose, onStreamAbort } = this.options;\n // Cancel the prior source so upstream producers stop generating tokens.\n // Swallow AbortError / locked-stream rejections since we're tearing down.\n this.stream?.cancel().catch(() => {});\n this.stream = stream;\n this.stream\n // tokenizeTimeLimit: 0 — never trade silently-wrong token colors for\n // latency; see renderFileWithHighlighter for the full rationale.\n .pipeThrough(\n typeof theme === 'string'\n ? new CodeToTokenTransformStream({\n ...this.options,\n theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n })\n : new CodeToTokenTransformStream({\n ...this.options,\n themes: theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n })\n )\n .pipeTo(\n new WritableStream({\n start(controller) {\n onStreamStart?.(controller);\n },\n close() {\n onStreamClose?.();\n },\n abort(reason) {\n onStreamAbort?.(reason);\n },\n write: this.handleWrite,\n }),\n { signal: this.abortController.signal }\n )\n .catch((error) => {\n // Ignore AbortError - it's expected when cleaning up\n if (error.name !== 'AbortError') {\n console.error('FileStream pipe error:', error);\n }\n });\n }\n\n private queuedTokens: (ThemedToken | RecallToken)[] = [];\n private handleWrite = (token: ThemedToken | RecallToken) => {\n // If we've recalled tokens we haven't rendered yet, we can just yeet them\n // and never apply them\n if ('recall' in token && this.queuedTokens.length >= token.recall) {\n this.queuedTokens.length = this.queuedTokens.length - token.recall;\n } else {\n this.queuedTokens.push(token);\n }\n queueRender(this.render);\n this.options.onStreamWrite?.(token);\n };\n\n private currentLineIndex: number;\n private currentLineElement: HTMLElement | undefined;\n private render = () => {\n this.options.onPreRender?.(this);\n const { gutter, content } = this.getOrCreateStreamColumns();\n const gutterFragment = document.createDocumentFragment();\n const contentFragment = document.createDocumentFragment();\n for (const token of this.queuedTokens) {\n if ('recall' in token) {\n if (this.currentLineElement == null) {\n throw new Error(\n 'FileStream.render: no current line element, shouldnt be possible to get here'\n );\n }\n if (token.recall > this.currentLineElement.childNodes.length) {\n throw new Error(\n `FileStream.render: Token recall exceed the current line, there's probably a bug...`\n );\n }\n for (let i = 0; i < token.recall; i++) {\n this.currentLineElement.lastChild?.remove();\n }\n } else {\n const span = createSpanFromToken(token);\n if (this.currentLineElement == null) {\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n }\n this.currentLineElement?.appendChild(span);\n if (token.content === '\\n') {\n this.currentLineIndex++;\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n }\n }\n }\n if (gutterFragment.childNodes.length > 0) {\n gutter.appendChild(gutterFragment);\n }\n if (contentFragment.childNodes.length > 0) {\n content.appendChild(contentFragment);\n }\n this.queuedTokens.length = 0;\n this.options.onPostRender?.(this);\n };\n\n private getOrCreateStreamColumns(): {\n gutter: HTMLElement;\n content: HTMLElement;\n } {\n if (this.code == null) {\n throw new Error('FileStream: expected code element to exist');\n }\n if (this.gutterElement != null && this.contentElement != null) {\n return { gutter: this.gutterElement, content: this.contentElement };\n }\n const gutter = document.createElement('div');\n gutter.dataset.gutter = '';\n const content = document.createElement('div');\n content.dataset.content = '';\n this.code.appendChild(gutter);\n this.code.appendChild(content);\n this.gutterElement = gutter;\n this.contentElement = content;\n return { gutter, content };\n }\n\n private updateRowSpan(): void {\n if (this.gutterElement != null) {\n this.gutterElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n if (this.contentElement != null) {\n this.contentElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n }\n\n private createLine(): { gutterLine: HTMLElement; contentLine: HTMLElement } {\n const lineNumber = this.currentLineIndex;\n const lineIndex = `${lineNumber - 1}`;\n const gutterLine = document.createElement('div');\n gutterLine.dataset.columnNumber = `${lineNumber}`;\n gutterLine.dataset.lineType = 'context';\n gutterLine.dataset.lineIndex = lineIndex;\n\n const numberContent = document.createElement('span');\n numberContent.dataset.lineNumberContent = '';\n numberContent.textContent = `${lineNumber}`;\n gutterLine.appendChild(numberContent);\n\n const contentLine = document.createElement('div');\n contentLine.dataset.line = `${lineNumber}`;\n contentLine.dataset.lineType = 'context';\n contentLine.dataset.lineIndex = lineIndex;\n\n this.currentRowCount += 1;\n this.updateRowSpan();\n this.currentLineElement = contentLine;\n return { gutterLine, contentLine };\n }\n\n private getOrCreateFileContainer(fileContainer?: HTMLElement): HTMLElement {\n if (\n (fileContainer != null && fileContainer === this.fileContainer) ||\n (fileContainer == null && this.fileContainer != null)\n ) {\n return this.fileContainer;\n }\n if (\n this.fileContainer != null &&\n fileContainer != null &&\n fileContainer !== this.fileContainer\n ) {\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n }\n this.fileContainer =\n fileContainer ?? document.createElement(DIFFS_TAG_NAME);\n return this.fileContainer;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.options.theme ?? DEFAULT_THEMES;\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n const scrollbarGutter = getMeasuredScrollbarGutter(shadowRoot);\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType &&\n this.appliedThemeCSS.scrollbarGutter === scrollbarGutter\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType, scrollbarGutter),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n }\n : undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileStream.js","names":[],"sources":["../../src/components/FileStream.ts"],"sourcesContent":["import { DEFAULT_THEMES, DIFFS_TAG_NAME } from '../constants';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport {\n dequeueRender,\n queueRender,\n} from '../managers/UniversalRenderingManager';\nimport { CodeToTokenTransformStream, type RecallToken } from '../shiki-stream';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n DiffsHighlighter,\n SupportedLanguages,\n ThemedToken,\n ThemeTypes,\n} from '../types';\nimport { createSpanFromToken } from '../utils/createSpanNodeFromToken';\nimport { wrapThemeCSS } from '../utils/cssWrappers';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHighlighterThemeStyles } from '../utils/getHighlighterThemeStyles';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { getTokenOptions } from '../utils/getTokenOptions';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { getMeasuredScrollbarGutter } from '../utils/scrollbarGutter';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\n\nexport interface FileStreamOptions extends BaseCodeOptions {\n lang?: SupportedLanguages;\n startingLineIndex?: number;\n\n onPreRender?(instance: FileStream): unknown;\n onPostRender?(instance: FileStream): unknown;\n\n onStreamStart?(controller: WritableStreamDefaultController): unknown;\n onStreamWrite?(token: ThemedToken | RecallToken): unknown;\n onStreamClose?(): unknown;\n onStreamAbort?(reason: unknown): unknown;\n}\n\nlet instanceId = -1;\n\nexport class FileStream {\n readonly __id: string = `file-stream:${++instanceId}`;\n\n private stream: ReadableStream<string> | undefined;\n private tokenStream: CodeToTokenTransformStream | undefined;\n private abortController: AbortController | undefined;\n private fileContainer: HTMLElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private gutterElement: HTMLElement | undefined;\n private contentElement: HTMLElement | undefined;\n private themeCSSStyle: HTMLStyleElement | undefined;\n private appliedThemeCSS: AppliedThemeStyleCache | undefined;\n private currentRowCount = 0;\n\n constructor(public options: FileStreamOptions = { theme: DEFAULT_THEMES }) {\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n }\n\n cleanUp(): void {\n dequeueRender(this.render);\n this.abortController?.abort();\n this.abortController = undefined;\n this.tokenStream?.tokenizer.dispose();\n this.tokenStream = undefined;\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.options = { ...this.options, themeType };\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n }\n\n private queuedSetupArgs: [ReadableStream<string>, HTMLElement] | undefined;\n async setup(\n _source: ReadableStream<string>,\n _wrapper: HTMLElement\n ): Promise<void> {\n const isSettingUp = this.queuedSetupArgs != null;\n this.queuedSetupArgs = [_source, _wrapper];\n if (isSettingUp) {\n // TODO(amadeus): Make it so that this function can be properly\n // awaitable, maybe?\n return;\n }\n let highlighter: DiffsHighlighter;\n try {\n highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.options.lang, this.options)\n );\n } catch (error) {\n this.queuedSetupArgs = undefined;\n throw error;\n }\n\n const [source, wrapper] = this.queuedSetupArgs;\n this.queuedSetupArgs = undefined;\n\n this.setupStream(source, wrapper, highlighter);\n }\n\n private setupStream(\n stream: ReadableStream<string>,\n wrapper: HTMLElement,\n highlighter: DiffsHighlighter\n ): void {\n const {\n disableLineNumbers = false,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n } = this.options;\n const fileContainer = this.getOrCreateFileContainer();\n if (fileContainer.parentElement == null) {\n wrapper.appendChild(fileContainer);\n }\n this.pre ??= document.createElement('pre');\n if (this.pre.parentElement == null) {\n fileContainer.shadowRoot?.appendChild(this.pre);\n }\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const themeStyles = getHighlighterThemeStyles({ theme, highlighter });\n this.applyThemeState(fileContainer, themeStyles, themeType, baseThemeType);\n const pre = setPreNodeProperties(this.pre, {\n type: 'file',\n diffIndicators: 'none',\n disableBackground: true,\n disableLineNumbers,\n overflow,\n split: false,\n totalLines: 0,\n });\n pre.textContent = '';\n\n this.pre = pre;\n this.code = getOrCreateCodeNode({ code: this.code, pre });\n this.gutterElement = undefined;\n this.contentElement = undefined;\n this.currentRowCount = 0;\n this.currentLineElement = undefined;\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n this.pendingCarriageReturn = false;\n this.streamClosed = false;\n this.abortController?.abort();\n this.tokenStream?.tokenizer.dispose();\n this.queuedTokens = [];\n this.abortController = new AbortController();\n const { onStreamStart, onStreamClose, onStreamAbort } = this.options;\n // Cancel the prior source so upstream producers stop generating tokens.\n // Swallow AbortError / locked-stream rejections since we're tearing down.\n this.stream?.cancel().catch(() => {});\n this.stream = stream;\n const tokenStream = new CodeToTokenTransformStream({\n ...getTokenOptions(\n this.options.lang ?? 'text',\n theme,\n this.options.tokenizeMaxLineLength\n ),\n highlighter,\n allowRecalls: true,\n });\n this.tokenStream = tokenStream;\n this.stream\n .pipeThrough(tokenStream)\n .pipeTo(\n new WritableStream({\n start(controller) {\n onStreamStart?.(controller);\n },\n close: () => {\n if (this.tokenStream === tokenStream) {\n this.streamClosed = true;\n queueRender(this.render);\n }\n onStreamClose?.();\n },\n abort(reason) {\n onStreamAbort?.(reason);\n },\n write: this.handleWrite,\n }),\n { signal: this.abortController.signal }\n )\n .catch((error) => {\n // Ignore AbortError - it's expected when cleaning up\n if (error.name !== 'AbortError') {\n console.error('FileStream pipe error:', error);\n }\n })\n .finally(() => tokenStream.tokenizer.dispose());\n }\n\n private queuedTokens: (ThemedToken | RecallToken)[] = [];\n private handleWrite = (token: ThemedToken | RecallToken) => {\n // If we've recalled tokens we haven't rendered yet, we can just yeet them\n // and never apply them\n if ('recall' in token && this.queuedTokens.length >= token.recall) {\n this.queuedTokens.length = this.queuedTokens.length - token.recall;\n } else {\n this.queuedTokens.push(token);\n }\n queueRender(this.render);\n this.options.onStreamWrite?.(token);\n };\n\n private currentLineIndex: number;\n private currentLineElement: HTMLElement | undefined;\n private pendingCarriageReturn = false;\n private streamClosed = false;\n private render = () => {\n this.options.onPreRender?.(this);\n const { gutter, content } = this.getOrCreateStreamColumns();\n const gutterFragment = document.createDocumentFragment();\n const contentFragment = document.createDocumentFragment();\n const cacheHtmlStyle =\n this.tokenStream?.options.highlighter.name === 'highlights';\n const appendLine = () => {\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n };\n for (const token of this.queuedTokens) {\n if ('recall' in token) {\n if (this.currentLineElement == null) {\n throw new Error(\n 'FileStream.render: no current line element, shouldnt be possible to get here'\n );\n }\n if (token.recall > this.currentLineElement.childNodes.length) {\n throw new Error(\n `FileStream.render: Token recall exceed the current line, there's probably a bug...`\n );\n }\n for (let i = 0; i < token.recall; i++) {\n this.currentLineElement.lastChild?.remove();\n }\n if (token.recall > 0) this.pendingCarriageReturn = false;\n } else {\n const span = createSpanFromToken(token, cacheHtmlStyle);\n // Delay the CR's row break so recalls can remove it and CRLF counts once.\n if (this.pendingCarriageReturn && token.content !== '\\n') {\n this.currentLineIndex++;\n appendLine();\n } else if (this.currentLineElement == null) {\n appendLine();\n }\n this.currentLineElement?.appendChild(span);\n this.pendingCarriageReturn = token.content === '\\r';\n if (token.content === '\\n') {\n this.currentLineIndex++;\n appendLine();\n }\n }\n }\n if (this.streamClosed && this.pendingCarriageReturn) {\n this.pendingCarriageReturn = false;\n this.currentLineIndex++;\n appendLine();\n }\n if (gutterFragment.childNodes.length > 0) {\n gutter.appendChild(gutterFragment);\n }\n if (contentFragment.childNodes.length > 0) {\n content.appendChild(contentFragment);\n }\n this.queuedTokens.length = 0;\n this.options.onPostRender?.(this);\n };\n\n private getOrCreateStreamColumns(): {\n gutter: HTMLElement;\n content: HTMLElement;\n } {\n if (this.code == null) {\n throw new Error('FileStream: expected code element to exist');\n }\n if (this.gutterElement != null && this.contentElement != null) {\n return { gutter: this.gutterElement, content: this.contentElement };\n }\n const gutter = document.createElement('div');\n gutter.dataset.gutter = '';\n const content = document.createElement('div');\n content.dataset.content = '';\n this.code.appendChild(gutter);\n this.code.appendChild(content);\n this.gutterElement = gutter;\n this.contentElement = content;\n return { gutter, content };\n }\n\n private updateRowSpan(): void {\n if (this.gutterElement != null) {\n this.gutterElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n if (this.contentElement != null) {\n this.contentElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n }\n\n private createLine(): { gutterLine: HTMLElement; contentLine: HTMLElement } {\n const lineNumber = this.currentLineIndex;\n const lineIndex = `${lineNumber - 1}`;\n const gutterLine = document.createElement('div');\n gutterLine.dataset.columnNumber = `${lineNumber}`;\n gutterLine.dataset.lineType = 'context';\n gutterLine.dataset.lineIndex = lineIndex;\n\n const numberContent = document.createElement('span');\n numberContent.dataset.lineNumberContent = '';\n numberContent.textContent = `${lineNumber}`;\n gutterLine.appendChild(numberContent);\n\n const contentLine = document.createElement('div');\n contentLine.dataset.line = `${lineNumber}`;\n contentLine.dataset.lineType = 'context';\n contentLine.dataset.lineIndex = lineIndex;\n\n this.currentRowCount += 1;\n this.updateRowSpan();\n this.currentLineElement = contentLine;\n return { gutterLine, contentLine };\n }\n\n private getOrCreateFileContainer(fileContainer?: HTMLElement): HTMLElement {\n if (\n (fileContainer != null && fileContainer === this.fileContainer) ||\n (fileContainer == null && this.fileContainer != null)\n ) {\n return this.fileContainer;\n }\n if (\n this.fileContainer != null &&\n fileContainer != null &&\n fileContainer !== this.fileContainer\n ) {\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n }\n this.fileContainer =\n fileContainer ?? document.createElement(DIFFS_TAG_NAME);\n return this.fileContainer;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.options.theme ?? DEFAULT_THEMES;\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n const scrollbarGutter = getMeasuredScrollbarGutter(shadowRoot);\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType &&\n this.appliedThemeCSS.scrollbarGutter === scrollbarGutter\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType, scrollbarGutter),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n }\n : undefined;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedFile.d.ts","names":[],"sources":["../../src/components/VirtualizedFile.ts"],"mappings":";;;;;;;;cA8Ea,gBACX,yBACA,2BACQ,KAAK,aAAa;UAyBhB;UACA;WAzBQ;WACF;EAET;EACA;UACC;UAUA;UACA;UACA;UACA;UACA;UACA;EAER,YACE,SAAS,YAAY,aAAa,oBAC1B,aAAa,cAAc,SAAS,aAAa,QACjD,UAAS,oBACjB,gBAAgB,mBAChB;EAKK,WACL,UAAU,QAAQ,qBAClB;EAWO,mBACP,iBAAiB,eAAe;UAS1B;YAiBW,qCACjB,iBAAiB,eAAe;UAS1B;UASA;EAYD,cAAc,mBAAmB;EAS/B,WACP,SAAS,YAAY,aAAa;EA4B3B,aAAa,WAAW;UAUzB;UAyBA;EAkCD;EAoHA,WAAQ;EAYR,qBACL,MAAM,cACN,aACA,QAAQ,4BACR,kBAAkB,eAAe;UA6C3B;EAID,gBACL;IACG;IAAa;;EA6CX,qBAAqB,cAAc;EAMnC,uBACL,2BACC;EAgFI;EAIA,uBACL,cAAc,eACb;EAyCM,QAAQ;UAiCT;EAsED,cAAc;EAcZ;EAwBF;EAYE,oBACP,cAAc,qBAAqB,cACnC,qBAAqB,eAAe,gBACpC;EAoCO,SACP,eACA,MACA,aACA,oBACG,SACF,gBAAgB;YA4FA;UAiBX;EA0BD;YAIY;YAMA;UAIX;UAIA;UAIA;UAWA;UAiCA;UAuCA;UASA;UAIA;UAIA;UAIA"}
1
+ {"version":3,"file":"VirtualizedFile.d.ts","names":[],"sources":["../../src/components/VirtualizedFile.ts"],"mappings":";;;;;;;;cA+Ea,gBACX,yBACA,2BACQ,KAAK,aAAa;UAyBhB;UACA;WAzBQ;WACF;EAET;EACA;UACC;UAUA;UACA;UACA;UACA;UACA;UACA;EAER,YACE,SAAS,YAAY,aAAa,oBAC1B,aAAa,cAAc,SAAS,aAAa,QACjD,UAAS,oBACjB,gBAAgB,mBAChB;EAKK,WACL,UAAU,QAAQ,qBAClB;EAWO,mBACP,iBAAiB,eAAe;UAS1B;YAiBW,qCACjB,iBAAiB,eAAe;UAS1B;UASA;EAYD,cAAc,mBAAmB;EAS/B,WACP,SAAS,YAAY,aAAa;EA4B3B,aAAa,WAAW;UAUzB;UAyBA;EAkCD;EAoHA,WAAQ;EAYR,qBACL,MAAM,cACN,aACA,QAAQ,4BACR,kBAAkB,eAAe;UA6C3B;EAID,gBACL;IACG;IAAa;;EAmDX,qBAAqB,cAAc;EAMnC,uBACL,2BACC;EAgFI;EAIA,uBACL,cAAc,eACb;EAyCM,QAAQ;UAiCT;EA0ED,cAAc;EAcZ;EAwBF;EAYE,oBACP,cAAc,qBAAqB,cACnC,qBAAqB,eAAe,gBACpC;EAoCO,SACP,eACA,MACA,aACA,oBACG,SACF,gBAAgB;YA4FA;UAiBX;EA0BD;YAIY;YAMA;UAIX;UAIA;UAIA;UAWA;UAiCA;UAuCA;UASA;UAIA;UAIA;UAIA"}
@@ -2,7 +2,7 @@ import { DEFAULT_VIRTUAL_FILE_METRICS } from "../constants.js";
2
2
  import { areObjectsEqual } from "../utils/areObjectsEqual.js";
3
3
  import { areOptionsEqual } from "../utils/areOptionsEqual.js";
4
4
  import { areFileTargetsEqual } from "../utils/areFileTargetsEqual.js";
5
- import { computeVirtualFileMetrics, getVirtualFileHeaderRegion, getVirtualFilePaddingBottom } from "../utils/computeVirtualFileMetrics.js";
5
+ import { computeVirtualFileMetrics, getVirtualFileHeaderHeight, getVirtualFileHeaderRegion, getVirtualFilePaddingBottom } from "../utils/computeVirtualFileMetrics.js";
6
6
  import { FILE_ANNOTATION_DOM_KEY, includesFileAnnotations, shouldRenderFileAnnotations } from "../utils/includesFileAnnotations.js";
7
7
  import { File } from "./File.js";
8
8
  //#region src/components/VirtualizedFile.ts
@@ -199,8 +199,12 @@ var VirtualizedFile = class extends File {
199
199
  if (file == null || lineNumber < 1) return;
200
200
  const { disableFileHeader = false, collapsed = false } = this.options;
201
201
  const lastLineIndex = this.fileRenderer.getLineCount(file) - 1;
202
+ if (collapsed) return {
203
+ top: getVirtualFileHeaderHeight(this.metrics, disableFileHeader),
204
+ height: 0
205
+ };
202
206
  let top = getVirtualFileHeaderRegion(this.metrics, disableFileHeader);
203
- if (collapsed || lastLineIndex < 0) return {
207
+ if (lastLineIndex < 0) return {
204
208
  top,
205
209
  height: 0
206
210
  };
@@ -301,13 +305,14 @@ var VirtualizedFile = class extends File {
301
305
  const { disableFileHeader = false, collapsed = false } = this.options;
302
306
  const { lineHeight } = this.metrics;
303
307
  const lineCount = this.fileRenderer.getLineCount(file);
304
- const headerRegion = getVirtualFileHeaderRegion(this.metrics, disableFileHeader);
305
- const paddingBottom = getVirtualFilePaddingBottom(this.metrics);
306
- this.height += headerRegion;
307
308
  if (collapsed) {
309
+ this.height += getVirtualFileHeaderHeight(this.metrics, disableFileHeader);
308
310
  this.layoutDirty = false;
309
311
  return;
310
312
  }
313
+ const headerRegion = getVirtualFileHeaderRegion(this.metrics, disableFileHeader);
314
+ const paddingBottom = getVirtualFilePaddingBottom(this.metrics);
315
+ this.height += headerRegion;
311
316
  this.height += this.cache.fileAnnotationHeight;
312
317
  if (this.hasUniformLineHeights()) this.height += lineCount * lineHeight;
313
318
  else for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) {