@pierre/diffs 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +26 -0
  3. package/dist/components/File.d.ts +78 -0
  4. package/dist/components/File.d.ts.map +1 -0
  5. package/dist/components/File.js +322 -0
  6. package/dist/components/File.js.map +1 -0
  7. package/dist/components/FileDiff.d.ts +90 -0
  8. package/dist/components/FileDiff.d.ts.map +1 -0
  9. package/dist/components/FileDiff.js +392 -0
  10. package/dist/components/FileDiff.js.map +1 -0
  11. package/dist/components/FileStream.d.ts +40 -0
  12. package/dist/components/FileStream.d.ts.map +1 -0
  13. package/dist/components/FileStream.js +161 -0
  14. package/dist/components/FileStream.js.map +1 -0
  15. package/dist/components/web-components.d.ts +5 -0
  16. package/dist/components/web-components.d.ts.map +1 -0
  17. package/dist/components/web-components.js +25 -0
  18. package/dist/components/web-components.js.map +1 -0
  19. package/dist/constants.d.ts +21 -0
  20. package/dist/constants.d.ts.map +1 -0
  21. package/dist/constants.js +23 -0
  22. package/dist/constants.js.map +1 -0
  23. package/dist/highlighter/languages/areLanguagesAttached.d.ts +7 -0
  24. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -0
  25. package/dist/highlighter/languages/areLanguagesAttached.js +11 -0
  26. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -0
  27. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +9 -0
  28. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -0
  29. package/dist/highlighter/languages/attachResolvedLanguages.js +20 -0
  30. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -0
  31. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts +5 -0
  32. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -0
  33. package/dist/highlighter/languages/cleanUpResolvedLanguages.js +11 -0
  34. package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -0
  35. package/dist/highlighter/languages/constants.d.ts +11 -0
  36. package/dist/highlighter/languages/constants.d.ts.map +1 -0
  37. package/dist/highlighter/languages/constants.js +8 -0
  38. package/dist/highlighter/languages/constants.js.map +1 -0
  39. package/dist/highlighter/languages/getResolvedLanguages.d.ts +9 -0
  40. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -0
  41. package/dist/highlighter/languages/getResolvedLanguages.js +16 -0
  42. package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -0
  43. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +9 -0
  44. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -0
  45. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +11 -0
  46. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -0
  47. package/dist/highlighter/languages/hasResolvedLanguages.d.ts +7 -0
  48. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -0
  49. package/dist/highlighter/languages/hasResolvedLanguages.js +11 -0
  50. package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -0
  51. package/dist/highlighter/languages/resolveLanguage.d.ts +9 -0
  52. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -0
  53. package/dist/highlighter/languages/resolveLanguage.js +30 -0
  54. package/dist/highlighter/languages/resolveLanguage.js.map +1 -0
  55. package/dist/highlighter/languages/resolveLanguages.d.ts +9 -0
  56. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -0
  57. package/dist/highlighter/languages/resolveLanguages.js +25 -0
  58. package/dist/highlighter/languages/resolveLanguages.js.map +1 -0
  59. package/dist/highlighter/shared_highlighter.d.ts +21 -0
  60. package/dist/highlighter/shared_highlighter.d.ts.map +1 -0
  61. package/dist/highlighter/shared_highlighter.js +71 -0
  62. package/dist/highlighter/shared_highlighter.js.map +1 -0
  63. package/dist/highlighter/themes/areThemesAttached.d.ts +7 -0
  64. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -0
  65. package/dist/highlighter/themes/areThemesAttached.js +12 -0
  66. package/dist/highlighter/themes/areThemesAttached.js.map +1 -0
  67. package/dist/highlighter/themes/attachResolvedThemes.d.ts +7 -0
  68. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -0
  69. package/dist/highlighter/themes/attachResolvedThemes.js +24 -0
  70. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -0
  71. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts +5 -0
  72. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -0
  73. package/dist/highlighter/themes/cleanUpResolvedThemes.js +11 -0
  74. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -0
  75. package/dist/highlighter/themes/constants.d.ts +11 -0
  76. package/dist/highlighter/themes/constants.d.ts.map +1 -0
  77. package/dist/highlighter/themes/constants.js +9 -0
  78. package/dist/highlighter/themes/constants.js.map +1 -0
  79. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts +7 -0
  80. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -0
  81. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +11 -0
  82. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -0
  83. package/dist/highlighter/themes/getResolvedThemes.d.ts +7 -0
  84. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -0
  85. package/dist/highlighter/themes/getResolvedThemes.js +16 -0
  86. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -0
  87. package/dist/highlighter/themes/hasResolvedThemes.d.ts +7 -0
  88. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -0
  89. package/dist/highlighter/themes/hasResolvedThemes.js +11 -0
  90. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -0
  91. package/dist/highlighter/themes/registerCustomTheme.d.ts +7 -0
  92. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -0
  93. package/dist/highlighter/themes/registerCustomTheme.js +14 -0
  94. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -0
  95. package/dist/highlighter/themes/resolveTheme.d.ts +7 -0
  96. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -0
  97. package/dist/highlighter/themes/resolveTheme.js +35 -0
  98. package/dist/highlighter/themes/resolveTheme.js.map +1 -0
  99. package/dist/highlighter/themes/resolveThemes.d.ts +7 -0
  100. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -0
  101. package/dist/highlighter/themes/resolveThemes.js +21 -0
  102. package/dist/highlighter/themes/resolveThemes.js.map +1 -0
  103. package/dist/index.d.ts +84 -0
  104. package/dist/index.js +83 -0
  105. package/dist/managers/LineSelectionManager.d.ts +64 -0
  106. package/dist/managers/LineSelectionManager.d.ts.map +1 -0
  107. package/dist/managers/LineSelectionManager.js +276 -0
  108. package/dist/managers/LineSelectionManager.js.map +1 -0
  109. package/dist/managers/MouseEventManager.d.ts +64 -0
  110. package/dist/managers/MouseEventManager.d.ts.map +1 -0
  111. package/dist/managers/MouseEventManager.js +244 -0
  112. package/dist/managers/MouseEventManager.js.map +1 -0
  113. package/dist/managers/ResizeManager.d.ts +11 -0
  114. package/dist/managers/ResizeManager.d.ts.map +1 -0
  115. package/dist/managers/ResizeManager.js +132 -0
  116. package/dist/managers/ResizeManager.js.map +1 -0
  117. package/dist/managers/ScrollSyncManager.d.ts +15 -0
  118. package/dist/managers/ScrollSyncManager.d.ts.map +1 -0
  119. package/dist/managers/ScrollSyncManager.js +54 -0
  120. package/dist/managers/ScrollSyncManager.js.map +1 -0
  121. package/dist/managers/UniversalRenderingManager.d.ts +6 -0
  122. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -0
  123. package/dist/managers/UniversalRenderingManager.js +32 -0
  124. package/dist/managers/UniversalRenderingManager.js.map +1 -0
  125. package/dist/react/File.d.ts +19 -0
  126. package/dist/react/File.d.ts.map +1 -0
  127. package/dist/react/File.js +36 -0
  128. package/dist/react/File.js.map +1 -0
  129. package/dist/react/FileDiff.d.ts +22 -0
  130. package/dist/react/FileDiff.d.ts.map +1 -0
  131. package/dist/react/FileDiff.js +36 -0
  132. package/dist/react/FileDiff.js.map +1 -0
  133. package/dist/react/MultiFileDiff.d.ts +24 -0
  134. package/dist/react/MultiFileDiff.d.ts.map +1 -0
  135. package/dist/react/MultiFileDiff.js +38 -0
  136. package/dist/react/MultiFileDiff.js.map +1 -0
  137. package/dist/react/PatchDiff.d.ts +21 -0
  138. package/dist/react/PatchDiff.d.ts.map +1 -0
  139. package/dist/react/PatchDiff.js +42 -0
  140. package/dist/react/PatchDiff.js.map +1 -0
  141. package/dist/react/WorkerPoolContext.d.ts +20 -0
  142. package/dist/react/WorkerPoolContext.d.ts.map +1 -0
  143. package/dist/react/WorkerPoolContext.js +41 -0
  144. package/dist/react/WorkerPoolContext.js.map +1 -0
  145. package/dist/react/constants.d.ts +7 -0
  146. package/dist/react/constants.d.ts.map +1 -0
  147. package/dist/react/constants.js +11 -0
  148. package/dist/react/constants.js.map +1 -0
  149. package/dist/react/index.d.ts +17 -0
  150. package/dist/react/index.js +14 -0
  151. package/dist/react/jsx.d.ts +12 -0
  152. package/dist/react/jsx.d.ts.map +1 -0
  153. package/dist/react/types.d.ts +34 -0
  154. package/dist/react/types.d.ts.map +1 -0
  155. package/dist/react/types.js +1 -0
  156. package/dist/react/utils/renderDiffChildren.d.ts +29 -0
  157. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -0
  158. package/dist/react/utils/renderDiffChildren.js +32 -0
  159. package/dist/react/utils/renderDiffChildren.js.map +1 -0
  160. package/dist/react/utils/renderFileChildren.d.ts +25 -0
  161. package/dist/react/utils/renderFileChildren.d.ts.map +1 -0
  162. package/dist/react/utils/renderFileChildren.js +28 -0
  163. package/dist/react/utils/renderFileChildren.js.map +1 -0
  164. package/dist/react/utils/templateRender.d.ts +7 -0
  165. package/dist/react/utils/templateRender.d.ts.map +1 -0
  166. package/dist/react/utils/templateRender.js +14 -0
  167. package/dist/react/utils/templateRender.js.map +1 -0
  168. package/dist/react/utils/useFileDiffInstance.d.ts +31 -0
  169. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -0
  170. package/dist/react/utils/useFileDiffInstance.js +54 -0
  171. package/dist/react/utils/useFileDiffInstance.js.map +1 -0
  172. package/dist/react/utils/useFileInstance.d.ts +27 -0
  173. package/dist/react/utils/useFileInstance.d.ts.map +1 -0
  174. package/dist/react/utils/useFileInstance.js +49 -0
  175. package/dist/react/utils/useFileInstance.js.map +1 -0
  176. package/dist/react/utils/useStableCallback.d.ts +5 -0
  177. package/dist/react/utils/useStableCallback.d.ts.map +1 -0
  178. package/dist/react/utils/useStableCallback.js +14 -0
  179. package/dist/react/utils/useStableCallback.js.map +1 -0
  180. package/dist/renderers/DiffHunksRenderer.d.ts +62 -0
  181. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -0
  182. package/dist/renderers/DiffHunksRenderer.js +651 -0
  183. package/dist/renderers/DiffHunksRenderer.js.map +1 -0
  184. package/dist/renderers/FileRenderer.d.ts +49 -0
  185. package/dist/renderers/FileRenderer.d.ts.map +1 -0
  186. package/dist/renderers/FileRenderer.js +239 -0
  187. package/dist/renderers/FileRenderer.js.map +1 -0
  188. package/dist/shiki-stream/index.d.ts +4 -0
  189. package/dist/shiki-stream/index.js +4 -0
  190. package/dist/shiki-stream/stream.d.ts +17 -0
  191. package/dist/shiki-stream/stream.d.ts.map +1 -0
  192. package/dist/shiki-stream/stream.js +32 -0
  193. package/dist/shiki-stream/stream.js.map +1 -0
  194. package/dist/shiki-stream/tokenizer.d.ts +24 -0
  195. package/dist/shiki-stream/tokenizer.d.ts.map +1 -0
  196. package/dist/shiki-stream/tokenizer.js +71 -0
  197. package/dist/shiki-stream/tokenizer.js.map +1 -0
  198. package/dist/shiki-stream/types.d.ts +45 -0
  199. package/dist/shiki-stream/types.d.ts.map +1 -0
  200. package/dist/shiki-stream/types.js +0 -0
  201. package/dist/sprite.d.ts +6 -0
  202. package/dist/sprite.d.ts.map +1 -0
  203. package/dist/sprite.js +55 -0
  204. package/dist/sprite.js.map +1 -0
  205. package/dist/ssr/FileDiffReact.d.ts +21 -0
  206. package/dist/ssr/FileDiffReact.d.ts.map +1 -0
  207. package/dist/ssr/FileDiffReact.js +53 -0
  208. package/dist/ssr/FileDiffReact.js.map +1 -0
  209. package/dist/ssr/index.d.ts +6 -0
  210. package/dist/ssr/index.js +6 -0
  211. package/dist/ssr/preloadDiffs.d.ts +72 -0
  212. package/dist/ssr/preloadDiffs.d.ts.map +1 -0
  213. package/dist/ssr/preloadDiffs.js +66 -0
  214. package/dist/ssr/preloadDiffs.js.map +1 -0
  215. package/dist/ssr/preloadFile.d.ts +23 -0
  216. package/dist/ssr/preloadFile.d.ts.map +1 -0
  217. package/dist/ssr/preloadFile.js +26 -0
  218. package/dist/ssr/preloadFile.js.map +1 -0
  219. package/dist/ssr/preloadPatchFile.d.ts +15 -0
  220. package/dist/ssr/preloadPatchFile.d.ts.map +1 -0
  221. package/dist/ssr/preloadPatchFile.js +17 -0
  222. package/dist/ssr/preloadPatchFile.js.map +1 -0
  223. package/dist/ssr/renderHTML.d.ts +7 -0
  224. package/dist/ssr/renderHTML.d.ts.map +1 -0
  225. package/dist/ssr/renderHTML.js +11 -0
  226. package/dist/ssr/renderHTML.js.map +1 -0
  227. package/dist/string-import.d.ts +6 -0
  228. package/dist/string-import.d.ts.map +1 -0
  229. package/dist/style.js +6 -0
  230. package/dist/style.js.map +1 -0
  231. package/dist/themes/pierre-dark.js +1328 -0
  232. package/dist/themes/pierre-dark.js.map +1 -0
  233. package/dist/themes/pierre-light.js +1328 -0
  234. package/dist/themes/pierre-light.js.map +1 -0
  235. package/dist/types.d.ts +238 -0
  236. package/dist/types.d.ts.map +1 -0
  237. package/dist/types.js +0 -0
  238. package/dist/utils/areFilesEqual.d.ts +7 -0
  239. package/dist/utils/areFilesEqual.d.ts.map +1 -0
  240. package/dist/utils/areFilesEqual.js +8 -0
  241. package/dist/utils/areFilesEqual.js.map +1 -0
  242. package/dist/utils/areObjectsEqual.d.ts +5 -0
  243. package/dist/utils/areObjectsEqual.d.ts.map +1 -0
  244. package/dist/utils/areObjectsEqual.js +18 -0
  245. package/dist/utils/areObjectsEqual.js.map +1 -0
  246. package/dist/utils/areOptionsEqual.d.ts +9 -0
  247. package/dist/utils/areOptionsEqual.d.ts.map +1 -0
  248. package/dist/utils/areOptionsEqual.js +12 -0
  249. package/dist/utils/areOptionsEqual.js.map +1 -0
  250. package/dist/utils/areSelectionsEqual.d.ts +7 -0
  251. package/dist/utils/areSelectionsEqual.d.ts.map +1 -0
  252. package/dist/utils/areSelectionsEqual.js +8 -0
  253. package/dist/utils/areSelectionsEqual.js.map +1 -0
  254. package/dist/utils/areThemesEqual.d.ts +7 -0
  255. package/dist/utils/areThemesEqual.d.ts.map +1 -0
  256. package/dist/utils/areThemesEqual.js +9 -0
  257. package/dist/utils/areThemesEqual.js.map +1 -0
  258. package/dist/utils/cleanLastNewline.d.ts +5 -0
  259. package/dist/utils/cleanLastNewline.d.ts.map +1 -0
  260. package/dist/utils/cleanLastNewline.js +8 -0
  261. package/dist/utils/cleanLastNewline.js.map +1 -0
  262. package/dist/utils/createAnnotationElement.d.ts +8 -0
  263. package/dist/utils/createAnnotationElement.d.ts.map +1 -0
  264. package/dist/utils/createAnnotationElement.js +21 -0
  265. package/dist/utils/createAnnotationElement.js.map +1 -0
  266. package/dist/utils/createAnnotationWrapperNode.d.ts +5 -0
  267. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -0
  268. package/dist/utils/createAnnotationWrapperNode.js +12 -0
  269. package/dist/utils/createAnnotationWrapperNode.js.map +1 -0
  270. package/dist/utils/createCodeNode.d.ts +12 -0
  271. package/dist/utils/createCodeNode.d.ts.map +1 -0
  272. package/dist/utils/createCodeNode.js +12 -0
  273. package/dist/utils/createCodeNode.js.map +1 -0
  274. package/dist/utils/createEmptyRowBuffer.d.ts +7 -0
  275. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -0
  276. package/dist/utils/createEmptyRowBuffer.js +16 -0
  277. package/dist/utils/createEmptyRowBuffer.js.map +1 -0
  278. package/dist/utils/createFileHeaderElement.d.ts +17 -0
  279. package/dist/utils/createFileHeaderElement.d.ts.map +1 -0
  280. package/dist/utils/createFileHeaderElement.js +84 -0
  281. package/dist/utils/createFileHeaderElement.js.map +1 -0
  282. package/dist/utils/createHoverContentNode.d.ts +5 -0
  283. package/dist/utils/createHoverContentNode.d.ts.map +1 -0
  284. package/dist/utils/createHoverContentNode.js +15 -0
  285. package/dist/utils/createHoverContentNode.js.map +1 -0
  286. package/dist/utils/createNoNewlineElement.d.ts +7 -0
  287. package/dist/utils/createNoNewlineElement.d.ts.map +1 -0
  288. package/dist/utils/createNoNewlineElement.js +24 -0
  289. package/dist/utils/createNoNewlineElement.js.map +1 -0
  290. package/dist/utils/createPreElement.d.ts +18 -0
  291. package/dist/utils/createPreElement.d.ts.map +1 -0
  292. package/dist/utils/createPreElement.js +28 -0
  293. package/dist/utils/createPreElement.js.map +1 -0
  294. package/dist/utils/createRowNodes.d.ts +8 -0
  295. package/dist/utils/createRowNodes.d.ts.map +1 -0
  296. package/dist/utils/createRowNodes.js +20 -0
  297. package/dist/utils/createRowNodes.js.map +1 -0
  298. package/dist/utils/createSeparator.d.ts +25 -0
  299. package/dist/utils/createSeparator.d.ts.map +1 -0
  300. package/dist/utils/createSeparator.js +69 -0
  301. package/dist/utils/createSeparator.js.map +1 -0
  302. package/dist/utils/createSpanNodeFromToken.d.ts +7 -0
  303. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -0
  304. package/dist/utils/createSpanNodeFromToken.js +13 -0
  305. package/dist/utils/createSpanNodeFromToken.js.map +1 -0
  306. package/dist/utils/createStyleElement.d.ts +7 -0
  307. package/dist/utils/createStyleElement.d.ts.map +1 -0
  308. package/dist/utils/createStyleElement.js +19 -0
  309. package/dist/utils/createStyleElement.js.map +1 -0
  310. package/dist/utils/createTransformerWithState.d.ts +13 -0
  311. package/dist/utils/createTransformerWithState.d.ts.map +1 -0
  312. package/dist/utils/createTransformerWithState.js +56 -0
  313. package/dist/utils/createTransformerWithState.js.map +1 -0
  314. package/dist/utils/createUnsafeCSSStyleNode.d.ts +5 -0
  315. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -0
  316. package/dist/utils/createUnsafeCSSStyleNode.js +12 -0
  317. package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -0
  318. package/dist/utils/cssWrappers.d.ts +6 -0
  319. package/dist/utils/cssWrappers.d.ts.map +1 -0
  320. package/dist/utils/cssWrappers.js +21 -0
  321. package/dist/utils/cssWrappers.js.map +1 -0
  322. package/dist/utils/diffAcceptRejectHunk.d.ts +7 -0
  323. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -0
  324. package/dist/utils/diffAcceptRejectHunk.js +82 -0
  325. package/dist/utils/diffAcceptRejectHunk.js.map +1 -0
  326. package/dist/utils/formatCSSVariablePrefix.d.ts +5 -0
  327. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -0
  328. package/dist/utils/formatCSSVariablePrefix.js +8 -0
  329. package/dist/utils/formatCSSVariablePrefix.js.map +1 -0
  330. package/dist/utils/getFiletypeFromFileName.d.ts +9 -0
  331. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -0
  332. package/dist/utils/getFiletypeFromFileName.js +343 -0
  333. package/dist/utils/getFiletypeFromFileName.js.map +1 -0
  334. package/dist/utils/getHighlighterOptions.d.ts +14 -0
  335. package/dist/utils/getHighlighterOptions.d.ts.map +1 -0
  336. package/dist/utils/getHighlighterOptions.js +13 -0
  337. package/dist/utils/getHighlighterOptions.js.map +1 -0
  338. package/dist/utils/getHighlighterThemeStyles.d.ts +16 -0
  339. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -0
  340. package/dist/utils/getHighlighterThemeStyles.js +40 -0
  341. package/dist/utils/getHighlighterThemeStyles.js.map +1 -0
  342. package/dist/utils/getHunkSeparatorSlotName.d.ts +5 -0
  343. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -0
  344. package/dist/utils/getHunkSeparatorSlotName.js +8 -0
  345. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -0
  346. package/dist/utils/getIconForType.d.ts +8 -0
  347. package/dist/utils/getIconForType.d.ts.map +1 -0
  348. package/dist/utils/getIconForType.js +15 -0
  349. package/dist/utils/getIconForType.js.map +1 -0
  350. package/dist/utils/getLineAnnotationName.d.ts +7 -0
  351. package/dist/utils/getLineAnnotationName.d.ts.map +1 -0
  352. package/dist/utils/getLineAnnotationName.js +8 -0
  353. package/dist/utils/getLineAnnotationName.js.map +1 -0
  354. package/dist/utils/getLineEndingType.d.ts +5 -0
  355. package/dist/utils/getLineEndingType.d.ts.map +1 -0
  356. package/dist/utils/getLineEndingType.js +11 -0
  357. package/dist/utils/getLineEndingType.js.map +1 -0
  358. package/dist/utils/getLineNodes.d.ts +7 -0
  359. package/dist/utils/getLineNodes.d.ts.map +1 -0
  360. package/dist/utils/getLineNodes.js +15 -0
  361. package/dist/utils/getLineNodes.js.map +1 -0
  362. package/dist/utils/getSingularPatch.d.ts +7 -0
  363. package/dist/utils/getSingularPatch.d.ts.map +1 -0
  364. package/dist/utils/getSingularPatch.js +20 -0
  365. package/dist/utils/getSingularPatch.js.map +1 -0
  366. package/dist/utils/getThemes.d.ts +7 -0
  367. package/dist/utils/getThemes.d.ts.map +1 -0
  368. package/dist/utils/getThemes.js +16 -0
  369. package/dist/utils/getThemes.js.map +1 -0
  370. package/dist/utils/getTotalLineCountFromHunks.d.ts +7 -0
  371. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -0
  372. package/dist/utils/getTotalLineCountFromHunks.js +10 -0
  373. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -0
  374. package/dist/utils/hast_utils.d.ts +31 -0
  375. package/dist/utils/hast_utils.d.ts.map +1 -0
  376. package/dist/utils/hast_utils.js +42 -0
  377. package/dist/utils/hast_utils.js.map +1 -0
  378. package/dist/utils/isWorkerContext.d.ts +5 -0
  379. package/dist/utils/isWorkerContext.d.ts.map +1 -0
  380. package/dist/utils/isWorkerContext.js +8 -0
  381. package/dist/utils/isWorkerContext.js.map +1 -0
  382. package/dist/utils/parseDiffDecorations.d.ts +31 -0
  383. package/dist/utils/parseDiffDecorations.d.ts.map +1 -0
  384. package/dist/utils/parseDiffDecorations.js +34 -0
  385. package/dist/utils/parseDiffDecorations.js.map +1 -0
  386. package/dist/utils/parseDiffFromFile.d.ts +14 -0
  387. package/dist/utils/parseDiffFromFile.d.ts.map +1 -0
  388. package/dist/utils/parseDiffFromFile.js +23 -0
  389. package/dist/utils/parseDiffFromFile.js.map +1 -0
  390. package/dist/utils/parseLineType.d.ts +11 -0
  391. package/dist/utils/parseLineType.d.ts.map +1 -0
  392. package/dist/utils/parseLineType.js +16 -0
  393. package/dist/utils/parseLineType.js.map +1 -0
  394. package/dist/utils/parsePatchFiles.d.ts +16 -0
  395. package/dist/utils/parsePatchFiles.d.ts.map +1 -0
  396. package/dist/utils/parsePatchFiles.js +204 -0
  397. package/dist/utils/parsePatchFiles.js.map +1 -0
  398. package/dist/utils/prerenderHTMLIfNecessary.d.ts +5 -0
  399. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -0
  400. package/dist/utils/prerenderHTMLIfNecessary.js +10 -0
  401. package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -0
  402. package/dist/utils/processLine.d.ts +8 -0
  403. package/dist/utils/processLine.d.ts.map +1 -0
  404. package/dist/utils/processLine.js +42 -0
  405. package/dist/utils/processLine.js.map +1 -0
  406. package/dist/utils/renderDiffWithHighlighter.d.ts +7 -0
  407. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -0
  408. package/dist/utils/renderDiffWithHighlighter.js +323 -0
  409. package/dist/utils/renderDiffWithHighlighter.js.map +1 -0
  410. package/dist/utils/renderFileWithHighlighter.d.ts +10 -0
  411. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -0
  412. package/dist/utils/renderFileWithHighlighter.js +52 -0
  413. package/dist/utils/renderFileWithHighlighter.js.map +1 -0
  414. package/dist/utils/setLanguageOverride.d.ts +7 -0
  415. package/dist/utils/setLanguageOverride.d.ts.map +1 -0
  416. package/dist/utils/setLanguageOverride.js +11 -0
  417. package/dist/utils/setLanguageOverride.js.map +1 -0
  418. package/dist/utils/setWrapperNodeProps.d.ts +20 -0
  419. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -0
  420. package/dist/utils/setWrapperNodeProps.js +29 -0
  421. package/dist/utils/setWrapperNodeProps.js.map +1 -0
  422. package/dist/worker/WorkerPoolManager.d.ts +72 -0
  423. package/dist/worker/WorkerPoolManager.d.ts.map +1 -0
  424. package/dist/worker/WorkerPoolManager.js +421 -0
  425. package/dist/worker/WorkerPoolManager.js.map +1 -0
  426. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts +16 -0
  427. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -0
  428. package/dist/worker/getOrCreateWorkerPoolSingleton.js +20 -0
  429. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -0
  430. package/dist/worker/index.d.ts +4 -0
  431. package/dist/worker/index.js +4 -0
  432. package/dist/worker/types.d.ts +140 -0
  433. package/dist/worker/types.d.ts.map +1 -0
  434. package/dist/worker/types.js +0 -0
  435. package/dist/worker/worker-portable.d.ts +1 -0
  436. package/dist/worker/worker-portable.js +14872 -0
  437. package/dist/worker/worker-portable.js.map +1 -0
  438. package/dist/worker/worker.d.ts +1 -0
  439. package/dist/worker/worker.js +1061 -0
  440. package/dist/worker/worker.js.map +1 -0
  441. package/package.json +76 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"File.js","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { type FileRenderResult, FileRenderer } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n RenderFileMetadata,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n}\n\nexport interface FileHyrdateProps<LAnnotation>\n extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions,\n MouseEventManagerBaseOptions<'file'>,\n LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n renderAnnotation?(\n annotation: LineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n private errorWrapper: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n\n private fileRenderer: FileRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private mouseEventManager: MouseEventManager<'file'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n\n private file: FileContents | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.mouseEventManager = new MouseEventManager(\n 'file',\n pluckMouseEventOptions(options)\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n rerender(): void {\n if (this.file == null) return;\n this.render({ file: this.file, forceRender: true });\n }\n\n setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.mouseEventManager.setOptions(pluckMouseEventOptions(options));\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n const currentThemeType = this.options.themeType ?? 'system';\n if (currentThemeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.fileRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.fileRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.file = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n this.unsafeCSSStyle = undefined;\n }\n\n hydrate(props: FileHyrdateProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { file, lineAnnotations } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n }\n }\n }\n\n render({\n file,\n fileContainer,\n forceRender = false,\n containerWrapper,\n lineAnnotations,\n }: FileRenderProps<LAnnotation>): void {\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) {\n return;\n }\n\n this.file = file;\n this.fileRenderer.setOptions(this.options);\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n }\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n\n try {\n const fileResult = this.fileRenderer.renderFile(file);\n if (fileResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(fileResult, pre);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.parentNode?.removeChild(this.unsafeCSSStyle);\n this.unsafeCSSStyle = undefined;\n }\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n pre.innerHTML = '';\n // Create code elements and insert HTML content\n this.code = createCodeNode();\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);\n pre.appendChild(this.code);\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n this.lineSelectionManager.setDirty();\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n } else {\n this.resizeManager.cleanUp();\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderCustomMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content = renderCustomMetadata?.(file) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines, themeStyles, baseThemeType }: FileRenderResult\n ): void {\n const {\n overflow = 'scroll',\n themeType = 'system',\n disableLineNumbers = false,\n } = this.options;\n setPreNodeProperties({\n pre,\n split: false,\n themeStyles,\n overflow,\n disableLineNumbers,\n themeType: baseThemeType ?? themeType,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuEA,IAAI,aAAa;AAEjB,IAAa,OAAb,MAA2C;CACzC,OAAO,wBAAiC;CAExC,AAAS,OAAe,EAAE;CAC1B,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,AAAQ;CACR,AAAQ;CAER,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,AAAQ,qBAAoC,EAAE;CAC9C,AAAQ,kBAAiD,EAAE;CAE3D,AAAQ;CAER,YACE,AAAOA,UAAoC,EAAE,OAAO,gBAAgB,EACpE,AAAQC,eACR,AAAQ,qBAAqB,OAC7B;EAHO;EACC;EACA;AAER,OAAK,eAAe,IAAI,aACtB,SACA,KAAK,uBACL,KAAK,cACN;AACD,OAAK,gBAAgB,IAAI,eAAe;AACxC,OAAK,oBAAoB,IAAI,kBAC3B,QACA,uBAAuB,QAAQ,CAChC;AACD,OAAK,uBAAuB,IAAI,qBAC9B,0BAA0B,QAAQ,CACnC;AACD,OAAK,eAAe,wBAAwB,KAAK;;CAGnD,AAAQ,8BAAoC;AAC1C,OAAK,UAAU;;CAGjB,WAAiB;AACf,MAAI,KAAK,QAAQ,KAAM;AACvB,OAAK,OAAO;GAAE,MAAM,KAAK;GAAM,aAAa;GAAM,CAAC;;CAGrD,WAAW,SAAqD;AAC9D,MAAI,WAAW,KAAM;AACrB,OAAK,UAAU;AACf,OAAK,kBAAkB,WAAW,uBAAuB,QAAQ,CAAC;AAClE,OAAK,qBAAqB,WAAW,0BAA0B,QAAQ,CAAC;;CAG1E,AAAQ,aAAa,SAAkD;AACrE,OAAK,UAAU;GAAE,GAAG,KAAK;GAAS,GAAG;GAAS;;CAGhD,aAAa,WAA6B;AAExC,OADyB,KAAK,QAAQ,aAAa,cAC1B,UACvB;AAEF,OAAK,aAAa,EAAE,WAAW,CAAC;AAChC,OAAK,aAAa,aAAa,UAAU;AAEzC,MAAI,KAAK,iBAAiB,KACxB,KAAI,cAAc,SAChB,QAAO,KAAK,cAAc,QAAQ;MAElC,MAAK,cAAc,QAAQ,YAAY;AAK3C,MAAI,KAAK,OAAO,KACd,SAAQ,WAAR;GACE,KAAK;AACH,WAAO,KAAK,IAAI,QAAQ;AACxB;GACF,KAAK;GACL,KAAK;AACH,SAAK,IAAI,QAAQ,YAAY;AAC7B;;;CAKR,uBAAiE;AAC/D,SAAO,KAAK,kBAAkB,gBAAgB;;CAGhD,mBAAmB,iBAAsD;AACvE,OAAK,kBAAkB;;CAGzB,iBAAiB,OAAuC;AACtD,OAAK,qBAAqB,aAAa,MAAM;;CAG/C,UAAgB;AACd,OAAK,aAAa,SAAS;AAC3B,OAAK,cAAc,SAAS;AAC5B,OAAK,kBAAkB,SAAS;AAChC,OAAK,qBAAqB,SAAS;AACnC,OAAK,eAAe,0BAA0B,KAAK;AACnD,OAAK,gBAAgB;AAGrB,OAAK,OAAO;AAGZ,MAAI,CAAC,KAAK,mBACR,MAAK,eAAe,YAAY,YAAY,KAAK,cAAc;AAEjE,MAAI,KAAK,eAAe,cAAc,KACpC,MAAK,cAAc,WAAW,YAAY;AAE5C,OAAK,gBAAgB;AACrB,OAAK,MAAM;AACX,OAAK,gBAAgB;AACrB,OAAK,eAAe;AACpB,OAAK,iBAAiB;;CAGxB,QAAQ,OAA4C;EAClD,MAAM,EAAE,eAAe,oBAAoB;AAC3C,2BAAyB,eAAe,gBAAgB;AACxD,OAAK,MAAM,WAAW,MAAM,KAC1B,cAAc,YAAY,YAAY,EAAE,CACzC,EAAE;AACD,OAAI,mBAAmB,YAAY;AACjC,SAAK,YAAY;AACjB;;AAEF,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,mBAAmB,gBAAgB;AACrC,SAAK,MAAM;AACX;;AAEF,OACE,mBAAmB,oBACnB,QAAQ,aAAa,qBAAqB,EAC1C;AACA,SAAK,iBAAiB;AACtB;;AAEF,OAAI,iBAAiB,QAAQ,SAAS;AACpC,SAAK,gBAAgB;AACrB;;;AAIJ,MAAI,KAAK,OAAO,KACd,MAAK,OAAO,MAAM;OAGf;GACH,MAAM,EAAE,MAAM,oBAAoB;AAClC,QAAK,gBAAgB;AACrB,UAAO,KAAK,IAAI,QAAQ;AAExB,QAAK,kBAAkB,mBAAmB,KAAK;AAC/C,QAAK,OAAO;AACZ,QAAK,aAAa,QAAQ,KAAK;AAC/B,QAAK,mBAAmB;AACxB,QAAK,oBAAoB;AACzB,QAAK,iBAAiB;AACtB,QAAK,kBAAkB,MAAM,KAAK,IAAI;AACtC,QAAK,qBAAqB,MAAM,KAAK,IAAI;AACzC,QAAK,KAAK,QAAQ,YAAY,cAAc,SAC1C,MAAK,cAAc,MAAM,KAAK,IAAI;;;CAKxC,OAAO,EACL,MACA,eACA,cAAc,OACd,kBACA,mBACqC;EACrC,MAAM,qBACJ,mBAAmB,SAClB,gBAAgB,SAAS,KAAK,KAAK,gBAAgB,SAAS,KACzD,oBAAoB,KAAK,kBACzB;AACN,MAAI,CAAC,eAAe,cAAc,KAAK,MAAM,KAAK,IAAI,CAAC,mBACrD;AAGF,OAAK,OAAO;AACZ,OAAK,aAAa,WAAW,KAAK,QAAQ;AAC1C,MAAI,mBAAmB,KACrB,MAAK,mBAAmB,gBAAgB;AAE1C,OAAK,aAAa,mBAAmB,KAAK,gBAAgB;EAE1D,MAAM,EAAE,oBAAoB,UAAU,KAAK;AAC3C,MAAI,mBAEF;OAAI,KAAK,iBAAiB,MAAM;AAC9B,SAAK,cAAc,YAAY,YAAY,KAAK,cAAc;AAC9D,SAAK,gBAAgB;;;AAIzB,kBAAgB,KAAK,6BACnB,eACA,iBACD;AAED,MAAI;GACF,MAAM,aAAa,KAAK,aAAa,WAAW,KAAK;AACrD,OAAI,cAAc,MAAM;AACtB,QAAI,KAAK,iBAAiB,QAAQ,CAAC,KAAK,cAAc,eAAe,CACnE,CAAK,KAAK,cAAc,YAAY,CAAC,WAAW,KAAK,UAAU,CAAC;AAElE;;AAEF,OAAI,WAAW,aAAa,KAC1B,MAAK,iBAAiB,WAAW,WAAW,cAAc;GAE5D,MAAM,MAAM,KAAK,mBAAmB,cAAc;AAClD,QAAK,gBAAgB,YAAY,IAAI;AACrC,QAAK,mBAAmB;AACxB,QAAK,oBAAoB;WAClBC,OAAgB;AACvB,OAAI,iBAAiB,MACnB,MAAK,gBAAgB,OAAO,cAAc;;;CAKhD,AAAQ,oBAA0B;AAChC,MAAI,KAAK,sBAAsB,KAAK,iBAAiB,KACnD;AAGF,OAAK,MAAM,WAAW,KAAK,mBACzB,SAAQ,YAAY,YAAY,QAAQ;AAE1C,OAAK,mBAAmB,SAAS;EAEjC,MAAM,EAAE,qBAAqB,KAAK;AAClC,MAAI,oBAAoB,QAAQ,KAAK,gBAAgB,SAAS,EAC5D,MAAK,MAAM,cAAc,KAAK,iBAAiB;GAC7C,MAAM,UAAU,iBAAiB,WAAW;AAC5C,OAAI,WAAW,KAAM;GACrB,MAAM,KAAK,4BACT,sBAAsB,WAAW,CAClC;AACD,MAAG,YAAY,QAAQ;AACvB,QAAK,mBAAmB,KAAK,GAAG;AAChC,QAAK,cAAc,YAAY,GAAG;;;CAKxC,AAAQ,qBAAqB;EAC3B,MAAM,EAAE,uBAAuB,KAAK;AACpC,MAAI,KAAK,iBAAiB,QAAQ,sBAAsB,KAAM;AAC9D,MAAI,KAAK,gBAAgB,MAAM;AAC7B,QAAK,eAAe,wBAAwB;AAC5C,QAAK,cAAc,YAAY,KAAK,aAAa;;EAEnD,MAAM,UAAU,mBAAmB,KAAK,kBAAkB,eAAe;AACzE,OAAK,aAAa,YAAY;AAC9B,MAAI,WAAW,KACb,MAAK,aAAa,YAAY,QAAQ;;CAI1C,AAAQ,kBAAwB;AAC9B,MAAI,KAAK,eAAe,cAAc,KACpC;EAEF,MAAM,EAAE,cAAc,KAAK;AAE3B,MAAI,aAAa,QAAQ,cAAc,IAAI;AACzC,OAAI,KAAK,kBAAkB,MAAM;AAC/B,SAAK,eAAe,YAAY,YAAY,KAAK,eAAe;AAChE,SAAK,iBAAiB;;AAExB;;AAIF,MAAI,KAAK,kBAAkB,MAAM;AAC/B,QAAK,iBAAiB,0BAA0B;AAChD,QAAK,cAAc,WAAW,YAAY,KAAK,eAAe;;AAGhE,OAAK,eAAe,YAAY,cAAc,UAAU;;CAG1D,AAAQ,gBAAgB,QAA0B,KAA2B;AAC3E,OAAK,qBAAqB;AAC1B,OAAK,uBAAuB,KAAK,OAAO;AACxC,MAAI,YAAY;AAEhB,OAAK,OAAO,gBAAgB;AAC5B,OAAK,KAAK,YAAY,KAAK,aAAa,kBAAkB,OAAO,QAAQ;AACzE,MAAI,YAAY,KAAK,KAAK;AAC1B,OAAK,iBAAiB;AACtB,OAAK,kBAAkB,MAAM,IAAI;AACjC,OAAK,qBAAqB,MAAM,IAAI;AACpC,OAAK,qBAAqB,UAAU;AACpC,OAAK,KAAK,QAAQ,YAAY,cAAc,SAC1C,MAAK,cAAc,MAAM,IAAI;MAE7B,MAAK,cAAc,SAAS;;CAIhC,AAAQ,iBACN,WACA,WACM;EACN,MAAM,EAAE,SAAS;AACjB,MAAI,QAAQ,KAAM;AAClB,OAAK,qBAAqB;EAC1B,MAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,UAAQ,YAAY,OAAO,UAAU;EACrC,MAAM,YAAY,QAAQ;AAC1B,MAAI,EAAE,qBAAqB,aACzB;AAEF,MAAI,KAAK,iBAAiB,KACxB,WAAU,YAAY,aAAa,WAAW,KAAK,cAAc;MAEjE,WAAU,YAAY,QAAQ,UAAU;AAE1C,OAAK,gBAAgB;AAErB,MAAI,KAAK,mBAAoB;EAE7B,MAAM,EAAE,yBAAyB,KAAK;AACtC,MAAI,KAAK,kBAAkB,KACzB,MAAK,eAAe,YAAY,YAAY,KAAK,eAAe;EAElE,MAAM,UAAU,uBAAuB,KAAK,IAAI;AAChD,MAAI,WAAW,MAAM;AACnB,QAAK,iBAAiB,SAAS,cAAc,MAAM;AACnD,QAAK,eAAe,OAAO;AAC3B,OAAI,mBAAmB,QACrB,MAAK,eAAe,YAAY,QAAQ;OAExC,MAAK,eAAe,YAAY,GAAG;AAErC,aAAU,YAAY,KAAK,eAAe;;;CAI9C,AAAQ,6BACN,eACA,YACa;AACb,OAAK,gBACH,iBACA,KAAK,iBACL,SAAS,cAAc,eAAe;AACxC,MAAI,cAAc,QAAQ,KAAK,cAAc,eAAe,WAC1D,YAAW,YAAY,KAAK,cAAc;AAE5C,MAAI,KAAK,aAAa,MAAM;GAC1B,MAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,YAAS,YAAY;GACrB,MAAM,aAAa,SAAS;AAC5B,OAAI,sBAAsB,YAAY;AACpC,SAAK,YAAY;AACjB,SAAK,cAAc,YAAY,YAAY,KAAK,UAAU;;;AAG9D,SAAO,KAAK;;CAGd,AAAQ,mBAAmB,WAAwC;AAEjE,MAAI,KAAK,OAAO,MAAM;AACpB,QAAK,MAAM,SAAS,cAAc,MAAM;AACxC,aAAU,YAAY,YAAY,KAAK,IAAI;aAIpC,KAAK,IAAI,eAAe,UAC/B,WAAU,YAAY,YAAY,KAAK,IAAI;AAE7C,SAAO,KAAK;;CAGd,AAAQ,uBACN,KACA,EAAE,YAAY,aAAa,iBACrB;EACN,MAAM,EACJ,WAAW,UACX,YAAY,UACZ,qBAAqB,UACnB,KAAK;AACT,uBAAqB;GACnB;GACA,OAAO;GACP;GACA;GACA;GACA,WAAW,iBAAiB;GAC5B,gBAAgB;GAChB,mBAAmB;GACnB;GACD,CAAC;;CAGJ,AAAQ,gBAAgB,OAAc,WAAwB;AAC5D,OAAK,qBAAqB;EAC1B,MAAM,MAAM,KAAK,mBAAmB,UAAU;AAC9C,MAAI,YAAY;AAChB,MAAI,YAAY,YAAY,IAAI;AAChC,OAAK,MAAM;EACX,MAAM,aACJ,UAAU,cAAc,UAAU,aAAa,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAK,iBAAiB,SAAS,cAAc,MAAM;AACnD,OAAK,aAAa,QAAQ,eAAe;AACzC,OAAK,aAAa,YAAY;AAC9B,aAAW,YAAY,KAAK,aAAa;EACzC,MAAM,eAAe,SAAS,cAAc,MAAM;AAClD,eAAa,QAAQ,eAAe;AACpC,eAAa,YAAY,MAAM;AAC/B,OAAK,aAAa,YAAY,aAAa;EAC3C,MAAM,aAAa,SAAS,cAAc,MAAM;AAChD,aAAW,QAAQ,aAAa;AAChC,aAAW,YAAY,MAAM,SAAS;AACtC,OAAK,aAAa,YAAY,WAAW;;CAG3C,AAAQ,sBAAsB;AAC5B,OAAK,cAAc,YAAY,YAAY,KAAK,aAAa;AAC7D,OAAK,eAAe"}
@@ -0,0 +1,90 @@
1
+ import { BaseDiffOptions, DiffLineAnnotation, ExpansionDirections, FileContents, FileDiffMetadata, HunkData, HunkSeparators, RenderHeaderMetadataCallback, ThemeTypes } from "../types.js";
2
+ import { LineSelectionOptions, SelectedLineRange } from "../managers/LineSelectionManager.js";
3
+ import { GetHoveredLineResult, MouseEventManagerBaseOptions } from "../managers/MouseEventManager.js";
4
+ import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
5
+ import "../worker/index.js";
6
+
7
+ //#region src/components/FileDiff.d.ts
8
+ interface FileDiffRenderProps<LAnnotation> {
9
+ fileDiff?: FileDiffMetadata;
10
+ oldFile?: FileContents;
11
+ newFile?: FileContents;
12
+ forceRender?: boolean;
13
+ fileContainer?: HTMLElement;
14
+ containerWrapper?: HTMLElement;
15
+ lineAnnotations?: DiffLineAnnotation<LAnnotation>[];
16
+ }
17
+ interface FileDiffHydrationProps<LAnnotation> extends Omit<FileDiffRenderProps<LAnnotation>, "fileContainer"> {
18
+ fileContainer: HTMLElement;
19
+ prerenderedHTML?: string;
20
+ }
21
+ interface FileDiffOptions<LAnnotation> extends Omit<BaseDiffOptions, "hunkSeparators">, MouseEventManagerBaseOptions<"diff">, LineSelectionOptions {
22
+ hunkSeparators?: Exclude<HunkSeparators, "custom"> | ((hunk: HunkData, instance: FileDiff<LAnnotation>) => HTMLElement | DocumentFragment);
23
+ disableFileHeader?: boolean;
24
+ renderHeaderMetadata?: RenderHeaderMetadataCallback;
25
+ renderAnnotation?(annotation: DiffLineAnnotation<LAnnotation>): HTMLElement | undefined;
26
+ renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<"diff"> | undefined): HTMLElement | null;
27
+ }
28
+ declare class FileDiff<LAnnotation = undefined> {
29
+ options: FileDiffOptions<LAnnotation>;
30
+ private workerManager?;
31
+ private isContainerManaged;
32
+ static LoadedCustomComponent: boolean;
33
+ readonly __id: number;
34
+ private fileContainer;
35
+ private spriteSVG;
36
+ private pre;
37
+ private unsafeCSSStyle;
38
+ private hoverContent;
39
+ private headerElement;
40
+ private headerMetadata;
41
+ private customHunkElements;
42
+ private errorWrapper;
43
+ private hunksRenderer;
44
+ private resizeManager;
45
+ private scrollSyncManager;
46
+ private mouseEventManager;
47
+ private lineSelectionManager;
48
+ private annotationElements;
49
+ private lineAnnotations;
50
+ private oldFile;
51
+ private newFile;
52
+ private fileDiff;
53
+ constructor(options?: FileDiffOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);
54
+ private handleHighlightRender;
55
+ setOptions(options: FileDiffOptions<LAnnotation> | undefined): void;
56
+ private mergeOptions;
57
+ setThemeType(themeType: ThemeTypes): void;
58
+ getHoveredLine: () => GetHoveredLineResult<"diff"> | undefined;
59
+ setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void;
60
+ setSelectedLines(range: SelectedLineRange | null): void;
61
+ cleanUp(): void;
62
+ hydrate(props: FileDiffHydrationProps<LAnnotation>): void;
63
+ rerender(): void;
64
+ handleExpandHunk: (hunkIndex: number, direction: ExpansionDirections) => void;
65
+ expandHunk(hunkIndex: number, direction: ExpansionDirections): void;
66
+ render({
67
+ oldFile,
68
+ newFile,
69
+ fileDiff,
70
+ forceRender,
71
+ lineAnnotations,
72
+ fileContainer,
73
+ containerWrapper
74
+ }: FileDiffRenderProps<LAnnotation>): void;
75
+ private renderSeparators;
76
+ private renderAnnotations;
77
+ private renderHoverUtility;
78
+ private getOrCreateFileContainer;
79
+ getFileContainer(): HTMLElement | undefined;
80
+ private getOrCreatePreNode;
81
+ private applyHeaderToDOM;
82
+ private injectUnsafeCSS;
83
+ private applyHunksToDOM;
84
+ private applyPreNodeAttributes;
85
+ private applyErrorToDOM;
86
+ private cleanupErrorWrapper;
87
+ }
88
+ //#endregion
89
+ export { FileDiff, FileDiffHydrationProps, FileDiffOptions, FileDiffRenderProps };
90
+ //# sourceMappingURL=FileDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDiff.d.ts","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,392 @@
1
+ import { DEFAULT_THEMES, DIFFS_TAG_NAME, HEADER_METADATA_SLOT_ID, UNSAFE_CSS_ATTRIBUTE } from "../constants.js";
2
+ import { LineSelectionManager, pluckLineSelectionOptions } from "../managers/LineSelectionManager.js";
3
+ import { MouseEventManager, pluckMouseEventOptions } from "../managers/MouseEventManager.js";
4
+ import { ResizeManager } from "../managers/ResizeManager.js";
5
+ import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
6
+ import { SVGSpriteSheet } from "../sprite.js";
7
+ import { areFilesEqual } from "../utils/areFilesEqual.js";
8
+ import { createAnnotationWrapperNode } from "../utils/createAnnotationWrapperNode.js";
9
+ import { createCodeNode } from "../utils/createCodeNode.js";
10
+ import { createHoverContentNode } from "../utils/createHoverContentNode.js";
11
+ import { createUnsafeCSSStyleNode } from "../utils/createUnsafeCSSStyleNode.js";
12
+ import { wrapUnsafeCSS } from "../utils/cssWrappers.js";
13
+ import { prerenderHTMLIfNecessary } from "../utils/prerenderHTMLIfNecessary.js";
14
+ import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
15
+ import { DiffsContainerLoaded } from "./web-components.js";
16
+ import { ScrollSyncManager } from "../managers/ScrollSyncManager.js";
17
+ import { DiffHunksRenderer } from "../renderers/DiffHunksRenderer.js";
18
+ import { parseDiffFromFile } from "../utils/parseDiffFromFile.js";
19
+ import { toHtml } from "hast-util-to-html";
20
+
21
+ //#region src/components/FileDiff.ts
22
+ let instanceId = -1;
23
+ var FileDiff = class {
24
+ static LoadedCustomComponent = DiffsContainerLoaded;
25
+ __id = ++instanceId;
26
+ fileContainer;
27
+ spriteSVG;
28
+ pre;
29
+ unsafeCSSStyle;
30
+ hoverContent;
31
+ headerElement;
32
+ headerMetadata;
33
+ customHunkElements = [];
34
+ errorWrapper;
35
+ hunksRenderer;
36
+ resizeManager;
37
+ scrollSyncManager;
38
+ mouseEventManager;
39
+ lineSelectionManager;
40
+ annotationElements = [];
41
+ lineAnnotations = [];
42
+ oldFile;
43
+ newFile;
44
+ fileDiff;
45
+ constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
46
+ this.options = options;
47
+ this.workerManager = workerManager;
48
+ this.isContainerManaged = isContainerManaged;
49
+ this.hunksRenderer = new DiffHunksRenderer({
50
+ ...options,
51
+ hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
52
+ }, this.handleHighlightRender, this.workerManager);
53
+ this.resizeManager = new ResizeManager();
54
+ this.scrollSyncManager = new ScrollSyncManager();
55
+ this.mouseEventManager = new MouseEventManager("diff", pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" ? this.handleExpandHunk : void 0));
56
+ this.lineSelectionManager = new LineSelectionManager(pluckLineSelectionOptions(options));
57
+ this.workerManager?.subscribeToThemeChanges(this);
58
+ }
59
+ handleHighlightRender = () => {
60
+ this.rerender();
61
+ };
62
+ setOptions(options) {
63
+ if (options == null) return;
64
+ this.options = options;
65
+ this.hunksRenderer.setOptions({
66
+ ...this.options,
67
+ hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators
68
+ });
69
+ this.mouseEventManager.setOptions(pluckMouseEventOptions(options, typeof options.hunkSeparators === "function" || (options.hunkSeparators ?? "line-info") === "line-info" ? this.handleExpandHunk : void 0));
70
+ this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));
71
+ }
72
+ mergeOptions(options) {
73
+ this.options = {
74
+ ...this.options,
75
+ ...options
76
+ };
77
+ }
78
+ setThemeType(themeType) {
79
+ if ((this.options.themeType ?? "system") === themeType) return;
80
+ this.mergeOptions({ themeType });
81
+ this.hunksRenderer.setThemeType(themeType);
82
+ if (this.headerElement != null) if (themeType === "system") delete this.headerElement.dataset.themeType;
83
+ else this.headerElement.dataset.themeType = themeType;
84
+ if (this.pre != null) switch (themeType) {
85
+ case "system":
86
+ delete this.pre.dataset.themeType;
87
+ break;
88
+ case "light":
89
+ case "dark":
90
+ this.pre.dataset.themeType = themeType;
91
+ break;
92
+ }
93
+ }
94
+ getHoveredLine = () => {
95
+ return this.mouseEventManager.getHoveredLine();
96
+ };
97
+ setLineAnnotations(lineAnnotations) {
98
+ this.lineAnnotations = lineAnnotations;
99
+ }
100
+ setSelectedLines(range) {
101
+ this.lineSelectionManager.setSelection(range);
102
+ }
103
+ cleanUp() {
104
+ this.hunksRenderer.cleanUp();
105
+ this.resizeManager.cleanUp();
106
+ this.mouseEventManager.cleanUp();
107
+ this.scrollSyncManager.cleanUp();
108
+ this.lineSelectionManager.cleanUp();
109
+ this.workerManager?.unsubscribeToThemeChanges(this);
110
+ this.workerManager = void 0;
111
+ this.fileDiff = void 0;
112
+ this.oldFile = void 0;
113
+ this.newFile = void 0;
114
+ if (!this.isContainerManaged) this.fileContainer?.parentNode?.removeChild(this.fileContainer);
115
+ if (this.fileContainer?.shadowRoot != null) this.fileContainer.shadowRoot.innerHTML = "";
116
+ this.fileContainer = void 0;
117
+ this.pre = void 0;
118
+ this.headerElement = void 0;
119
+ this.errorWrapper = void 0;
120
+ }
121
+ hydrate(props) {
122
+ const { fileContainer, prerenderedHTML } = props;
123
+ prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);
124
+ for (const element of Array.from(fileContainer.shadowRoot?.children ?? [])) {
125
+ if (element instanceof SVGElement) {
126
+ this.spriteSVG = element;
127
+ continue;
128
+ }
129
+ if (!(element instanceof HTMLElement)) continue;
130
+ if (element instanceof HTMLPreElement) {
131
+ this.pre = element;
132
+ continue;
133
+ }
134
+ if ("diffsHeader" in element.dataset) {
135
+ this.headerElement = element;
136
+ continue;
137
+ }
138
+ if (element instanceof HTMLStyleElement && element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)) {
139
+ this.unsafeCSSStyle = element;
140
+ continue;
141
+ }
142
+ }
143
+ if (this.pre == null) this.render(props);
144
+ else {
145
+ const { lineAnnotations, oldFile, newFile, fileDiff } = props;
146
+ this.fileContainer = fileContainer;
147
+ delete this.pre.dataset.dehydrated;
148
+ this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;
149
+ this.newFile = newFile;
150
+ this.oldFile = oldFile;
151
+ this.fileDiff = fileDiff ?? (oldFile != null && newFile != null ? parseDiffFromFile(oldFile, newFile) : void 0);
152
+ this.hunksRenderer.hydrate(this.fileDiff);
153
+ this.renderAnnotations();
154
+ this.renderHoverUtility();
155
+ this.injectUnsafeCSS();
156
+ this.mouseEventManager.setup(this.pre);
157
+ this.lineSelectionManager.setup(this.pre);
158
+ if ((this.options.overflow ?? "scroll") === "scroll") {
159
+ this.resizeManager.setup(this.pre);
160
+ this.scrollSyncManager.setup(this.pre);
161
+ }
162
+ }
163
+ }
164
+ rerender() {
165
+ if (this.fileDiff == null && this.newFile == null && this.oldFile == null) return;
166
+ this.render({
167
+ oldFile: this.oldFile,
168
+ newFile: this.newFile,
169
+ fileDiff: this.fileDiff,
170
+ forceRender: true
171
+ });
172
+ }
173
+ handleExpandHunk = (hunkIndex, direction) => {
174
+ this.expandHunk(hunkIndex, direction);
175
+ };
176
+ expandHunk(hunkIndex, direction) {
177
+ this.hunksRenderer.expandHunk(hunkIndex, direction);
178
+ this.rerender();
179
+ }
180
+ render({ oldFile, newFile, fileDiff, forceRender = false, lineAnnotations, fileContainer, containerWrapper }) {
181
+ const filesDidChange = oldFile != null && newFile != null && (!areFilesEqual(oldFile, this.oldFile) || !areFilesEqual(newFile, this.newFile));
182
+ const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
183
+ if (!forceRender && !annotationsChanged && (fileDiff != null && fileDiff === this.fileDiff || fileDiff == null && !filesDidChange)) return;
184
+ this.oldFile = oldFile;
185
+ this.newFile = newFile;
186
+ if (fileDiff != null) this.fileDiff = fileDiff;
187
+ else if (oldFile != null && newFile != null && filesDidChange) this.fileDiff = parseDiffFromFile(oldFile, newFile);
188
+ if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
189
+ if (this.fileDiff == null) return;
190
+ this.hunksRenderer.setOptions({
191
+ ...this.options,
192
+ hunkSeparators: typeof this.options.hunkSeparators === "function" ? "custom" : this.options.hunkSeparators
193
+ });
194
+ this.hunksRenderer.setLineAnnotations(this.lineAnnotations);
195
+ const { disableFileHeader = false } = this.options;
196
+ if (disableFileHeader) {
197
+ if (this.headerElement != null) {
198
+ this.headerElement.parentNode?.removeChild(this.headerElement);
199
+ this.headerElement = void 0;
200
+ }
201
+ }
202
+ fileContainer = this.getOrCreateFileContainer(fileContainer, containerWrapper);
203
+ try {
204
+ const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff);
205
+ if (hunksResult == null) {
206
+ if (this.workerManager != null && !this.workerManager.isInitialized()) this.workerManager.initialize().then(() => this.rerender());
207
+ return;
208
+ }
209
+ if (hunksResult.headerElement != null) this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);
210
+ const pre = this.getOrCreatePreNode(fileContainer);
211
+ this.applyHunksToDOM(pre, hunksResult);
212
+ this.renderSeparators(hunksResult.hunkData);
213
+ this.renderAnnotations();
214
+ this.renderHoverUtility();
215
+ } catch (error) {
216
+ if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
217
+ }
218
+ }
219
+ renderSeparators(hunkData) {
220
+ const { hunkSeparators } = this.options;
221
+ if (this.isContainerManaged || this.fileContainer == null || typeof hunkSeparators !== "function") return;
222
+ for (const element of this.customHunkElements) element.parentNode?.removeChild(element);
223
+ this.customHunkElements.length = 0;
224
+ for (const hunk of hunkData) {
225
+ const element = document.createElement("div");
226
+ element.style.display = "contents";
227
+ element.slot = hunk.slotName;
228
+ element.appendChild(hunkSeparators(hunk, this));
229
+ this.fileContainer.appendChild(element);
230
+ this.customHunkElements.push(element);
231
+ }
232
+ }
233
+ renderAnnotations() {
234
+ if (this.isContainerManaged || this.fileContainer == null) return;
235
+ for (const element of this.annotationElements) element.parentNode?.removeChild(element);
236
+ this.annotationElements.length = 0;
237
+ const { renderAnnotation } = this.options;
238
+ if (renderAnnotation != null && this.lineAnnotations.length > 0) for (const annotation of this.lineAnnotations) {
239
+ const content = renderAnnotation(annotation);
240
+ if (content == null) continue;
241
+ const el = createAnnotationWrapperNode(getLineAnnotationName(annotation));
242
+ el.appendChild(content);
243
+ this.annotationElements.push(el);
244
+ this.fileContainer.appendChild(el);
245
+ }
246
+ }
247
+ renderHoverUtility() {
248
+ const { renderHoverUtility } = this.options;
249
+ if (this.fileContainer == null || renderHoverUtility == null) return;
250
+ if (this.hoverContent == null) {
251
+ this.hoverContent = createHoverContentNode();
252
+ this.fileContainer.appendChild(this.hoverContent);
253
+ }
254
+ const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);
255
+ this.hoverContent.innerHTML = "";
256
+ if (element != null) this.hoverContent.appendChild(element);
257
+ }
258
+ getOrCreateFileContainer(fileContainer, parentNode) {
259
+ this.fileContainer = fileContainer ?? this.fileContainer ?? document.createElement(DIFFS_TAG_NAME);
260
+ if (parentNode != null && this.fileContainer.parentNode !== parentNode) parentNode.appendChild(this.fileContainer);
261
+ if (this.spriteSVG == null) {
262
+ const fragment = document.createElement("div");
263
+ fragment.innerHTML = SVGSpriteSheet;
264
+ const firstChild = fragment.firstChild;
265
+ if (firstChild instanceof SVGElement) {
266
+ this.spriteSVG = firstChild;
267
+ this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);
268
+ }
269
+ }
270
+ return this.fileContainer;
271
+ }
272
+ getFileContainer() {
273
+ return this.fileContainer;
274
+ }
275
+ getOrCreatePreNode(container) {
276
+ if (this.pre == null) {
277
+ this.pre = document.createElement("pre");
278
+ container.shadowRoot?.appendChild(this.pre);
279
+ } else if (this.pre.parentNode !== container) container.shadowRoot?.appendChild(this.pre);
280
+ return this.pre;
281
+ }
282
+ applyHeaderToDOM(headerAST, container) {
283
+ this.cleanupErrorWrapper();
284
+ const tempDiv = document.createElement("div");
285
+ tempDiv.innerHTML = toHtml(headerAST);
286
+ const newHeader = tempDiv.firstElementChild;
287
+ if (!(newHeader instanceof HTMLElement)) return;
288
+ if (this.headerElement != null) container.shadowRoot?.replaceChild(newHeader, this.headerElement);
289
+ else container.shadowRoot?.prepend(newHeader);
290
+ this.headerElement = newHeader;
291
+ if (this.isContainerManaged) return;
292
+ const { renderHeaderMetadata } = this.options;
293
+ if (this.headerMetadata != null) this.headerMetadata.parentNode?.removeChild(this.headerMetadata);
294
+ const content = renderHeaderMetadata?.({
295
+ oldFile: this.oldFile,
296
+ newFile: this.newFile,
297
+ fileDiff: this.fileDiff
298
+ }) ?? void 0;
299
+ if (content != null) {
300
+ this.headerMetadata = document.createElement("div");
301
+ this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;
302
+ if (content instanceof Element) this.headerMetadata.appendChild(content);
303
+ else this.headerMetadata.innerText = `${content}`;
304
+ container.appendChild(this.headerMetadata);
305
+ }
306
+ }
307
+ injectUnsafeCSS() {
308
+ if (this.fileContainer?.shadowRoot == null) return;
309
+ const { unsafeCSS } = this.options;
310
+ if (unsafeCSS == null || unsafeCSS === "") return;
311
+ if (this.unsafeCSSStyle == null) {
312
+ this.unsafeCSSStyle = createUnsafeCSSStyleNode();
313
+ this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);
314
+ }
315
+ this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);
316
+ }
317
+ applyHunksToDOM(pre, result) {
318
+ this.cleanupErrorWrapper();
319
+ this.applyPreNodeAttributes(pre, result);
320
+ pre.innerHTML = "";
321
+ let codeDeletions;
322
+ let codeAdditions;
323
+ if (result.unifiedAST != null) {
324
+ const codeUnified = createCodeNode({ columnType: "unified" });
325
+ codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(result.unifiedAST);
326
+ pre.appendChild(codeUnified);
327
+ } else {
328
+ if (result.deletionsAST != null) {
329
+ codeDeletions = createCodeNode({ columnType: "deletions" });
330
+ codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(result.deletionsAST);
331
+ pre.appendChild(codeDeletions);
332
+ }
333
+ if (result.additionsAST != null) {
334
+ codeAdditions = createCodeNode({ columnType: "additions" });
335
+ codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(result.additionsAST);
336
+ pre.appendChild(codeAdditions);
337
+ }
338
+ }
339
+ this.injectUnsafeCSS();
340
+ this.mouseEventManager.setup(pre);
341
+ this.lineSelectionManager.setup(pre);
342
+ if ((this.options.overflow ?? "scroll") === "scroll") {
343
+ this.resizeManager.setup(pre);
344
+ this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);
345
+ } else {
346
+ this.resizeManager.cleanUp();
347
+ this.scrollSyncManager.cleanUp();
348
+ }
349
+ }
350
+ applyPreNodeAttributes(pre, { themeStyles, baseThemeType, additionsAST, deletionsAST, totalLines }) {
351
+ const { diffIndicators = "bars", disableBackground = false, disableLineNumbers = false, overflow = "scroll", themeType = "system", diffStyle = "split" } = this.options;
352
+ setPreNodeProperties({
353
+ pre,
354
+ diffIndicators,
355
+ disableBackground,
356
+ disableLineNumbers,
357
+ overflow,
358
+ split: diffStyle === "unified" ? false : additionsAST != null && deletionsAST != null,
359
+ themeStyles,
360
+ themeType: baseThemeType ?? themeType,
361
+ totalLines
362
+ });
363
+ }
364
+ applyErrorToDOM(error, container) {
365
+ this.cleanupErrorWrapper();
366
+ const pre = this.getOrCreatePreNode(container);
367
+ pre.innerHTML = "";
368
+ pre.parentNode?.removeChild(pre);
369
+ this.pre = void 0;
370
+ const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
371
+ this.errorWrapper ??= document.createElement("div");
372
+ this.errorWrapper.dataset.errorWrapper = "";
373
+ this.errorWrapper.innerHTML = "";
374
+ shadowRoot.appendChild(this.errorWrapper);
375
+ const errorMessage = document.createElement("div");
376
+ errorMessage.dataset.errorMessage = "";
377
+ errorMessage.innerText = error.message;
378
+ this.errorWrapper.appendChild(errorMessage);
379
+ const errorStack = document.createElement("pre");
380
+ errorStack.dataset.errorStack = "";
381
+ errorStack.innerText = error.stack ?? "No Error Stack";
382
+ this.errorWrapper.appendChild(errorStack);
383
+ }
384
+ cleanupErrorWrapper() {
385
+ this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);
386
+ this.errorWrapper = void 0;
387
+ }
388
+ };
389
+
390
+ //#endregion
391
+ export { FileDiff };
392
+ //# sourceMappingURL=FileDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n RenderHeaderMetadataCallback,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n renderAnnotation?(\n annotation: DiffLineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined\n ): HTMLElement | null;\n}\n\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n private customHunkElements: HTMLElement[] = [];\n private errorWrapper: HTMLElement | undefined;\n\n private hunksRenderer: DiffHunksRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private scrollSyncManager: ScrollSyncManager;\n private mouseEventManager: MouseEventManager<'diff'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n private oldFile: FileContents | undefined;\n private newFile: FileContents | undefined;\n private fileDiff: FileDiffMetadata | undefined;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n // NOTE(amadeus): Temp hack while we use this component in a react context\n private isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.hunksRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.fileDiff = undefined;\n this.oldFile = undefined;\n this.newFile = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.newFile = newFile;\n this.oldFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n this.scrollSyncManager.setup(this.pre);\n }\n }\n }\n\n rerender(): void {\n if (this.fileDiff == null && this.newFile == null && this.oldFile == null) {\n return;\n }\n this.render({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n }: FileDiffRenderProps<LAnnotation>): void {\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.oldFile) ||\n !areFilesEqual(newFile, this.newFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.oldFile = oldFile;\n this.newFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff);\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderSeparators(hunkData: HunkData[]): void {\n const { hunkSeparators } = this.options;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof hunkSeparators !== 'function'\n ) {\n return;\n }\n for (const element of this.customHunkElements) {\n element.parentNode?.removeChild(element);\n }\n this.customHunkElements.length = 0;\n for (const hunk of hunkData) {\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n this.customHunkElements.push(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n // Clear existing content\n pre.innerHTML = '';\n\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n if (result.unifiedAST != null) {\n const codeUnified = createCodeNode({ columnType: 'unified' });\n codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n pre.appendChild(codeUnified);\n } else {\n if (result.deletionsAST != null) {\n codeDeletions = createCodeNode({ columnType: 'deletions' });\n codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n pre.appendChild(codeDeletions);\n }\n if (result.additionsAST != null) {\n codeAdditions = createCodeNode({ columnType: 'additions' });\n codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n pre.appendChild(codeAdditions);\n }\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);\n } else {\n this.resizeManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n {\n themeStyles,\n baseThemeType,\n additionsAST,\n deletionsAST,\n totalLines,\n }: HunksRenderResult\n ): void {\n const {\n diffIndicators = 'bars',\n disableBackground = false,\n disableLineNumbers = false,\n overflow = 'scroll',\n themeType = 'system',\n diffStyle = 'split',\n } = this.options;\n const split =\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null;\n setPreNodeProperties({\n pre,\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}