@pierre/diffs 1.0.10 → 1.1.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +40 -0
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -0
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +145 -0
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -0
  5. package/dist/components/AdvancedVirtualizer.d.ts +38 -0
  6. package/dist/components/AdvancedVirtualizer.d.ts.map +1 -0
  7. package/dist/components/AdvancedVirtualizer.js +201 -0
  8. package/dist/components/AdvancedVirtualizer.js.map +1 -0
  9. package/dist/components/File.d.ts +59 -32
  10. package/dist/components/File.d.ts.map +1 -1
  11. package/dist/components/File.js +297 -53
  12. package/dist/components/File.js.map +1 -1
  13. package/dist/components/FileDiff.d.ts +87 -39
  14. package/dist/components/FileDiff.d.ts.map +1 -1
  15. package/dist/components/FileDiff.js +687 -109
  16. package/dist/components/FileDiff.js.map +1 -1
  17. package/dist/components/FileStream.d.ts +6 -0
  18. package/dist/components/FileStream.d.ts.map +1 -1
  19. package/dist/components/FileStream.js +74 -12
  20. package/dist/components/FileStream.js.map +1 -1
  21. package/dist/components/VirtualizedFile.d.ts +33 -0
  22. package/dist/components/VirtualizedFile.d.ts.map +1 -0
  23. package/dist/components/VirtualizedFile.js +227 -0
  24. package/dist/components/VirtualizedFile.js.map +1 -0
  25. package/dist/components/VirtualizedFileDiff.d.ts +39 -0
  26. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -0
  27. package/dist/components/VirtualizedFileDiff.js +316 -0
  28. package/dist/components/VirtualizedFileDiff.js.map +1 -0
  29. package/dist/components/Virtualizer.d.ts +63 -0
  30. package/dist/components/Virtualizer.d.ts.map +1 -0
  31. package/dist/components/Virtualizer.js +369 -0
  32. package/dist/components/Virtualizer.js.map +1 -0
  33. package/dist/components/VirtulizerDevelopment.d.ts +14 -0
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -0
  35. package/dist/components/web-components.d.ts +1 -1
  36. package/dist/components/web-components.d.ts.map +1 -1
  37. package/dist/constants.d.ts +7 -3
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +20 -2
  40. package/dist/constants.js.map +1 -1
  41. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  42. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  43. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  44. package/dist/highlighter/languages/constants.d.ts +3 -1
  45. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  46. package/dist/highlighter/languages/constants.js +2 -1
  47. package/dist/highlighter/languages/constants.js.map +1 -1
  48. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  49. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  50. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  51. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  52. package/dist/highlighter/languages/registerCustomLanguage.d.ts +19 -0
  53. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  54. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  55. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  56. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  57. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  58. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  59. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  60. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  61. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  62. package/dist/highlighter/shared_highlighter.js.map +1 -1
  63. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  64. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  65. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  66. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  67. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  68. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  69. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  70. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  71. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  72. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  73. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  74. package/dist/index.d.ts +27 -13
  75. package/dist/index.js +22 -8
  76. package/dist/managers/LineSelectionManager.d.ts +14 -15
  77. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  78. package/dist/managers/LineSelectionManager.js +66 -78
  79. package/dist/managers/LineSelectionManager.js.map +1 -1
  80. package/dist/managers/MouseEventManager.d.ts +13 -6
  81. package/dist/managers/MouseEventManager.d.ts.map +1 -1
  82. package/dist/managers/MouseEventManager.js +161 -47
  83. package/dist/managers/MouseEventManager.js.map +1 -1
  84. package/dist/managers/ResizeManager.d.ts +6 -1
  85. package/dist/managers/ResizeManager.d.ts.map +1 -1
  86. package/dist/managers/ResizeManager.js +114 -64
  87. package/dist/managers/ResizeManager.js.map +1 -1
  88. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  89. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  90. package/dist/react/File.d.ts +1 -0
  91. package/dist/react/File.d.ts.map +1 -1
  92. package/dist/react/File.js +2 -1
  93. package/dist/react/File.js.map +1 -1
  94. package/dist/react/FileDiff.d.ts +1 -0
  95. package/dist/react/FileDiff.d.ts.map +1 -1
  96. package/dist/react/FileDiff.js +2 -1
  97. package/dist/react/FileDiff.js.map +1 -1
  98. package/dist/react/MultiFileDiff.d.ts +1 -0
  99. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  100. package/dist/react/MultiFileDiff.js +4 -3
  101. package/dist/react/MultiFileDiff.js.map +1 -1
  102. package/dist/react/PatchDiff.d.ts +1 -0
  103. package/dist/react/PatchDiff.d.ts.map +1 -1
  104. package/dist/react/PatchDiff.js +3 -2
  105. package/dist/react/PatchDiff.js.map +1 -1
  106. package/dist/react/Virtualizer.d.ts +25 -0
  107. package/dist/react/Virtualizer.d.ts.map +1 -0
  108. package/dist/react/Virtualizer.js +38 -0
  109. package/dist/react/Virtualizer.js.map +1 -0
  110. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  111. package/dist/react/WorkerPoolContext.js +1 -1
  112. package/dist/react/WorkerPoolContext.js.map +1 -1
  113. package/dist/react/constants.d.ts.map +1 -1
  114. package/dist/react/index.d.ts +3 -2
  115. package/dist/react/index.js +2 -1
  116. package/dist/react/jsx.d.ts.map +1 -1
  117. package/dist/react/types.d.ts +5 -3
  118. package/dist/react/types.d.ts.map +1 -1
  119. package/dist/react/utils/renderDiffChildren.d.ts +9 -9
  120. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  121. package/dist/react/utils/renderDiffChildren.js +3 -3
  122. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  123. package/dist/react/utils/renderFileChildren.d.ts +5 -5
  124. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  125. package/dist/react/utils/templateRender.d.ts.map +1 -1
  126. package/dist/react/utils/useFileDiffInstance.d.ts +5 -3
  127. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  128. package/dist/react/utils/useFileDiffInstance.js +6 -2
  129. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  130. package/dist/react/utils/useFileInstance.d.ts +5 -3
  131. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  132. package/dist/react/utils/useFileInstance.js +6 -2
  133. package/dist/react/utils/useFileInstance.js.map +1 -1
  134. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  135. package/dist/react/utils/useStableCallback.js.map +1 -1
  136. package/dist/renderers/DiffHunksRenderer.d.ts +21 -15
  137. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  138. package/dist/renderers/DiffHunksRenderer.js +392 -357
  139. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  140. package/dist/renderers/FileRenderer.d.ts +13 -5
  141. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  142. package/dist/renderers/FileRenderer.js +101 -35
  143. package/dist/renderers/FileRenderer.js.map +1 -1
  144. package/dist/shiki-stream/stream.d.ts +2 -2
  145. package/dist/shiki-stream/stream.d.ts.map +1 -1
  146. package/dist/shiki-stream/stream.js.map +1 -1
  147. package/dist/shiki-stream/tokenizer.d.ts +2 -2
  148. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  149. package/dist/shiki-stream/tokenizer.js.map +1 -1
  150. package/dist/shiki-stream/types.d.ts +18 -18
  151. package/dist/shiki-stream/types.d.ts.map +1 -1
  152. package/dist/sprite.d.ts +1 -1
  153. package/dist/sprite.d.ts.map +1 -1
  154. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  155. package/dist/ssr/FileDiffReact.js +1 -1
  156. package/dist/ssr/index.d.ts +2 -2
  157. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  158. package/dist/ssr/preloadFile.d.ts.map +1 -1
  159. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  160. package/dist/ssr/preloadPatchFile.js.map +1 -1
  161. package/dist/ssr/renderHTML.d.ts.map +1 -1
  162. package/dist/style.js +1 -1
  163. package/dist/style.js.map +1 -1
  164. package/dist/types.d.ts +311 -74
  165. package/dist/types.d.ts.map +1 -1
  166. package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
  167. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
  168. package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
  169. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
  170. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  171. package/dist/utils/areHunkDataEqual.d.ts +7 -0
  172. package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
  173. package/dist/utils/areHunkDataEqual.js +8 -0
  174. package/dist/utils/areHunkDataEqual.js.map +1 -0
  175. package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
  176. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
  177. package/dist/utils/areLineAnnotationsEqual.js +8 -0
  178. package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
  179. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  180. package/dist/utils/areOptionsEqual.d.ts +1 -1
  181. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  182. package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
  183. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
  184. package/dist/utils/arePrePropertiesEqual.js +9 -0
  185. package/dist/utils/arePrePropertiesEqual.js.map +1 -0
  186. package/dist/utils/areRenderRangesEqual.d.ts +7 -0
  187. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
  188. package/dist/utils/areRenderRangesEqual.js +9 -0
  189. package/dist/utils/areRenderRangesEqual.js.map +1 -0
  190. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  191. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  192. package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
  193. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
  194. package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
  195. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
  196. package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
  197. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
  198. package/dist/utils/areWorkerStatsEqual.js +9 -0
  199. package/dist/utils/areWorkerStatsEqual.js.map +1 -0
  200. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  201. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  202. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  203. package/dist/utils/createContentColumn.d.ts +7 -0
  204. package/dist/utils/createContentColumn.d.ts.map +1 -0
  205. package/dist/utils/createContentColumn.js +17 -0
  206. package/dist/utils/createContentColumn.js.map +1 -0
  207. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  208. package/dist/utils/createEmptyRowBuffer.js +2 -1
  209. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  210. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  211. package/dist/utils/createHoverContentNode.d.ts.map +1 -1
  212. package/dist/utils/createNoNewlineElement.d.ts +2 -1
  213. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  214. package/dist/utils/createNoNewlineElement.js +3 -6
  215. package/dist/utils/createNoNewlineElement.js.map +1 -1
  216. package/dist/utils/createPreElement.d.ts +2 -1
  217. package/dist/utils/createPreElement.d.ts.map +1 -1
  218. package/dist/utils/createPreElement.js +4 -3
  219. package/dist/utils/createPreElement.js.map +1 -1
  220. package/dist/utils/createRowNodes.d.ts.map +1 -1
  221. package/dist/utils/createSeparator.d.ts.map +1 -1
  222. package/dist/utils/createSeparator.js +2 -2
  223. package/dist/utils/createSeparator.js.map +1 -1
  224. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  225. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  226. package/dist/utils/createStyleElement.d.ts.map +1 -1
  227. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  228. package/dist/utils/createTransformerWithState.js +1 -1
  229. package/dist/utils/createTransformerWithState.js.map +1 -1
  230. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  231. package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
  232. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
  233. package/dist/utils/createWindowFromScrollPosition.js +26 -0
  234. package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
  235. package/dist/utils/cssWrappers.d.ts.map +1 -1
  236. package/dist/utils/diffAcceptRejectHunk.d.ts +1 -1
  237. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  238. package/dist/utils/diffAcceptRejectHunk.js +36 -21
  239. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  240. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  241. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  242. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  243. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  244. package/dist/utils/getFiletypeFromFileName.js +14 -4
  245. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  246. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  247. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  248. package/dist/utils/getHunkSeparatorSlotName.d.ts +3 -1
  249. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  250. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  251. package/dist/utils/getIconForType.d.ts +1 -1
  252. package/dist/utils/getIconForType.d.ts.map +1 -1
  253. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  254. package/dist/utils/getLineEndingType.d.ts +1 -1
  255. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  256. package/dist/utils/getLineNodes.d.ts.map +1 -1
  257. package/dist/utils/getOrCreateCodeNode.d.ts +16 -0
  258. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
  259. package/dist/utils/getOrCreateCodeNode.js +16 -0
  260. package/dist/utils/getOrCreateCodeNode.js.map +1 -0
  261. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  262. package/dist/utils/getThemes.d.ts.map +1 -1
  263. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  264. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  265. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  266. package/dist/utils/hast_utils.d.ts +6 -2
  267. package/dist/utils/hast_utils.d.ts.map +1 -1
  268. package/dist/utils/hast_utils.js +34 -1
  269. package/dist/utils/hast_utils.js.map +1 -1
  270. package/dist/utils/isDefaultRenderRange.d.ts +7 -0
  271. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
  272. package/dist/utils/isDefaultRenderRange.js +8 -0
  273. package/dist/utils/isDefaultRenderRange.js.map +1 -0
  274. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  275. package/dist/utils/iterateOverDiff.d.ts +54 -0
  276. package/dist/utils/iterateOverDiff.d.ts.map +1 -0
  277. package/dist/utils/iterateOverDiff.js +397 -0
  278. package/dist/utils/iterateOverDiff.js.map +1 -0
  279. package/dist/utils/iterateOverFile.d.ts +50 -0
  280. package/dist/utils/iterateOverFile.d.ts.map +1 -0
  281. package/dist/utils/iterateOverFile.js +49 -0
  282. package/dist/utils/iterateOverFile.js.map +1 -0
  283. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  284. package/dist/utils/parseDiffFromFile.d.ts +6 -6
  285. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  286. package/dist/utils/parseDiffFromFile.js +10 -7
  287. package/dist/utils/parseDiffFromFile.js.map +1 -1
  288. package/dist/utils/parseLineType.d.ts +1 -1
  289. package/dist/utils/parseLineType.d.ts.map +1 -1
  290. package/dist/utils/parsePatchFiles.d.ts +25 -11
  291. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  292. package/dist/utils/parsePatchFiles.js +221 -163
  293. package/dist/utils/parsePatchFiles.js.map +1 -1
  294. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  295. package/dist/utils/processLine.d.ts.map +1 -1
  296. package/dist/utils/processLine.js +11 -27
  297. package/dist/utils/processLine.js.map +1 -1
  298. package/dist/utils/renderDiffWithHighlighter.d.ts +8 -2
  299. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  300. package/dist/utils/renderDiffWithHighlighter.js +152 -228
  301. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  302. package/dist/utils/renderFileWithHighlighter.d.ts +7 -2
  303. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  304. package/dist/utils/renderFileWithHighlighter.js +30 -4
  305. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  306. package/dist/utils/resolveVirtualFileMetrics.d.ts +7 -0
  307. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -0
  308. package/dist/utils/resolveVirtualFileMetrics.js +25 -0
  309. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -0
  310. package/dist/utils/setLanguageOverride.d.ts +2 -1
  311. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  312. package/dist/utils/setLanguageOverride.js.map +1 -1
  313. package/dist/utils/setWrapperNodeProps.d.ts +4 -7
  314. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  315. package/dist/utils/setWrapperNodeProps.js +19 -12
  316. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  317. package/dist/utils/splitFileContents.d.ts +12 -0
  318. package/dist/utils/splitFileContents.d.ts.map +1 -0
  319. package/dist/utils/splitFileContents.js +17 -0
  320. package/dist/utils/splitFileContents.js.map +1 -0
  321. package/dist/utils/trimPatchContext.d.ts +11 -0
  322. package/dist/utils/trimPatchContext.d.ts.map +1 -0
  323. package/dist/utils/trimPatchContext.js +99 -0
  324. package/dist/utils/trimPatchContext.js.map +1 -0
  325. package/dist/worker/WorkerPoolManager.d.ts +11 -4
  326. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  327. package/dist/worker/WorkerPoolManager.js +153 -61
  328. package/dist/worker/WorkerPoolManager.js.map +1 -1
  329. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  330. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  331. package/dist/worker/types.d.ts +32 -25
  332. package/dist/worker/types.d.ts.map +1 -1
  333. package/dist/worker/worker-portable.js +902 -312
  334. package/dist/worker/worker-portable.js.map +1 -1
  335. package/dist/worker/worker.js +657 -268
  336. package/dist/worker/worker.js.map +1 -1
  337. package/package.json +52 -50
  338. package/dist/utils/createCodeNode.d.ts +0 -12
  339. package/dist/utils/createCodeNode.d.ts.map +0 -1
  340. package/dist/utils/createCodeNode.js +0 -12
  341. package/dist/utils/createCodeNode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"File.d.ts","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/File.ts"],"sourcesContent":[],"mappings":";;;;;;;UA2CiB;QACT;kBACU;EAFlB,gBAAiB,CAAA,EAGI,WAHJ;EACT,WAAA,CAAA,EAAA,OAAA;EACU,eAAA,CAAA,EAGE,cAHF,CAGiB,WAHjB,CAAA,EAAA;;AAGiB,UAGlB,gBAHkB,CAAA,WAAA,CAAA,SAIzB,IAJyB,CAIpB,eAJoB,CAIJ,WAJI,CAAA,EAAA,eAAA,CAAA,CAAA;EAAf,aAAA,EAKH,WALG;EAAA,eAAA,CAAA,EAAA,MAAA;AAGpB;AAC+B,UAKd,WALc,CAAA,WAAA,CAAA,SAMrB,eANqB,EAO3B,4BAP2B,CAAA,MAAA,CAAA,EAQ3B,oBAR2B,CAAA;EAAhB,iBAAA,CAAA,EAAA,OAAA;EACE,oBAAA,CAAA,EASQ,kBATR;EADP;;AAKV;;;EAagB,oBAAA,CAAA,EAAA,OAAA;EACX,gBAAA,EAAA,UAAA,EADW,cACX,CAD0B,WAC1B,CAAA,CAAA,EAAA,WAAA,GAAA,SAAA;EAEoB,kBAAA,EAAA,aAAA,EAAA,GAAA,GAAA,oBAAA,CAAA,MAAA,CAAA,GAAA,SAAA,CAAA,EACpB,WADoB,GAAA,IAAA;;AAff,cAqBG,IArBH,CAAA,cAAA,SAAA,CAAA,CAAA;EACN,OAAA,EA8CgB,WA9ChB,CA8C4B,WA9C5B,CAAA;EACA,QAAA,aAAA;EAAA,QAAA,kBAAA;EAmBJ,OAAa,qBAAA,EAAA,OAAA;EA0BmB,SAAA,IAAA,EAAA,MAAA;EAAZ,QAAA,aAAA;EAAY,QAAA,SAAA;EAAZ,QAAA,GAAA;EACQ,QAAA,IAAA;EA4BM,QAAA,cAAA;EAAZ,QAAA,YAAA;EAWI,QAAA,YAAA;EA8BH,QAAA,aAAA;EAI8B,QAAA,cAAA;EAAf,QAAA,YAAA;EAIZ,QAAA,aAAA;EA6BQ,QAAA,iBAAA;EAAjB,QAAA,oBAAA;EAsDb,QAAA,kBAAA;EACA,QAAA,eAAA;EACA,QAAA,IAAA;EACA,WAAA,CAAA,OAAA,CAAA,EApKgB,WAoKhB,CApK4B,WAoK5B,CAAA,EAAA,aAAA,CAAA,EAnKwB,iBAmKxB,GAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA;EACA,QAAA,qBAAA;EACiB,QAAA,CAAA,CAAA,EAAA,IAAA;EAAhB,UAAA,CAAA,OAAA,EAzIiB,WAyIjB,CAzI6B,WAyI7B,CAAA,GAAA,SAAA,CAAA,EAAA,IAAA;EAAA,QAAA,YAAA;0BA9HqB;wBA8BH;sCAIe,eAAe;0BAI3B;;iBA6BT,iBAAiB;;;;;;;KA2D7B,gBAAgB"}
1
+ {"version":3,"file":"File.d.ts","names":["LineSelectionManager","LineSelectionOptions","SelectedLineRange","GetHoveredLineResult","MouseEventManager","MouseEventManagerBaseOptions","ResizeManager","FileRenderer","BaseCodeOptions","FileContents","LineAnnotation","PrePropertiesConfig","RenderFileMetadata","RenderRange","ThemeTypes","WorkerPoolManager","FileRenderProps","LAnnotation","HTMLElement","FileHyrdateProps","Omit","FileOptions","AnnotationElementCache","File","SVGElement","HTMLPreElement","HTMLStyleElement","Map","file","fileContainer","forceRender","containerWrapper","lineAnnotations","renderRange"],"sources":["../../src/components/File.d.ts"],"sourcesContent":["import { LineSelectionManager, type LineSelectionOptions, type SelectedLineRange } from '../managers/LineSelectionManager';\nimport { type GetHoveredLineResult, MouseEventManager, type MouseEventManagerBaseOptions } from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer } from '../renderers/FileRenderer';\nimport type { BaseCodeOptions, FileContents, LineAnnotation, PrePropertiesConfig, RenderFileMetadata, RenderRange, ThemeTypes } from '../types';\nimport type { WorkerPoolManager } from '../worker';\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\nexport interface FileHyrdateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\nexport interface FileOptions<LAnnotation> extends BaseCodeOptions, MouseEventManagerBaseOptions<'file'>, LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(annotation: LineAnnotation<LAnnotation>): HTMLElement | undefined;\n renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null;\n}\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\nexport declare class File<LAnnotation = undefined> {\n options: FileOptions<LAnnotation>;\n private workerManager?;\n private isContainerManaged;\n static LoadedCustomComponent: boolean;\n readonly __id: string;\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected hoverContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n protected headerElement: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected mouseEventManager: MouseEventManager<'file'>;\n protected lineSelectionManager: LineSelectionManager;\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>>;\n protected lineAnnotations: LineAnnotation<LAnnotation>[];\n protected file: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n constructor(options?: FileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);\n private handleHighlightRender;\n rerender(): void;\n setOptions(options: FileOptions<LAnnotation> | undefined): void;\n private mergeOptions;\n setThemeType(themeType: ThemeTypes): void;\n getHoveredLine: () => {\n lineNumber: number;\n } | undefined;\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void;\n setSelectedLines(range: SelectedLineRange | null): void;\n cleanUp(): void;\n hydrate(props: FileHyrdateProps<LAnnotation>): void;\n getOrCreateLineCache(file?: FileContents | undefined): string[];\n render({ file, fileContainer, forceRender, containerWrapper, lineAnnotations, renderRange }: FileRenderProps<LAnnotation>): boolean;\n private canPartiallyRender;\n renderPlaceholder(height: number): boolean;\n private cleanChildNodes;\n private renderAnnotations;\n private renderHoverUtility;\n private injectUnsafeCSS;\n private applyFullRender;\n private applyPartialRender;\n private getColumns;\n private trimDOMToOverlap;\n private getDOMBoundaryIndices;\n private getLineIndexFromDOMNode;\n private applyBuffers;\n private applyHeaderToDOM;\n protected getOrCreateFileContainerNode(fileContainer?: HTMLElement, parentNode?: HTMLElement): HTMLElement;\n private getOrCreatePreNode;\n private applyPreNodeAttributes;\n private applyErrorToDOM;\n private cleanupErrorWrapper;\n}\nexport {};\n//# sourceMappingURL=File.d.ts.map"],"mappings":"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"}
@@ -2,41 +2,52 @@ import { DEFAULT_THEMES, DIFFS_TAG_NAME, HEADER_METADATA_SLOT_ID, UNSAFE_CSS_ATT
2
2
  import { LineSelectionManager, pluckLineSelectionOptions } from "../managers/LineSelectionManager.js";
3
3
  import { MouseEventManager, pluckMouseEventOptions } from "../managers/MouseEventManager.js";
4
4
  import { ResizeManager } from "../managers/ResizeManager.js";
5
+ import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
5
6
  import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
6
7
  import { FileRenderer } from "../renderers/FileRenderer.js";
7
8
  import { SVGSpriteSheet } from "../sprite.js";
8
9
  import { areFilesEqual } from "../utils/areFilesEqual.js";
10
+ import { areLineAnnotationsEqual } from "../utils/areLineAnnotationsEqual.js";
11
+ import { arePrePropertiesEqual } from "../utils/arePrePropertiesEqual.js";
9
12
  import { createAnnotationWrapperNode } from "../utils/createAnnotationWrapperNode.js";
10
- import { createCodeNode } from "../utils/createCodeNode.js";
11
13
  import { createHoverContentNode } from "../utils/createHoverContentNode.js";
12
14
  import { createUnsafeCSSStyleNode } from "../utils/createUnsafeCSSStyleNode.js";
13
15
  import { wrapUnsafeCSS } from "../utils/cssWrappers.js";
16
+ import { getOrCreateCodeNode } from "../utils/getOrCreateCodeNode.js";
14
17
  import { prerenderHTMLIfNecessary } from "../utils/prerenderHTMLIfNecessary.js";
15
18
  import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
16
19
  import { DiffsContainerLoaded } from "./web-components.js";
17
20
  import { toHtml } from "hast-util-to-html";
18
21
 
19
22
  //#region src/components/File.ts
23
+ const EMPTY_STRINGS = [];
20
24
  let instanceId = -1;
21
25
  var File = class {
22
26
  static LoadedCustomComponent = DiffsContainerLoaded;
23
- __id = ++instanceId;
27
+ __id = `file:${++instanceId}`;
24
28
  fileContainer;
25
29
  spriteSVG;
26
30
  pre;
27
31
  code;
32
+ bufferBefore;
33
+ bufferAfter;
28
34
  unsafeCSSStyle;
29
35
  hoverContent;
30
36
  errorWrapper;
37
+ placeHolder;
38
+ lastRenderedHeaderHTML;
39
+ appliedPreAttributes;
40
+ lastRowCount;
31
41
  headerElement;
32
42
  headerMetadata;
33
43
  fileRenderer;
34
44
  resizeManager;
35
45
  mouseEventManager;
36
46
  lineSelectionManager;
37
- annotationElements = [];
47
+ annotationCache = /* @__PURE__ */ new Map();
38
48
  lineAnnotations = [];
39
49
  file;
50
+ renderRange;
40
51
  constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
41
52
  this.options = options;
42
53
  this.workerManager = workerManager;
@@ -54,7 +65,8 @@ var File = class {
54
65
  if (this.file == null) return;
55
66
  this.render({
56
67
  file: this.file,
57
- forceRender: true
68
+ forceRender: true,
69
+ renderRange: this.renderRange
58
70
  });
59
71
  }
60
72
  setOptions(options) {
@@ -101,14 +113,21 @@ var File = class {
101
113
  this.lineSelectionManager.cleanUp();
102
114
  this.workerManager?.unsubscribeToThemeChanges(this);
103
115
  this.workerManager = void 0;
116
+ this.renderRange = void 0;
104
117
  this.file = void 0;
105
118
  if (!this.isContainerManaged) this.fileContainer?.parentNode?.removeChild(this.fileContainer);
106
119
  if (this.fileContainer?.shadowRoot != null) this.fileContainer.shadowRoot.innerHTML = "";
107
120
  this.fileContainer = void 0;
108
121
  this.pre = void 0;
122
+ this.bufferBefore = void 0;
123
+ this.bufferAfter = void 0;
124
+ this.appliedPreAttributes = void 0;
125
+ this.lastRowCount = void 0;
109
126
  this.headerElement = void 0;
127
+ this.lastRenderedHeaderHTML = void 0;
110
128
  this.errorWrapper = void 0;
111
129
  this.unsafeCSSStyle = void 0;
130
+ this.placeHolder = void 0;
112
131
  }
113
132
  hydrate(props) {
114
133
  const { fileContainer, prerenderedHTML } = props;
@@ -121,6 +140,7 @@ var File = class {
121
140
  if (!(element instanceof HTMLElement)) continue;
122
141
  if (element instanceof HTMLPreElement) {
123
142
  this.pre = element;
143
+ this.appliedPreAttributes = void 0;
124
144
  continue;
125
145
  }
126
146
  if (element instanceof HTMLStyleElement && element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)) {
@@ -129,12 +149,14 @@ var File = class {
129
149
  }
130
150
  if ("diffsHeader" in element.dataset) {
131
151
  this.headerElement = element;
152
+ this.lastRenderedHeaderHTML = void 0;
132
153
  continue;
133
154
  }
134
155
  }
135
156
  if (this.pre == null) this.render(props);
136
157
  else {
137
158
  const { file, lineAnnotations } = props;
159
+ const { overflow = "scroll" } = this.options;
138
160
  this.fileContainer = fileContainer;
139
161
  delete this.pre.dataset.dehydrated;
140
162
  this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;
@@ -145,33 +167,47 @@ var File = class {
145
167
  this.injectUnsafeCSS();
146
168
  this.mouseEventManager.setup(this.pre);
147
169
  this.lineSelectionManager.setup(this.pre);
148
- if ((this.options.overflow ?? "scroll") === "scroll") this.resizeManager.setup(this.pre);
170
+ this.resizeManager.setup(this.pre, overflow === "wrap");
149
171
  }
150
172
  }
151
- render({ file, fileContainer, forceRender = false, containerWrapper, lineAnnotations }) {
173
+ getOrCreateLineCache(file = this.file) {
174
+ return file != null ? this.fileRenderer.getOrCreateLineCache(file) : EMPTY_STRINGS;
175
+ }
176
+ render({ file, fileContainer, forceRender = false, containerWrapper, lineAnnotations, renderRange }) {
177
+ const previousRenderRange = this.renderRange;
152
178
  const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
153
- if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) return;
179
+ const didFileChange = !areFilesEqual(this.file, file);
180
+ if (!forceRender && areRenderRangesEqual(renderRange, this.renderRange) && !didFileChange && !annotationsChanged) return false;
181
+ this.renderRange = renderRange;
154
182
  this.file = file;
155
183
  this.fileRenderer.setOptions(this.options);
156
184
  if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
157
185
  this.fileRenderer.setLineAnnotations(this.lineAnnotations);
158
- const { disableFileHeader = false, disableErrorHandling = false } = this.options;
186
+ const { disableErrorHandling = false, disableFileHeader = false, overflow = "scroll" } = this.options;
159
187
  if (disableFileHeader) {
160
188
  if (this.headerElement != null) {
161
189
  this.headerElement.parentNode?.removeChild(this.headerElement);
162
190
  this.headerElement = void 0;
191
+ this.lastRenderedHeaderHTML = void 0;
163
192
  }
164
193
  }
165
194
  fileContainer = this.getOrCreateFileContainerNode(fileContainer, containerWrapper);
166
195
  try {
167
- const fileResult = this.fileRenderer.renderFile(file);
168
- if (fileResult == null) {
169
- if (this.workerManager != null && !this.workerManager.isInitialized()) this.workerManager.initialize().then(() => this.rerender());
170
- return;
171
- }
172
- if (fileResult.headerAST != null) this.applyHeaderToDOM(fileResult.headerAST, fileContainer);
173
196
  const pre = this.getOrCreatePreNode(fileContainer);
174
- this.applyHunksToDOM(fileResult, pre);
197
+ if (!this.canPartiallyRender(forceRender, annotationsChanged, didFileChange) || !this.applyPartialRender(previousRenderRange, renderRange)) {
198
+ const fileResult = this.fileRenderer.renderFile(file, renderRange);
199
+ if (fileResult == null) {
200
+ if (this.workerManager?.isInitialized() === false) this.workerManager.initialize().then(() => this.rerender());
201
+ return false;
202
+ }
203
+ if (fileResult.headerAST != null) this.applyHeaderToDOM(fileResult.headerAST, fileContainer);
204
+ this.applyFullRender(fileResult, pre);
205
+ }
206
+ this.applyBuffers(pre, renderRange);
207
+ this.injectUnsafeCSS();
208
+ this.mouseEventManager.setup(pre);
209
+ this.lineSelectionManager.setup(pre);
210
+ this.resizeManager.setup(pre, overflow === "wrap");
175
211
  this.renderAnnotations();
176
212
  this.renderHoverUtility();
177
213
  } catch (error) {
@@ -179,31 +215,92 @@ var File = class {
179
215
  console.error(error);
180
216
  if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
181
217
  }
218
+ return true;
219
+ }
220
+ canPartiallyRender(forceRender, annotationsChanged, didContentChange) {
221
+ if (forceRender || annotationsChanged || didContentChange) return false;
222
+ return true;
223
+ }
224
+ renderPlaceholder(height) {
225
+ if (this.fileContainer == null) return false;
226
+ this.cleanChildNodes();
227
+ if (this.placeHolder == null) {
228
+ const shadowRoot = this.fileContainer.shadowRoot ?? this.fileContainer.attachShadow({ mode: "open" });
229
+ this.placeHolder = document.createElement("div");
230
+ this.placeHolder.dataset.placeholder = "";
231
+ shadowRoot.appendChild(this.placeHolder);
232
+ }
233
+ this.placeHolder.style.setProperty("height", `${height}px`);
234
+ return true;
235
+ }
236
+ cleanChildNodes() {
237
+ this.resizeManager.cleanUp();
238
+ this.mouseEventManager.cleanUp();
239
+ this.lineSelectionManager.cleanUp();
240
+ this.bufferAfter?.remove();
241
+ this.bufferBefore?.remove();
242
+ this.code?.remove();
243
+ this.errorWrapper?.remove();
244
+ this.headerElement?.remove();
245
+ this.hoverContent?.remove();
246
+ this.pre?.remove();
247
+ this.spriteSVG?.remove();
248
+ this.unsafeCSSStyle?.remove();
249
+ this.bufferAfter = void 0;
250
+ this.bufferBefore = void 0;
251
+ this.code = void 0;
252
+ this.errorWrapper = void 0;
253
+ this.headerElement = void 0;
254
+ this.hoverContent = void 0;
255
+ this.pre = void 0;
256
+ this.spriteSVG = void 0;
257
+ this.unsafeCSSStyle = void 0;
258
+ this.lastRenderedHeaderHTML = void 0;
259
+ this.lastRowCount = void 0;
182
260
  }
183
261
  renderAnnotations() {
184
- if (this.isContainerManaged || this.fileContainer == null) return;
185
- for (const element of this.annotationElements) element.parentNode?.removeChild(element);
186
- this.annotationElements.length = 0;
262
+ if (this.isContainerManaged || this.fileContainer == null) {
263
+ for (const { element } of this.annotationCache.values()) element.parentNode?.removeChild(element);
264
+ this.annotationCache.clear();
265
+ return;
266
+ }
267
+ const staleAnnotations = new Map(this.annotationCache);
187
268
  const { renderAnnotation } = this.options;
188
- if (renderAnnotation != null && this.lineAnnotations.length > 0) for (const annotation of this.lineAnnotations) {
189
- const content = renderAnnotation(annotation);
190
- if (content == null) continue;
191
- const el = createAnnotationWrapperNode(getLineAnnotationName(annotation));
192
- el.appendChild(content);
193
- this.annotationElements.push(el);
194
- this.fileContainer.appendChild(el);
269
+ if (renderAnnotation != null && this.lineAnnotations.length > 0) for (const [index, annotation] of this.lineAnnotations.entries()) {
270
+ const id = `${index}-${getLineAnnotationName(annotation)}`;
271
+ let cache = this.annotationCache.get(id);
272
+ if (cache == null || !areLineAnnotationsEqual(annotation, cache.annotation)) {
273
+ cache?.element.parentElement?.removeChild(cache.element);
274
+ const content = renderAnnotation(annotation);
275
+ if (content == null) continue;
276
+ cache = {
277
+ element: createAnnotationWrapperNode(getLineAnnotationName(annotation)),
278
+ annotation
279
+ };
280
+ cache.element.appendChild(content);
281
+ this.fileContainer.appendChild(cache.element);
282
+ this.annotationCache.set(id, cache);
283
+ }
284
+ staleAnnotations.delete(id);
285
+ }
286
+ for (const [id, { element }] of staleAnnotations.entries()) {
287
+ this.annotationCache.delete(id);
288
+ element.parentNode?.removeChild(element);
195
289
  }
196
290
  }
197
291
  renderHoverUtility() {
198
292
  const { renderHoverUtility } = this.options;
199
293
  if (this.fileContainer == null || renderHoverUtility == null) return;
200
- if (this.hoverContent == null) {
201
- this.hoverContent = createHoverContentNode();
202
- this.fileContainer.appendChild(this.hoverContent);
203
- }
204
294
  const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);
205
- this.hoverContent.innerHTML = "";
206
- if (element != null) this.hoverContent.appendChild(element);
295
+ if (element != null && this.hoverContent != null) return;
296
+ else if (element == null) {
297
+ this.hoverContent?.parentNode?.removeChild(this.hoverContent);
298
+ this.hoverContent = void 0;
299
+ return;
300
+ }
301
+ this.hoverContent = createHoverContentNode();
302
+ this.hoverContent.appendChild(element);
303
+ this.fileContainer.appendChild(this.hoverContent);
207
304
  }
208
305
  injectUnsafeCSS() {
209
306
  if (this.fileContainer?.shadowRoot == null) return;
@@ -221,31 +318,161 @@ var File = class {
221
318
  }
222
319
  this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);
223
320
  }
224
- applyHunksToDOM(result, pre) {
321
+ applyFullRender(result, pre) {
225
322
  this.cleanupErrorWrapper();
226
323
  this.applyPreNodeAttributes(pre, result);
227
- pre.innerHTML = "";
228
- this.code = createCodeNode();
229
- this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);
230
- pre.appendChild(this.code);
231
- this.injectUnsafeCSS();
232
- this.mouseEventManager.setup(pre);
233
- this.lineSelectionManager.setup(pre);
234
- this.lineSelectionManager.setDirty();
235
- if ((this.options.overflow ?? "scroll") === "scroll") this.resizeManager.setup(pre);
236
- else this.resizeManager.cleanUp();
324
+ this.code = getOrCreateCodeNode({ code: this.code });
325
+ this.code.innerHTML = this.fileRenderer.renderPartialHTML(this.fileRenderer.renderCodeAST(result));
326
+ pre.replaceChildren(this.code);
327
+ this.lastRowCount = result.rowCount;
328
+ }
329
+ applyPartialRender(previousRenderRange, renderRange) {
330
+ if (previousRenderRange == null || renderRange == null) return false;
331
+ const { file, code } = this;
332
+ const columns = code != null ? this.getColumns(code) : void 0;
333
+ if (file == null || code == null || columns == null) return false;
334
+ const previousStart = previousRenderRange.startingLine;
335
+ const nextStart = renderRange.startingLine;
336
+ const previousEnd = previousRenderRange.totalLines === Infinity ? Number.POSITIVE_INFINITY : previousStart + previousRenderRange.totalLines;
337
+ const nextEnd = renderRange.totalLines === Infinity ? Number.POSITIVE_INFINITY : nextStart + renderRange.totalLines;
338
+ const overlapStart = Math.max(previousStart, nextStart);
339
+ const overlapEnd = Math.min(previousEnd, nextEnd);
340
+ if (overlapEnd <= overlapStart) return false;
341
+ if (!this.trimDOMToOverlap(columns.gutter, overlapStart, overlapEnd) || !this.trimDOMToOverlap(columns.content, overlapStart, overlapEnd)) return false;
342
+ let { length: rowCount } = columns.content.children;
343
+ const renderChunk = (startingLine, totalLines) => {
344
+ if (totalLines <= 0) return;
345
+ return this.fileRenderer.renderFile(file, {
346
+ startingLine,
347
+ totalLines,
348
+ bufferBefore: 0,
349
+ bufferAfter: 0
350
+ });
351
+ };
352
+ const prependResult = nextStart < overlapStart ? renderChunk(nextStart, overlapStart - nextStart) : void 0;
353
+ if (prependResult === void 0 && nextStart < overlapStart) return false;
354
+ const appendTotalLines = nextEnd === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : Math.max(0, nextEnd - overlapEnd);
355
+ const appendResult = nextEnd > overlapEnd ? renderChunk(overlapEnd, appendTotalLines) : void 0;
356
+ if (appendResult === void 0 && nextEnd > overlapEnd) return false;
357
+ this.cleanupErrorWrapper();
358
+ if (prependResult != null) {
359
+ columns.gutter.insertAdjacentHTML("afterbegin", this.fileRenderer.renderPartialHTML(prependResult.gutterAST));
360
+ columns.content.insertAdjacentHTML("afterbegin", this.fileRenderer.renderPartialHTML(prependResult.contentAST));
361
+ rowCount += prependResult.rowCount;
362
+ }
363
+ if (appendResult != null) {
364
+ columns.gutter.insertAdjacentHTML("beforeend", this.fileRenderer.renderPartialHTML(appendResult.gutterAST));
365
+ columns.content.insertAdjacentHTML("beforeend", this.fileRenderer.renderPartialHTML(appendResult.contentAST));
366
+ rowCount += appendResult.rowCount;
367
+ }
368
+ if (this.lastRowCount !== rowCount) {
369
+ columns.gutter.style.setProperty("grid-row", `span ${rowCount}`);
370
+ columns.content.style.setProperty("grid-row", `span ${rowCount}`);
371
+ this.lastRowCount = rowCount;
372
+ }
373
+ return true;
374
+ }
375
+ getColumns(code) {
376
+ const gutter = code.children[0];
377
+ const content = code.children[1];
378
+ if (!(gutter instanceof HTMLElement) || !(content instanceof HTMLElement) || gutter.dataset.gutter == null || content.dataset.content == null) return;
379
+ return {
380
+ gutter,
381
+ content
382
+ };
383
+ }
384
+ trimDOMToOverlap(container, overlapStart, overlapEnd) {
385
+ const boundaryIndices = this.getDOMBoundaryIndices(container, [overlapStart, overlapEnd]);
386
+ const startIndex = boundaryIndices.get(overlapStart) ?? container.children.length;
387
+ const endIndex = boundaryIndices.get(overlapEnd) ?? container.children.length;
388
+ if (startIndex > endIndex) return false;
389
+ for (let i = container.children.length - 1; i >= endIndex; i -= 1) container.children[i]?.remove();
390
+ for (let i = startIndex - 1; i >= 0; i -= 1) container.children[i]?.remove();
391
+ return true;
392
+ }
393
+ getDOMBoundaryIndices(container, boundaries) {
394
+ const sortedBoundaries = [...new Set(boundaries)].sort((a, b) => a - b);
395
+ const boundaryIndices = /* @__PURE__ */ new Map();
396
+ if (sortedBoundaries.length === 0) return boundaryIndices;
397
+ let boundaryIndex = 0;
398
+ let nextBoundary = sortedBoundaries[boundaryIndex];
399
+ const { children } = container;
400
+ for (let i = 0; i < children.length; i += 1) {
401
+ const child = children[i];
402
+ if (!(child instanceof HTMLElement)) continue;
403
+ const lineIndex = this.getLineIndexFromDOMNode(child);
404
+ if (lineIndex == null) continue;
405
+ while (nextBoundary != null && lineIndex >= nextBoundary) {
406
+ boundaryIndices.set(nextBoundary, i);
407
+ boundaryIndex += 1;
408
+ nextBoundary = sortedBoundaries[boundaryIndex];
409
+ }
410
+ if (boundaryIndex >= sortedBoundaries.length) break;
411
+ }
412
+ for (const boundary of sortedBoundaries) if (!boundaryIndices.has(boundary)) boundaryIndices.set(boundary, children.length);
413
+ return boundaryIndices;
414
+ }
415
+ getLineIndexFromDOMNode(node) {
416
+ const lineIndexAttr = node.dataset.lineIndex;
417
+ if (lineIndexAttr == null) return;
418
+ const parsed = Number(lineIndexAttr);
419
+ return Number.isNaN(parsed) ? void 0 : parsed;
420
+ }
421
+ applyBuffers(pre, renderRange) {
422
+ const { disableVirtualizationBuffers = false } = this.options;
423
+ if (disableVirtualizationBuffers || renderRange == null) {
424
+ if (this.bufferBefore != null) {
425
+ this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
426
+ this.bufferBefore = void 0;
427
+ }
428
+ if (this.bufferAfter != null) {
429
+ this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
430
+ this.bufferAfter = void 0;
431
+ }
432
+ return;
433
+ }
434
+ if (renderRange.bufferBefore > 0) {
435
+ if (this.bufferBefore == null) {
436
+ this.bufferBefore = document.createElement("div");
437
+ this.bufferBefore.dataset.virtualizerBuffer = "before";
438
+ pre.before(this.bufferBefore);
439
+ }
440
+ this.bufferBefore.style.setProperty("height", `${renderRange.bufferBefore}px`);
441
+ this.bufferBefore.style.setProperty("contain", "strict");
442
+ } else if (this.bufferBefore != null) {
443
+ this.bufferBefore.parentNode?.removeChild(this.bufferBefore);
444
+ this.bufferBefore = void 0;
445
+ }
446
+ if (renderRange.bufferAfter > 0) {
447
+ if (this.bufferAfter == null) {
448
+ this.bufferAfter = document.createElement("div");
449
+ this.bufferAfter.dataset.virtualizerBuffer = "after";
450
+ pre.after(this.bufferAfter);
451
+ }
452
+ this.bufferAfter.style.setProperty("height", `${renderRange.bufferAfter}px`);
453
+ this.bufferAfter.style.setProperty("contain", "strict");
454
+ } else if (this.bufferAfter != null) {
455
+ this.bufferAfter.parentNode?.removeChild(this.bufferAfter);
456
+ this.bufferAfter = void 0;
457
+ }
237
458
  }
238
459
  applyHeaderToDOM(headerAST, container) {
239
460
  const { file } = this;
240
461
  if (file == null) return;
241
462
  this.cleanupErrorWrapper();
242
- const tempDiv = document.createElement("div");
243
- tempDiv.innerHTML = toHtml(headerAST);
244
- const newHeader = tempDiv.firstElementChild;
245
- if (!(newHeader instanceof HTMLElement)) return;
246
- if (this.headerElement != null) container.shadowRoot?.replaceChild(newHeader, this.headerElement);
247
- else container.shadowRoot?.prepend(newHeader);
248
- this.headerElement = newHeader;
463
+ this.placeHolder?.remove();
464
+ this.placeHolder = void 0;
465
+ const headerHTML = toHtml(headerAST);
466
+ if (headerHTML !== this.lastRenderedHeaderHTML) {
467
+ const tempDiv = document.createElement("div");
468
+ tempDiv.innerHTML = headerHTML;
469
+ const newHeader = tempDiv.firstElementChild;
470
+ if (!(newHeader instanceof HTMLElement)) return;
471
+ if (this.headerElement != null) container.shadowRoot?.replaceChild(newHeader, this.headerElement);
472
+ else container.shadowRoot?.prepend(newHeader);
473
+ this.headerElement = newHeader;
474
+ this.lastRenderedHeaderHTML = headerHTML;
475
+ }
249
476
  if (this.isContainerManaged) return;
250
477
  const { renderCustomMetadata } = this.options;
251
478
  if (this.headerMetadata != null) this.headerMetadata.parentNode?.removeChild(this.headerMetadata);
@@ -259,7 +486,12 @@ var File = class {
259
486
  }
260
487
  }
261
488
  getOrCreateFileContainerNode(fileContainer, parentNode) {
489
+ const previousContainer = this.fileContainer;
262
490
  this.fileContainer = fileContainer ?? this.fileContainer ?? document.createElement(DIFFS_TAG_NAME);
491
+ if (previousContainer != null && previousContainer !== this.fileContainer) {
492
+ this.lastRenderedHeaderHTML = void 0;
493
+ this.headerElement = void 0;
494
+ }
263
495
  if (parentNode != null && this.fileContainer.parentNode !== parentNode) parentNode.appendChild(this.fileContainer);
264
496
  if (this.spriteSVG == null) {
265
497
  const fragment = document.createElement("div");
@@ -273,16 +505,24 @@ var File = class {
273
505
  return this.fileContainer;
274
506
  }
275
507
  getOrCreatePreNode(container) {
508
+ const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
276
509
  if (this.pre == null) {
277
510
  this.pre = document.createElement("pre");
511
+ this.appliedPreAttributes = void 0;
512
+ this.code = void 0;
513
+ shadowRoot.appendChild(this.pre);
514
+ } else if (this.pre.parentNode !== shadowRoot) {
278
515
  container.shadowRoot?.appendChild(this.pre);
279
- } else if (this.pre.parentNode !== container) container.shadowRoot?.appendChild(this.pre);
516
+ this.appliedPreAttributes = void 0;
517
+ }
518
+ this.placeHolder?.remove();
519
+ this.placeHolder = void 0;
280
520
  return this.pre;
281
521
  }
282
522
  applyPreNodeAttributes(pre, { totalLines, themeStyles, baseThemeType }) {
283
523
  const { overflow = "scroll", themeType = "system", disableLineNumbers = false } = this.options;
284
- setPreNodeProperties({
285
- pre,
524
+ const preProperties = {
525
+ type: "file",
286
526
  split: false,
287
527
  themeStyles,
288
528
  overflow,
@@ -291,7 +531,10 @@ var File = class {
291
531
  diffIndicators: "none",
292
532
  disableBackground: true,
293
533
  totalLines
294
- });
534
+ };
535
+ if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) return;
536
+ setPreNodeProperties(pre, preProperties);
537
+ this.appliedPreAttributes = preProperties;
295
538
  }
296
539
  applyErrorToDOM(error, container) {
297
540
  this.cleanupErrorWrapper();
@@ -299,6 +542,7 @@ var File = class {
299
542
  pre.innerHTML = "";
300
543
  pre.parentNode?.removeChild(pre);
301
544
  this.pre = void 0;
545
+ this.appliedPreAttributes = void 0;
302
546
  const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
303
547
  this.errorWrapper ??= document.createElement("div");
304
548
  this.errorWrapper.dataset.errorWrapper = "";