@pierre/diffs 1.5.2 → 1.6.0

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 (359) hide show
  1. package/README.md +4 -3
  2. package/dist/components/CodeView.d.ts +3 -2
  3. package/dist/components/CodeView.d.ts.map +1 -1
  4. package/dist/components/CodeView.js +24 -19
  5. package/dist/components/CodeView.js.map +1 -1
  6. package/dist/components/File.d.ts +31 -9
  7. package/dist/components/File.d.ts.map +1 -1
  8. package/dist/components/File.js +176 -90
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +32 -9
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +225 -131
  13. package/dist/components/FileDiff.js.map +1 -1
  14. package/dist/components/FileStream.d.ts +6 -4
  15. package/dist/components/FileStream.d.ts.map +1 -1
  16. package/dist/components/FileStream.js +49 -36
  17. package/dist/components/FileStream.js.map +1 -1
  18. package/dist/components/UnresolvedFile.d.ts +14 -4
  19. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  20. package/dist/components/UnresolvedFile.js +35 -16
  21. package/dist/components/UnresolvedFile.js.map +1 -1
  22. package/dist/components/VirtualizedFile.d.ts +3 -2
  23. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  24. package/dist/components/VirtualizedFile.js +28 -20
  25. package/dist/components/VirtualizedFile.js.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.d.ts +3 -2
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  28. package/dist/components/VirtualizedFileDiff.js +31 -24
  29. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  30. package/dist/constants.d.ts +4 -2
  31. package/dist/constants.d.ts.map +1 -1
  32. package/dist/constants.js +3 -1
  33. package/dist/constants.js.map +1 -1
  34. package/dist/editor/editor.d.ts +2 -1
  35. package/dist/editor/editor.d.ts.map +1 -1
  36. package/dist/editor/editor.js +5 -1
  37. package/dist/editor/editor.js.map +1 -1
  38. package/dist/editor/platform.d.ts +1 -1
  39. package/dist/editor/platform.js +5 -4
  40. package/dist/editor/platform.js.map +1 -1
  41. package/dist/editor/selection.d.ts +2 -2
  42. package/dist/editor/selection.d.ts.map +1 -1
  43. package/dist/editor/selection.js +31 -6
  44. package/dist/editor/selection.js.map +1 -1
  45. package/dist/editor/tokenizer.d.ts +6 -4
  46. package/dist/editor/tokenizer.d.ts.map +1 -1
  47. package/dist/editor/tokenizer.js +25 -470
  48. package/dist/editor/tokenizer.js.map +1 -1
  49. package/dist/highlighter/DiffsEditorTokenizer.d.ts +16 -0
  50. package/dist/highlighter/DiffsEditorTokenizer.d.ts.map +1 -0
  51. package/dist/highlighter/DiffsEditorTokenizer.js +0 -0
  52. package/dist/highlighter/DiffsHighlighter.d.ts +41 -0
  53. package/dist/highlighter/DiffsHighlighter.d.ts.map +1 -0
  54. package/dist/highlighter/DiffsHighlighter.js +39 -0
  55. package/dist/highlighter/DiffsHighlighter.js.map +1 -0
  56. package/dist/highlighter/backends/highlights.d.ts +26 -0
  57. package/dist/highlighter/backends/highlights.d.ts.map +1 -0
  58. package/dist/highlighter/backends/highlights.js +71 -0
  59. package/dist/highlighter/backends/highlights.js.map +1 -0
  60. package/dist/highlighter/backends/shiki.d.ts +27 -0
  61. package/dist/highlighter/backends/shiki.d.ts.map +1 -0
  62. package/dist/highlighter/backends/shiki.js +107 -0
  63. package/dist/highlighter/backends/shiki.js.map +1 -0
  64. package/dist/highlighter/highlighterType.d.ts +13 -0
  65. package/dist/highlighter/highlighterType.d.ts.map +1 -0
  66. package/dist/highlighter/highlighterType.js +32 -0
  67. package/dist/highlighter/highlighterType.js.map +1 -0
  68. package/dist/highlighter/highlights-editor.d.ts +24 -0
  69. package/dist/highlighter/highlights-editor.d.ts.map +1 -0
  70. package/dist/highlighter/highlights-editor.js +166 -0
  71. package/dist/highlighter/highlights-editor.js.map +1 -0
  72. package/dist/highlighter/highlights-stream.d.ts +20 -0
  73. package/dist/highlighter/highlights-stream.d.ts.map +1 -0
  74. package/dist/highlighter/highlights-stream.js +93 -0
  75. package/dist/highlighter/highlights-stream.js.map +1 -0
  76. package/dist/highlighter/languages/areLanguagesAttached.d.ts +2 -1
  77. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  78. package/dist/highlighter/languages/areLanguagesAttached.js +4 -6
  79. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
  80. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +6 -1
  81. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  82. package/dist/highlighter/languages/attachResolvedLanguages.js +6 -11
  83. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
  84. package/dist/highlighter/languages/constants.d.ts +1 -1
  85. package/dist/highlighter/languages/getResolvedLanguages.d.ts +1 -1
  86. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  87. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  88. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  89. package/dist/highlighter/languages/resolveLanguage.js +19 -16
  90. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  91. package/dist/highlighter/languages/resolveLanguages.d.ts +1 -1
  92. package/dist/highlighter/shared_highlighter.d.ts +24 -9
  93. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  94. package/dist/highlighter/shared_highlighter.js +59 -47
  95. package/dist/highlighter/shared_highlighter.js.map +1 -1
  96. package/dist/highlighter/shiki-editor.d.ts +25 -0
  97. package/dist/highlighter/shiki-editor.d.ts.map +1 -0
  98. package/dist/highlighter/shiki-editor.js +483 -0
  99. package/dist/highlighter/shiki-editor.js.map +1 -0
  100. package/dist/highlighter/shiki-stream.d.ts +20 -0
  101. package/dist/highlighter/shiki-stream.d.ts.map +1 -0
  102. package/dist/highlighter/shiki-stream.js +60 -0
  103. package/dist/highlighter/shiki-stream.js.map +1 -0
  104. package/dist/highlighter/stream-tokenizer.d.ts +40 -0
  105. package/dist/highlighter/stream-tokenizer.d.ts.map +1 -0
  106. package/dist/highlighter/stream-tokenizer.js +70 -0
  107. package/dist/highlighter/stream-tokenizer.js.map +1 -0
  108. package/dist/highlighter/themes/areThemesAttached.d.ts +3 -2
  109. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  110. package/dist/highlighter/themes/areThemesAttached.js +5 -4
  111. package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
  112. package/dist/highlighter/themes/attachResolvedThemes.d.ts +5 -2
  113. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  114. package/dist/highlighter/themes/attachResolvedThemes.js +4 -16
  115. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  116. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts +3 -1
  117. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  118. package/dist/highlighter/themes/cleanUpResolvedThemes.js +8 -5
  119. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  120. package/dist/highlighter/themes/createCSSVariablesTheme.d.ts +7 -0
  121. package/dist/highlighter/themes/createCSSVariablesTheme.d.ts.map +1 -0
  122. package/dist/highlighter/themes/createCSSVariablesTheme.js +89 -0
  123. package/dist/highlighter/themes/createCSSVariablesTheme.js.map +1 -0
  124. package/dist/highlighter/themes/createCachedLoader.d.ts +5 -0
  125. package/dist/highlighter/themes/createCachedLoader.d.ts.map +1 -0
  126. package/dist/highlighter/themes/createCachedLoader.js +15 -0
  127. package/dist/highlighter/themes/createCachedLoader.js.map +1 -0
  128. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts +3 -2
  129. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  130. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +4 -4
  131. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  132. package/dist/highlighter/themes/getResolvedThemes.d.ts +3 -2
  133. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  134. package/dist/highlighter/themes/getResolvedThemes.js +4 -3
  135. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  136. package/dist/highlighter/themes/hasResolvedThemes.d.ts +2 -2
  137. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  138. package/dist/highlighter/themes/hasResolvedThemes.js +4 -3
  139. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  140. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  141. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +3 -3
  142. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  143. package/dist/highlighter/themes/registerCustomTheme.d.ts +9 -4
  144. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  145. package/dist/highlighter/themes/registerCustomTheme.js +8 -16
  146. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  147. package/dist/highlighter/themes/resolveTheme.d.ts +3 -2
  148. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  149. package/dist/highlighter/themes/resolveTheme.js +4 -7
  150. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  151. package/dist/highlighter/themes/resolveThemes.d.ts +3 -2
  152. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  153. package/dist/highlighter/themes/resolveThemes.js +4 -7
  154. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  155. package/dist/highlighter/themes/themeResolver.d.ts +10 -4
  156. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
  157. package/dist/highlighter/themes/themeResolver.js +141 -2
  158. package/dist/highlighter/themes/themeResolver.js.map +1 -1
  159. package/dist/highlighter/themes/types.d.ts +23 -0
  160. package/dist/highlighter/themes/types.d.ts.map +1 -0
  161. package/dist/highlighter/themes/types.js +0 -0
  162. package/dist/highlighter/tokenizer-types.d.ts +35 -0
  163. package/dist/highlighter/tokenizer-types.d.ts.map +1 -0
  164. package/dist/highlighter/tokenizer-types.js +0 -0
  165. package/dist/highlighter/types.d.ts +55 -0
  166. package/dist/highlighter/types.d.ts.map +1 -0
  167. package/dist/highlighter/types.js +0 -0
  168. package/dist/index.d.ts +22 -13
  169. package/dist/index.js +21 -18
  170. package/dist/managers/InteractionManager.d.ts.map +1 -1
  171. package/dist/managers/InteractionManager.js +2 -2
  172. package/dist/managers/InteractionManager.js.map +1 -1
  173. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +9 -1
  174. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -1
  175. package/dist/react/CodeView.d.ts +4 -3
  176. package/dist/react/CodeView.d.ts.map +1 -1
  177. package/dist/react/CodeView.js +47 -38
  178. package/dist/react/CodeView.js.map +1 -1
  179. package/dist/react/File.js +3 -3
  180. package/dist/react/File.js.map +1 -1
  181. package/dist/react/FileDiff.js +3 -3
  182. package/dist/react/FileDiff.js.map +1 -1
  183. package/dist/react/MultiFileDiff.js +2 -2
  184. package/dist/react/MultiFileDiff.js.map +1 -1
  185. package/dist/react/PatchDiff.js +3 -3
  186. package/dist/react/PatchDiff.js.map +1 -1
  187. package/dist/react/UnresolvedFile.js +2 -2
  188. package/dist/react/UnresolvedFile.js.map +1 -1
  189. package/dist/react/index.d.ts +9 -4
  190. package/dist/react/types.d.ts +4 -2
  191. package/dist/react/types.d.ts.map +1 -1
  192. package/dist/react/utils/renderDiffChildren.js +1 -1
  193. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  194. package/dist/react/utils/renderFileChildren.js +1 -1
  195. package/dist/react/utils/renderFileChildren.js.map +1 -1
  196. package/dist/react/utils/useFileDiffInstance.d.ts +1 -0
  197. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  198. package/dist/react/utils/useFileDiffInstance.js +29 -24
  199. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  200. package/dist/react/utils/useFileInstance.d.ts +2 -0
  201. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  202. package/dist/react/utils/useFileInstance.js +38 -28
  203. package/dist/react/utils/useFileInstance.js.map +1 -1
  204. package/dist/react/utils/useForceUpdate.d.ts +5 -0
  205. package/dist/react/utils/useForceUpdate.d.ts.map +1 -0
  206. package/dist/react/utils/useForceUpdate.js +27 -0
  207. package/dist/react/utils/useForceUpdate.js.map +1 -0
  208. package/dist/react/utils/useNextRenderData.d.ts +9 -0
  209. package/dist/react/utils/useNextRenderData.d.ts.map +1 -0
  210. package/dist/react/utils/useNextRenderData.js +9 -0
  211. package/dist/react/utils/useNextRenderData.js.map +1 -0
  212. package/dist/react/utils/useUnresolvedFileInstance.d.ts +1 -0
  213. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
  214. package/dist/react/utils/useUnresolvedFileInstance.js +26 -11
  215. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
  216. package/dist/renderers/DiffHunksRenderer.d.ts +4 -2
  217. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  218. package/dist/renderers/DiffHunksRenderer.js +82 -43
  219. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  220. package/dist/renderers/FileRenderer.d.ts +6 -2
  221. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  222. package/dist/renderers/FileRenderer.js +77 -43
  223. package/dist/renderers/FileRenderer.js.map +1 -1
  224. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
  225. package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -1
  226. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
  227. package/dist/shiki-stream/index.d.ts +3 -3
  228. package/dist/shiki-stream/index.js +1 -2
  229. package/dist/shiki-stream/stream.d.ts +4 -4
  230. package/dist/shiki-stream/stream.d.ts.map +1 -1
  231. package/dist/shiki-stream/stream.js +20 -9
  232. package/dist/shiki-stream/stream.js.map +1 -1
  233. package/dist/shiki-stream/types.d.ts +7 -38
  234. package/dist/shiki-stream/types.d.ts.map +1 -1
  235. package/dist/ssr/index.d.ts +7 -2
  236. package/dist/ssr/renderHTML.js +2 -2
  237. package/dist/ssr/renderHTML.js.map +1 -1
  238. package/dist/style.js +1 -1
  239. package/dist/style.js.map +1 -1
  240. package/dist/types.d.ts +20 -11
  241. package/dist/types.d.ts.map +1 -1
  242. package/dist/utils/canUseWASM.d.ts +13 -0
  243. package/dist/utils/canUseWASM.d.ts.map +1 -0
  244. package/dist/utils/canUseWASM.js +59 -0
  245. package/dist/utils/canUseWASM.js.map +1 -0
  246. package/dist/utils/createSpanNodeFromToken.d.ts +3 -2
  247. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  248. package/dist/utils/createSpanNodeFromToken.js +4 -5
  249. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  250. package/dist/utils/cssWrappers.d.ts.map +1 -1
  251. package/dist/utils/cssWrappers.js +12 -0
  252. package/dist/utils/cssWrappers.js.map +1 -1
  253. package/dist/utils/getCodeViewItemRenderData.d.ts +10 -0
  254. package/dist/utils/getCodeViewItemRenderData.d.ts.map +1 -0
  255. package/dist/utils/getCodeViewItemRenderData.js +19 -0
  256. package/dist/utils/getCodeViewItemRenderData.js.map +1 -0
  257. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  258. package/dist/utils/getHighlighterOptions.js +3 -2
  259. package/dist/utils/getHighlighterOptions.js.map +1 -1
  260. package/dist/utils/getHighlighterThemeStyles.d.ts +2 -1
  261. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  262. package/dist/utils/getHighlighterThemeStyles.js +13 -3
  263. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  264. package/dist/utils/getTokenOptions.d.ts +7 -0
  265. package/dist/utils/getTokenOptions.d.ts.map +1 -0
  266. package/dist/utils/getTokenOptions.js +16 -0
  267. package/dist/utils/getTokenOptions.js.map +1 -0
  268. package/dist/utils/hastToHtml.d.ts +10 -0
  269. package/dist/utils/hastToHtml.d.ts.map +1 -0
  270. package/dist/utils/hastToHtml.js +125 -0
  271. package/dist/utils/hastToHtml.js.map +1 -0
  272. package/dist/utils/hydratePartialDiff.js +4 -0
  273. package/dist/utils/hydratePartialDiff.js.map +1 -1
  274. package/dist/utils/parseDiffDecorations.d.ts +2 -1
  275. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  276. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  277. package/dist/utils/parseMergeConflictDiffFromFile.js +2 -0
  278. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  279. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  280. package/dist/utils/parsePatchFiles.js +24 -4
  281. package/dist/utils/parsePatchFiles.js.map +1 -1
  282. package/dist/utils/renderDiffWithHighlighter.d.ts +3 -2
  283. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  284. package/dist/utils/renderDiffWithHighlighter.js +33 -48
  285. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  286. package/dist/utils/renderFileWithHighlighter.d.ts +3 -2
  287. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  288. package/dist/utils/renderFileWithHighlighter.js +10 -26
  289. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  290. package/dist/utils/renderTokenLines.d.ts +22 -0
  291. package/dist/utils/renderTokenLines.d.ts.map +1 -0
  292. package/dist/utils/renderTokenLines.js +250 -0
  293. package/dist/utils/renderTokenLines.js.map +1 -0
  294. package/dist/utils/resolvePreferredHighlighter.d.ts +13 -0
  295. package/dist/utils/resolvePreferredHighlighter.d.ts.map +1 -0
  296. package/dist/utils/resolvePreferredHighlighter.js +11 -0
  297. package/dist/utils/resolvePreferredHighlighter.js.map +1 -0
  298. package/dist/utils/resolveRegion.js +20 -10
  299. package/dist/utils/resolveRegion.js.map +1 -1
  300. package/dist/utils/setDeferredArrayItem.d.ts +5 -0
  301. package/dist/utils/setDeferredArrayItem.d.ts.map +1 -0
  302. package/dist/utils/setDeferredArrayItem.js +39 -0
  303. package/dist/utils/setDeferredArrayItem.js.map +1 -0
  304. package/dist/utils/tokenStyle.d.ts +11 -0
  305. package/dist/utils/tokenStyle.d.ts.map +1 -0
  306. package/dist/utils/tokenStyle.js +32 -0
  307. package/dist/utils/tokenStyle.js.map +1 -0
  308. package/dist/utils/tokensToHtml.d.ts +11 -0
  309. package/dist/utils/tokensToHtml.d.ts.map +1 -0
  310. package/dist/utils/tokensToHtml.js +48 -0
  311. package/dist/utils/tokensToHtml.js.map +1 -0
  312. package/dist/utils/updateDiffHunks.d.ts +2 -2
  313. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  314. package/dist/utils/updateDiffHunks.js +7 -3
  315. package/dist/utils/updateDiffHunks.js.map +1 -1
  316. package/dist/utils/wrapTokenFragments.js.map +1 -1
  317. package/dist/worker/WorkerPoolManager.d.ts +14 -2
  318. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  319. package/dist/worker/WorkerPoolManager.js +155 -67
  320. package/dist/worker/WorkerPoolManager.js.map +1 -1
  321. package/dist/worker/hastLinesTransport.d.ts +14 -0
  322. package/dist/worker/hastLinesTransport.d.ts.map +1 -0
  323. package/dist/worker/hastLinesTransport.js +156 -0
  324. package/dist/worker/hastLinesTransport.js.map +1 -0
  325. package/dist/worker/highlights-CpZm9DAR.js +317 -0
  326. package/dist/worker/highlights-CpZm9DAR.js.map +1 -0
  327. package/dist/worker/index.d.ts +1 -1
  328. package/dist/worker/shiki-Ci4cdHsM.js +697 -0
  329. package/dist/worker/shiki-Ci4cdHsM.js.map +1 -0
  330. package/dist/worker/stream-tokenizer-DK9xp5M5.js +427 -0
  331. package/dist/worker/stream-tokenizer-DK9xp5M5.js.map +1 -0
  332. package/dist/worker/types.d.ts +16 -3
  333. package/dist/worker/types.d.ts.map +1 -1
  334. package/dist/worker/worker-portable.js +41 -13337
  335. package/dist/worker/worker-portable.js.map +1 -1
  336. package/dist/worker/worker.js +681 -349
  337. package/dist/worker/worker.js.map +1 -1
  338. package/dist/worker/workerMessage.d.ts +24 -0
  339. package/dist/worker/workerMessage.d.ts.map +1 -0
  340. package/dist/worker/workerMessage.js +0 -0
  341. package/package.json +5 -3
  342. package/dist/highlighter/themes/constants.d.ts +0 -5
  343. package/dist/highlighter/themes/constants.d.ts.map +0 -1
  344. package/dist/highlighter/themes/constants.js +0 -6
  345. package/dist/highlighter/themes/constants.js.map +0 -1
  346. package/dist/highlighter/themes/themeResolution.d.ts +0 -7
  347. package/dist/highlighter/themes/themeResolution.d.ts.map +0 -1
  348. package/dist/highlighter/themes/themeResolution.js +0 -21
  349. package/dist/highlighter/themes/themeResolution.js.map +0 -1
  350. package/dist/shiki-stream/tokenizer.d.ts +0 -23
  351. package/dist/shiki-stream/tokenizer.d.ts.map +0 -1
  352. package/dist/shiki-stream/tokenizer.js +0 -72
  353. package/dist/shiki-stream/tokenizer.js.map +0 -1
  354. package/dist/utils/createTransformerWithState.d.ts +0 -12
  355. package/dist/utils/createTransformerWithState.d.ts.map +0 -1
  356. package/dist/utils/createTransformerWithState.js +0 -89
  357. package/dist/utils/createTransformerWithState.js.map +0 -1
  358. package/dist/worker/wasm-B9ZqxnKj.js +0 -8
  359. 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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"}
@@ -2,7 +2,7 @@ import { FileContents, FileDiffMetadata, MergeConflictActionPayload, MergeConfli
2
2
  import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
3
3
  import "../worker/index.js";
4
4
  import { HunksRenderResult } from "../renderers/DiffHunksRenderer.js";
5
- import { FileDiff, FileDiffOptions, FileDiffRenderBaseProps } from "./FileDiff.js";
5
+ import { FileDiff, FileDiffOptions, FileDiffRenderBaseProps, FileDiffRenderData, FileDiffRenderInput } from "./FileDiff.js";
6
6
  import { MergeConflictDiffAction } from "../utils/parseMergeConflictDiffFromFile.js";
7
7
  import { UnresolvedFileHunksRenderer, UnresolvedFileHunksRendererOptions } from "../renderers/UnresolvedFileHunksRenderer.js";
8
8
  //#region src/components/UnresolvedFile.d.ts
@@ -38,6 +38,14 @@ interface ResolveConflictReturn {
38
38
  markerRows: MergeConflictMarkerRow[];
39
39
  }
40
40
  type UnresolvedFileDataCache = GetOrComputeDiffProps;
41
+ interface UnresolvedFileRenderInput<LAnnotation> extends FileDiffRenderInput<LAnnotation> {
42
+ actions: (MergeConflictDiffAction | undefined)[];
43
+ markerRows: MergeConflictMarkerRow[];
44
+ }
45
+ interface UnresolvedFileRenderData<LAnnotation> extends FileDiffRenderData<LAnnotation> {
46
+ actions: (MergeConflictDiffAction | undefined)[];
47
+ markerRows: MergeConflictMarkerRow[];
48
+ }
41
49
  declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotation, undefined> {
42
50
  options: UnresolvedFileOptions<LAnnotation>;
43
51
  readonly __id: string;
@@ -45,8 +53,9 @@ declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotati
45
53
  protected computedCache: UnresolvedFileDataCache;
46
54
  private conflictActions;
47
55
  private markerRows;
56
+ __getNextRenderData({ actions, markerRows, ...input }: UnresolvedFileRenderInput<LAnnotation>): UnresolvedFileRenderData<LAnnotation>;
48
57
  private conflictActionCache;
49
- constructor(options?: UnresolvedFileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);
58
+ constructor(options?: UnresolvedFileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, requestOwnerRender?: () => void);
50
59
  setOptions(options: UnresolvedFileOptions<LAnnotation> | undefined): void;
51
60
  protected syncInteractionOptions(): void;
52
61
  protected createHunksRenderer(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRenderer<LAnnotation>;
@@ -59,7 +68,8 @@ declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotati
59
68
  render(props?: UnresolvedFileRenderProps<LAnnotation>): boolean;
60
69
  resolveConflict(conflictIndex: number, resolution: MergeConflictResolution, fileDiff?: FileDiffMetadata | undefined): ResolveConflictReturn | undefined;
61
70
  private resolveConflictAndRender;
62
- private setActiveMergeConflictState;
71
+ protected prepareRenderData(fileDiff: FileDiffMetadata): void;
72
+ protected adoptRenderData(fileDiff: FileDiffMetadata): void;
63
73
  private handleMergeConflictActionClick;
64
74
  private renderMergeConflictActionSlots;
65
75
  private renderMergeConflictAction;
@@ -67,5 +77,5 @@ declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotati
67
77
  }
68
78
  declare function getUnresolvedDiffHunksRendererOptions<LAnnotation>(options?: UnresolvedFileOptions<LAnnotation>, baseOptions?: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRendererOptions;
69
79
  //#endregion
70
- export { MergeConflictActionsTypeOption, RenderMergeConflictActions, UnresolvedFile, UnresolvedFileHydrationProps, UnresolvedFileOptions, UnresolvedFileRenderProps, getUnresolvedDiffHunksRendererOptions };
80
+ export { MergeConflictActionsTypeOption, RenderMergeConflictActions, UnresolvedFile, UnresolvedFileHydrationProps, UnresolvedFileOptions, UnresolvedFileRenderData, UnresolvedFileRenderInput, UnresolvedFileRenderProps, getUnresolvedDiffHunksRendererOptions };
71
81
  //# sourceMappingURL=UnresolvedFile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UnresolvedFile.d.ts","names":[],"sources":["../../src/components/UnresolvedFile.ts"],"mappings":";;;;;;;;KAqCY,2BAA2B,gBACrC,QAAQ,yBACR,UAAU,eAAe,iBACtB,cAAc;KAEP,+BAA+B,oCAGvC,2BAA2B;UAEd,sBAAsB,qBAAqB,KAC1D,gBAAgB;EAGhB,cACE,MAAM,aACN,UAAU,eAAe,cACzB,OAAO;EAET,2BAA2B,+BAA+B;EAC1D,uBACE,SAAS,4BACT,UAAU,eAAe;EAE3B,wBACE,MAAM,cACN,SAAS;EAEX;;UAGe,0BACf,qBACQ,wBAAwB;EAChC,OAAO;EACP,WAAW;EACX,aAAa;;UAGE,6BAA6B,qBAAqB,KACjE,0BAA0B;EAG1B,OAAO;EACP,eAAe;EACf;;UAQQ;EACR,MAAM;EACN,UAAU;EACV,UAAU;EACV,YAAY;;UASJ;EACR,MAAM;EACN,UAAU;EACV,UAAU;EACV,YAAY;;KAGT,0BAA0B;cAIlB,eAAe,iCAAiC,SAC3D;EAkBkB,SAAS,sBAAsB;WAf/B;WACA;YAER,eAAe;UAMjB;UACA;UACA;EAGR,YACkB,UAAS,sBAAsB,cAG/C,gBAAgB,+BAChB;EAMO,WACP,SAAS,sBAAsB;YAyBd;YAeA,oBACjB,SAAS,sBAAsB,eAC9B,4BAA4B;YAUZ,wBACjB,SAAS,sBAAsB,eAC9B;YAIgB,uBACjB,KAAK,gBACL,QAAQ;EAOD;UAaD;EA6HC,QAAQ,OAAO,6BAA6B;EA8C5C;EAOA,OAAO,QAAO,0BAA0B;EAmC1C,gBACL,uBACA,YAAY,yBACZ,WAAU,+BACT;UA+BK;UA+CA;UAkBA;UAwBA;UA+DA;UAyBA;;iBAyNM,sCAAsC,aACpD,UAAU,sBAAsB,cAChC,cAAc,sBAAsB,eACnC"}
1
+ {"version":3,"file":"UnresolvedFile.d.ts","names":[],"sources":["../../src/components/UnresolvedFile.ts"],"mappings":";;;;;;;;KAwCY,2BAA2B,gBACrC,QAAQ,yBACR,UAAU,eAAe,iBACtB,cAAc;KAEP,+BAA+B,oCAGvC,2BAA2B;UAEd,sBAAsB,qBAAqB,KAC1D,gBAAgB;EAGhB,cACE,MAAM,aACN,UAAU,eAAe,cACzB,OAAO;EAET,2BAA2B,+BAA+B;EAC1D,uBACE,SAAS,4BACT,UAAU,eAAe;EAE3B,wBACE,MAAM,cACN,SAAS;EAEX;;UAGe,0BACf,qBACQ,wBAAwB;EAChC,OAAO;EACP,WAAW;EACX,aAAa;;UAGE,6BAA6B,qBAAqB,KACjE,0BAA0B;EAG1B,OAAO;EACP,eAAe;EACf;;UAQQ;EACR,MAAM;EACN,UAAU;EACV,UAAU;EACV,YAAY;;UASJ;EACR,MAAM;EACN,UAAU;EACV,UAAU;EACV,YAAY;;KAGT,0BAA0B;UAEd,0BACf,qBACQ,oBAAoB;EAC5B,UAAU;EACV,YAAY;;UAGG,yBACf,qBACQ,mBAAmB;EAC3B,UAAU;EACV,YAAY;;cAKD,eAAe,iCAAiC,SAC3D;EAiCkB,SAAS,sBAAsB;WA9B/B;WACA;YAER,eAAe;UAMjB;UACA;EAEQ,sBACd,SACA,eACG,SACF,0BAA0B,eAAe,yBAAyB;UAU7D;EAGR,YACkB,UAAS,sBAAsB,cAG/C,gBAAgB,+BAChB;EAMO,WACP,SAAS,sBAAsB;YAyBd;YAeA,oBACjB,SAAS,sBAAsB,eAC9B,4BAA4B;YAUZ,wBACjB,SAAS,sBAAsB,eAC9B;YAIgB,uBACjB,KAAK,gBACL,QAAQ;EAOD;UAcD;EA6HC,QAAQ,OAAO,6BAA6B;EA8C5C;EAQA,OAAO,QAAO,0BAA0B;EAkC1C,gBACL,uBACA,YAAY,yBACZ,WAAU,+BACT;UA+BK;YAoDW,kBAAkB,UAAU;YAe5B,gBAAgB,UAAU;UAQrC;UAoCA;UA+DA;UAyBA;;iBAyNM,sCAAsC,aACpD,UAAU,sBAAsB,cAChC,cAAc,sBAAsB,eACnC"}
@@ -2,6 +2,7 @@ import { DEFAULT_THEMES } from "../constants.js";
2
2
  import { pluckInteractionOptions } from "../managers/InteractionManager.js";
3
3
  import { createAnnotationWrapperNode } from "../utils/createAnnotationWrapperNode.js";
4
4
  import { shouldUseTokenTransformer } from "../utils/shouldUseTokenTransformer.js";
5
+ import { areDiffTargetsEqual } from "../utils/areDiffTargetsEqual.js";
5
6
  import { areFilesEqual } from "../utils/areFilesEqual.js";
6
7
  import { splitFileContents } from "../utils/splitFileContents.js";
7
8
  import { FileDiff } from "./FileDiff.js";
@@ -24,9 +25,18 @@ var UnresolvedFile = class extends FileDiff {
24
25
  };
25
26
  conflictActions = [];
26
27
  markerRows = [];
28
+ __getNextRenderData({ actions, markerRows, ...input }) {
29
+ const data = super.__getNextRenderData(input);
30
+ const isInput = areDiffTargetsEqual(data.fileDiff, input.fileDiff);
31
+ return {
32
+ ...data,
33
+ actions: isInput ? actions : this.conflictActions,
34
+ markerRows: isInput ? markerRows : this.markerRows
35
+ };
36
+ }
27
37
  conflictActionCache = /* @__PURE__ */ new Map();
28
- constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
29
- super(void 0, workerManager, isContainerManaged);
38
+ constructor(options = { theme: DEFAULT_THEMES }, workerManager, requestOwnerRender) {
39
+ super(void 0, workerManager, requestOwnerRender);
30
40
  this.options = options;
31
41
  this.setOptions(options);
32
42
  }
@@ -59,6 +69,7 @@ var UnresolvedFile = class extends FileDiff {
59
69
  markerRows: void 0
60
70
  };
61
71
  this.conflictActions = [];
72
+ this.markerRows = [];
62
73
  super.cleanUp();
63
74
  }
64
75
  getOrComputeDiff({ file, fileDiff, actions, markerRows }) {
@@ -129,7 +140,7 @@ var UnresolvedFile = class extends FileDiff {
129
140
  });
130
141
  if (source == null) return;
131
142
  this.hydrateElements(fileContainer, prerenderedHTML);
132
- this.setActiveMergeConflictState(source.actions, source.markerRows);
143
+ this.prepareRenderData(source.fileDiff);
133
144
  if (shouldRenderCode(this.pre, source.fileDiff, this.options.collapsed) || shouldRenderHeader(this.headerElement, source.fileDiff, this.options.disableFileHeader)) this.render({
134
145
  ...props,
135
146
  preventEmit: true
@@ -144,7 +155,8 @@ var UnresolvedFile = class extends FileDiff {
144
155
  if (!preventEmit) this.emitPostRender();
145
156
  }
146
157
  rerender() {
147
- if (!this.enabled || this.fileDiff == null) return;
158
+ if (!this.enabled || this.computedCache.fileDiff == null) return;
159
+ if (this.requestRender()) return;
148
160
  this.render({
149
161
  forceRender: true,
150
162
  renderRange: this.renderRange
@@ -159,7 +171,6 @@ var UnresolvedFile = class extends FileDiff {
159
171
  markerRows
160
172
  });
161
173
  if (source == null) return false;
162
- this.setActiveMergeConflictState(source.actions, source.markerRows);
163
174
  const didRender = super.render({
164
175
  ...rest,
165
176
  fileDiff: source.fileDiff,
@@ -173,7 +184,7 @@ var UnresolvedFile = class extends FileDiff {
173
184
  return didRender;
174
185
  }
175
186
  resolveConflict(conflictIndex, resolution, fileDiff = this.computedCache.fileDiff) {
176
- const action = this.conflictActions[conflictIndex];
187
+ const action = this.computedCache.actions?.[conflictIndex];
177
188
  if (fileDiff == null || action == null) return;
178
189
  if (action.conflictIndex !== conflictIndex) {
179
190
  console.error({
@@ -186,7 +197,7 @@ var UnresolvedFile = class extends FileDiff {
186
197
  const previousFile = this.computedCache.file;
187
198
  const { file, actions, markerRows } = rebuildFileAndActions({
188
199
  fileDiff: newFileDiff,
189
- previousActions: this.conflictActions,
200
+ previousActions: this.computedCache.actions ?? [],
190
201
  resolvedConflictIndex: conflictIndex,
191
202
  previousFile,
192
203
  resolution
@@ -199,7 +210,7 @@ var UnresolvedFile = class extends FileDiff {
199
210
  };
200
211
  }
201
212
  resolveConflictAndRender(conflictIndex, resolution) {
202
- const action = this.conflictActions[conflictIndex];
213
+ const action = this.computedCache.actions?.[conflictIndex];
203
214
  if (action == null) return;
204
215
  if (action.conflictIndex !== conflictIndex) {
205
216
  console.error({
@@ -220,17 +231,25 @@ var UnresolvedFile = class extends FileDiff {
220
231
  actions,
221
232
  markerRows
222
233
  };
223
- this.setActiveMergeConflictState(actions, markerRows);
224
- if (this.workerManager != null) this.hunksRenderer.renderDiff(fileDiff);
234
+ const { workerManager } = this;
235
+ if (workerManager?.isWorkingPool() === true && !workerManager.shouldHighlightOnMainThread(fileDiff)) this.hunksRenderer.renderDiff(fileDiff);
225
236
  else this.render({ forceRender: true });
226
237
  this.options.onMergeConflictResolve?.(file, payload);
227
238
  }
228
- setActiveMergeConflictState(actions = this.conflictActions, markerRows = this.markerRows) {
229
- this.conflictActions = actions;
230
- this.markerRows = markerRows;
231
- if (this.computedCache.fileDiff != null && this.hunksRenderer instanceof UnresolvedFileHunksRenderer) this.hunksRenderer.setConflictState(this.options.mergeConflictActionsType === "none" ? [] : actions, markerRows, this.computedCache.fileDiff);
239
+ prepareRenderData(fileDiff) {
240
+ super.prepareRenderData(fileDiff);
241
+ const latest = areDiffTargetsEqual(fileDiff, this.computedCache.fileDiff);
242
+ if (this.hunksRenderer instanceof UnresolvedFileHunksRenderer) this.hunksRenderer.setConflictState(this.options.mergeConflictActionsType === "none" ? [] : (latest ? this.computedCache.actions : this.conflictActions) ?? [], (latest ? this.computedCache.markerRows : this.markerRows) ?? [], fileDiff);
243
+ }
244
+ adoptRenderData(fileDiff) {
245
+ super.adoptRenderData(fileDiff);
246
+ if (areDiffTargetsEqual(fileDiff, this.computedCache.fileDiff)) {
247
+ this.conflictActions = this.computedCache.actions ?? [];
248
+ this.markerRows = this.computedCache.markerRows ?? [];
249
+ }
232
250
  }
233
251
  handleMergeConflictActionClick = (target) => {
252
+ if (!this.isComponentManaged && this.options.onMergeConflictAction != null && !areDiffTargetsEqual(this.getRenderedDiff(), this.computedCache.fileDiff)) return;
234
253
  const action = this.conflictActions[target.conflictIndex];
235
254
  if (action == null) return;
236
255
  if (action.conflictIndex !== target.conflictIndex) {
@@ -251,8 +270,8 @@ var UnresolvedFile = class extends FileDiff {
251
270
  this.resolveConflictAndRender(target.conflictIndex, target.resolution);
252
271
  };
253
272
  renderMergeConflictActionSlots() {
254
- const { fileDiff } = this.computedCache;
255
- if (this.isContainerManaged || this.fileContainer == null || typeof this.options.mergeConflictActionsType !== "function" || this.conflictActions.length === 0 || fileDiff == null) {
273
+ const fileDiff = this.getRenderedDiff();
274
+ if (this.isComponentManaged || this.fileContainer == null || typeof this.options.mergeConflictActionsType !== "function" || this.conflictActions.length === 0 || fileDiff == null) {
256
275
  this.clearMergeConflictActionCache();
257
276
  return;
258
277
  }